Errori, bug, domande - pagina 1989

 

Le prestazioni del tester dipendono fortemente dal server commerciale.


Impostazioni del tester:

Netting USD, Core1 solo abilitato.


Consulente esperto

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


Risultato sulserver 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


Risultato su 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


La quantità totale di tick su unserver FIBOGroup-MT5 è 15925124 e le prestazioni del tester sono 2038807.3 unità/sec.MetaQuotes-Demo ha 2456073 tick e le prestazioni del tester 1645058.9 unità/sec. Cioè, sul secondo server, le prestazioni del tester sono diminuite del 20%. Ma il tester non dovrebbe dipendere dal server commerciale!

Riproducibile senza problemi.

 
Alexey Kozitsyn:
Non ha aiutato:) OK, non c'è bisogno di indovinare, abbiamo solo bisogno di una risposta dalla SD. Queste stampelle non dovrebbero comunque essere accettabili!

Strano. Ho frugato per circa 10 minuti prima di postare e quindi ho periodicamente continuato a frugare cambiando il periodo del grafico e cambiando true a false nel parametro dell'indicatore. Non vedo il problema. Certo che sono stampelle, per questo ho detto che era una soluzione temporanea.

 
Alexey Kozitsyn:
Non ha funzionato:) Ok, perché indovinare, abbiamo bisogno di avere una risposta dalla SD. Queste stampelle non dovrebbero comunque essere accettabili!

Funziona senza problemi. Naturalmente ha senso definire prima i buffer di uscita e poi il buffer di colore, che è quello che si fa ora.

 
Vitaly Muzichenko:

Funziona senza problemi. Naturalmente, ha senso definire prima i buffer di uscita e poi il buffer di colore, che è quello che si fa ora.


Vitaly, per favore vai al fondo del problema prima. Quando l'impostazione è attiva, tutto funziona bene. Il problema inizia quando l'impostazione è disattivata.
 
Alexey Viktorov:
La tua versione è più stabile, e anche quasi sempre funziona correttamente (se non cambi il TF). Ma se lo scambi e poi lo scambi di nuovo... È di nuovo un casino.
 
fxsaber:
(stringa)NormalizeDouble(0.99872, 5) - risultato molto lungo.

Nessun errore, alcuni numeri in notazione decimale non possono essere rappresentati esattamente in doppio

Il seguente codice dà un risultato normale
DoubleToString(0.99872, 5)

 
Evgeny Chernyshev:

Nessun errore, alcuni numeri in notazione decimale non possono essere rappresentati esattamente in doppia

Il seguente codice dà un risultato normale
DoubleToString(0.99872, 5)

Capito, grazie!

 
Alexey Kozitsyn:
Vitaly, vai al fondo del problema prima, per favore. Quando l'impostazione è attiva, tutto funziona bene. Il problema inizia quando l'impostazione è spenta.

Alexey, mi scuso, ho dimenticato un'altra correzione

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

Corretto anche in quel post, segnato in rosso.

 
Alexey Viktorov:

Alexei, mi dispiace, mi è sfuggita un'altra correzione.

Corretto anche in quel post, con la marcatura in rosso.

È proprio questo il punto! Si scopre che l'hai appena spento e tutti gli array sotto tutte le serie del grafico sono utilizzati. Ma il punto è proprio quello di dare all'utente la possibilità di disabilitare alcune delle serie del grafico, se necessario. E se necessario - accendetelo!

 
Alexey Kozitsyn:

Ecco di cosa si tratta! Quindi, basta spegnerlo e vengono utilizzati tutti gli array per tutte le serie del grafico. Ma il punto è proprio quello di dare all'utente la possibilità di disabilitare parte della serie di grafici, se necessario. E se necessario - accendetelo!

Bene, il numero di serie del grafico è definito all'inizio del codice, che non cambia quando si cambia il TF.

Ho paura che sia invincibile in mql5.

Tuttavia, c'è un altro trucco che può essere utilizzato per escludere la visualizzazione delle serie grafiche nella finestra dei dati

PlotIndexSetString(plotIndex, PLOT_LABEL, NULL);

Funziona in mql4. Devo controllare come funziona in mql5, non l'ho ancora testato.

No... non funziona in mql5. Funziona in 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);
     }
Motivazione: