程序库: MT4Orders - 页 61 1...545556575859606162636465666768...95 新评论 fxsaber 2021.05.13 22:43 #601 Andrey Khatimlianskii:这一秒过后会发生什么?在没有同步的情况下,操作会继续吗? 是的,它会通过发出警报来继续。但我很难想象一秒钟还不够。同步会持续几毫秒。 如果发生这种情况,最好在这里报告。 这需要 写入战斗机器人吗? 不需要。如果运行上面的脚本时没有这一行,统计结果很可能会显示没有发生过一次不同步。我需要这一行作为检测问题的额外因素。几乎从一开始,交易 库就会尝试将每个交易请求 带入同步状态。我故意禁用这一行,是为了使任务复杂化,并测试识别不同步的独立机制。 fxsaber 2021.05.13 22:48 #602 Andrey Khatimlianskii:还是在交易操作前 检查 MT4ORDERS::ByPass.Is()(以确保没有不同步)就足够了? 每次调用 OrdersTotal、OrdersHistoryTotal 和 OrderSelect 时,ByPass.Is()==true 都是待定的。这就是为什么在调用这些函数后,其结果会立即相关。随着时间的推移,它们可能会发生变化,因此如果有任何停顿,再次调用它们是正确的。这就是上述问题 的答案。不仅在 MT5 中,在 MT4 中这样做也是正确的。 因此,如果您刚刚读取了交易环境,您可以立即进行交易操作,因为环境仍然相关。这就是为什么可以对库的普通用户隐藏该机制的原因。 fxsaber 2021.05.13 23:27 #603 // 更改列表: // 13.05.2021 // 修复:修复了OrderOpenReason() 中的一个错误。 fxsaber 2021.05.13 23:28 #604 amrali:发现错误:函数 OrderOpenReason() 返回 (ENUM_DEAL_REASON)DEAL_REASON_TP 给止盈平仓的订单。 谢谢!已修复。 Andrey Khatimlianskii 2021.05.13 23:58 #605 fxsaber: 是的,他会的,他会发出警报。但我很难想象一秒钟还不够。反同步会持续几毫秒。 如果发生这种情况,最好在这里报告。 如果您仍然不依赖环境在一秒内同步的事实,那么如果没有同步,如何正确中断 EA(禁止新订单)? if ( MT4ORDERS::ByPass.Is() == false ) // 环境不同步,请勿交易 return; OrderSend(...); ? fxsaber 2021.05.14 00:09 #606 Andrey Khatimlianskii:如果我们仍然不依赖环境在一秒钟内同步的事实,那么在没有同步的情况下,我们如何正确地中断 EA(禁止新订单)? 这取决于您的判断。您可以按您写的做。或者做另一个等待。或者增加暂停时间。我会尝试至少等待一次这样长时间的不同步。 Andrey Khatimlianskii 2021.05.14 01:33 #607 fxsaber:这取决于你的判断力。你可以照你写的做。或者改成另一种 "等待"。或者增加暂停时间。我会尝试至少等待一次这样长时间的不同步。 谢谢! 我会尝试等待警报或回退,我会取消其他检查。 fxsaber 2021.05.14 22:10 #608 // 更改列表: // 14.05.2021 // 修复:BYPASS 机制不再影响 OrderSelect(INT_MAX, SELECT_BY_POS) 和 OrderSelect(INT_MIN, SELECT_BY_POS)。 对于使用快照和其他非常特殊的交易技术的人来说非常重要。 fxsaber 2021.05.26 15:33 #609 厌倦了保证金带来的惊喜。我建议在使用战斗专家顾问之前运行此类测试脚本。 // 检查 MT5 中的保证金计算是否正确。 #include <MT4Orders.mqh> //https://www.mql5.com/zh/code/16006 bool EqualDouble( const double Value1, const double Value2, const double Epsilon = 0.01 ) { return(Value1 && Value2 && (MathMax(Value1, Value2) / MathMin(Value1, Value2) < 1 + Epsilon)); } #define TOSTRING(A) #A + " = " + (string)(A) + " " bool CheckMargin( const string Symb ) { const double RealMargin = AccountInfoDouble(ACCOUNT_MARGIN); // const double CalcMargin = GetMarginRequired(Symb); //https://www.mql5.com/ru/forum/170952/page9#comment_4134898 double CalcMargin = 0; OrderCalcMargin(ORDER_TYPE_BUY, Symb, 1, SymbolInfoDouble(Symb, SYMBOL_ASK), CalcMargin); const bool Res = EqualDouble(RealMargin, CalcMargin); const string Str = TOSTRING(Symb) + TOSTRING(RealMargin) + TOSTRING(CalcMargin) + "- " + (string)Res; if (Res) Print(Str); else Alert(Str); return(Res); } bool CheckCalcMargin( const string Symb ) { bool Res = !OrdersTotal(); if (Res) { const TICKET_TYPE Ticket = OrderSend(Symb, OP_BUY, 1, SymbolInfoDouble(Symb, SYMBOL_ASK), 0, 0, 0); if (Res = (Ticket != -1)) { Res = CheckMargin(Symb); if (OrderSelect(Ticket, SELECT_BY_TICKET)) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0); } } else { Alert("ERROR: OrdersTotal() != 0"); ExpertRemove(); } return(Res); } void OnStart() { if (AccountInfoInteger(ACCOUNT_TRADE_MODE) != ACCOUNT_TRADE_MODE_DEMO) Alert("Demo account is required!"); else for (int i = SymbolsTotal(true) - 1; !IsStopped() && (i >= 0); i--) { const string Symb = SymbolName(i, true); if (!SymbolInfoInteger(Symb, SYMBOL_CUSTOM)) CheckCalcMargin(Symb); } } 我们看到 MT5 保证金指标的计算结果与实际指标完全不符。在这种情况下,也许唯一的办法就是避免使用相应的符号。 ZЫ 而且令人厌烦的是,您拿起基本的东西,马上就能发现其中的错误,而论坛上对此却只字不提! Edgar Akhmadeev 2021.05.26 15:53 #610 fxsaber: 向论坛上唯一一个不厌其烦地报告错误的人致敬。大多数人都是在发了几个被忽略的帖子后就放弃了。这里几乎没人使用这些符号,所以他们才没有注意到。 1...545556575859606162636465666768...95 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
这一秒过后会发生什么?在没有同步的情况下,操作会继续吗?
是的,它会通过发出警报来继续。但我很难想象一秒钟还不够。同步会持续几毫秒。
如果发生这种情况,最好在这里报告。
这需要 写入战斗机器人吗?
不需要。如果运行上面的脚本时没有这一行,统计结果很可能会显示没有发生过一次不同步。我需要这一行作为检测问题的额外因素。几乎从一开始,交易 库就会尝试将每个交易请求 带入同步状态。我故意禁用这一行,是为了使任务复杂化,并测试识别不同步的独立机制。
还是在交易操作前 检查 MT4ORDERS::ByPass.Is()(以确保没有不同步)就足够了?
每次调用 OrdersTotal、OrdersHistoryTotal 和 OrderSelect 时,ByPass.Is()==true 都是待定的。这就是为什么在调用这些函数后,其结果会立即相关。随着时间的推移,它们可能会发生变化,因此如果有任何停顿,再次调用它们是正确的。这就是上述问题 的答案。不仅在 MT5 中,在 MT4 中这样做也是正确的。
因此,如果您刚刚读取了交易环境,您可以立即进行交易操作,因为环境仍然相关。这就是为什么可以对库的普通用户隐藏该机制的原因。
发现错误:
函数 OrderOpenReason() 返回 (ENUM_DEAL_REASON)DEAL_REASON_TP 给止盈平仓的订单。
谢谢!已修复。
fxsaber:
是的,他会的,他会发出警报。但我很难想象一秒钟还不够。反同步会持续几毫秒。
如果发生这种情况,最好在这里报告。
如果您仍然不依赖环境在一秒内同步的事实,那么如果没有同步,如何正确中断 EA(禁止新订单)?
?
如果我们仍然不依赖环境在一秒钟内同步的事实,那么在没有同步的情况下,我们如何正确地中断 EA(禁止新订单)?
这取决于您的判断。您可以按您写的做。或者做另一个等待。或者增加暂停时间。我会尝试至少等待一次这样长时间的不同步。
这取决于你的判断力。你可以照你写的做。或者改成另一种 "等待"。或者增加暂停时间。我会尝试至少等待一次这样长时间的不同步。
谢谢!
我会尝试等待警报或回退,我会取消其他检查。
对于使用快照和其他非常特殊的交易技术的人来说非常重要。
厌倦了保证金带来的惊喜。我建议在使用战斗专家顾问之前运行此类测试脚本。
我们看到 MT5 保证金指标的计算结果与实际指标完全不符。在这种情况下,也许唯一的办法就是避免使用相应的符号。
ZЫ 而且令人厌烦的是,您拿起基本的东西,马上就能发现其中的错误,而论坛上对此却只字不提!