В прошлом уроке мы создали советника в MQL4, который может торговать. Но если его включить в таком виде он будет вести себя по «хамски». Он будет открывать а потом управлять и удалять не только ордера которые он открыл, но и всеми Вашими открытыми ордерами или открытыми другими «советниками».
Для того что бы «советник» отличал свои ордера от ордеров выставленных кем-то другим в торговой функции OrderSend есть идентификатор – magic (магическое число ордера). При открытии ордеров «советник» помечает их этим числом, по которому он их потом будет отличать от ордеров выставленных другим «советником» или трейдером.
//+------------------------------------------------------------------+ //| TradeOnNews.mq4 | //| Copyright © 2008, MetaQuotes Software Corp. | //| | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" //---- input parameters extern int Magic = 111; //число может быть любым extern string StartTime = "15:30"; // время открытия маркет ордера (по времени MetaTrader) extern string CloseTime = "16:00"; // Время закрытия ордеров extern int Delta = 15; // расстояние от цены для выставления стоп ордеров extern int StopLoss = 20; extern int TakeProfit = 30; extern double Lot = 0.1;
Объявляем переменную Magic что бы потом в настройках «эксперта» его можно будет менять.
Если у Вас торгует несколько «советников» каждому нужно назначить свое число.
Добавляем в функцию OrderSend переменную Magic.
OrderSend(Symb,OP_SELLSTOP,Lot,Bid-Delta*Point,3,Bid-Delta*Point + StopLoss*Point,Bid-Delta*Point - TakeProfit*Point,NULL,Magic,EP,Red);
Теперь «эксперт» будет все свои ордера помечать этим числом.
А что бы он управлял только этими ордерами в тех местах кода «советника» (обычно это цикл) после OrderSelect, устанавливаем фильтр.
if(Magic != OrderMagicNumber()) continue; // если магическое число не совпадает с нашим Magic - возвращаемся в начало цикла.
continue – возвращает в начало цикла.
Если магическое число не совпадает с нашим Magic – значит это «чужой» ордер, отбрасываем его и возвращаемся в начало цикла. Берем следующий ордер и проверяем Magic, если совпадает значит это ордер наш и мы можем с ним делать все что угодно (удалять, модернизировать и тд.) исходя из ситуации.
В нашем «советнике» эти строки кода нужно ввести в двух местах в функции start().
if(OrderSelect(i, SELECT_BY_POS) == false) continue; // если ордер не выбран, возвращаемся в начало цикла if(Magic != OrderMagicNumber()) continue;// если магическое число не совпадает с нашим Magic - возвращаемся в начало цикла
и в Orders()
if((OrderSelect(i,SELECT_BY_POS) == true) && (OrderSymbol() == Symb))//Если есть следующ. //.. и наша вал.пара { if(Magic != OrderMagicNumber()) continue;// если магическое число не совпадает с нашим Magic - возвращаемся в начало цикла
Теперь наш «эксперт» будет управлять только своими ордерами.
Исходник: TradeOnNews-0.1
Написание советника для торговли — https://forexlab.ru/mql-write-advisor/