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

 

Se reformularmos o problema como "com que frequência o código MQL5 é chamado a partir do kernel do terminal", então tudo deve ser medido de forma errada:

  1. Devemos remover todo o código MQL5 desnecessário e deixar alguns contadores em uma função simples para minimizar o custo da própria medição
  2. Encontrar um ponto de entrada OnXXXX adequado e um método de geração forçada de chamadas do kernel. Aqui precisamos fazer uma compilação de teste separada para medição.

Nesse caso, depois de construir um polígono, você pode realmente medir todas as despesas gerais das chamadas MQL5 e obter uma característica interessante. Como é nosso costume, então otimizamos tudo várias vezes.

Essa é uma tarefa interessante e vamos lidar com ela.

 
fxsaber:


Eu consegui!

Sim, nós temos.

Desculpe, eu não vi.

 
Renat Fatkhullin:

Se reformularmos o problema como "com que frequência o código MQL5 é chamado a partir do kernel do terminal", então tudo deve ser medido de forma errada:

  1. Devemos remover todo o código MQL5 desnecessário e deixar alguns contadores em uma função simples para minimizar o custo da própria medição
  2. Encontrar um ponto de entrada OnXXXX adequado e um método de geração forçada de chamadas do kernel. Aqui precisamos fazer uma compilação de teste separada para medição.

Nesse caso, depois de construir um polígono, você pode realmente medir todas as despesas gerais das chamadas MQL5 e obter uma característica interessante. Como é nosso costume, então otimizamos tudo várias vezes.

Essa é uma tarefa interessante e nós a faremos.

Obrigado por não deixar essas coisas nerds sem atenção!

Provavelmente, precisamos de uma compilação separada para medir a velocidade de chegada dos pacotes de cotação. Exatamente o que eu queria medir.

[Excluído]  
Renat Fatkhullin, fxsaber - obrigado pelo esclarecimento.
 
fxsaber:

Por favor, faça outro teste de velocidade do MT5 em uma conta real

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

Testando o 'CopyTicks'

fxsaber, 2016.09.13 11:11 AM

Se, por meio do OrderSendAsync, enviarmos dois limitadores (BuyLimit1_price < BuyLimit2_price) dentro do spread, a bolsa gerará dois ticks consecutivos com melhoria do preço de compra ao mesmo tempo (com precisão de 1 ms)?

Deixe-me explicar o que isso fará.

Quando a BuyLimit1 for enviada dentro do spread, um tick nos chegará da bolsa com o horário de seu nascimento (ele gerará um novo Bid). Depois de BuyLimit2 - outro tick com sua hora de nascimento. A diferença entre esses dois tempos é a característica de velocidade da entrega das ordens de negociação do MT5 para a bolsa.

Para obter perdas monetárias mínimas com esse experimento, você pode enviar não dois BuyLimits de forma assíncrona, mas BuyLimit e SellLimit dentro do spread e escolher algum instrumento de negociação com pouca liquidez.

 

Antes de comparar, precisamos "terminar" todo o complexo de operações de negociação

(recebimento de dados, justificativa de transações, recebimento de confirmação de transações).

Adicionado Build 1395, real

2016.09.14 17:30:03.100 Trades  'xxxxx': sell limit 5.00 BR-12.16 at 47.56
2016.09.14 17:30:06.849 Trades  'xxxxx': accepted sell limit 5.00 BR-12.16 at 47.56
2016.09.14 17:30:06.849 Trades  'xxxxx': sell limit 5.00 BR-12.16 at 47.56 placed for execution in 3750.466 ms
2016.09.14 17:30:06.851 Trades  'xxxxx': cancel order #44309414 sell limit 5.00 BR-12.16 at 47.56
2016.09.14 17:30:10.014 Trades  'xxxxx': deal #29388895 sell 1.00 BR-12.16 at 47.56 done (based on order #44309414)
2016.09.14 17:30:10.014 Trades  'xxxxx': exchange buy 1.00 BR-11.16 at market
2016.09.14 17:30:10.385 Trades  'xxxxx': deal #29388914 sell 4.00 BR-12.16 at 47.56 done (based on order #44309414)
2016.09.14 17:30:12.374 Trades  'xxxxx': accepted exchange buy 1.00 BR-11.16 at market
2016.09.14 17:30:12.375 Trades  'xxxxx': exchange buy 1.00 BR-11.16 at market placed for execution in 2360.902 ms
2016.09.14 17:30:12.398 Trades  'xxxxx': deal #29389024 buy 1.00 BR-11.16 at 47.25 done (based on order #44309578)
2016.09.14 17:30:12.401 Trades  'xxxxx': exchange buy 4.00 BR-11.16 at market
2016.09.14 17:30:13.006 Trades  'xxxxx': accepted exchange buy 4.00 BR-11.16 at market
2016.09.14 17:30:13.007 Trades  'xxxxx': exchange buy 4.00 BR-11.16 at market placed for execution in 606.852 ms
2016.09.14 17:30:13.009 Trades  'xxxxx': deal #29389140 buy 4.00 BR-11.16 at 47.25 done (based on order #44309644)
2016.09.14 17:30:13.015 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.74
2016.09.14 17:30:13.357 Trades  'xxxxx': accepted buy limit 5.00 BR-12.16 at 47.74
2016.09.14 17:30:13.357 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.74 placed for execution in 342.736 ms
2016.09.14 17:30:13.668 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.79
2016.09.14 17:30:13.712 Trades  'xxxxx': accepted buy limit 5.00 BR-12.16 at 47.79
2016.09.14 17:30:13.716 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.79 placed for execution in 48.228 ms
2016.09.14 17:30:13.718 Trades  'xxxxx': deal #29389165 buy 5.00 BR-12.16 at 47.79 done (based on order #44309680)
2016.09.14 17:30:13.721 Trades  'xxxxx': exchange sell 5.00 BR-11.16 at market
2016.09.14 17:30:13.740 Trades  'xxxxx': accepted exchange sell 5.00 BR-11.16 at market
2016.09.14 17:30:13.741 Trades  'xxxxx': exchange sell 5.00 BR-11.16 at market placed for execution in 20.867 ms
2016.09.14 17:30:13.778 Trades  'xxxxx': deal #29389166 sell 5.00 BR-11.16 at 47.29 done (based on order #44309682)
 

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

FORTES. Perguntas sobre execução

Renat Fatkhullin, 2016.08.23 16:35

Você só precisa esperar de 5 a 10 ms e tentar novamente.

O problema é que você recebe a confirmação da transação imediatamente, mas os detalhes completos da transação chegam de forma assíncrona depois disso. Isso pode levar de 0 a N ms, geralmente dentro de 1-2 ms (depende do ping, é claro).

Devido a essa circunstância, a comparação com o QLUA não é favorável ao MT5.
 
prostotrader:

Antes de comparar, precisamos "terminar" todo o complexo de operações de negociação

(recebimento de dados, justificativa de transações, recebimento de confirmação de transações).

Adicionado Build 1395, real


Acabei de fazer uma operação semelhante manualmente: 11,7 ms

2016.09.14 18:17:26.298	Trades	'10321': order #44324961 buy limit 1.00 / 1.00 BR-12.16 at 47.00 done in 11.759 ms
2016.09.14 18:17:26.295	Trades	'10321': buy limit 1.00 BR-12.16 at 47.00 placed for execution
2016.09.14 18:17:26.293	Trades	'10321': accepted buy limit 1.00 BR-12.16 at 47.00
2016.09.14 18:17:26.286	Trades	'10321': buy limit 1.00 BR-12.16 at 47.00
 
Renat Fatkhullin:

Você não quer ver o relatório real, mas usa seu próprio método defeituoso de medir o tempo da transação.

E não quer admitir seus erros, preferindo acreditar em números monstruosos de seu script errôneo.

Acabei de fazer uma operação semelhante manualmente: 11,7 ms.

Do que você está falando, Renate?

Esse é um trecho do registro do Temninal, não do meu próprio registro!

 
fxsaber:
Devido a essa circunstância, é necessário ajustar ligeiramente a comparação com o QLUA, não a favor do MT5.

Não há necessidade de ajustar nada. Minha frase foi para o caso geral "na sua Internet e seu ping pode ser qualquer coisa e, na realidade, dependendo da sua rede, você obterá uma transação em 0-N ms". E é mais provável que seja 0 ms do que mais.

Aqui está o código de verificação com controle de todas as transações no modo assíncrono:

ulong ExtTicks=0;
//+------------------------------------------------------------------+
//| Função de inicialização de especialista|
//+------------------------------------------------------------------+
int OnInit()
  {
//--- saída do ping para o servidor de negociação em milissegundos
   PrintFormat("AsyncTradesTest: last ping %.2f ms, build %d",TerminalInfoInteger(TERMINAL_PING_LAST)/1000.0,TerminalInfoInteger(TERMINAL_BUILD));
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   Print(EnumToString(trans.type)," ",trans.symbol,": ",trans.price," ",result.order," time: ",(GetMicrosecondCount()-ExtTicks)/1000.0," ms");
  }
//+------------------------------------------------------------------+
//| Função de tique de especialista|
//+------------------------------------------------------------------+
void OnTick()
  {
   static bool started=false;
//--- executar a série uma vez no primeiro tique
   if(!started)
     {
      started=true;
      //--- preencha a solicitação
      MqlTradeRequest req={};
      MqlTradeResult  res={};

      req.volume      =1;
      req.symbol      =_Symbol;
      req.price       =SymbolInfoDouble(_Symbol,SYMBOL_ASK);
      req.sl          =0;
      req.tp          =0;
      req.deviation   =100;
      req.type_filling=ORDER_FILLING_RETURN;
      req.action      =TRADE_ACTION_DEAL;
      req.type        =ORDER_TYPE_BUY;
      req.magic       =2016;
      //--- executar o loop de operação
      ExtTicks=GetMicrosecondCount();
      Print("Start...");
      OrderSendAsync(req,res);
     }
  }

Aqui está o resultado em uma conta real agora mesmo:

2016.09.14 18:32:53.234 Test (BR-12.16,H1)      TRADE_TRANSACTION_HISTORY_ADD BR-12.16: 0.0 0 time: 11.455 ms
2016.09.14 18:32:53.232 Test (BR-12.16,H1)      TRADE_TRANSACTION_DEAL_ADD BR-12.16: 47.13 0 time: 8.778 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_DELETE BR-12.16: 0.0 0 time: 8.457000000000001 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_UPDATE BR-12.16: 0.0 0 time: 8.202999999999999 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_REQUEST : 0.0 44326441 time: 8.151 ms
2016.09.14 18:32:53.228 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_UPDATE BR-12.16: 0.0 0 time: 5.196 ms
2016.09.14 18:32:53.228 Test (BR-12.16,H1)      TRADE_TRANSACTION_REQUEST : 0.0 44326441 time: 5.171 ms
2016.09.14 18:32:53.227 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_ADD BR-12.16: 0.0 0 time: 4.184 ms
2016.09.14 18:32:53.223 Test (BR-12.16,H1)      Start...
2016.09.14 18:32:49.753 Test (BR-12.16,H1)      AsyncTradesTest: last ping 2.15 ms, build 1417

Você deve lê-lo de baixo para cima.

Ele mostra todos os estágios das transações com o total cumulativo do tempo gasto desde o início. Por tipos de transação, você pode ver o que foi adicionado ao terminal e quando.

O tempo total é de 11,45 ms.