Закрытие двух встречных позиций

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Закрытие двух встречных позиций

Сообщение Haos » 15 дек 2020, 09:33

В МКУэль есть функция для закрытия встречных позиций - OrderCloseBy. Общий случай мы рассмотрели ранее: см. тему Закрытие позиций торговой функцией OrderCloseBy.
Мы также можем использовать функцию более простого случая, который подразумевает, что имеется только две позиции по определенному торговому инструменту: одна на покупку, а другая на продажу и при этом одинаковым лотом. Если же лот позиций будет отличаться, то закроется их общая часть, т.е. позиция с меньшим объемом лотности будет закрыта полностью, а от позиции с бОльшим объемом лотности останется часть. Её уже можно будет закрыть обычным способом. Это вполне распространенная ситуация. К примеру:

1. Вы залокировали имеющуюся прибыль в лок, используя вместо ТП отложенный ордер такого же направления. Теперь можно закрыть две встречных позиций (положительный лок) не поочередно, закрывая каждую из них, а как встречные, чтобы сэкономить один спред. Это может быть уместно тогда, когда трейдер не хочет показывать брокеру свой ТП по каким то причинам (однако, показывает встречный ордер) или ожидает возможного проскальзывания цены во время закрытия своей позиции (открытие ордера имеет больший шанс выполнится по установленной цене, чем закрытие позиции).

2. Вы залокировали убыточную позицию в отрицательный лок для дальнейшего размышления как с ним поступить, но решили всё-таки избавиться от него, закрыв с сохранением одного спреда. Это особенно может быть в случае отрицательного большого свопа в сумме по обоим позициям. Также встречная сделка могла быть в качестве аналога СЛ, если трейдер по каким-то причинам не хочет чтобы брокер видел СЛ (однако, показывает встречный ордер).

3. Аналогично встречная позиция могла возникнуть не через отложенник, а по рынку, но суть не меняется: в итоге трейдер получил или положительный лок или отрицательный (прибыльный или убыточный).

Так вот, в коде можно использовать тогда следующую функцию:
Код: выделить все
bool f_CloseByTwoPos(string sy, int mn)
{
/*
   Функция закрывает встречным ордером две позиции (предпологается что их две
   - одна на покупку, другая - на продажу)
   Параметры:                                                               
   sy - наименование инструмента   ("0" - текущий символ)                 
   mn - MagicNumber                (-1   - любой магик)       
*/
   int int_TickBuy = 0, int_TickSel = 0;
   double dbl_LotBuy = 0, dbl_LotSell = 0;
   
   bool bol_Y = false;
   if(sy == "0") sy = Symbol();
   for(int i = 0; i < OrdersTotal(); i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == sy && (mn < 0 || OrderMagicNumber() == mn))
         {
            if(OrderType() == OP_BUY)
            {
               int_TickBuy = OrderTicket();
               dbl_LotBuy  = OrderLots();
            }
            else if(OrderType() == OP_SELL)
            {
               int_TickSel = OrderTicket();
               dbl_LotSell = OrderLots();           
            }
         }
      }
   }
   if(dbl_LotBuy > dbl_LotSell)
   { bol_Y = OrderCloseBy(int_TickBuy, int_TickSel); }
   else
   { bol_Y = OrderCloseBy(int_TickSel, int_TickBuy); }
   
return(bol_Y);
}

Она имеет тип bool, т.е. логическая. Возвращаемое значение должно быть проверяемо на истину или ложь и, обычно, после этого выводится соотв. сообщение через команду Print о том сработала ли функция или не сработала.
Параметрами функции являются:
string sy - имя торгового инструмента, если "0" то текущий инструмент (иначе, типа, "EURUSD" и т.п.);
int mn - спецификация в виде мэджика данного эксперта (это позволяет нам выделять нужные нам сделки относительно возможных других открытых вручную или другим экспертом).
Т.е. всего два параметра.

Таким образом, например, из блока вашей программы OnTick(), данная функция может быть вызвана таким образом:
Код: выделить все
if(f_CloseByTwoPos("0", intMagic))
      {
         Print(Symbol(), "Закрытие встречных позиций успешно");         
      }
      else Print(Symbol(), "Ошибка закрытия встречных позиций");

intMagic - это имя переменной для мэджика, определена она выше в коде программы обычно.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 68

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения