Netting MT5, как отловить момент закрытия по стоп лосс.

 

Проблема вот в чем:

нужно отловить момент закрытия позиции (по sl, tp или ручное закрытие) в неттинг версии. Ловлю это простой проверкой: 

OnTick(){
......
        int market_trades = TM.GetMarketPositions();
        if (!market_trades && last_market_trades > 0){
                UpdatePendingOrders();                                  
        }
        last_market_trades = TM.GetMarketPositions();
......
}

То есть каждый тик проверяю, если на прошлом тике позиция была, а на этом тике позиции нет - она только что закрылась.


Суть проблемы такая:

ЕА открывает три отложенных ордера, к примеру SellStop. Один из них становится рыночным. Чуть позже позиция закрывается по SL и на этом же тикеодин из отложенных ордеров становится рыночным. Таким образом, технически позиция осталась открытой - но закрытие по SL было и я пока не могу понять как в этом случае отловить это закрытие.

Может у кого нибудь будут идеи? Заранее спасибо!

 
https://www.mql5.com/ru/docs/event_handlers/ontradetransaction
Документация по MQL5: Обработка событий / OnTradeTransaction
Документация по MQL5: Обработка событий / OnTradeTransaction
  • www.mql5.com
При обрабокте транзакций типа TRADE_TRANSACTION_REQUEST для получения дополнительной информации необходимо анализировать второй и третий параметры функции OnTradeTransaction() – Отправка торгового запроса на покупку приводит к цепи торговых транзакций, которые совершаются на торговом счете: 1) запрос  принимается на обработку, 2) далее для...
 
vvebus:

Проблема вот в чем:

нужно отловить момент закрытия позиции (по sl, tp или ручное закрытие) в неттинг версии. Ловлю это простой проверкой: 

То есть каждый тик проверяю, если на прошлом тике позиция была, а на этом тике позиции нет - она только что закрылась.


Суть проблемы такая:

ЕА открывает три отложенных ордера, к примеру SellStop. Один из них становится рыночным. Чуть позже позиция закрывается по SL и на этом же тикеодин из отложенных ордеров становится рыночным. Таким образом, технически позиция осталась открытой - но закрытие по SL было и я пока не могу понять как в этом случае отловить это закрытие.

Может у кого нибудь будут идеи? Заранее спасибо!

Дополню предыдущий ответ: OnTradeTransaction и ENUM_DEAL_REASON

ENUM_DEAL_REASON

Идентификатор

Описание

DEAL_REASON_CLIENT

Сделка проведена в результате срабатывания ордера, выставленного из десктопного терминала

DEAL_REASON_MOBILE

Сделка проведена в результате срабатывания ордера, выставленного из мобильного приложения

DEAL_REASON_WEB

Сделка проведена в результате срабатывания ордера, выставленного из веб-платформы

DEAL_REASON_EXPERT

Сделка проведена в результате срабатывания ордера, выставленного из MQL5-программы – советником или скриптом

DEAL_REASON_SL

Сделка проведена в результате срабатывания ордера Stop Loss

DEAL_REASON_TP

Сделка проведена в результате срабатывания ордера Take Profit

DEAL_REASON_SO

Сделка проведена в результате наступления события Stop Out

DEAL_REASON_ROLLOVER

Сделка проведена по причине переноса позиции

DEAL_REASON_VMARGIN

Сделка проведена по причине начисления/списания вариационной маржи

DEAL_REASON_SPLIT

Сделка проведена по причине сплита (понижения цены) инструмента, по которому имелась позиция на момент проведения сплита

 
Алексей Тарабанов:
https://www.mql5.com/ru/docs/event_handlers/ontradetransaction
Vladimir Karputov:

Дополню предыдущий ответ: OnTradeTransaction и ENUM_DEAL_REASON

Должно помочь, спасибо!

Пока что не вижу ручного удаления, но проведу тесты, может выкинет в лог нужную причину. Потом отпишусь.

 
vvebus:

Проблема вот в чем:

нужно отловить момент закрытия позиции (по sl, tp или ручное закрытие) в неттинг версии. Ловлю это простой проверкой: 

То есть каждый тик проверяю, если на прошлом тике позиция была, а на этом тике позиции нет - она только что закрылась.


Суть проблемы такая:

ЕА открывает три отложенных ордера, к примеру SellStop. Один из них становится рыночным. Чуть позже позиция закрывается по SL и на этом же тикеодин из отложенных ордеров становится рыночным. Таким образом, технически позиция осталась открытой - но закрытие по SL было и я пока не могу понять как в этом случае отловить это закрытие.

Может у кого нибудь будут идеи? Заранее спасибо!

 Я бы на Вашем месте немного изменил логику программы. То как это есть сейчас, на реальном счете чревато проблемами.

Ситуация. Есть позиция селл и у нее есть стоплосс. На этом же уровне стоплосс вы хотите открыться в бай тем же лотом (установлен отложенный ордер). В реальности может получиться так, что отложка сработает ДО стопа и позиция схлопнется. И новой не будет. Если же отложка большего объема чем текущая позиция, то в результате будет INOUT сделка и новая позиция мелкого объема, да еще и без стопов.

В тестере этого не наиграть, а на живом счете может быть легко.

 
Andrey Barinov:

 Я бы на Вашем месте немного изменил логику программы. То как это есть сейчас, на реальном счете чревато проблемами.

Ситуация. Есть позиция селл и у нее есть стоплосс. На этом же уровне стоплосс вы хотите открыться в бай тем же лотом (установлен отложенный ордер). В реальности может получиться так, что отложка сработает ДО стопа и позиция схлопнется. И новой не будет. Если же отложка большего объема чем текущая позиция, то в результате будет INOUT сделка и новая позиция мелкого объема, да еще и без стопов.

В тестере этого не наиграть, а на живом счете может быть легко.

К сожалению, логику стратегии менять нельзя.

 

Сделал так:

  • в начале и конце каждого тика запихиваю в массивы все сделки, которые были выполнены по DEAL_ENTRY_OUT.
  • сравниваю количество тикетов в конце прошлого тика и начале нового тика. 
  • Если количество разное - значит только что было какое то закрытие.

пока что все работает как надо.


Всем спасибо!

 
vvebus:

К сожалению, логику стратегии менять нельзя.

Я написал логику программы, а не логику стратегии. Это разные вещи.

 
Andrey Barinov:

 Я бы на Вашем месте немного изменил логику программы. То как это есть сейчас, на реальном счете чревато проблемами.

Ситуация. Есть позиция селл и у нее есть стоплосс. На этом же уровне стоплосс вы хотите открыться в бай тем же лотом (установлен отложенный ордер). В реальности может получиться так, что отложка сработает ДО стопа и позиция схлопнется. И новой не будет. Если же отложка большего объема чем текущая позиция, то в результате будет INOUT сделка и новая позиция мелкого объема, да еще и без стопов.

В тестере этого не наиграть, а на живом счете может быть легко.

А если стратегия не предусматривает открытие отложенных ордеров вообще? Зачем давать советы, равно как и ходить в чужой монастырь со своим уставом?

 
Alexey Viktorov:

А если стратегия не предусматривает открытие отложенных ордеров вообще? Зачем давать советы, равно как и ходить в чужой монастырь со своим уставом?

А Вы первый пост ветки читали?

 
Andrey Barinov:

Я написал логику программы, а не логику стратегии. Это разные вещи.

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