Добрый день.
Может кто сможет подсказать, как в MQL5 можно узнать, закрылась сделка по стопу или по тейку в том случае, если стоп был перенесён в безубыток? Я пробовал основываться на прибыли по сделке, но при переносе стопа в безубыток, итоговая прибыль по сделке может быть как минус немного денег, так и плюс немного денег.
При вызове функции HistoryDealGetInteger(pos_ticket, DEAL_REASON) всегда выдаёт DEAL_REASON_EXPERT, так как ордера выставляются через советник. Если бы выдавал DEAL_REASON_SL или DEAL_REASON_TP то вопросов бы не было :(
Заранее благодарю!
Здравствуйте! Не знаю поможет или нет, но опробуйте этот код (выдернул часть из одного своего скрипта):
//+------------------------------------------------------------------+ //| ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ | //+------------------------------------------------------------------+ ulong ticket; ulong deal_ticket; ulong history_ticket; ulong history_order_ticket; ulong order_ticket; ulong pos_ticket; double price; double volume; double profit; datetime time; string symbol; ulong type; ulong entry; ulong reason; ulong pos_ID; ulong order_ID; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { HistorySelect(0,TimeCurrent()); // запросим всю историю сделок и ордеров за указанный период //--- БЛОК ИСТОРИИ ОРДЕРОВ uint history_orders_total=HistoryOrdersTotal(); // получим количество ордеров в истории if(history_orders_total>0) // если ордера в истории получены Print("< ========== БЛОК ИСТОРИИ ОРДЕРОВ ========== >"); // печатаем название раздела for(uint i=history_orders_total-10; i<history_orders_total; i++) // переберём 10-ть последних ордеров { if((history_order_ticket=HistoryOrderGetTicket(i))>0) // если получили тикеты ордеров { //--- получим все остальные свойства сделок history_ticket=HistoryOrderGetInteger(history_order_ticket,ORDER_TICKET); symbol =HistoryOrderGetString(history_order_ticket,ORDER_SYMBOL); time =(datetime)HistoryOrderGetInteger(history_order_ticket,ORDER_TIME_DONE); type =HistoryOrderGetInteger(history_order_ticket,ORDER_TYPE); volume =HistoryOrderGetDouble(history_order_ticket,ORDER_VOLUME_INITIAL); price =HistoryOrderGetDouble(history_order_ticket,ORDER_PRICE_OPEN); reason =HistoryOrderGetInteger(history_order_ticket,ORDER_REASON); order_ID =HistoryOrderGetInteger(history_order_ticket,ORDER_POSITION_ID); //--- если выбрана история ордеров для текущего символа if(symbol==_Symbol) { string text_type=(type==0 ? "Рын. ордер на покупку" : type==1 ? "Рын. ордер на продажу " : type==2 ? "Отл. ордер Buy Limit " : type==3 ? "Отл. ордер Sell Limit " : type==4 ? "Отл. ордер Buy Stop " : "Отл. ордер Sell Stop "); string text_reason=(reason==0 ? "Ордер выставлен из десктопного терминала " : reason==1 ? "Ордер выставлен из мобильного приложения " : reason==2 ? "Ордер выставлен из веб-платформы " : reason==3 ? "Ордер выставлен советником или скриптом " : reason==4 ? "Ордер выставлен в результате срабатывания Stop Loss " : reason==5 ? "Ордер выставлен в результате срабатывания Take Profit" : "Ордер выставлен в результате наступления события Stop Out "); Print("Символ: ",symbol," Тикет: ",history_order_ticket," Время: ",time," Тип: ",text_type, " Объём: ",DoubleToString(volume,2)," Цена: ",DoubleToString(price,5), " Причина: ",text_reason," Идентификатор: ",order_ID); } } } } //+------------------------------------------------------------------+
Если даже не поможет, то хоть натолкнёт на какую-нибудь мысль.
С уважением, Владимир.
Добрый день.
Может кто сможет подсказать, как в MQL5 можно узнать, закрылась сделка по стопу или по тейку в том случае, если стоп был перенесён в безубыток? Я пробовал основываться на прибыли по сделке, но при переносе стопа в безубыток, итоговая прибыль по сделке может быть как минус немного денег, так и плюс немного денег.
При вызове функции HistoryDealGetInteger(pos_ticket, DEAL_REASON) всегда выдаёт DEAL_REASON_EXPERT, так как ордера выставляются через советник. Если бы выдавал DEAL_REASON_SL или DEAL_REASON_TP то вопросов бы не было :(
Заранее благодарю!
Сравнить цену закрытия сделки и цену стоп-лосса. Абсолютное значение их разности сравнить с некой величиной,
например 5 пунктов т.к. закрытие может произойти не точно по цене СЛ, а с проскальзыванием.
Добрый день.
Может кто сможет подсказать, как в MQL5 можно узнать, закрылась сделка по стопу или по тейку в том случае, если стоп был перенесён в безубыток? Я пробовал основываться на прибыли по сделке, но при переносе стопа в безубыток, итоговая прибыль по сделке может быть как минус немного денег, так и плюс немного денег.
При вызове функции HistoryDealGetInteger(pos_ticket, DEAL_REASON) всегда выдаёт DEAL_REASON_EXPERT, так как ордера выставляются через советник. Если бы выдавал DEAL_REASON_SL или DEAL_REASON_TP то вопросов бы не было :(
Заранее благодарю!
Вы точно проверяете сделку типа DEAL_ENTRY_OUT? Складывается впечатление, что проверяется сделка DEAL_ENTRY_IN.
Проверьте результат выполнения этого кода:
void OnStart() { HistorySelect(0, TimeCurrent()); for (int i = HistoryDealsTotal() - 1;i >= 0; --i) { ulong ulTicket = HistoryDealGetTicket(i); Print("Deal #", ulTicket, ", entry: ", EnumToString((ENUM_DEAL_ENTRY)HistoryDealGetInteger(ulTicket, DEAL_ENTRY)), ", reason: ", EnumToString((ENUM_DEAL_REASON)HistoryDealGetInteger(ulTicket, DEAL_REASON))); } }
У меня так:
2023.04.04 14:27:17.536 Test (EURUSD,M1) Deal #1631136465, entry: DEAL_ENTRY_OUT, reason: DEAL_REASON_SL 2023.04.04 14:27:17.537 Test (EURUSD,M1) Deal #1631129873, entry: DEAL_ENTRY_IN, reason: DEAL_REASON_CLIENT 2023.04.04 14:27:17.537 Test (EURUSD,M1) Deal #1624754938, entry: DEAL_ENTRY_OUT, reason: DEAL_REASON_CLIENT 2023.04.04 14:27:17.537 Test (EURUSD,M1) Deal #1624249158, entry: DEAL_ENTRY_OUT, reason: DEAL_REASON_CLIENT 2023.04.04 14:27:17.537 Test (EURUSD,M1) Deal #1624247933, entry: DEAL_ENTRY_IN, reason: DEAL_REASON_CLIENT 2023.04.04 14:27:17.537 Test (EURUSD,M1) Deal #1617235319, entry: DEAL_ENTRY_OUT, reason: DEAL_REASON_CLIENT 2023.04.04 14:27:17.537 Test (EURUSD,M1) Deal #1617234008, entry: DEAL_ENTRY_IN, reason: DEAL_REASON_CLIENT 2023.04.04 14:27:17.537 Test (EURUSD,M1) Deal #1532779966, entry: DEAL_ENTRY_IN, reason: DEAL_REASON_CLIENT
Добрый день.
Может кто сможет подсказать, как в MQL5 можно узнать, закрылась сделка по стопу или по тейку в том случае, если стоп был перенесён в безубыток? Я пробовал основываться на прибыли по сделке, но при переносе стопа в безубыток, итоговая прибыль по сделке может быть как минус немного денег, так и плюс немного денег.
При вызове функции HistoryDealGetInteger(pos_ticket, DEAL_REASON) всегда выдаёт DEAL_REASON_EXPERT, так как ордера выставляются через советник. Если бы выдавал DEAL_REASON_SL или DEAL_REASON_TP то вопросов бы не было :(
Заранее благодарю!
Сначала надо получить сделку выход из рынка
DEAL_ENTRY_IN | Вход в рынок |
DEAL_ENTRY_OUT | Выход из рынка |
DEAL_ENTRY_INOUT | Разворот |
DEAL_ENTRY_OUT_BY | Закрытие встречной позицией |
И только потом проверять как позиция была закрыта
/******************* Если закрылась позиция********************/ if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_OUT) { if(HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_TP) Print("Закрыто по тейку"); if(HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_SL) Print("Закрыто по стопу")); }
Это выдранный кусок из функции OnTradeTransaction()
Вы точно проверяете сделку типа DEAL_ENTRY_OUT? Складывается впечатление, что проверяется сделка DEAL_ENTRY_IN.
Игорь, с целью самообучения, подскажите, пжл, а зачем вообще смотреть на сделку, если закрытие позиции всё-равно происходит путем выставления противоположного ордера с тем же объёмом? Вот этого никак не пойму.
С уважением, Владимир
Игорь, с целью самообучения, подскажите, пжл, а зачем вообще смотреть на сделку, если закрытие позиции всё-равно происходит путем выставления противоположного ордера с тем же объёмом? Вот этого никак не пойму.
С уважением, Владимир
Если закрытие по SL или TP, то история все равно покажет тип DEAL_ENTRY_OUT, что при хедже, что при неттинге. Если же речь о неттинге и закрытие проводится противоположным ордером, то тип выхода будет DEAL_ENTRY_OUT или DEAL_ENTRY_INOUT, а в причине появится все, что угодно, кроме DEAL_REASON_SL или DEAL_REASON_TP. Закрытие ведь не по SL/TP.
Игорь, с целью самообучения, подскажите, пжл, а зачем вообще смотреть на сделку, если закрытие позиции всё-равно происходит путем выставления противоположного ордера с тем же объёмом? Вот этого никак не пойму.
С уважением, Владимир
Владимир, вот эту картинку посмотри
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Вопрос о функции OnTradeTransaction
fxsaber, 2023.03.28 10:24
На скрине сделки, порожденные тейками позиций. При этом тейки не представлены в виде MT5-ордеров.
Если закрытие по SL или TP, то история все равно покажет тип DEAL_ENTRY_OUT, что при хедже, что при неттинге. Если же речь о неттинге и закрытие противоположным ордером, то тип выхода будет DEAL_ENTRY_OUT или DEAL_ENTRY_INOUT, а в причине появится все, что угодно, кроме DEAL_REASON_SL или DEAL_REASON_TP. Закрытие ведь не по SL/TP.
Огромное спасибо! Про неттинг вообще не думал, т.к. у меня его нет. Теперь буду знать.
С уважением, Владимир.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Может кто сможет подсказать, как в MQL5 можно узнать, закрылась сделка по стопу или по тейку в том случае, если стоп был перенесён в безубыток? Я пробовал основываться на прибыли по сделке, но при переносе стопа в безубыток, итоговая прибыль по сделке может быть как минус немного денег, так и плюс немного денег.
При вызове функции HistoryDealGetInteger(pos_ticket, DEAL_REASON) всегда выдаёт DEAL_REASON_EXPERT, так как ордера выставляются через советник. Если бы выдавал DEAL_REASON_SL или DEAL_REASON_TP то вопросов бы не было :(
Заранее благодарю!