文章 "MQL5 Cookbook: 处理 TradeTransaction 事件" - 页 2

 

以下是触发止盈平仓的日志记录。如何在 OnTradeTransaction( constMqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result) 中检测到这一点?

既没有设置 const MqlTradeResult& result 的返回代码(result.retcode)(0 是无选项,TRADE_RETCODE_DONE = 10009),也没有设置 id(交易票据、订单票据、请求 ID)中的一个,以便在不循环所有交易的情况下找到它们。

这是在第 376 行打印的相关标记:

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
...// line 376:
   Print(__LINE__," ",counter," prc:",_ToStr2Dig(trans.price)," tckt: ",trans.position //, "pTrigg:",_ToStr2Dig(trans.price_trigger)
            ," Tr.Type: ",EnumToString(trans.type)//, "DL.类型:",枚举字符串(trans.deal_type)
            ," Tr.OrdType: ",EnumToString(trans.order_type)," Tr.OrdFill: ",EnumToString(trans.order_state)
            ," Tr.tckt:",trans.order," ",trans.position," ",trans.position_by
            ," retCode:",result.retcode," ",result.deal," ",result.order," ",result.deal," ",result.request_id         );
...
  }

这是我在日志中读到的内容:

10:04:40   take profit triggered #2 sell 0.01 EURUSD 1.00319 sl: 1.00816 tp: 1.00171 [#3 buy 0.01 EURUSD at 1.00171]
10:04:40   deal #3 buy 0.01 EURUSD at 1.00171 done (based on order #3)
10:04:40   deal performed [#3 buy 0.01 EURUSD at 1.00171]
10:04:40   order performed buy 0.01 at 1.00171 [#3 buy 0.01 EURUSD at 1.00171]
10:04:40   373  New trade operation dTime1970.01.01 09:03:41
10:04:40   376 0 prc:trans.price=1.00171   tckt: 2 Tr.Type: TRADE_TRANSACTION_DEAL_ADD Tr.OrdType: ORDER_TYPE_BUY Tr.OrdFill: ORDER_STATE_STARTED Tr.tckt:3 2 0 retCode:0 0 0 0 0
10:04:40   489 MqlTradeTransaction: TRADE_TRANSACTION_DEAL_ADD deal #3 DEAL_TYPE_BUY EURUSD 0.01 lot   
10:04:40   376 1 prc:trans.price=1.00171   tckt: 2 Tr.Type: TRADE_TRANSACTION_ORDER_DELETE Tr.OrdType: ORDER_TYPE_BUY Tr.OrdFill: ORDER_STATE_FILLED Tr.tckt:3 2 0 retCode:0 0 0 0 0
10:04:40   383 1 prc:trans.price=1.00171   tckt: 2  res.Ord:0 Tr.Type: TRADE_TRANSACTION_ORDER_DELETE Tr.OrdFill: ORDER_STATE_FILLED Tr.OrdType: ORDER_TYPE_BUY Tr.tckt:3 2 0 Res::0 0 0 0 0
10:04:40   408 PosExists #3 2 mag:0 ORDER_STATE_FILLED ORDER_TYPE_BUY
10:04:40   376 2 prc:trans.price=1.00171   tckt: 2 Tr.Type: TRADE_TRANSACTION_HISTORY_ADD Tr.OrdType: ORDER_TYPE_BUY Tr.OrdFill: ORDER_STATE_FILLED Tr.tckt:3 2 0 retCode:0 0 0 0 0
10:04:40   408 PosExists #3 2 mag:0 ORDER_STATE_FILLED ORDER_TYPE_BUY
2022.09.26 14:08:33.755    disconnected

终端写得非常漂亮:"止盈触发 #2 卖出 0.01 EURUSD 1.00319 sl: 1.00816 tp: 1.00171 [#3 在 1.00171 买入 0.01 EURUSD]"。

为什么没有 TRADE_TRANSACTION_TRIGGERED_PT 和 TRADE_TRANSACTION_TRIGGERED_SL 这样的标志?

请求的返回代码总是不设置吗?

 
造成混乱的部分原因是ENUM_ORDER_TYPE 0 = ORDER_TYPE_BUY。因此,EA 无法区分该字段的值是用 ORDER_TYPE_BUY 设置的,还是无效因而未设置的--太好了!!!
 

丹尼斯,谢谢你的文章!我饶有兴趣地阅读了这篇文章,但我还没有完全理解我所读到的内容。我还下载了您的 TradeProcessor 智能交易系统,并在我的终端上运行了它,目前我有一个未结头寸。我看了打印输出,随即出现了一些问题,我想自己找到答案。好吧,如果我做不到,就只能麻烦您了。))

