Урок 2: MQL4 Как закрыть ордер



В этой статье мы разберем закрытие ордеров в MQL4:
1) Как закрыть ордер
2) Как закрыть все ордера
3) Как закрыть отложенные ордера
4) Как закрыть ордер по времени
5) Как закрыть ордер по профиту

Первая часть кода: Перебор ордеров. Если закрывать или удалять, то перебор делается в обратную сторону. Так как, последний ордер находится снизу. Многие используют код:

1
2
3
4
for(int i=0; i<=OrdersTotal(); i++)
{
  //здесь закрывается один ордер
}

Это неправильно. Допустим у нас есть несколько открытых ордеров, ну скажем 5. Запуская наш цикл перебора мы закрываем ордер, идущий в списке под номером 0. При следующей итерации i увеличится на 1 и будет указывать, как нам кажется, на второй ордер в списке. На самом деле это не так. Как только мы удалили ордер номер 0, список ордеров уменьшился, и следующий за ним ордер получил номер 0, а третий ордер сдвинулся на позицию 1 (его то мы и удалим во второй итерации нашего цикла перескочив через один ордер). Это логическая ошибка, возникающая вследствие того, что при каждой итерации цикла у нас изменяются не одна, а две величины: индекс цикла(списка ордеров) и сам список ордеров(уменьшается).


Вторая часть кода:
Это закрытие ордера, стоит цикл, пока не закроется ордер. Так как часто бывает ошибка 135 — Цена изменилась, одно дела когда Вы сами торгуете, но если торгует робот, то позиция без этого цикла не закроется, тоесть это зашита от реквотов.

1)Код закрытия всех ордеров BUY и SELL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
   int ticket=-1;
   for(i=OrdersTotal()-1;i>=0;i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if((OrderType()==OP_BUY || OrderType()==OP_SELL) )
         {            
 
               ticket=OrderTicket();
 
 
         }
      }
   }
   if(OrderTicket()!=ticket) OrderSelect(ticket,SELECT_BY_TICKET);
 
while(true)
           {
           double price;
           int error;
           bool result;
              if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
            if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,CLR_NONE);
            if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
            else { error=0; }
            if(error==135) RefreshRates();
            else break;
           }
 
     } 
 }
 }

2. Как закрыть отложенные оредера:
Самое главное отличие, что отложенные ордера закрываются с помощью функции OrderDelete. Тут нет проблем с реквотами, поэтому мы не проверяем ошибку 135.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
   int ticket=-1;
   for(i=OrdersTotal()-1;i>=0;i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {      
 
      if (OrderType()==OP_BUYLIMIT ) if (OrderDelete (OrderTicket(),Yellow))  Print("!Предупреждение: Ордер SELLSTOP закрыт!", OrderTicket());          
        if (OrderType()==OP_SELLLIMIT) if (OrderDelete (OrderTicket(),Yellow))  Print("!Предупреждение: Ордер SELLSTOP закрыт!", OrderTicket());          
      if (OrderType()==OP_BUYSTOP ) if (OrderDelete (OrderTicket(),Yellow))  Print("!Предупреждение: Ордер SELLSTOP закрыт!", OrderTicket());          
      if (OrderType()==OP_SELLSTOP) if (OrderDelete (OrderTicket(),Yellow))  Print("!Предупреждение: Ордер SELLSTOP закрыт!", OrderTicket());   
 
 
               }
   }

3. Как закрыть ордер по профиту:
В первой части кода перед циклом WHILE, поставить проверку какая прибыль по ордеру. Тут закрываются все ордера у которых прибыль меньше 6 пунктов.

1
     if  (OrderProfit()<-0.6)

4. Как закрыть ордер по времени:
В первой части кода перед циклом WHILE, поставить проверку по времени. BlackTime — это время после, которого ордера удаляются.

1
     if (OrderOpenTime()<BlackTime)
Ежемесячный конкурс соц. сетей, условия вступить к нам группу и поделится записью. Приз любая платная разработка подробнее


Понравилась статья, поставь оценку:
1 Star2 Stars3 Stars4 Stars5 Stars (3 votes, average: 3,67 out of 5)
Loading...Loading...


Будь в курсе новостей сайта. Подпишись!

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

email рассылки

Еще записи:





Ежемесячный конкурс лучшего комментатора. Приз любая платная разработка подробнее, комментарии пишем по делу! Кто наберет больше комментариев за год, получит бесплатное обучение по форекс!

Написать комментарий

  1. Taras:

    Добрый день.
    Подскажите, пожалуйста, как сделать проверку дня недели и времени для советника?

    Что-то типа вот такого:
    //Проверить, что сейчас пятница (желательно что первая пятница месяца [например (7-get.date)>=0])
    //Проверить время (15:29:58 Мск)
    if((DayOfWeek()==5) and (TimeCurrent()==15:29:58));

  2. кше:

    Как же закрыть из десяти открытых два профитных?(:smile:)

    • admin:

      Надо выбрать критерий отбора: магик, профит, время.

ЗАДАЙ ВОПРОС?

Top-100 блогов инвесторов, 
					трейдеров и аналитиков   |     |   Яндекс.Метрика

website monitoring results and uptime stats [Valid RSS] Счетчик PR-CY.Rank