错误、漏洞、问题 - 页 1989

 

测试器的性能高度依赖于贸易服务器。


测试仪设置。

网罗美元,只启用Core1


专家顾问

#include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int Interval = 60;
input int AmountLastDeals = 5;
input double Lots = 1;

double CorrectLot( const double Lot )
{
  static const double StepVol = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
  static const double MaxVol = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
  static const double MinVol = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);

  const double Vol = StepVol * (int)(Lot / StepVol + 0.5);

  return((Vol < MinVol) ? MinVol : ((Vol > MaxVol) ? MaxVol : Vol));
}
  
void OnTick()
{  
  if (!PositionGetTicket(0))
  {
    if (HistorySelect(0, TimeCurrent()))
    {
      const int Total = HistoryDealsTotal() - 1;

      double SumProfit = 0;
      double SumLots = 0;

      for (int i = Total, Count = 0; (i >= 0) && (Count < AmountLastDeals); i--)
      {
        const ulong Ticket = HistoryDealGetTicket(i);

        if ((ENUM_DEAL_ENTRY)HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
        {
          SumProfit += HistoryDealGetDouble(Ticket, DEAL_PROFIT) * (AmountLastDeals - Count);
          SumLots += HistoryDealGetDouble(Ticket, DEAL_VOLUME) * (AmountLastDeals - Count);

          Count++;
        }
      }

      SumLots /= (AmountLastDeals * (1 + AmountLastDeals)) >> 1;

      MqlTradeRequest Request = {0};

      Request.action = TRADE_ACTION_DEAL;

      Request.symbol = _Symbol;
      Request.type = ((Total >= 0) && ((ENUM_DEAL_TYPE)HistoryDealGetInteger(HistoryDealGetTicket(Total), DEAL_TYPE) == DEAL_TYPE_SELL)) ?
                     ORDER_TYPE_SELL : ORDER_TYPE_BUY;;

      Request.volume = (SumProfit >= 0) ? Lots : CorrectLot(SumLots);
      Request.price = SymbolInfoDouble(Request.symbol, (Request.type == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID);

//      MqlTradeCheckResult CheckResult;
//      if (OrderCheck(Request, CheckResult))
      {
        MqlTradeResult Result;

        const bool AntiWarning = OrderSend(Request, Result);
      }
    }
  }
  else if (TimeCurrent() - PositionGetInteger(POSITION_TIME) >= Interval)
  {
    MqlTradeRequest Request = {0};
    MqlTradeResult Result;

    Request.action = TRADE_ACTION_DEAL;
    Request.position = PositionGetInteger(POSITION_TICKET);

    Request.symbol = PositionGetString(POSITION_SYMBOL);
    Request.type = (ENUM_ORDER_TYPE)(1 - PositionGetInteger(POSITION_TYPE));

    Request.volume = PositionGetDouble(POSITION_VOLUME);
    Request.price = PositionGetDouble(POSITION_PRICE_CURRENT);

    const bool AntiWarning = OrderSend(Request, Result);
  }
}


FIBOGroup-MT5服务器 上的结果

------
OnTesterInit
i = 0 Pass = 0 OnTester = 7.994 s.: Count = 15925124, 1992134.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 1 Pass = 1 OnTester = 7.831 s.: Count = 15925124, 2033600.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 2 Pass = 2 OnTester = 7.811 s.: Count = 15925124, 2038807.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 3 Pass = 3 OnTester = 7.825 s.: Count = 15925124, 2035159.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 4 Pass = 4 OnTester = 7.831 s.: Count = 15925124, 2033600.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 5 Pass = 5 OnTester = 7.832 s.: Count = 15925124, 2033340.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
iMin = 2 Results[iMin] = 7.811 s.
iMax = 0 Results[iMax] = 7.994 s.
Amount = 6 Mean = 7.854 s. - 90.11%
OnTesterDeinit
------
Interval = 52.296 s., Count = 0, 0.0 unit/sec


MetaQuotes-Demo 的结果

OnTesterInit
i = 0 Pass = 0 OnTester = 1.497 s.: Count = 2456073, 1640663.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 1 Pass = 1 OnTester = 1.494 s.: Count = 2456073, 1643957.8 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 2 Pass = 2 OnTester = 1.496 s.: Count = 2456073, 1641760.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 3 Pass = 3 OnTester = 1.493 s.: Count = 2456073, 1645058.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 4 Pass = 4 OnTester = 1.499 s.: Count = 2456073, 1638474.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 5 Pass = 5 OnTester = 1.498 s.: Count = 2456073, 1639568.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
iMin = 3 Results[iMin] = 1.493 s.
iMax = 4 Results[iMax] = 1.499 s.
Amount = 6 Mean = 1.496 s. - 49.11%
OnTesterDeinit
------
Interval = 18.279 s., Count = 0, 0.0 unit/sec


FIBOGroup-MT5服务器 上的ticks总量是15925124,测试仪的性能是2038807.3单位/秒。MetaQuotes-Demo 有2456073点,测试器性能1645058.9单位/秒。也就是说,在第二台服务器上,测试者的性能下降了20%。但是,测试人员不应该依赖贸易服务器!因为他们的工作是由他们自己完成的。

可重复使用,没有任何问题。

 
Alexey Kozitsyn:
这并没有什么帮助:)好吧,不需要猜测,我们只需要SD的答案。这样的拐杖无论如何是不应该被接受的!

很奇怪。我在发帖前已经探究了大约10分钟,所以我定期通过切换图表周期 和将指标参数中的true改为false来继续探究。我不觉得有什么问题。当然是拐杖,这就是为什么我说这是一个临时解决方案。

 
Alexey Kozitsyn:
没用的:)好吧,为什么猜测,我们需要从SD得到答案。这样的拐杖无论如何都不应该被接受!

它的工作没有任何问题。当然,先定义输出缓冲区,然后再定义颜色缓冲区 是有意义的,这就是现在所做的。

 
Vitaly Muzichenko:

它的工作没有任何问题。当然,先定义输出缓冲区,然后再定义颜色缓冲区是有意义的,现在就是这样做的。


维塔利,请先找到问题的根源。当设置开启时,一切工作正常。当设置被禁用时,问题开始出现。
 
Alexey Viktorov:
你的版本更稳定,甚至几乎总是能正确工作(如果你不切换TF的话)。但如果你把它换掉,然后再换回来...这又是一个混乱的局面。
 
fxsaber:
(string)NormalizeDouble(0.99872, 5) - 非常长的结果。

没有错误,有些十进制的数字不能准确地用双数表示

下面的代码给出了一个正常的结果
DoubleToString(0.99872, 5)

 
Evgeny Chernyshev:

没有错误,一些十进制符号的数字不能准确地用双数表示

下面的代码给你一个正常的结果
DoubleToString(0.99872, 5)

明白了,谢谢!

 
Alexey Kozitsyn:
维塔利,请先找到问题的根源。当设置开启时,一切工作正常。该问题在关闭设置时开始出现。

阿列克谢,我很抱歉,我错过了另一个更正。

   //if(inpUseArrows) // Если отображать нужно
   //  {
      SetPlotParametersArrow(0,0,bufArrowUp,false,"test up",EMPTY,clrLime,233,10);
      SetPlotParametersArrow(1,1,bufArrowDn,false,"test dn",EMPTY,clrRed,234,-10);
   //  }

在那个帖子中也做了更正,用红色标记。

 
Alexey Viktorov:

阿列克谢,对不起,我错过了另一个更正。

在那个帖子中也做了更正,用红色标记。

这就是问题的关键!原来你只是把它关掉了,所有图形系列下的所有数组都被使用。但重点恰恰是让用户能够在必要时禁用一些图形系列。如果有必要的话--打开它!

 
Alexey Kozitsyn:

这就是它的意义所在!所以,你只要把它关掉,所有图形系列的所有数组都被使用。但重点恰恰是让用户在必要时可以选择禁用部分图表系列。如果有必要的话--把它打开!

好吧,图形系列的数量是在代码的开头定义的,当你切换TF时,它不会改变。

我担心在mql5中它是无敌的。

然而,还有一个技巧可以用来排除数据窗口 中的图形系列的显示

PlotIndexSetString(plotIndex, PLOT_LABEL, NULL);

它在mql4中工作。我必须检查它在mql5中是如何工作的,我还没有测试过它。

不...It does not work in mql5.它在mql5中工作。

      PlotIndexSetInteger(0, PLOT_SHOW_DATA, true);
      PlotIndexSetInteger(1, PLOT_SHOW_DATA, true);
   if(!inpUseArrows) // Если отображать не нужно
     {
      PlotIndexSetInteger(0, PLOT_SHOW_DATA, false);
      PlotIndexSetInteger(1, PLOT_SHOW_DATA, false);
     }