Erros, bugs, perguntas - página 1989

 

O desempenho do testador é altamente dependente do servidor comercial.


Configurações do testador:

Netting USD, Core1 apenas activado.


Conselheiro especializado

#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 noServidor 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 em 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


A quantidade total de ticks numServidor FIBOGroup-MT5 é de 15925124 e o desempenho do testador é de 2038807,3 unidades/segundo.MetaQuotes-Demo tem 2456073 ticks e desempenho do testador 1645058,9 unidade/segundo. Isto é, no segundo servidor, o desempenho do testador diminuiu 20%. Mas o testador não deve depender do servidor comercial!

Reproduzível sem qualquer problema.

 
Alexey Kozitsyn:
Não ajudou:) OK, não há necessidade de adivinhar, só precisamos de uma resposta do SD. Tais muletas não devem ser aceitáveis de qualquer forma!

Estranho. Tenho andado a fazer poking durante cerca de 10 minutos antes de afixar e por isso, periodicamente, mantenho o poking mudando o período do gráfico e mudando verdadeiro para falso no parâmetro indicador. Não vejo qualquer problema. Claro que são muletas, foi por isso que disse que era uma solução temporária.

 
Alexey Kozitsyn:
Não funcionou:) Ok, porquê adivinhar, precisamos de obter uma resposta do SD. Tais muletas não deveriam ser aceitáveis de qualquer forma!

Funciona sem qualquer problema. Claro que faz sentido definir primeiro os amortecedores de saída, e depois o amortecedor de cor, que é o que se faz agora.

 
Vitaly Muzichenko:

Funciona sem qualquer problema. Claro que faz sentido definir primeiro os amortecedores de saída, e depois o amortecedor de cor, que é o que se faz agora.


Vitaly, vá primeiro para o fundo do problema, por favor. Quando o cenário está pronto, tudo funciona bem. O problema começa quando a configuração é desactivada.
 
Alexey Viktorov:
A sua versão é mais estável, e mesmo quase sempre funciona correctamente (se não mudar o TF). Mas se mudar e voltar atrás... Está novamente uma confusão.
 
fxsaber:
(string)NormalizeDuplo(0,99872, 5) - resultado muito longo.

Nenhum erro, alguns números em notação decimal não podem ser representados exactamente em duplo

O seguinte código dá um resultado normal
DoubleToString(0.99872, 5)

 
Evgeny Chernyshev:

Nenhum erro, alguns números em notação decimal não podem ser representados exactamente em duplo

O seguinte código dá-lhe um resultado normal
DoubleToString(0,99872, 5)

Já está, obrigado!

 
Alexey Kozitsyn:
Vitaly, vá primeiro para o fundo do problema, por favor. Quando o cenário está pronto, tudo funciona bem. O problema começa quando a definição é desligada.

Alexey, peço desculpa, perdi outra correcção

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

Corrigido também nesse post, marcado a vermelho.

 
Alexey Viktorov:

Alexei, peço desculpa, perdi outra correcção.

Corrigido também nesse posto, com a marcação a vermelho.

A questão é essa! Acontece que se desligou e todas as matrizes sob todas as séries gráficas são utilizadas. Mas o objectivo é precisamente dar ao utilizador a capacidade de desactivar algumas das séries gráficas, se necessário. E se necessário - ligue-o!

 
Alexey Kozitsyn:

É disso que se trata! Assim, basta desligá-lo e são utilizadas todas as matrizes para todas as séries gráficas. Mas o objectivo é precisamente dar ao utilizador a opção de desactivar parte da série gráfica, se necessário. E se necessário - ligue-o!

Bem, o número de séries gráficas é definido no início do código, o que não muda quando se muda o TF.

Receio que seja invencível em mql5.

Contudo, há mais um truque que pode ser usado para excluir a exibição de séries gráficas na janela de dados

PlotIndexSetString(plotIndex, PLOT_LABEL, NULL);

Funciona em mql4. Tenho de verificar como funciona em mql5, ainda não o testei.

Não... não funciona em mql5. Funciona em 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);
     }
Razão: