检测OnTradeTransaction回测中的止损触发器

 

你好。

我试图在我的EA中检测一个停止执行。不幸的是,我只得到 MqlTradeTransaction提供的DEAL_ENTRY_IN,传递给OnTradeTransaction。

这似乎只是回测中的情况。

有谁知道如何在回测中可靠地检测被触发的止损--最好是与价格和(部分)利润一起?

谢谢你

Documentation on MQL5: Standard Constants, Enumerations and Structures / Trade Constants / Deal Properties
Documentation on MQL5: Standard Constants, Enumerations and Structures / Trade Constants / Deal Properties
  • www.mql5.com
Standard Constants, Enumerations and Structures / Trade Constants / Deal Properties - Documentation on MQL5
 
chinaski:

你好。

我试图在我的EA中检测一个停止执行。不幸的是,我只得到 MqlTradeTransaction提供的DEAL_ENTRY_IN,传递给OnTradeTransaction。

这似乎只是回测中的情况。

有谁知道如何在回测中可靠地检测被触发的止损--最好是与价格和(部分)利润一起?

谢谢。

在OnTradeTransaction中,你必须检查:

trans.order_state = ORDER_STATE_PLACED;

紧随其后的是另一个交易,即:

trans.type = TRADE_TRANSACTION_DEAL_ADD;
 
angevoyageur:

在OnTradeTransaction中,你必须检查是否有 。

后面是另一个交易,其中有:

你好Angevoyageur。

请看一下我的转储。这个转储将所有交易打印到一个文件中。我的EA非常简单。它买入或卖出,并带有止损和目标。不幸的是,我在日志中找不到任何交易,即

与触发的止损或目标有关的交易。

20130507 00:26:59:672 entry short at 1.32176 <- entry short
20130507 00:26:59:672 symbol=EURUSD price=1.3217600 volume=0.01 sl=1.3229200 tp=1.3202000 order=2 deal=2 entry-type=IN trans-type=DEAL_ADD order_type=BUY deal_type=DEAL_TYPE_SELL type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00
20130507 00:26:59:672 symbol=EURUSD price=1.3217600 volume=0.01 sl=1.3229200 tp=1.3202000 order=2 deal=0 entry-type=IN trans-type=ORDER_DELETE order_type=SELL deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00
20130507 00:26:59:672 symbol=EURUSD price=1.3217600 volume=0.00 sl=1.3229200 tp=1.3202000 order=2 deal=0 entry-type=IN trans-type=HISTORY_ADD order_type=SELL deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00
20130507 00:26:59:672 symbol= price=0.0000000 volume=0.00 sl=0.0000000 tp=0.0000000 order=0 deal=0 entry-type=IN trans-type=REQUEST order_type=BUY deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00

/// before the entry long, the stop or target of entry short should be triggerd.
/// The EA does not allow to enter new trade before latest is closed, simply by check current positions for symbol before open an entry tradde.

20130507 00:26:59:674 entry long at 1.32140 <- entry long
20130507 00:26:59:674 symbol=EURUSD price=1.3214000 volume=0.01 sl=1.3200900 tp=1.3231100 order=3 deal=3 entry-type=IN trans-type=DEAL_ADD order_type=BUY deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00
20130507 00:26:59:674 symbol=EURUSD price=1.3214000 volume=0.01 sl=1.3200900 tp=1.3231100 order=3 deal=0 entry-type=IN trans-type=ORDER_DELETE order_type=BUY deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00
20130507 00:26:59:674 symbol=EURUSD price=1.3214000 volume=0.00 sl=1.3200900 tp=1.3231100 order=3 deal=0 entry-type=IN trans-type=HISTORY_ADD order_type=BUY deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00
20130507 00:26:59:674 symbol= price=0.0000000 volume=0.00 sl=0.0000000 tp=0.0000000 order=0 deal=0 entry-type=IN trans-type=REQUEST order_type=BUY deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00

/// As you can see, my entry short shows transaction BUY, SELL, SELL what ever the purpose of this confusing transactions is.
/// No a bit about stop or target orders

那么,如何获得止损和目标的交易?我在这里谈的是回溯测试。不知道在真实条件下是否也是如此。

 
chinaski:

