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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Закрытие позиций торговой функцией 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
     
    Сообщений: 15660
    Зарегистрирован: 29 мар 2014, 16:07
    Средств на руках: 881.25 Доллар
    Группа: Главные модераторы
    Благодарил (а): 2143 раз.
    Поблагодарили: 6406 раз.


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

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

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

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

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