Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#626

Вопросы от новичка.
Какой смысл в параметре Slippage в отложенных ордерах?
В чем отличие его работы от рыночных ордеров?

#627

И ещё, уже долго до меня не дойдёт, как сделать так чтобы открывался только один ордер при заданном условии и при закрытии по тейку не открывался ещё один, так как условие всё ещё соблюдено. То есть, на примере советника, если цена выше скользящей средней - открывается ордер на покупку и закрывается по тейку, ну или стопу, а следующий ордер должен быть только на продажу, и не важно закрылся он по SL || TP.
Просмотрев уроки учителя, открыв MetaEditor, написал (напечатал), НО, во-первых ордера на покупку открываются ниже мувинга
при условии Ask>MA, ну и во-вторых за ордером BUY и последующим его закрытием открывается BUY.
Кому не сложно посмотрите, укажите на ошибки.

OneOrder.mq410 скач.

#628


Спойлер

И ещё, уже долго до меня не дойдёт, как сделать так чтобы открывался только один ордер при заданном условии и при закрытии по тейку не открывался ещё один, так как условие всё ещё соблюдено. То есть, на примере советника, если цена выше скользящей средней - открывается ордер на покупку и закрывается по тейку, ну или стопу, а следующий ордер должен быть только на продажу, и не важно закрылся он по SL || TP.
Просмотрев уроки учителя, открыв MetaEditor, написал (напечатал), НО, во-первых ордера на покупку открываются ниже мувинга
при условии Ask>MA, ну и во-вторых за ордером BUY и последующим его закрытием открывается BUY.
Кому не сложно посмотрите, укажите на ошибки.




Для начала:
int MA = iMA(Symbol(),0,200,0,MODE_EMA,PRICE_CLOSE,0);

Переменная MA, должна быть объявлена как double. Ваша МА, в лучшем случае, выдаёт 1. Также, я бы написал Bid>MA, вместо Ask>MA (но это неприципиально). Не лепите скобки на один уровень, сделайте как у xbms - ступеньками. Похоже sell советник не открывает - не на месте закрывающая скобка... . Slippage, на рыночных, не ставьте 0.

Команда start срабатывает на каждом тике. Исходя из этого и печатать надо: => если ордеров нет => если последний ордер был Бай, значит ждём сигнал на Селл => если последний был Селл, значит ждём сигнал на Бай...

Rusand
Нет смысла. Пишите 0.
#629

ни чё у меня не получается...
Vorchunozavr, покажите мне как это в коде надо записать

#630


ни чё у меня не получается...
Vorchunozavr, покажите мне как это в коде надо записать


Столько раз в уроках пережевано было: и пересчет ордеров, и нужные параметры в них.
При пересчете от конца находишь нужный ордер, сравниваешь время открытия со временем настоящим. Если разные, то возвращаешь true, как сигнал к торговле.
#631
Baggins , не...

Добавлено: 19-12-2013 17:32:51

Мне кто нибудь поможет сделать то, что я каждыми днями пытаюсь сделать?
То что удалось сделать, так это изменить немного функцию выборки закрытых ордеров, добавил переменную oldticket которая сравнивается с последним тикетом, и забирает у последнего ордера тип, и переменной type присвоил значение OrderType()+1, что бы переменная была или 1 или 2 в зависимости от типа закрытого ордера. Добавил в условия и чуда не произошло, но уже более менее похоже на истину. Скажите что ж надо ещё туда вписать, чтобы всё заработало?

OneOrder.mq412 скач.

Изменено 19 декабря, 2013 пользователем Сast

#632


Мне кто нибудь поможет сделать то, что я каждыми днями пытаюсь сделать?



Уж и помогать особо нечего...
Просто МА считается, только если if (Count() == 0 && order_type == 0), считать нужно или вне условий, или после каждого. Я, почему ступеньками советовал - так виднее... ;).

Ещё, при отсутствии стопа, ордер может висеть долго.
Переменная ticket, объявлена на глобальном уровне, в функции лучше её не использовать.
#633

Доброго времени вам господа программисты. всех С Новым 2014 Годом.
В общем интересует что б кто то посмотрел код. А то сомнение берет правильно ли я написал без убыток и трелинг в нем. Задумка была токова,когда по мартину открываются доливочные ордера,то вычисляем общий без убыток,ставим стоп лосс и потом тралим.

Test_22.mq419 скач.

#634

Всех с Новым Годом!! Программисты, помогите с совой. Ошибка со скобками, что там не так?? Вроде же все верно писал...

VaiL.mq410 скач.

#635

samuliak ,Я то же не специалист,только учусь,но внимательно посмотри видео уроки,постарайся вникнуть хоть не много.Там в первом уроке есть такая фишка как можно использовать за место калькулятора.еще на сайте MQL4 там написанно что такое константы ,переменные и все такое,что к чему присваевается. Я по началу то же тупо списал.
Посмотри код сравни со своим,должен понять где ошибки.

VaiL.mq412 скач.

#636

У вас немного другая сова, я когда то так же её писал. А меня интересует что именно в моей неправильно. И никак не могу найти ошибку.(

#637

Скажу словами господина xbms Очень настоятельно рекомендую просмотреть вводные видео уроки.иначе совсем не чего не поймете.

Vail_2.mq410 скач.

#638

xbms, посмотрите пожалуйста функции на наличие ошибок ( они там похоже точно есть)
суть первой функции в поиске лота, который необходим для покрытия убытка за TP пунктов в случае закрытия сетки ордеров.
вторая функция должна закрывать половину сетки начиная с самого старшего ордера
double FindRightLot (int otype) // функция поиска лота, необходимого для выхода из просадки после
//закрытия сетки ордеров
{
double Lot=0; double TotalLot=0;
for (int i = OrdersTotal()-1; i>0; i--)
{
if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == otype)
{
if (otype == OP_BUY)
{
Lot = NormalizeDouble ((OrderOpenPrice()-Bid)*OrderLots()/TP,2);
if (Lot>0)
{
TotalLot= NormalizeDouble (TotalLot+Lot,2);
}
}


else if (otype == OP_SELL)
{
Lot = NormalizeDouble ((Ask-OrderOpenPrice())*OrderLots()/TP,2);
if (Lot>0)
{
TotalLot= NormalizeDouble (TotalLot+Lot,2);
}

}
}
}
}
return (TotalLot);

}
//+------------------------------------------------------------------+

void CloseHalfOrders (int otype)// ф-ция закрытия половины ордеров сетки
{
int count = 0;
for (int i = 0; i {
if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == otype)
{
if (otype == OP_BUY)
{
if (count3 )

OrderClose(OrderTicket(),OrderLots(),Bid,0,Black);
count++;

}


else if (otype == OP_SELL)
{
if (count3)

OrderClose(OrderTicket(),OrderLots(),Ask,0,Black);
count++;

}
}
}
}

}

#639


Доброго времени вам господа программисты. всех С Новым 2014 Годом.
В общем интересует что б кто то посмотрел код. А то сомнение берет правильно ли я написал без убыток и трелинг в нем. Задумка была токова,когда по мартину открываются доливочные ордера,то вычисляем общий без убыток,ставим стоп лосс и потом тралим.




Привет всем,что не кто не подскажет по поводу моей просьбы ?
#640

