Закрытие позиций торговой функцией OrderCloseBy

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

Закрытие позиций торговой функцией OrderCloseBy

Сообщение Haos » 05 сен 2019, 16:47

Закрытие позиций при помощи торговой функции OrderCloseBy подразумевает, что у нас есть позиции как на покупку так и на продажу по выбранному торговому инструменту и мы хотим сэкономить на половине от спреда открытых позиций. Это очень большая и серьезная тема, особенно важная для тех, кто:
1. Торгует в обе стороны одновременно;
2. Не подключен к сервису ребейта;
3. Позиции закрываются не по одиночке, а одновременно.
Вот эти три условия и определяют, скажем так, "потребителя" данной темы.

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

Прежде всего нужно решить ряд вопросов, которые почему то не освещены в справке по данной торговой функции.
1. Рассмотреть материал по самой торговой функции OrderCloseBy.
2. Должен ли размер первой позиции быть меньше или равен размеру второй позиции? Что будет если попробовать закрыть больший объем меньшим?
3. Нужно решить задачу по закрытию позиций при помощи рассматриваемой торговой функции когда имеются много позиций разного размера как на покупку так и на продажу. Как это сделать наиболее эффективно? Этот вопрос открыт.

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

Закрытие позиций торговой функцией OrderCloseBy

Сообщение Haos » 13 окт 2019, 07:11

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

1. Вначале определяем объем позиций на покупку и продажу. Если окажется, что в одном из направлений объем нулевой, то просто закрываем позиции обычным образом оставшегося направления. Если окажется что объем нулевой с обоих сторон (т.е. позиций нет, то, собственно, ничего не делаем).

2. Из п. 1 определили, что объем позиций обоих направлений больше нуля. Теперь ищем позицию с минимальным объемом.

3. Закрываем встречной операций первую попавшуюся позицию противоположного направления позицией с мин. объемом (что нашли в п. 2).

4. В результате окажется, что какое-то направление торговли имеет уже нулевой объем, тогда см. п. 1. (закрываем другое направление позиций).

Таким образом, все операции можно будет попробовать осуществить в одном цикле, что, по-моему, оптимально.

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

Закрытие позиций торговой функцией OrderCloseBy

Сообщение Haos » 18 окт 2019, 10:05

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

1. Цикл просмотра нужных позиций среди всех открытых ордеров задаём:
Код: выделить все
      for(i = 0; i < OrdersTotal(); i++)
      {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if(OrderSymbol() == sy)
            {
               if(mn < 0 || OrderMagicNumber() == mn)
               {
                  // Работа со сделками по нужному активу с нужным МН:
                     ...
               }
            }
         }
      }

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

Закрытие позиций торговой функцией OrderCloseBy

Сообщение Haos » 12 дек 2019, 08:24

Итак, продолжим. Из переменных нам понадобятся:
- переменная цикла i;
- тикеты сделок с минимальными лотами;
- сами значения минимальных лотов;
Код: выделить все
   int i = 0;
   int intBuyTick = 0, intSelTick = 0; // тикеты сделок с минимальными лотами
   double dblBuyQMin = 0, dblSelQMin = 0; // минимальные лоты

Также понадобится логическая переменная, наличия и покупок и продаж (смысл работы функции по закрытии встречных позиций обусловлен самим наличием этих позиций. Если есть только покупки или продажи, то просто закрываются покупки или продажи. Данное состояние также будет в конце работы нашей функции, поэтому по ее завершению нужно просто прописать будет код для закрытия оставшихся "обломков" однонаправленных позиций.
Код: выделить все
   bool bolBuySel = false;

Необходимы и переменных количества покупок и продаж. Первым делом мы находим количество позиций на покупку и продажу и если тех и других больше нуля, то переменной bolBuySel присваиваем значение "истина". Эта переменная понадобится нам во внешнем цикле обработки позиций.
Код: выделить все
   int intBuys = f_GetNumberOfPositions(sy, OP_BUY, mn);
   int intSels = f_GetNumberOfPositions(sy, OP_SELL, mn);
   if(intBuys > 0 && intSels > 0) bolBuySel = true;
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Закрытие позиций торговой функцией OrderCloseBy

Сообщение Haos » 29 дек 2019, 08:35

Продолжим. Организуем основной цикл:
Код: выделить все
 while(bolBuySel)
 { //******* }

Внтри него будет упомянутый выше цикл по перебору всех позиций за раз:
Код: выделить все
     
for(i = 0; i < OrdersTotal(); i++)
  {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if((OrderSymbol() == sy) && (mn < 0 || OrderMagicNumber() == mn))
            {
//....

Для ордеров типа покупка и продажа считаем количество и тех и других. Находим минимальный объем лота.
Код: выделить все
 
               if(OrderType() == OP_BUY )
               {
                  if(dblBuyQMin == 0 || dblBuyQMin > OrderLots())
                  {
                     dblBuyQMin = OrderLots();
                  }
                  intBuys++;
               }

Закрываем встречные позиции:
Код: выделить все
      if(dblBuyQMin <= dblSelQMin)     { bolCloBy = OrderCloseBy(intBuyTick, intSelTick); }
      else if(dblBuyQMin > dblSelQMin) { bolCloBy = OrderCloseBy(intSelTick, intBuyTick); }

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

Закрытие позиций торговой функцией OrderCloseBy

Сообщение Haos » 29 дек 2019, 08:47

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

Закрытие позиций торговой функцией OrderCloseBy

Сообщение Invest_Safe » 29 фев 2020, 19:18

Мне помогло, спасибо.
Последний раз редактировалось Haos 29 фев 2020, 22:50, всего редактировалось 1 раз.
Причина: .
Аватар пользователя
Invest_Safe
 
Сообщений: 15
Зарегистрирован: 29 фев 2020, 15:59
Средств на руках: 0.25 Доллар
Группа: Новые пользователи
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.


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

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

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

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

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

cron