mql5语言的特点、微妙之处以及技巧 - 页 86 1...798081828384858687888990919293...247 新评论 fxsaber 2018.06.20 21:25 #851 关于交易、自动交易系统和交易策略测试的论坛 虫子,虫子,问题 fxsaber, 2018.06.20 23:18 决定检查一下,当一个订单在系统中但不在终端中时,这些幻象订单的情况会持续多久。 // Советник отслеживает длительность ситуаций, когда ордер отсутствует среди текущих и исторических #define TOSTRING(A) #A + " = " + (string)(A) + "\n" #define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n" bool OrderIsExist( const ulong &OrderTicket ) { return(OrderTicket ? OrderSelect(OrderTicket) || HistoryOrderSelect(OrderTicket) : true); } void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest&, const MqlTradeResult& ) { static bool PrevIsExist = true; static ulong StartTime = 0; static ulong MaxInterval = 0; const ulong NowTime = GetMicrosecondCount(); const bool IsExist = OrderIsExist(Trans.order); if (!IsExist) { Print(TOSTRING2(Trans.type) + TOSTRING(Trans.order) + TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order))); if (PrevIsExist) StartTime = NowTime; } else if (!PrevIsExist) { const ulong Interval = NowTime - StartTime; Print(TOSTRING(Interval) + TOSTRING2(Trans.type) + TOSTRING(Trans.order) + TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order))); if (Interval > MaxInterval) { MaxInterval = Interval; Comment(TOSTRING(MaxInterval) + TOSTRING(Trans.order)); // mcs. } } PrevIsExist = IsExist; } 结果 2018.06.21 00:10:31.047 Trans.type = TRADE_TRANSACTION_ORDER_DELETE (2) 2018.06.21 00:10:31.047 Trans.order = 2210967406 2018.06.21 00:10:31.047 OrderSelect(Trans.order) = false 2018.06.21 00:10:31.047 HistoryOrderSelect(Trans.order) = false 2018.06.21 00:10:31.047 2018.06.21 00:10:31.080 Interval = 32643 2018.06.21 00:10:31.080 Trans.type = TRADE_TRANSACTION_HISTORY_ADD (3) 2018.06.21 00:10:31.080 Trans.order = 2210967406 2018.06.21 00:10:31.080 OrderSelect(Trans.order) = false 2018.06.21 00:10:31.080 HistoryOrderSelect(Trans.order) = true 32毫秒,一个订单在那里,但不在终端中!试想一下,如果交易逻辑在这个区间内执行,后果会怎样......。 有趣的是,幽灵订单最常出现在TRADE_TRANSACTION_ORDER_DELETE 和TRADE_TRANSACTION_DEAL_ADD(更罕见)交易类型。 非常糟糕的平台细微差别。 ZZY 遗憾的是,5号的贸易交易速度值得怀疑。 fxsaber 2018.07.06 07:30 #852 如果你从一开始就提出历史请求,那么HistorySelect就很慢。因此,可取的做法是这样的 关于交易、自动交易系统和测试交易策略的论坛 订单关闭时间专家顾问MQL5 fxsaber, 2018.07.06 09:27 void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime ) { static datetime PrevTime = 0; if (HistorySelect(PrevTime, INT_MAX)) // HistorySelect(0, INT_MAX) - slow. { for (int i = HistoryDealsTotal() - 1; i >= 0; i--) { const ulong Ticket = HistoryDealGetTicket(i); if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT) { CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME); if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID))) OpenTime = (datetime)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME); break; } } } PrevTime = CloseTime; } 很明显,这个解决方案已经濒临成为一个拐杖了。其他的实现方式就不会再那么简洁了。绕过刹车的简单方法一般不会奏效。 Fast235 2018.07.06 12:22 #853 fxsaber: 快速的多符号OnTick实现我搞不清楚。 为什么OnTick是带参数的Symbol,为什么是不带参数的? 以及为什么又在评论下面? 为什么不只是一个基本的OnChartEvent? void OnTick() { OnTick(_Symbol); } void OnChartEvent( const int id, const long &lparam, const double&, const string& ) { if (id == CHARTEVENT_CUSTOM) OnTick(Symbols[(int)lparam]); } // Мультисимвольный OnTick void OnTick( const string &Symb ) { } Fast235 2018.07.06 12:39 #854 fxsaber,我们有一个很酷的代号druker。我搞不清楚这个芯片 fxsaber 2018.07.06 12:44 #855 快528。为什么不通过一个基本的OnChartEvent? 因为要把 "苍蝇和肉片 "分开,很方便。在一个多字符的OnTick中写入所有逻辑。名字中的巧合是随机的...... Fast235 2018.07.06 12:46 #856 fxsaber:因为要把 "苍蝇和肉片 "分开,很方便。在一个多符号的OnTick中写入所有的逻辑。名字上的巧合是巧合......。...与你们所有人在一起,直到2028年...。 这是你的代码,我会找到完整的代码。 Индикатор #property indicator_chart_window #property indicator_plots 0 input long Chart = 0; // идентификатор графика-получателя события input int Index = 0; int OnCalculate( const int rates_total, const int prev_calculated, const int, const double &[] ) { if (prev_calculated) EventChartCustom(Chart, 0, Index, 0, NULL); return(rates_total); } Советник input int AmountSymbols = 1; const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"}; void OnInit() { for (int i = 0; i < AmountSymbols; i++) if (Symbols[i] != _Symbol) iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5 } void OnTick() { OnTick(_Symbol); } void OnChartEvent( const int id, const long &lparam, const double&, const string& ) { if (id == CHARTEVENT_CUSTOM) OnTick(Symbols[(int)lparam]); } // Мультисимвольный OnTick void OnTick( const string &Symb ) { } fxsaber 2018.07.06 12:54 #857 快528。没有人强迫你使用这个多符号NewTick事件实现的变体。在这个分支,我把各种东西简单地放在一起。 Fast235 2018.07.06 12:55 #858 fxsaber:没有人强迫你使用这个多符号NewTick事件实现的变体。在这个主题中,我只是把各种东西放在一起。我对OnTick感兴趣,也是带参数的,编译器吞下了 fxsaber 2018.07.06 12:56 #859 快528。我在想为什么OnTick????我自己也不知道,随机的巧合。 Fast235 2018.07.06 12:57 #860 fxsaber:我自己也不知道,随机的巧合。不要告诉我,我发现了一个功能,主持人仍然没有固定一个主要功能的名称,我花了很多时间来阅读和寻找它。 寻找一个没有记录的功能。 1...798081828384858687888990919293...247 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
关于交易、自动交易系统和交易策略测试的论坛
虫子,虫子,问题
fxsaber, 2018.06.20 23:18
决定检查一下,当一个订单在系统中但不在终端中时,这些幻象订单的情况会持续多久。
结果
32毫秒,一个订单在那里,但不在终端中!试想一下,如果交易逻辑在这个区间内执行,后果会怎样......。
有趣的是,幽灵订单最常出现在TRADE_TRANSACTION_ORDER_DELETE 和TRADE_TRANSACTION_DEAL_ADD(更罕见)交易类型。
非常糟糕的平台细微差别。
ZZY 遗憾的是,5号的贸易交易速度值得怀疑。
关于交易、自动交易系统和测试交易策略的论坛
订单关闭时间专家顾问MQL5
fxsaber, 2018.07.06 09:27
很明显,这个解决方案已经濒临成为一个拐杖了。其他的实现方式就不会再那么简洁了。绕过刹车的简单方法一般不会奏效。
快速的多符号OnTick实现
我搞不清楚。
为什么OnTick是带参数的Symbol,为什么是不带参数的?
以及为什么又在评论下面?
为什么不只是一个基本的OnChartEvent?
为什么不通过一个基本的OnChartEvent?
因为要把 "苍蝇和肉片 "分开,很方便。在一个多字符的OnTick中写入所有逻辑。名字中的巧合是随机的......
因为要把 "苍蝇和肉片 "分开,很方便。在一个多符号的OnTick中写入所有的逻辑。名字上的巧合是巧合......。
...与你们所有人在一起,直到2028年...。
这是你的代码,我会找到完整的代码。
没有人强迫你使用这个多符号NewTick事件实现的变体。在这个分支,我把各种东西简单地放在一起。
没有人强迫你使用这个多符号NewTick事件实现的变体。在这个主题中,我只是把各种东西放在一起。
我对OnTick感兴趣,也是带参数的,编译器吞下了
我在想为什么OnTick????
我自己也不知道,随机的巧合。
我自己也不知道,随机的巧合。
不要告诉我,我发现了一个功能,主持人仍然没有固定一个主要功能的名称,我花了很多时间来阅读和寻找它。
寻找一个没有记录的功能。