Пример когда позиция открыта, когда позиция закрыта, когда сработал Стоп лосс или когда сработал Тейк профит:
//+------------------------------------------------------------------+ //| OnTradeTransaction Info.mq5 | //| Copyright © 2020, Vladimir Karputov | //+------------------------------------------------------------------+ #property copyright "Copyright © 2020, Vladimir Karputov" #property version "1.00" //--- input parameters //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- } //+------------------------------------------------------------------+ //| TradeTransaction function | //+------------------------------------------------------------------+ void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) { //--- get transaction type as enumeration value ENUM_TRADE_TRANSACTION_TYPE type=trans.type; //--- if transaction is result of addition of the transaction in history if(type==TRADE_TRANSACTION_DEAL_ADD) { long deal_ticket =0; long deal_order =0; long deal_time =0; long deal_time_msc =0; long deal_type =-1; long deal_entry =-1; long deal_magic =0; long deal_reason =-1; long deal_position_id =0; double deal_volume =0.0; double deal_price =0.0; double deal_commission =0.0; double deal_swap =0.0; double deal_profit =0.0; string deal_symbol =""; string deal_comment =""; string deal_external_id =""; if(HistoryDealSelect(trans.deal)) { deal_ticket =HistoryDealGetInteger(trans.deal,DEAL_TICKET); deal_order =HistoryDealGetInteger(trans.deal,DEAL_ORDER); deal_time =HistoryDealGetInteger(trans.deal,DEAL_TIME); deal_time_msc =HistoryDealGetInteger(trans.deal,DEAL_TIME_MSC); deal_type =HistoryDealGetInteger(trans.deal,DEAL_TYPE); deal_entry =HistoryDealGetInteger(trans.deal,DEAL_ENTRY); deal_magic =HistoryDealGetInteger(trans.deal,DEAL_MAGIC); deal_reason =HistoryDealGetInteger(trans.deal,DEAL_REASON); deal_position_id =HistoryDealGetInteger(trans.deal,DEAL_POSITION_ID); deal_volume =HistoryDealGetDouble(trans.deal,DEAL_VOLUME); deal_price =HistoryDealGetDouble(trans.deal,DEAL_PRICE); deal_commission =HistoryDealGetDouble(trans.deal,DEAL_COMMISSION); deal_swap =HistoryDealGetDouble(trans.deal,DEAL_SWAP); deal_profit =HistoryDealGetDouble(trans.deal,DEAL_PROFIT); deal_symbol =HistoryDealGetString(trans.deal,DEAL_SYMBOL); deal_comment =HistoryDealGetString(trans.deal,DEAL_COMMENT); deal_external_id =HistoryDealGetString(trans.deal,DEAL_EXTERNAL_ID); } else return; string str_entry="-"; if(deal_entry==DEAL_ENTRY_IN) str_entry="Entry in."; if(deal_entry==DEAL_ENTRY_OUT) str_entry="Entry out."; if(deal_entry==DEAL_ENTRY_INOUT) str_entry="Reverse."; if(deal_entry==DEAL_ENTRY_OUT_BY) str_entry="Close a position by an opposite one."; string str_reason="-"; if(deal_reason==DEAL_REASON_SL) str_reason="The deal was executed as a result of Stop Loss activation."; if(deal_reason==DEAL_REASON_TP) str_reason="The deal was executed as a result of Take Profit activation."; Print("Adding a deal to the history."," ",str_entry," ",(str_reason=="-")?"":str_reason+" ", deal_symbol," ",DoubleToString(deal_volume,2)); } //--- if transaction is result of adding a new open order if(type==TRADE_TRANSACTION_ORDER_ADD) { } } //+------------------------------------------------------------------+
- www.metatrader5.com
Пример когда позиция открыта, когда позиция закрыта, когда сработал Стоп лосс или когда сработал Тейк профит:
Зачем лишние действия?
ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
Можно просто
switch(trans.type) { case TRADE_TRANSACTION_DEAL_ADD: ///-------------------------------- break;case TRADE_TRANSACTION_ORDER_ADD:
///-------------------------------- break;}
Пример когда позиция открыта, когда позиция закрыта, когда сработал Стоп лосс или когда сработал Тейк профит:
Спасибо за ответ. OnTradeTransaction () не управляется графиком?
Потому что, когда я подаю заявку на EURUSD и GBPUSD, она печатается 2 раза.
Пожалуйста, дайте мне знать, как я могу отличить идентификацию запроса. Если это возможно, используйте таблицу, на которой они применяются.
Спасибо за ответ. OnTradeTransaction () не управляется графиком?
Потому что, когда я подаю заявку на EURUSD и GBPUSD, она печатается 2 раза.
Пожалуйста, дайте мне знать, как я могу отличить идентификацию запроса. Если это возможно, используйте таблицу, на которой они применяются.
OnTradeTransaction отлавливает все транзакции.
Ваша задача - отобрать нужную транзакцию (по символу ('deal_symbol') , по Magic number ('deal_magic'), по типу ('deal_entry').
Пример: в OnTradeTransaction отлавливает все транзакции TRADE_TRANSACTION_DEAL_ADD по текущему символу и Magic number, сделки DEAL_ENTRY_IN
//+------------------------------------------------------------------+ //| TradeTransaction function | //+------------------------------------------------------------------+ void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) { //--- get transaction type as enumeration value ENUM_TRADE_TRANSACTION_TYPE type=trans.type; //--- if transaction is result of addition of the transaction in history if(type==TRADE_TRANSACTION_DEAL_ADD) { long deal_ticket =0; long deal_order =0; long deal_time =0; long deal_time_msc =0; long deal_type =-1; long deal_entry =-1; long deal_magic =0; long deal_reason =-1; long deal_position_id =0; double deal_volume =0.0; double deal_price =0.0; double deal_commission =0.0; double deal_swap =0.0; double deal_profit =0.0; string deal_symbol =""; string deal_comment =""; string deal_external_id =""; if(HistoryDealSelect(trans.deal)) { deal_ticket =HistoryDealGetInteger(trans.deal,DEAL_TICKET); deal_order =HistoryDealGetInteger(trans.deal,DEAL_ORDER); deal_time =HistoryDealGetInteger(trans.deal,DEAL_TIME); deal_time_msc =HistoryDealGetInteger(trans.deal,DEAL_TIME_MSC); deal_type =HistoryDealGetInteger(trans.deal,DEAL_TYPE); deal_entry =HistoryDealGetInteger(trans.deal,DEAL_ENTRY); deal_magic =HistoryDealGetInteger(trans.deal,DEAL_MAGIC); deal_reason =HistoryDealGetInteger(trans.deal,DEAL_REASON); deal_position_id =HistoryDealGetInteger(trans.deal,DEAL_POSITION_ID); deal_volume =HistoryDealGetDouble(trans.deal,DEAL_VOLUME); deal_price =HistoryDealGetDouble(trans.deal,DEAL_PRICE); deal_commission =HistoryDealGetDouble(trans.deal,DEAL_COMMISSION); deal_swap =HistoryDealGetDouble(trans.deal,DEAL_SWAP); deal_profit =HistoryDealGetDouble(trans.deal,DEAL_PROFIT); deal_symbol =HistoryDealGetString(trans.deal,DEAL_SYMBOL); deal_comment =HistoryDealGetString(trans.deal,DEAL_COMMENT); deal_external_id =HistoryDealGetString(trans.deal,DEAL_EXTERNAL_ID); } else return; ENUM_DEAL_ENTRY enum_deal_entry=(ENUM_DEAL_ENTRY)deal_entry; if(deal_symbol==m_symbol.Name() && deal_magic==InpMagic) { if(deal_type==DEAL_TYPE_BUY || deal_type==DEAL_TYPE_SELL) { if(deal_entry==DEAL_ENTRY_IN) { } } } } }
- www.mql5.com
OnTradeTransaction отлавливает все транзакции.
Ваша задача - отобрать нужную транзакцию (по символу (' deal_symbol ') , по Magic number (' deal_magic '), по типу (' deal_entry ').
Пример: в OnTradeTransaction отлавливает все транзакции TRADE_TRANSACTION_DEAL_ADD по текущему символу и Magic number, сделки DEAL_ENTRY_IN
Что делать, если я пытаюсь торговать вручную? Магическое число всегда 0.
Что делать, если я пытаюсь торговать вручную? Магическое число всегда 0.
Да, правильно. При ручной торговле Magic number автоматически проставляется как '0' - именно '0' является признаком ручной торговли.
(Но нужно ещё, на всякий случай, проверять 'deal_reason' на равенство DEAL_REASON_EXPERT)
Да, правильно. При ручной торговле Magic number автоматически проставляется как '0' - именно '0' является признаком ручной торговли.
(Но нужно ещё, на всякий случай, проверять 'deal_reason' на равенство DEAL_REASON_EXPERT)
Поправлю: на неравенство
- ведь нужно отследить ручное действие, а не советником. Тогда и магик не нужно отслеживать.
У меня все еще есть запрос. Если сделка была открыта 4 месяца назад, а теперь она закрывается через 4 месяца или даже 5 месяцев, будет доступна история, так как функция истории не может загружать историю более 28 дней, я полагаю.
И сработает ли функция OnTradeTransaction (), если брокер внезапно закроет позицию?
Пожалуйста, дайте мне знать.
У меня все еще есть запрос. Если сделка была открыта 4 месяца назад, а теперь она закрывается через 4 месяца или даже 5 месяцев, будет доступна история, так как функция истории не может загружать историю более 28 дней, я полагаю.
Откуда такое мнение? У Вас есть доказательства?
Закрытие или открытие позиции - эти действия записываются в торговую историю. Соответственно сработает OnTradeTransaction.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Я хочу определить, когда сделка является покупкой или продажей, или применен отложенный ордер, или ожидающий конвертируется в мгновенный ордер, или SL, или TP, или сделка закрывается.
Я хочу выполнить действие, когда процесс полностью выполнен и внутри OnTradeTransaction ().
Посоветуйте, пожалуйста, как мне это сделать.