你好,Angevoyageur。

请看一下我的转储。这个转储将所有交易打印到一个文件中。我的EA非常简单。它买入或卖出,并带有止损和目标。不幸的是,我在日志中找不到任何交易,即

与触发的止损或目标有关的交易。

那么,如何获得止损和目标的交易?我在这里谈的是回溯测试。不确定在真实条件下是否也是如此。

好吧,对不起,我误解了你的第一个问题,当你说 "触发的止损 "时,我想到的是一个挂单(买入止损或卖出止损)。

你确定你需要监控交易吗?如果你一次只做一笔交易,你可以用PositionSelect(_Symbol)简单地检查你的开仓情况。

 
angevoyageur:

好的,对不起,我误解了你的第一个问题,当你说 "触发的止损 "时,我想到的是一个挂单(买入止损或卖出止损)。

你确定你需要监控交易吗?如果你一次只做一笔交易,你可以用PositionSelect(_Symbol)简单地检查你的开仓情况。

你好。

为了检查一个头寸是否开放,我已经做了CPositionInfo.Select。

但是,一旦止损或目标被触发,如何获得已执行的止损或目标价格?有什么聪明的方法吗?

 
chinaski:

你好。

为了检查一个头寸是否开放,我已经做了CPositionInfo.Select。

但是,一旦止损或目标被触发,如何获得执行的止损或目标价格?有什么聪明的方法吗?

为什么不检查 交易历史?
 
angevoyageur:
为什么不检查交易历史?

能否请你提供更多的细节。我需要执行的止损或目标价格。没有触发目标或止损的交易ID或票据(没有作为交易传递)。

历史记录提供了DEAL_PRICE,但我需要一个交易#或票据。应该选择哪种票据或交易?谢谢你

Documentation on MQL5: Standard Constants, Enumerations and Structures / Trade Constants / Deal Properties
Documentation on MQL5: Standard Constants, Enumerations and Structures / Trade Constants / Deal Properties
  • www.mql5.com
Standard Constants, Enumerations and Structures / Trade Constants / Deal Properties - Documentation on MQL5
 
chinaski:

能否请你提供更多的细节。我需要执行的止损或目标价格。没有触发目标或止损的交易ID或票据(没有作为交易传递)。

历史记录提供了DEAL_PRICE,但我需要一个交易#或票据。应该选择哪种票据或交易?谢谢你

当触发止损或止盈时,你有一个与你的交易相反的交易。例如,您有一个买入0.25手的仓位。当你的sl/tp被触发时,你将有一个卖出类型的交易,你可以使用OnTradeTransaction来监控,或者当你知道你的头寸被关闭时,简单地查看交易历史。

请看这里代码示例

 
angevoyageur:

当sl或tp被触发时,你就会与你交易的另一方进行交易。例如,你有一个买入0.25手的仓位。当你的sl/tp被触发时,你会有一个卖出类型的交易,你可以使用OnTradeTransaction来监控,或者当你知道你的头寸被关闭时,简单地查看交易历史。

请看这里代码例子

你好,Angev。

这是我的问题:显然我不能使用OnTradeTransaction。请看我上面的日志。那里没有列出止损或目标订单--所以没有执行与止损或目标有关的交易。

我再次谈及回溯测试。

 
chinaski:

你好,Angev。

这是我的问题:显然我不能使用OnTradeTransaction。请看我上面的日志。那里没有列出止损或目标订单--所以没有执行与止损或目标有关的交易。 转储是为传给OnTradeTransaction的每一笔交易而创建的。

再一次,我说的是回溯测试。

我唯一能做的就是测试你的代码,如果你提供的话。我没有这样的问题。
 
angevoyageur:
我唯一能做的就是测试你的代码,如果你提供的话。我没有这样的问题。

你好,angevoyageur。

我在附件中找到一个简单的EA,证明了这个问题。该EA开仓做多,并带有止损和目标,然后做空,再做多,如此循环。

也包含了一个抛售方法。只需应用EUR.USD 1分钟1周,观察回测 日志中的交易转储。

谢谢你的帮助。

附加的文件:
tc_ea_trans.mq5  11 kb