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

 

Houve um forte movimento no Brent hoje

E, nesse momento, o MT5 cuidou desses atrasos.

 
Renat Fatkhullin:

Você não precisa ajustar nada. Minha frase foi para um 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:

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

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.

Muito obrigado pelo código claro! De acordo com seus resultados, não há realmente nada a ser corrigido. Eu cometi um erro.
 
prostotrader:

Hoje houve um forte movimento no Brent.

E, nesse momento, o MT5 cuidou desses atrasos.

Mantenha as teclas de atalho prontas para gravação instantânea da tela. Ou registre tudo o tempo todo. Você sempre pode cortar uma parte problemática e apresentá-la como prova. Por enquanto, apenas palavras.
 
prostotrader:

Do que está falando, Renate?

Isso é um extrato do registro do Temninal, não do meu próprio registro!

Sim, é isso mesmo. Desculpe, eu o confundi com um colega que estava contando os tempos incorretamente.

Eis o que aconteceu na ocasião: é uma pergunta para a bolsa - por que ela sempre se comporta dessa forma em movimentos mínimos e considera normal executar ordens nesse período?

Você queria colocar uma ordem de limite a 47,56 próximo ao mercado e é provável que a bolsa tenha diminuído a aceitação de ordens para um intervalo de preço próximo de propósito, para que não houvesse surpresas:


Do ponto de vista do desempenho, não pode haver dúvidas, pois o volume foi ridículo, 320 lotes por minuto.

Mostrei meu desempenho em um mercado calmo acima.

 
fxsaber:
Mantenha as teclas de atalho prontas para gravação instantânea da tela. Ou grave tudo o tempo todo. Você sempre pode cortar a parte problemática e apresentá-la como prova. Por enquanto, apenas palavras.
prostotrader:

Hoje houve um forte movimento no Brent.

E, nesse momento, o MT5 cuidou desses atrasos.

Só que o MT5 não tem nada a ver com esses atrasos.

Foi a bolsa que respondeu por tanto tempo.

 
Renat Fatkhullin:

Somente o MT5 não tem nada a ver com esses atrasos.

Foi a bolsa que demorou tanto para responder.

Você pode destacar as linhas em seu log de exemplo onde os freios da bolsa estarão visíveis quando ela se comportar dessa maneira?

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
 

É provável que se torne perceptível a partir daqui, mas com certeza será visível nas duas últimas transações:

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
 
Renat Fatkhullin:

Provavelmente será perceptível a partir daqui, mas com certeza será visível nas duas últimas transações:

Obrigado. A ajuda e o artigo são bastante escassos quanto aos processos internos por trás de cada tipo de transação comercial.

Em seu esclarecimento, parece que as primeiras quatro linhas (8ms) ainda não são uma troca. Onde é possível ler o que realmente acontece? Porque não há entendimento e não está claro onde obtê-lo.

 
fxsaber:

Obrigado. A ajuda e o artigo são bastante escassos quanto aos processos internos por trás de cada tipo de transação comercial.

Em seu esclarecimento, verifica-se que as primeiras quatro linhas (8ms) ainda não são uma troca. Onde é possível ler o que realmente acontece? Porque não há entendimento e não está claro onde enfatizar isso.

Não, eu não disse isso.

Esbocei o código de forma apressada e não descrevi todos os campos. Verifique você mesmo no depurador cada entrada para a função do meu script e imprima mais campos, por favor.

 
fxsaber:

Obrigado. A ajuda e o artigo estão muito mal escritos sobre os processos internos por trás de cada tipo de transação comercial.

Um exemplo de um possível ouvinte de eventos de negociação é dado no artigo Por onde começar ao criar um robô de negociação para a Bolsa de Valores de Moscou MOEX

//+------------------------------------------------------------------+
//|TradeTransactionListener.mq5 |
//| Copyright 2016, MetaQuotes Software Corp.
//| https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Função de inicialização de especialista|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   PrintFormat("LAST PING=%.f ms",
               TerminalInfoInteger(TERMINAL_PING_LAST)/1000.);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Função de tique de especialista|
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Função TradeTransaction|
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//---
   static int counter=0;   // contador de chamadas OnTradeTransaction()
   static uint lasttime=0; // hora da última chamada OnTradeTransaction()
//---
   uint time=GetTickCount();
//--- se a última transação foi realizada há mais de 1 segundo
   if(time-lasttime>1000)
     {
      counter=0; // significa que essa é uma nova operação de negociação e você pode zerar o contador
      if(IS_DEBUG_MODE)
         Print(" Nova operação comercial");
     }
   lasttime=time;
   counter++;
   Print(counter,". ",__FUNCTION__);
//--- resultado da execução da solicitação de negociação
   ulong            lastOrderID   =trans.order;
   ENUM_ORDER_TYPE  lastOrderType =trans.order_type;
   ENUM_ORDER_STATE lastOrderState=trans.order_state;
//--- o nome do caractere no qual a transação ocorreu
   string trans_symbol=trans.symbol;
//--- tipo de transação
   ENUM_TRADE_TRANSACTION_TYPE  trans_type=trans.type;
   switch(trans.type)
     {
      case  TRADE_TRANSACTION_POSITION:   // mudar de posição
        {
         ulong pos_ID=trans.position;
         PrintFormat("MqlTradeTransaction: Position  #%d %s modified: SL=%.5f TP=%.5f",
                     pos_ID,trans_symbol,trans.price_sl,trans.price_tp);
        }
      break;
      case TRADE_TRANSACTION_REQUEST:     // envio de uma solicitação de negociação
         PrintFormat("MqlTradeTransaction: TRADE_TRANSACTION_REQUEST");
         break;
      case TRADE_TRANSACTION_DEAL_ADD:    // adição de uma transação
        {
         ulong          lastDealID   =trans.deal;
         ENUM_DEAL_TYPE lastDealType =trans.deal_type;
         double        lastDealVolume=trans.volume;
         //--- identificador da transação no sistema externo - bilhete atribuído pela Bolsa de Valores de Moscou
         string Exchange_ticket="";
         if(HistoryDealSelect(lastDealID))
            Exchange_ticket=HistoryDealGetString(lastDealID,DEAL_EXTERNAL_ID);
         if(Exchange_ticket!="")
            Exchange_ticket=StringFormat("(MOEX deal=%s)",Exchange_ticket);

         PrintFormat("MqlTradeTransaction: %s deal #%d %s %s %.2f lot   %s",EnumToString(trans_type),
                     lastDealID,EnumToString(lastDealType),trans_symbol,lastDealVolume,Exchange_ticket);
        }
      break;
      case TRADE_TRANSACTION_HISTORY_ADD: // adição de um pedido ao histórico
        {
         //--- Identificador de ordem no sistema externo - bilhete atribuído pela Bolsa de Valores de Moscou
         string Exchange_ticket="";
         if(lastOrderState==ORDER_STATE_FILLED)
           {
            if(HistoryOrderSelect(lastOrderID))
               Exchange_ticket=HistoryOrderGetString(lastOrderID,ORDER_EXTERNAL_ID);
            if(Exchange_ticket!="")
               Exchange_ticket=StringFormat("(MOEX ticket=%s)",Exchange_ticket);
           }
         PrintFormat("MqlTradeTransaction: %s order #%d %s %s %s   %s",EnumToString(trans_type),
                     lastOrderID,EnumToString(lastOrderType),trans_symbol,EnumToString(lastOrderState),Exchange_ticket);
        }
      break;
      default: // outras transações 
        {
         //--- Identificador de ordem no sistema externo - bilhete atribuído pela Bolsa de Valores de Moscou
         string Exchange_ticket="";
         if(lastOrderState==ORDER_STATE_PLACED)
           {
            if(OrderSelect(lastOrderID))
               Exchange_ticket=OrderGetString(ORDER_EXTERNAL_ID);
            if(Exchange_ticket!="")
               Exchange_ticket=StringFormat("MOEX ticket=%s",Exchange_ticket);
           }
         PrintFormat("MqlTradeTransaction: %s order #%d %s %s   %s",EnumToString(trans_type),
                     lastOrderID,EnumToString(lastOrderType),EnumToString(lastOrderState),Exchange_ticket);
        }
      break;
     }
//--- pedido de ingresso 
   ulong orderID_result=result.order;
   string retcode_result=GetRetcodeID(result.retcode);
   if(orderID_result!=0)
      PrintFormat("MqlTradeResult: order #%d retcode=%s ",orderID_result,retcode_result);
//--- 
  }
//+------------------------------------------------------------------+
//| Traduz os códigos de resposta numéricos em mnemocódigos de string
//+------------------------------------------------------------------+
string GetRetcodeID(int retcode)
  {
   switch(retcode)
     {
      case 10004: return("TRADE_RETCODE_REQUOTE");             break;
      case 10006: return("TRADE_RETCODE_REJECT");              break;
      case 10007: return("TRADE_RETCODE_CANCEL");              break;
      case 10008: return("TRADE_RETCODE_PLACED");              break;
      case 10009: return("TRADE_RETCODE_DONE");                break;
      case 10010: return("TRADE_RETCODE_DONE_PARTIAL");        break;
      case 10011: return("TRADE_RETCODE_ERROR");               break;
      case 10012: return("TRADE_RETCODE_TIMEOUT");             break;
      case 10013: return("TRADE_RETCODE_INVALID");             break;
      case 10014: return("TRADE_RETCODE_INVALID_VOLUME");      break;
      case 10015: return("TRADE_RETCODE_INVALID_PRICE");       break;
      case 10016: return("TRADE_RETCODE_INVALID_STOPS");       break;
      case 10017: return("TRADE_RETCODE_TRADE_DISABLED");      break;
      case 10018: return("TRADE_RETCODE_MARKET_CLOSED");       break;
      case 10019: return("TRADE_RETCODE_NO_MONEY");            break;
      case 10020: return("TRADE_RETCODE_PRICE_CHANGED");       break;
      case 10021: return("TRADE_RETCODE_PRICE_OFF");           break;
      case 10022: return("TRADE_RETCODE_INVALID_EXPIRATION");  break;
      case 10023: return("TRADE_RETCODE_ORDER_CHANGED");       break;
      case 10024: return("TRADE_RETCODE_TOO_MANY_REQUESTS");   break;
      case 10025: return("TRADE_RETCODE_NO_CHANGES");          break;
      case 10026: return("TRADE_RETCODE_SERVER_DISABLES_AT");  break;
      case 10027: return("TRADE_RETCODE_CLIENT_DISABLES_AT");  break;
      case 10028: return("TRADE_RETCODE_LOCKED");              break;
      case 10029: return("TRADE_RETCODE_FROZEN");              break;
      case 10030: return("TRADE_RETCODE_INVALID_FILL");        break;
      case 10031: return("TRADE_RETCODE_CONNECTION");          break;
      case 10032: return("TRADE_RETCODE_ONLY_REAL");           break;
      case 10033: return("TRADE_RETCODE_LIMIT_ORDERS");        break;
      case 10034: return("TRADE_RETCODE_LIMIT_VOLUME");        break;
      case 10035: return("TRADE_RETCODE_INVALID_ORDER");       break;
      case 10036: return("TRADE_RETCODE_POSITION_CLOSED");     break;
      default:
         return("TRADE_RETCODE_UNKNOWN="+IntegerToString(retcode));
         break;
     }
//---
  }
//+------------------------------------------------------------------+