再见,弗拉基米尔。

 
MrBrooklin 未结头寸。我看了打印输出,随即出现了一些问题,我想自己找到答案。好吧,如果我做不到,就只能麻烦您了。))

再见,弗拉基米尔。

谢谢您的意见。 不客气,布鲁克林先生!))

 
Denis Kirichenko #:

谢谢您的意见。 不客气,布鲁克林先生!))

丹尼斯,对不起,没有您的帮助,我的脑子会 "爆炸 "的。这是您的 EA(顺便说一句,非常棒的 EA!!!)的一次通行结果:

2023.10.27 17:11:02.514 TradeProcessor (EURUSDrfd,D1)   Проход : #100
2023.10.27 17:11:02.514 TradeProcessor (EURUSDrfd,D1)   Поступил запрос: изменить параметры отложенного ордера
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   ---===Транзакция===---
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тикет сделки: 0
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тип сделки: DEAL_TYPE_BUY
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тикет ордера: 1030195768
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Состояние ордера: ORDER_STATE_PLACED
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тип ордера: ORDER_TYPE_SELL_STOP
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Цена: 1.05853
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Уровень Stop Loss: 1.(скрыл значения стоп-лосса)
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Уровень Take Profit: 1.05803
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Цена срабатывания стоп-лимитного ордера: 0.00000
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Торговый инструмент: EURUSDrfd
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Срок истечения отложенного ордера: 2023.10.27 00:00
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тип ордера по времени действия: ORDER_TIME_DAY
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тип торговой транзакции: TRADE_TRANSACTION_ORDER_UPDATE
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тикет позиции: 0
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Объём в лотах: 0.04
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Проход : #101

我不明白的是

  1. 我的 EA 下了一个挂单 SELL_STOP;
  2. 您的 EA 写的是 - 交易类型 DEAL_TYPE_BY(用黄色标出)。为了以防万一,我查看了 MQL5 参考指南。它说DEAL_TYPE_BY 是:

ENUM_DEAL_TYPE

标识符

描述

DEAL_TYPE_BUY

买入


问题 - 当修改挂单 SELL_STOP 时,如何将交易类型确定为BUY?????))

谢谢,弗拉基米尔。

 

没有交易。下挂单和处理挂单不涉及任何交易。交易单 = 0,类型 = 0,其中 0相当于 枚举 ENUM_DEAL_TYPE 的 DEAL_TYPE_BUY。也就是说,在 MqlTradeTransaction 结构中 ,有些字段已填充,有些则未填充。未填充的字段通常为空。

更多详情:请参阅有关挂单的文档

这种类型 的交易将填充交易字段:

TRADE_TRANSACTION_DEAL_*

在 MqlTradeTransaction 结构中,与交易处理相关的交易(TRADE_TRANSACTION_DEAL_ADD、TRADE_TRANSACTION_DEAL_UPDATE 和 TRADE_TRANSACTION_DEAL_DELETE)会填充以下字段:

  • deal - 交易票据;
  • order - 交易订单的票据;
  • symbol - 交易中金融工具的名称;
  • type - 交易类型;
  • deal_type - 交易类型;
  • price - 交易价格;
  • price_sl - 止损价格(如果交易订单中指定了止损价格,则填写该价格);
  • price_tp - Take Profit(获利价格)(如果订单中指定了该价格,则填写该价格,并以此为基础进行交易);
  • volume - 以手为单位的交易量。
  • position - 因执行交易而开仓、改仓或平仓的仓单。
  • position_by - 反向仓位的单据。它只用于通过反向(out by)平仓的交易。


只有 3 种交易属于 "交易 "类型:TRADE_TRANSACTION_DEAL_ADD、TRADE_TRANSACTION_DEAL_UPDATE、TRADE_ TRANSACTION_DEAL_DELETE

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
  • www.mql5.com
Структура торговой транзакции - Структуры данных - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Denis Kirichenko #:

没有交易。下挂单不涉及任何交易。交易单 = 0,类型 = 0,其中 0相当于 枚举 ENUM_DEAL_TYPE 的 DEAL_TYPE_BUY 也就是说,在 MqlTradeTransaction 结构中 ,有些字段已填充,有些则未填充。未填充的字段通常清零。

更多详情:请参阅有关挂单的文档

啊哈,就是这样!!!!天啊,我的头都要炸了!))

谢谢

谢谢,弗拉基米尔