Здравствуйте всем! С Новым 2014 годом вас! У меня вопрос возник. Дело в том. что после загрузки и установки не открывается видеоролик ("MQL4 Программирование" курс молодого бойца" и др). Выдает сообщение "Нет приложения, связанного с данным расширением файла". Подскажите, пожалуйста, что это означает и что мне следует предпринять для устранения этой проблемы. Заранее спасибо!

Изменено 6 января, 2014 пользователем Nart60

#641

Сорри за нубский вопрос, но что-то я не разобрался, а с одного чарта нельзя в эксперте открывать явно ордера по другим инструментам?
Т.е. если я запускаю сову на EURUSD, а в коде написано:
OrderSend("USDJPY", OP_SELL, ....ну и так далее), то... ничего не происходит. В логе тоже пусто.

UPD: Разобрался сам: нужно было в качестве параметра цены передавать MarketInfo по инструменту.

Изменено 10 января, 2014 пользователем JR

#642

Люди добрые подскажите: мне нужно определить профит последнего закрытого ордера и его тип,а так же последний лот .Накидал вот такие функции но,что не работает
double CountProfitHystory()
{
int profit = 0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==false) { Print("Error in history!"); break; }

if(OrderSymbol() != Symbol() && OrderMagicNumber() != Magic)continue;
profit=OrderProfit();


}

return(profit);
}
2) int FindLastOrderType()
{
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return(OrderType());
}
}
return(-1);
}
3) double FindLastLots(int otype)
{
double oldLots;
int oldticket;

ticket = 0;

for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
oldLots = OrderLots();

ticket = oldticket;
}
}
}
}
return(oldLots);
}


Добавлено: 12-01-2014 10:15:23

Спасибо товарищи за помощь,она была неоценимой :d
Выкладываю исправленную версию,авось кому пригодится \M/
int CountProfitHystory()
{
double profit = 0;
int i,accTotal=OrdersHistoryTotal();

for( i=0;i {
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true)
{if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

profit=OrderProfit();

}
}

return(profit);
}
2) //+------------------------------------------------------------------+
double FindLastLots(int otype)
{
double oldLots;
int oldticket;

ticket = 0;

for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
oldLots = OrderLots();

ticket = oldticket;
}
}
}
}
return(oldLots);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
for(int i = OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return(OrderType());
}
}
return(-1);
}

Изменено 12 января, 2014 пользователем AndreyP

#643

к уроку - Пишем советник на мартингейле

Сразу извиняюсь если эта тема уже освещалась (не нашел).
Писал советник под-диктовку с урока, но вылазит куча ошибок.
Сразу отвечу, что предварительные уроки смотрел.
Прошел несколько раз по коду параллельно с прокруткой видео ...
Возможно сказывается полное отсутствие опыта программирования.
(Почему то, мне нельзя засунуть текст кода ни в поле КОДА, ни в поле СПОЙЛЕРА. Так, что извиняюсь...)
Привожу код, который писал под-диктовку:
=================================================================================
extern double Lots = 0.1;
extern int TakeProfit = 50;
extern int Step = 50;
extern double Multiplier = 2;
extern int Slippage = 5;
extern int Magic = 333;

int ticket;
double price, TP, lastlot;

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
if (Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
Step *= 10;
Slippage *= 10;
}

return(0);
}

//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{

return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if (CountTrades() == 0)
{
double ima = iMA(Symbol(), PERIOD_H1, 14, 0, MODE_SMA, PRICE_CLOSE, 1);
if (Ask > ima)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Green);
if (ticket > 0)
{
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
}
}
else if(Bid {
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red);
if (ticket > 0)
{
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
}
}
}
else
{
int order_type = FindLastOrderType();
{
if (order_type == OP_BUY)
{
price = FindLastPrice(OP_BUY);
if(Ask {
lastlot = FindLaslLots(OP_BUY);
lastlot = NormalizeDouble(lastlot * Multiplier, 2);
ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, Slippage, 0, 0, "", 0, Green);
if (ticket > 0)
ModifyOrders(OP_BUY);
}
}
else if (order_type == OP_SELL)
{
price = FindLastPrice(OP_SELL);
if(Bid {
lastlot = FindLaslLots(OP_SELL);
lastlot = NormalizeDouble(lastlot * Multiplier, 2);
ticket = OrderSend(Symbol(), OP_SELL, lastlot, Bid, Slippage, 0, 0, "", 0, Red);
if (ticket > 0)
ModifyOrders(OP_SELL);
}
}
}

return(0);
}
//+------------------------------------------------------------------+
void ModifyOrders(int otype)
{
double avgprice = 0, order_lots = 0;

price = 0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
price += OrderOpenPrice()*OrderLots();
order_lots += OrderLots();
}
}
}
avgprice = NormalizeDouble(price / order_lots, Digits);

if (otype == OP_BUY) TP = NormalizeDouble(avgprice + TakeProfit*Point, Digits);
if (otype == OP_SELL) TP = NormalizeDouble(avgprice - TakeProfit*Point, Digits);

for (i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0);
}
}
}
//+------------------------------------------------------------------+
double FindLastLots(int otype)
{
double oldlots;
int oldticket;

ticket = 0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
oldlots = OrderLots();
ticket = oldticket;
}
}
}
}
return(oldlots);
}
//+------------------------------------------------------------------+
double FindLastPrice(int otype)
{
double oldopenprice;
int oldticket;

ticket = 0;

for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
oldopenprice = OrderOpenPrice();
ticket = oldticket;
}
}
}
}
return(oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return(OrderType());
}
}
return(-1);
}
//+------------------------------------------------------------------+
int CountTrades()
{
int count = 0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
count ++;
}
}

return(count);
}

=====================================================================

Пожалуйста, помогите.

Изменено 12 января, 2014 пользователем Nafanja

#644
Nafanja, проверяй код - когда такие ошибки сыпят, это скорее всего синтаксис - незакрытые(открытые) фигурные скобки и (или) непоставленные ";" - точка с запятой в конце выражений. У меня по этому уроку тоже сначала куча ошибок по компиляции была.
А вот более серьезная ошибка в этом уроке, которая изначально в видео есть - неправильная проверка для доливки при SELL ордерах. Изначально в уроке так:

if(Bid if (Bid >= price + Step * Point).
Без этого мартышка правильно работать не будет.
#645


Изначально в уроке так:
if(Bid if (Bid >= price + Step * Point).
Без этого мартышка правильно работать не будет.


Спасибо за подсказку.
А на счет синтаксиса - проверял раза четыре.
Если конечно это не СПЕЦИАЛЬНО созданная ошибка.
Потому как я пока в этом ...
Ладно, буду рыть дальше
#646

http://forum.mql4.com/ru/60074
Ну вот, и случился бескровный переход на язык mql5.

#647

Подскажите плз, каким образом лучше ограничивать бота на открытие ордеров во время быстрых движений (новости и связанные с ними каки исполнения)? Проверять размер текущей свечи?

#648

Добрый день.
Прошу подсказать следующую информацию:

1. На каком минимальном расстоянии от Ask можно открывать ордер Buystop? Как это можно узнать программно?
Я пытаюсь узнать с помощью MarketInfo(Symbol(), MODE_STOPLEVEL).
Но, во-первых, значение возвращается 0, а во-вторых, я не уверен, что это именно то, про что я спрашиваю.

2. Как можно сделать паузу в выполнении операции до следующего тика?

Спасибо.

#649
1. MODE_FREEZELEVEL константа - 33. Описание - Уровень заморозки ордеров в пунктах. Если цена исполнения находится в пределах, определяемых уровнем заморозки, то ордер не может быть модифицирован, отменен или закрыт.
Вызывается через MarketInfo(Symbol(), MODE_FREEZELEVEL).

2. Не корректный вопрос. После завершения функции start() программа автоматически ожидает следующий тик.
Если нужно сделать внутри функции start(), то используется функция RefreshRates().
#650

Здравствуйте уважаемые! Вот у меня такая вот "беда".Написал функцию подсчета максимальной просадки,но она не сохраняет значение,после закрытия ордера обнуляется почему то :d .Дак вот вопрос как сделать чтоб она все же хранила эту переменную?
double MaxDrawn()
{ double DrMax;

double Dr=NormalizeDouble((AccountProfit()/AccountBalance())*100,2);

if (DrMax
DrMax=Dr;

return(DrMax);
}

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025