Волшебство в MQL4

В прошлом уроке мы создали советника в 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/

You May Also Like