MQL5 vs QLUA - Por que operações de negociação no MQL5 são até 28 vezes mais rápidas? - página 2

 
Rashid Umarov:
Os códigos são fornecidos, qualquer pessoa pode verificar por si mesma e ver se as conclusões são válidas. Não há nenhum problema aqui.

Meu código

sinput int Interval = 30; // Intervalo em segundos

class BENCH
{
protected:
  MqlTick FirstTick;
  int Count;
  ulong StartTime;

  int GetAmountTicks( const ulong From = 0, const int Amount = 10000 ) const
  {
    MqlTick Ticks[];

    return(::CopyTicks(this.symbol, Ticks, COPY_TICKS_ALL, From, Amount));
  }
  void Init( void )
  {
    this.Count = 0;

    this.GetAmountTicks(); // aquecimento
    ::SymbolInfoTick(this.symbol, this.FirstTick);

    this.StartTime = ::GetMicrosecondCount();

    return;
  }

public:
  const string symbol;
  const int TimerInterval;

  BENCH( const int iTimerInterval, const string Symb = NULL ) :
         symbol((Symb == NULL) ? ::Symbol() : Symb), TimerInterval(iTimerInterval * (int)1 e6)
  {
    this.Init();

    this.StartTime = 0;
  }

  ~BENCH( void )
  {
    ::Comment("");
  }

  void Refresh( const string Symb )
  {
    if (Symb == this.symbol)
    {
      if (this.GetBenchTime() >= this.TimerInterval)
      {
        if (Count > 0)
          ::Alert(this.ToString());

        this.Init();
      }

      Count++;
    }

    return;
  }
  int GetBenchTime( void ) const
  {
    return((int)(::GetMicrosecondCount() - this.StartTime));
  }

  string ToString( void ) const
  {
    const ulong BenchTime = this.GetBenchTime();
    const int Amount = this.GetAmountTicks(this.FirstTick.time_msc);

    if ((BenchTime == 0) || (Amount == 0))
     return(NULL);

    const double Velocity1 = 1 e6 * this.Count / BenchTime;
    const double Velocity2 = 1 e6 * Amount / BenchTime;

    return((string)this.Count + "/" + (string)Amount + " = " + ::DoubleToString(100.0 * Count / Amount, 2) + "%, ExChange_History = " +
           ::DoubleToString(Velocity2, 1) + " ticks/sec, MT5_RealTime = " + ::DoubleToString(Velocity1, 1) + " units/sec, Interval = " +
           ::DoubleToString(BenchTime / 1 e6, 1) + " sec.");
  }
};

class BENCH_BOOK : public BENCH
{
public:
  BENCH_BOOK( const int iTimerInterval, const string Symb = NULL ) : BENCH(iTimerInterval, Symb)
  {
    ::MarketBookAdd(this.symbol);
  }

  ~BENCH_BOOK( void )
  {
    ::MarketBookRelease(this.symbol);
  }
};

/*
BENCH Bench(Interval);

void OnTick( void )
{
 Bench.Refresh(_Symbol);

 return;
}
*/

BENCH_BOOK BenchBook(Interval);

void OnBookEvent(const string &symbol )
{
  BenchBook.Refresh(symbol);

  return;
}

Resultado

2016.09.13 17:18:35.667 Bench (Si-9.16,M1)      851/754 = 112.86%, ExChange_History = 25.1 ticks/sec, MT5_RealTime = 28.3 units/sec, Interval = 30.1 sec.
2016.09.13 17:18:05.524 Bench (Si-9.16,M1)      662/506 = 130.83%, ExChange_History = 16.9 ticks/sec, MT5_RealTime = 22.1 units/sec, Interval = 30.0 sec.
2016.09.13 17:17:35.424 Bench (Si-9.16,M1)      883/1610 = 54.84%, ExChange_History = 53.6 ticks/sec, MT5_RealTime = 29.4 units/sec, Interval = 30.0 sec.
2016.09.13 17:17:05.319 Bench (Si-9.16,M1)      834/2707 = 30.81%, ExChange_History = 90.1 ticks/sec, MT5_RealTime = 27.8 units/sec, Interval = 30.0 sec.
2016.09.13 17:16:35.196 Bench (Si-9.16,M1)      789/627 = 125.84%, ExChange_History = 20.9 ticks/sec, MT5_RealTime = 26.3 units/sec, Interval = 30.0 sec.
2016.09.13 17:16:05.110 Bench (Si-9.16,M1)      900/822 = 109.49%, ExChange_History = 27.4 ticks/sec, MT5_RealTime = 30.0 units/sec, Interval = 30.0 sec.
2016.09.13 17:15:34.993 Bench (Si-9.16,M1)      772/747 = 103.35%, ExChange_History = 24.8 ticks/sec, MT5_RealTime = 25.7 units/sec, Interval = 30.1 sec.

