错误、漏洞、问题 - 页 480

 
papaklass:
现在更新了,并试图再次弄清楚它。我几乎在每条线上都放了打印的东西。我将报告结果。

这是与你的插入物一起运行的情况,即止损被固定的时刻。

2011.08.09 00:41:08 核心 1 2011.01.14 01:41:27 欧元兑美元的多头头寸将被关闭止损
2011.08.09 00:41:08 核心 1 2011.01.14 01:41:27-----------------Deal #63 sl 1.33328
2011.08.09 00:41:08 核心 1 2011.01.01.14 01:41:27oldDealsTotal=62 newDealsTotal=63
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27CSampleExpert::Trade
2011.08.09 00:41:08 核心 1 2011.01.14 01:41:27 订单执行 在1.33328卖出0.15 [#63卖出0.15 EURUSD at 1.33328]
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 交易执行 [#63 sell 0.15 EURUSD at 1.33328]
2011.08.09 00:41:08 核心 1 2011.01.14 01:41:27 交易#63在1.33328卖出0.15 EURUSD 完成(基于订单#63)
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27止损 触发 买入 0.15 EURUSD 1.32127 sl: 1.33328 tp: 1.35139 [#63 卖出 0.15 EURUSD at 1.33328]
2011.08.09 00:41:08 Core 1 2011.01.13 18:32:00 EURUSD的多头头寸将被修改跟踪。
 
显然,不同的结果是在OnTrade中的处理方式不同,我只寻找交易,只有它们让我感兴趣,另一方面,按照我的理解,你处理所有的事件,对它们进行分类,在这里有什么地方弄错了。
 
我想,期货投注市场也是一个演示?从MMVB那里拿了一个真正的,批次不一致的。
 
papaklass:

我下的是有效期为1小时的挂单。一小时后,未被激活的订单将在订单到期前关闭。如果几个订单同时被关闭,而在关闭之前,HistoryOrdersTotal()函数有一个非零值,那么它就会失去一些订单。例如,在关闭8个订单之前,该函数的数值为4,但在关闭之后,它的数值为10。两个订单丢失。


你说 "订单丢失 "是什么意思?应该记住的是,进入OnTrade()的信息可能携带不止一个交易事件的信息。此外,如果同时发送几条信息,在处理第一条信息时,历史缓存可能已经发生了变化,你可能会有一种 "丢失事件 "的感觉。

请阅读文章MetaTrader 5中的交易事件

总结

MetaTrader 5交易平台中的所有操作都是异步的,对交易账户中的所有变化发送消息是相互独立的,所以不要试图按照 "一个请求-一个交易事件 "的规则来追踪一个事件。如果你想确定交易事件发生后到底发生了什么变化,你需要分析处理程序OnTrade每次调用时的所有交易、头寸和订单,并将它们与事件出现前的状态进行比较。
 
papaklass:
在关闭订单之前,我特别要求查看HistoryOrdersTotal()的值,它等于4。在关闭8个订单后,HistoryOrdersTotal()的值应该等于12(4+8),但它等于10。我附上了一个日志文件,我们可以在其中不止一次地看到类似的情况。我还附上了专家顾问,通过它可以得到这个结果。自己去做,你会看到一切。

试着改变功能,会发生什么?

void OnTrade(){
//---
   HistorySelect(dayStart,TimeTradeServer());      
   Print("              ",__FUNCTION__,"  :  historyOrdersTotal = ",HistoryOrdersTotal(),"   ",TimeTradeServer()); 
}
     
 
测试员运行的HTML报告并不总是保存在文件中?
 
zigan:
测试员运行的HTML报告并不总是被保存到文件中!

更准确地描述一下。在什么情况下。

 
alexvd:

更准确地描述一下。在什么情况下。

很少,大约在20-30次测试者运行中出现一次 - 打开 "结果 "标签

点击保存XML报告--我得到了报告文件,一切都很好!

点击保存HTML报告--保存文件的窗口弹出,在空的进度条上挂了一会儿(短暂的),然后进度条迅速填满,窗口关闭......但没有创建任何报告文件!

我无法说明这种情况究竟何时发生的模式。

 
Rosh:

试着改变功能,会发生什么?

我不认为这有什么用。OnTrade,作为一个原则问题,不能像papaklass 那样工作。

关键是"你需要分析每次调用OnTrade处理程序时的所有交易、头寸和订单,并与它出现之前的状态进行比较" ,有挂单的例子,这只适用于历史上的订单。 为了避免丢失订单,我将这样修改代码。

引入一个全局变量int oldHistoryOrders; 在Ontrade中,类似这样的内容。

//--------------------------ТОРГОВЫЕ СОБЫТИЯ-------------------------------------------------------------+
void OnTrade(){
//---
   Print(__FUNCTION__);
   HistorySelect(0,TimeCurrent()+1);      
   int newHistoryOrders=HistoryOrdersTotal();
   if(oldHistoryOrders==newHistoryOrders) return;
   Print("oldHistoryOrders=",oldHistoryOrders," newHistoryOrders=",newHistoryOrders);
   for(int i=oldHistoryOrders;i<newHistoryOrders;i++)
      Print("Order ",i," #",HistoryOrderGetTicket(i));
   oldHistoryOrders=newHistoryOrders;    
//   Print("              ",__FUNCTION__,"  :  historyOrdersTotal = ",newHistoryOrders,"   ",dayStart); 
}
附加的文件:
 
papaklass:

这不是你描述的我使用OnTrade()的工作方式。在我所附的代码中,我已经删除了所有的东西,只留下了突出函数的错误的部分。我的EA中几乎没有循环。该EA在单个tick上处理单个符号。因此,我不需要循环。我在12点内处理所有的符号。

PS:OnTrade()通知我一个交易事件。 而什么事件发生是由我的函数定义的,没有循环。

好吧,好吧,我只是指你的例子,据说证明了OnTrade功能造成的订单损失。OnTrade的工作方式是异步的,而不是按ticks计算,所以它不关心你在一个tick中处理多少个符号。你有一堆空单同时过期,所以你不能不采取变通的办法。我已经修改了你的代码,以显示OnTrade没有错过任何东西。我甚至在测试器中运行它,一切似乎都到位了。打印机从OnTrade打印的所有被删除的订单 的代码都存在于日志中。你试过我的版本吗?
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
原因: