Errores, fallos, preguntas - página 1989

 

El rendimiento del probador depende en gran medida del servidor comercial.


Ajustes del probador:

Neto USD, Core1 sólo habilitado.


Asesor experto

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


Resultado en elservidor 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


Resultado en 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 cantidad total de ticks en unservidor FIBOGroup-MT5 es de 15925124 y el rendimiento del probador es de 2038807,3 unidades/seg.MetaQuotes-Demo tiene 2456073 ticks y el rendimiento del probador 1645058.9 unidad/seg. Es decir, en el segundo servidor, el rendimiento del probador ha bajado un 20%. Pero el probador no debe depender del servidor comercial.

Reproducible sin problemas.

 
Alexey Kozitsyn:
No sirvió de nada:) Bien, no es necesario adivinar, sólo necesitamos una respuesta de la SD. De todos modos, ¡esas muletas no deberían ser aceptables!

Extraño. He estado pinchando durante unos 10 minutos antes de publicar y por eso sigo pinchando periódicamente cambiando el periodo del gráfico y cambiando true por false en el parámetro del indicador. No veo ningún problema. Claro que son muletas, por eso dije que era una solución temporal.

 
Alexey Kozitsyn:
No funcionó:) Ok, por qué adivinar, tenemos que obtener una respuesta de la SD. De todos modos, ¡esas muletas no deberían ser aceptables!

Funciona sin problemas. Por supuesto, tiene sentido definir primero los búferes de salida y luego el búfer de color, que es lo que se hace ahora.

 
Vitaly Muzichenko:

Funciona sin problemas. Por supuesto, tiene sentido definir primero los búferes de salida y luego el búfer de color, que es lo que se hace ahora.


Vitaly, por favor, llega primero al fondo del problema. Cuando el ajuste está activado, todo funciona bien. El problema comienza cuando se desactiva el ajuste.
 
Alexey Viktorov:
Su versión es más estable, e incluso casi siempre funciona correctamente (si no se cambia el TF). Pero si lo cambias y luego lo vuelves a cambiar... Es un desastre otra vez.
 
fxsaber:
(cadena)NormalizarDoble(0,99872, 5) - resultado muy largo.

No hay error, algunos números en notación decimal no pueden representarse exactamente en doble

El siguiente código da un resultado normal
DoubleToString(0.99872, 5)

 
Evgeny Chernyshev:

No hay error, algunos números en notación decimal no se pueden representar exactamente en doble

El siguiente código da un resultado normal
DoubleToString(0.99872, 5)

Lo tengo, ¡gracias!

 
Alexey Kozitsyn:
Vitaly, llega primero al fondo del problema, por favor. Cuando el ajuste está activado, todo funciona bien. El problema comienza cuando se desactiva el ajuste.

Alexey, me disculpo, se me pasó otra corrección

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

Corregido en ese post también, marcado en rojo.

 
Alexey Viktorov:

Alexei, lo siento, se me pasó otra corrección.

Corregido también en ese post, con la marca en rojo.

¡Ese es el objetivo! Resulta que lo acabas de desactivar y se utilizan todas las matrices de todas las series del gráfico. Pero la cuestión es precisamente dar al usuario la posibilidad de desactivar algunas de las series de gráficos si es necesario. Y si es necesario, ¡enciéndelo!

 
Alexey Kozitsyn:

¡De eso se trata! Así que, simplemente se desactiva y se utilizan todas las matrices de todas las series de gráficos. Pero la cuestión es precisamente dar al usuario la opción de desactivar parte de la serie de gráficos si es necesario. Y si es necesario, ¡enciéndelo!

Bueno, el número de series del gráfico se define al principio del código, que no cambia cuando se cambia el TF.

Me temo que es invencible en mql5.

Sin embargo, hay un truco más que se puede utilizar para excluir la visualización de las series gráficas en la ventana de datos

PlotIndexSetString(plotIndex, PLOT_LABEL, NULL);

Funciona en mql4. Tengo que comprobar cómo funciona en mql5, aún no lo he probado.

No... no funciona en mql5. Funciona en 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);
     }