Você pode ver claramente o quanto os resultados diferem, mesmo em meios minutos vizinhos. A comparação de óculos deve ser feita SOMENTE ao mesmo tempo!

[Excluído]  
Тестирование синхронных операций - uma série de 10operações síncronasconsecutivas de Buy tradecom confirmação do sucesso de cada transação na bolsa. A operação subsequente não é executada até que seja recebida uma confirmação do servidor de negociação de que a transação foi aprovada/fracassada na bolsa. A velocidade de execução depende de toda a cadeia terminal - servidor de negociação - bolsa - servidor de negociação - terminal. Quanto menor for o tempo médio de uma operação de negociação síncrona, melhor.
//--- executar o loop de operação
      for(int i=0;i<Trades;i++)
        {
         req.price  =SymbolInfoDouble(_Symbol,SYMBOL_ASK);
         req.comment=string(i+1);
         //--- ação
         if(!OrderSend(req,res))
           {
            PrintFormat("OrderSend() failed, retcode=%d",res.retcode);
           }
         else
           {
            trades_finished++;
            PrintFormat("#%d Buy %s 1 lot",i+1,_Symbol);
           }
        }

Onde está a confirmação sobre a qual você escreveu? Não a notei no código. Se você está se referindo à resposta de OrderSend(), então, veja a ajuda:

Valor de retorno

Em caso de verificação bem-sucedida da estrutura básica (verificação de ponteiro), true é retornado - isso não indica a execução bem-sucedida da operação de negociação. Para obter uma descrição mais detalhada do resultado da execução da função, você deve analisar os campos da estrutura de resultados.

Favor explicar.
 
fxsaber:

O vídeo mostra o início da sessão. E o vídeo no artigo é o suco. E

o número não é suficiente para iniciar a sessão. Por favor, explique o que é uma "fila" e um "aquecimento".

Observe o horário nos testes - é o meio de um dia tranquilo, não o início da sessão. Portanto, pular um pequeno número de ticks é razoável e é suficiente para evitar possíveis resíduos de ticks não selecionados.

Não é como se fôssemos crianças do fórum que não sabem como executar medições de teste e depois perdem devido a evidências ruins. Os testes foram executados dezenas de vezes para garantir que não houvesse erros. Somente depois disso é que houve a publicação.

 
Alexey Kozitsyn:

Onde está a confirmação de que você está falando? Não a notei no código. Se você está se referindo à resposta de OrderSend(), então está na ajuda:

Por favor, explique.

OrderSend é uma operação 100% síncrona que aguarda os resultados de uma colocação de ordem completa no servidor.

Ou seja, no caso da execução de uma bolsa externa, é um ciclo completo de processamento com a confirmação da colocação da ordem pela bolsa.

 
Renat Fatkhullin:

Observe o horário nos testes - é o meio de um dia tranquilo, não o início de uma sessão.

Seu colega disse sobre a sessão

sessão de negociação , há várias atualizações individuais da pilha. Portanto, o script pula os primeiros N ticks para garantir que haja um conjunto real de ordens na pilha. E somente depois disso ele começa a contar os ticks.


Se o código tiver permanecido inalterado em relação ao vídeo anterior, a situação será diferente.
 
fxsaber:

Meu código

Resultado

Você pode ver claramente o quanto os resultados diferem, mesmo em meios minutos vizinhos. A comparação de óculos deve ser feita SOMENTE ao mesmo tempo!

Simultâneo é quando você tem uma diferença nas medições que oscila em torno de 10%.

Mas quando, pelos resultados de dezenas de testes, você tem uma diferença estável de 4 a 5 vezes, não há nada a discutir.

 
Alexey Kozitsyn:

Onde está a confirmação de que você está falando? Não a notei no código. Se você está se referindo à resposta de OrderSend(), então está na ajuda:

Por favor, explique.

OrderSend retorna o mesmo valor que OrderCheck. Mas, nesse caso, se retornar true, o OrderSend concluirá sua execução somente quando a resposta do servidor de negociação chegar.

O servidor de negociação (gateway) é um canal para a bolsa, onde apenas o GO é verificado. Portanto, se o GO estiver errado, a ordem não chegará à bolsa. E, nesse sentido, você está certo ao dizer que é bom verificar o MqlTradeResult. Mas, nesse caso, o GO estava sempre em ordem, de modo que todas as ordens foram enviadas para a bolsa. E o OrderSend terminou seu trabalho depois de receber exatamente a resposta da bolsa.

Portanto, o resultado está correto.

 
fxsaber:
Seu colega disse sobre a sessão
Se o código não foi alterado em relação ao vídeo anterior, isso é diferente.

Você está confuso com outro vídeo apresentado para comparação visual do início da sessão em três terminais. Nesse vídeo https://www.youtube.com/watch?v=i5vvD66I3Ik, é fácil ver a clara superioridade visual do MT5 na velocidade de atualização de dados.

No artigo https://www.mql5.com/pt/articles/2635, comprovamos a diferença de velocidade nos números e pegamos especialmente o meio do dia (2016.09.12 13:57 GMT+1), para que não houvesse reclamações sobre a possibilidade potencial de alguém travar no início do mercado. O vídeo do artigo https://www.youtube.com/watch?v=J5nqWGQ1zh8 mostra uma medição sequencial limpa por três minutos sem nenhuma interrupção.

3markets 25082016 blur
3markets 25082016 blur
  • 2016.08.25
  • www.youtube.com
Запись стаканов в терминалах MetaTrader 5, Quik и SmartX 25 августа 2016. Инструмент Si-9.16
 
Renat Fatkhullin:

Você está confuso com outro vídeo apresentado para comparação visual do início da sessão em três terminais. Nesse vídeo https://www.youtube.com/watch?v=i5vvD66I3Ik, é fácil notar uma clara superioridade visual do MT5 na velocidade de atualização dos dados.

No artigo https://www.mql5.com/pt/articles/2635, comprovamos a diferença de velocidade nos números e pegamos o meio do dia (13:57 GMT+1) de propósito, para que não houvesse reclamações sobre a possibilidade potencial de alguém travar no início do mercado. O vídeo do artigo https://www.youtube.com/watch?v=J5nqWGQ1zh8 mostra uma medição sequencial limpa ao longo de três minutos.

Eu só tinha uma pergunta sobre o comentário na fonte do artigo atual

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Discussão do artigo "Comparação de MQL5 e QLUA - por que as operações de negociação em MQL5 são até 28 vezes mais rápidas?".

fxsaber, 2016.09.13:25 pm

 //--- pule os primeiros ticks para a limpeza inicial da fila e o aquecimento
   tickcounter++;
   if(tickcounter<ExtSkipFirstTicks)
      return;

Preciso de esclarecimentos sobre o impacto do enfileiramento e do aquecimento no desempenho.

Se for um rudimento (do vídeo anterior) - uma coisa, se não for - outra.
 
fxsaber:
Eu só tinha uma pergunta sobre o comentário na fonte do artigo atual
Se for um rudimento (do vídeo anterior) - uma coisa, se não for - outra.

Qualquer teste deve conter proteção contra partida a frio.

Portanto, pular N ticks é uma indicação de que estamos cientes e levando isso em consideração. Apenas para evitar a reclamação obviamente esperada "por que você não compensou a partida a frio".


O vídeo sobre o início da sessão de três terminais foi preparado em 25 de agosto de 2016 para outra reclamação de um operador que afirmou que o MT5 fica mais lento no início da sessão. Como se verificou mais tarde, esse operador não usava o MT5, mas transmitia especulações do fórum. Descobriu-se também que alguns operadores não estavam cientes de que, para instrumentos de câmbio, os gráficos são construídos não por Bid, mas por preços Last negociados. Eles consideraram a mudança de lances na pilha e sua não exibição nos gráficos como "freios do MT5".

É claro que não há freios.