오류, 버그, 질문 - 페이지 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 서버 에 대한 결과

------
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 Server 의 총 틱 수는 15925124이고 테스터의 성능은 2038807.3 unit/sec입니다. MetaQuotes-Demo에서 틱 수는 2456073이고 테스터의 성능은 1645058.9 unit/sec입니다. 저것들. 두 번째 서버에서는 테스터의 성능이 20% 떨어졌습니다. 그러나 테스터는 거래 서버에 의존해서는 안됩니다!

문제 없이 재현되었습니다.

 
Alexey Kozitsyn :
도움이 되지 않았습니다 :) 알겠습니다. 왜 SD에서 답을 얻어야 할까요? 마찬가지로, 그러한 목발은 받아 들일 수 없습니다!

기이한. 게시하기 전에 10분 동안 찌르고 주기적으로 차트 기간 을 전환하고 표시기 매개변수에서 true를 false로 변경합니다. 문제가 보이지 않습니다. 물론 이것은 목발이기 때문에 이것이 임시 해결책이라고 말한 이유입니다.

 
Alexey Kozitsyn :
도움이 되지 않았습니다 :) 알겠습니다. 왜 SD에서 답을 얻어야 할까요? 마찬가지로, 그러한 목발은 받아 들일 수 없습니다!

문제 없이 작동합니다. 물론 먼저 출력 버퍼를 정의한 다음 색상 버퍼 를 정의한 다음 이제 완료되는 것이 논리적입니다.

 
Vitaly Muzichenko :

문제 없이 작동합니다. 물론 출력 버퍼를 먼저 정의한 다음 컬러 버퍼를 정의한 다음 이제 완료되는 것이 논리적입니다.


Vitaly, 먼저 문제의 본질을 이해하십시오. 설정이 활성화되면 모든 것이 잘 작동합니다. 문제는 설정이 꺼져 있을 때 시작됩니다.
 
Alexey Viktorov :
귀하의 버전은 더 안정적으로 작동하며 거의 항상 정확합니다(TF를 전환하지 않는 경우). 그리고 당신이 전환하고 되돌아가면 ... 다시, 주석이 시작될 것입니다.
 
fxsaber :
(string)NormalizeDouble(0.99872, 5)은 매우 긴 결과입니다.

오류가 없습니다. 십진수 표기법의 일부 숫자는 이중으로 정확하게 표현할 수 없습니다.

다음 코드는 정상적인 결과를 생성합니다.
DoubleToString (0.99872, 5)

 
Evgeny Chernyshev :

오류가 없습니다. 십진수 표기법의 일부 숫자는 이중으로 정확하게 표현할 수 없습니다.

다음 코드는 정상적인 결과를 생성합니다.
DoubleToString(0.99872, 5)

이해했습니다 감사합니다!

 
Alexey Kozitsyn :
Vitaly, 먼저 문제의 본질을 이해하십시오. 설정이 활성화되면 모든 것이 잘 작동합니다. 문제는 설정이 꺼져 있을 때 시작됩니다.

Alexey, 죄송합니다. 다른 수정 사항을 놓쳤습니다.

    //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, 죄송합니다. 다른 수정 사항을 놓쳤습니다.

해당 게시물에서도 빨간 표시로 수정했습니다.

그게 요점입니다! 방금 끄고 모든 배열이 모든 그래프에 사용되는 것으로 나타났습니다. 시리즈. 그러나 요점은 사용자에게 필요한 경우 그래프의 일부를 비활성화할 수 있는 기회를 제공하는 것입니다. 시리즈. 그리고 필요한 경우 켜십시오!

 
Alexey Kozitsyn :

그게 요점입니다! 방금 끄고 모든 배열이 모든 그래프에 사용되는 것으로 나타났습니다. 시리즈. 그러나 요점은 사용자에게 필요한 경우 그래프의 일부를 비활성화할 수 있는 기회를 제공하는 것입니다. 시리즈. 그리고 필요한 경우 켜십시오!

글쎄, 그래픽 시리즈의 수는 TF를 전환할 때 변경되지 않는 코드의 맨 처음에 결정됩니다.

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 );
     }