Ошибки, баги, вопросы - страница 1989

 

Производительность тестера сильно зависит от торгового сервера.


Настройки тестера:

Неттинг USD, включен только 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 Server

------
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.811s.
iMax = 0 Results[iMax] = 7.994s.
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.493s.
iMax = 4 Results[iMax] = 1.499s.
Amount = 6 Mean = 1.496 s. - 49.11%
OnTesterDeinit
------
Interval = 18.279 s., Count = 0, 0.0 unit/sec


Итого на FIBOGroup-MT5 Server количество тиков 15925124 и производительность тестера 2038807.3 unit/sec. На MetaQuotes-Demo количество тиков 2456073 и производительность тестера 1645058.9 unit/sec. Т.е. на втором сервере производительность тестера упала на 20%. Но тестер же не должен зависеть от торгового сервера!

Воспроизводится без проблем.

 
Alexey Kozitsyn:
Не помогло:) Ладно, чего гадать, нужно получить ответ от СД. Все равно такие костыли не должны быть приемлемы!

Странно. Я перед публикацией тыкал минут 10 и так периодически всё-ещё тыкаю переключая период графика и меняя true на false в параметре индикатора. Не вижу проблемы. Безусловно это костыли, потому и сказал я что это временное решение.

 
Alexey Kozitsyn:
Не помогло:) Ладно, чего гадать, нужно получить ответ от СД. Все равно такие костыли не должны быть приемлемы!

Работает без проблем. Логично конечно сначала определять буферы вывода, а уже потом буфер цвета, что сейчас и сделано.

 
Vitaly Muzichenko:

Работает без проблем. Логично конечно сначала определять буферы вывода, а уже потом буфер цвета, что сейчас и сделано.


Виталий, разберитесь сначала в сути проблемы, пожалуйста. Когда включена настройка - все работает нормально. Проблема начинается тогда, когда настройка выключена.
 
Alexey Viktorov:
Твой вариант стабильнее работает, и даже почти всегда корректно (если не переключать ТФ). А если переключить и вернуть обратно... опять жесть начнется.
 
fxsaber:
(string)NormalizeDouble(0.99872, 5) - очень длинный результат.

Ошибки нет, некоторые числа в десятичной записи нельзя точно представить в double

Следующий код выдаёт нормальный результат
DoubleToString(0.99872, 5)

 
Evgeny Chernyshev:

Ошибки нет, некоторые числа в десятичной записи нельзя точно представить в double

Следующий код выдаёт нормальный результат
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:

Дак в ней вся суть! Получается, ты просто выключил ее и используются все массивы под все граф. серии. Но суть именно в том, чтобы дать пользователю возможность отключить при необходимости часть граф. серий. А при необходимости - включить!

Ну так количество графических серий определяется в самом начале кода, который не изменяется при переключении ТФ.

Боюсь что это непобедимо в mql5.

Хотя есть ещё одно ухищрение, чтобы исключить отображение графических серий в окне данных, надо

PlotIndexSetString(plotIndex, PLOT_LABEL, NULL);

В mql4 это работает. Надо проверить как в 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);
     }
Причина обращения: