程序库: MT4Orders - 页 61

 
Andrey Khatimlianskii:

这一秒过后会发生什么?在没有同步的情况下,操作会继续吗?

是的,它会通过发出警报来继续。但我很难想象一秒钟还不够。同步会持续几毫秒。

如果发生这种情况,最好在这里报告。

需要 写入战斗机器人吗?

不需要。如果运行上面的脚本时没有这一行,统计结果很可能会显示没有发生过一次不同步。我需要这一行作为检测问题的额外因素。几乎从一开始,交易 库就会尝试将每个交易请求 带入同步状态。我故意禁用这一行,是为了使任务复杂化,并测试识别不同步的独立机制。

 
Andrey Khatimlianskii:

还是在交易操作前 检查 MT4ORDERS::ByPass.Is()(以确保没有不同步)就足够了?

每次调用 OrdersTotal、OrdersHistoryTotal 和 OrderSelect 时,ByPass.Is()==true 都是待定的。这就是为什么在调用这些函数后,其结果会立即相关。随着时间的推移,它们可能会发生变化,因此如果有任何停顿,再次调用它们是正确的。这就是上述问题 的答案。不仅在 MT5 中,在 MT4 中这样做也是正确的。


因此,如果您刚刚读取了交易环境,您可以立即进行交易操作,因为环境仍然相关。这就是为什么可以对库的普通用户隐藏该机制的原因。

 
// 更改列表:
// 13.05.2021
// 修复:修复了OrderOpenReason() 中的一个错误
 
amrali:

发现错误:

函数 OrderOpenReason() 返回 (ENUM_DEAL_REASON)DEAL_REASON_TP 给止盈平仓的订单。

谢谢!已修复

 

fxsaber:

是的,他会的,他会发出警报。但我很难想象一秒钟还不够。反同步会持续几毫秒。
如果发生这种情况,最好在这里报告。

如果您仍然不依赖环境在一秒内同步的事实,那么如果没有同步,如何正确中断 EA(禁止新订单)?

if ( MT4ORDERS::ByPass.Is() == false ) // 环境不同步,请勿交易
        return;

OrderSend(...);

?

 
Andrey Khatimlianskii:

如果我们仍然不依赖环境在一秒钟内同步的事实,那么在没有同步的情况下,我们如何正确地中断 EA(禁止新订单)?

这取决于您的判断。您可以按您写的做。或者做另一个等待。或者增加暂停时间。我会尝试至少等待一次这样长时间的不同步。

 
fxsaber:

这取决于你的判断力。你可以照你写的做。或者改成另一种 "等待"。或者增加暂停时间。我会尝试至少等待一次这样长时间的不同步。

谢谢!

我会尝试等待警报或回退,我会取消其他检查。

 
// 更改列表:
// 14.05.2021
// 修复:BYPASS 机制不再影响 OrderSelect(INT_MAX, SELECT_BY_POS) 和 OrderSelect(INT_MIN, SELECT_BY_POS)。

对于使用快照和其他非常特殊的交易技术的人来说非常重要。

 

厌倦了保证金带来的惊喜。我建议在使用战斗专家顾问之前运行此类测试脚本。

// 检查 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Ы 而且令人厌烦的是,您拿起基本的东西,马上就能发现其中的错误,而论坛上对此却只字不提!

 
fxsaber:
向论坛上唯一一个不厌其烦地报告错误的人致敬。大多数人都是在发了几个被忽略的帖子后就放弃了。
这里几乎没人使用这些符号,所以他们才没有注意到。