MT5 e velocidade em ação - página 9

 
fxsaber:

Acontece com freqüência. As funções comerciais não foram chamadas.

SymbolInfoTick às vezes não é um mau atraso. O HFT pode ser muito experiente com tais atrasos inesperados.

Por favor, peça aos Desenvolvedores que encontrem as razões. Enquanto isso, é óbvio que em EAs de batalha seu profiler é uma obrigação.

O que o teste vai mostrar no terminal "vazio"?

void OnStart()
  {
   MqlTick Tick;
//---
   ulong start,end,max_time=0,avr_time=0;
   int   count=100000;
   for(int i=0; i<count; i++)
     {
      start=GetMicrosecondCount();
      SymbolInfoTick(_Symbol, Tick);
      end=GetMicrosecondCount()-start;
      //--- >1 ms
      if(end>1000)
         Print(" > 1 ms for one SymbolInfoTick: ",DoubleToString(end/1000.0,2)," ms");
      //---
      if(end>max_time)
         max_time=end;
      avr_time+=end;
     }
   Print("SymbolInfoTick max time: ",DoubleToString(max_time/1000.0,3)," ms; avr time: ",DoubleToString(avr_time/1000.0/count,3)," ms; ",count," iterations");
//---
   start=GetMicrosecondCount();
   for(int i=0; i<count; i++)
      SymbolInfoTick(_Symbol, Tick);
   end=GetMicrosecondCount()-start;
   Print(count," SymbolInfoTick = ",DoubleToString(end/1000.0,2)," ms");
  }

Deveria ser algo como isto:

2020.06.04 11:02:30.123 TestSymbolInfoTick (EURUSD,H1)  SymbolInfoTick max time: 0.138 ms; avr time: 0.000 ms; 100000 iterations
2020.06.04 11:02:30.138 TestSymbolInfoTick (EURUSD,H1)  100000 SymbolInfoTick = 14.85 ms
2020.06.04 11:02:31.433 TestSymbolInfoTick (EURUSD,H1)  SymbolInfoTick max time: 0.051 ms; avr time: 0.000 ms; 100000 iterations
2020.06.04 11:02:31.448 TestSymbolInfoTick (EURUSD,H1)  100000 SymbolInfoTick = 15.17 ms
2020.06.04 11:02:33.064 TestSymbolInfoTick (EURUSD,H1)  SymbolInfoTick max time: 0.035 ms; avr time: 0.000 ms; 100000 iterations
2020.06.04 11:02:33.079 TestSymbolInfoTick (EURUSD,H1)  100000 SymbolInfoTick = 15.12 ms

A menos que você nos diga em detalhes o que está fazendo, como exatamente está colocando uma carga no terminal, será difícil para nós encontrar as razões.

 
Anton:

O que o teste mostrará em um terminal "vazio"?

Deveria ser algo como isto:

        SymbolInfoTick max time: 0.034 ms; avr time: 0.000 ms; 100000 iterations
        100000 SymbolInfoTick = 8.56 ms
        SymbolInfoTick max time: 0.047 ms; avr time: 0.000 ms; 100000 iterations
        100000 SymbolInfoTick = 9.04 ms
        SymbolInfoTick max time: 0.045 ms; avr time: 0.000 ms; 100000 iterations
        100000 SymbolInfoTick = 9.02 ms

A menos que você nos diga em detalhes o que está fazendo, exatamente como está colocando a carga no terminal, será difícil para nós encontrar as razões.

As iterações 100K não são um indicador. Uma vez que a função nem sempre desacelera, mas às vezes.

Na verdade, preciso desativar pedaços da EA de combate até que a frenagem pare. Então eu posso fornecer o código. Eu tenho que esperar.

 
fxsaber:

Na verdade, preciso desativar pedaços do conselheiro de combate até que os freios parem. Então eu posso fornecer o código. Eu tenho que esperar.

Execute esta EA com alguns caracteres para obter um resultado rápido.

#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

void OnTick()
{
  MqlTick Tick[1];
  
  if (_B(CopyTicks(_Symbol, Tick, COPY_TICKS_ALL, 0, 1), 1)) // Не знаю, влияет это или нет.
    _B(SymbolInfoTick(_Symbol, Tick[0]), 1);
}


Consegui isso em cinco minutos.

        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 9 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 3 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 4 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 1 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 2 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 5 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 2 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 1 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 16 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 16 ms.


Parece que basta deixar apenas isto (sem CopyTicks) na EA.

    _B(SymbolInfoTick(_Symbol, Tick[0]), 1);
 
fxsaber:

As iterações 100K não são um indicador. Como a função nem sempre desacelera, mas às vezes.

Proponho mudar o conceito de definir a rapidez de uma função.

Uma função é rápida se não houver picos em seu tempo de execução.


Como foi mostrado acima, mesmo funções simples têm tais picos. Às vezes muito grandes. Eu não tenho idéia do que isso tem a ver. Mas é óbvio que todas as funções críticas para o comércio devem ser verificadas quanto à presença de picos usando o método sugerido acima. Isto é, corremos e monitoramos picos maiores que um milissegundo durante algumas horas.


É necessário conseguir que não haja picos, pelo menos em um Terminal vazio. As iterações rápidas de 100K acabam por não ser nada.

 
fxsaber:

Sugiro mudar o conceito de definir a rapidez de uma função.

Uma função é rápida se não houver picos em sua duração.


Como mostrado acima, mesmo funções simples têm tais picos. Às vezes muito grandes. Não tenho idéia do que isso tem a ver com isso. Mas é óbvio que todas as funções críticas para o comércio devem ser verificadas quanto à presença de picos usando o método sugerido acima. Isto é, corremos e monitoramos picos maiores que um milissegundo durante algumas horas.


É necessário conseguir que não haja picos, pelo menos em um Terminal vazio. As iterações rápidas de 100K acabam por não ser nada.

s vezes acontece que o temporizador mostra uma quantidade acumulada de tempo se outra tarefa estiver em execução. Por exemplo, isso pode acontecer quando se trabalha com telas - quando a função de exibição define a tarefa a ser exibida sem criar uma imagem e volta. Depois disso, qualquer outra função é executada sequencialmente, por exemplo, o mesmo comentário, porém o processo de mapeamento de tela é iniciado na linguagem da CPU e somente depois que a tela é exibida. Ao medir o tempo você pode ver que o comentário leva muito tempo para ser produzido, mas a função de exibição do kanvas funciona em 0 ms.

 
fxsaber:

funcionar e monitorar picos superiores a um milissegundo por um par de horas.

Precisamos garantir que não haja picos, pelo menos em um Terminal vazio. As iterações rápidas de 100K revelaram-se inúteis.

Elaborei um consultor especializado para o monitoramento.

// Мониторинг длительных пиков выполнения важных функций для торговли.
#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

input int inCycle = 10;    // Циклов проверки в одном OnTick
input int inAlertTime = 1; // Нижний порог в миллисекундах

#define _B2(A) _B(A, AlertTime)

void Check( const string Symb, const int AlertTime = 1 )
{
  MqlTick Tick;
  
  if (_B2(SymbolInfoTick(Symb, Tick)))
  {
    MqlTick Ticks[];
    
    _B2(CopyTicks(Symb, Ticks, COPY_TICKS_ALL, 0, 1));
    _B2(CopyTicks(Symb, Ticks, COPY_TICKS_ALL, Tick.time_msc));
    _B2(CopyTicksRange(Symb, Ticks, COPY_TICKS_ALL, Tick.time_msc));

    _B2(HistorySelect(Tick.time, INT_MAX));
    
    _B2(HistoryDealsTotal());
    _B2(HistoryDealGetTicket(0));
    _B2(HistoryDealGetInteger(0, DEAL_MAGIC));
    _B2(HistoryDealGetDouble(0, DEAL_PRICE));
    _B2(HistoryDealSelect(0));

    _B2(HistoryOrdersTotal());
    _B2(HistoryOrderGetTicket(0));
    _B2(HistoryOrderGetInteger(0, ORDER_MAGIC));
    _B2(HistoryOrderGetDouble(0, ORDER_PRICE_CURRENT));
    _B2(HistoryOrderSelect(0));
    
    _B2(GetLastError());
    _B2(IsStopped());
    
    _B2(SymbolInfoDouble(Symb, SYMBOL_ASK));
    _B2(SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE));
    _B2(SymbolInfoDouble(Symb, SYMBOL_POINT));
    _B2(SymbolInfoInteger(Symb, SYMBOL_DIGITS));

    _B2(TimeCurrent());
    _B2(TimeLocal());
    _B2(TimeTradeServer());
    
    _B2(OrdersTotal());
    _B2(OrderSelect(0));
    _B2(OrderGetDouble(ORDER_PRICE_CURRENT));
    _B2(OrderGetInteger(ORDER_MAGIC));
    _B2(OrderGetString(ORDER_SYMBOL));
    
    _B2(PositionsTotal());
    _B2(PositionSelect(Symb));
    _B2(PositionSelectByTicket(0));
    _B2(PositionGetDouble(POSITION_PRICE_CURRENT));
    _B2(PositionGetInteger(POSITION_MAGIC));
    _B2(PositionGetString(POSITION_SYMBOL));
    
    _B2(AccountInfoDouble(ACCOUNT_EQUITY));
    _B2(AccountInfoInteger(ACCOUNT_MARGIN_MODE));
    
    MqlTradeRequest Request = {0};
    MqlTradeCheckResult CheckResult;

    _B2(OrderCheck(Request, CheckResult));
    
    _B2(MQLInfoInteger(MQL_TRADE_ALLOWED));
    _B2(AccountInfoInteger(ACCOUNT_TRADE_EXPERT));
    _B2(AccountInfoInteger(ACCOUNT_TRADE_ALLOWED));
    _B2(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED));
    
    _B2(SymbolsTotal(true));
    _B2(SymbolName(0, true));
    _B2(Symbol());
    
    _B2(GlobalVariableCheck(NULL));
    _B2(GlobalVariableGet(NULL));
    
    _B2(ResourceFree(NULL));
  }
}

void OnTick()
{
  for (int i = 0; i < inCycle; i++)
    Check(_Symbol, inAlertTime);
}


Consegui o resultado em cinco minutos de monitoramento.

        Alert: Time[Test6.mq5 18: HistorySelect(Tick.time,INT_MAX)] = 21 ms.
        Alert: Time[Test6.mq5 24: HistoryDealSelect(0)] = 4 ms.
        Alert: Time[Test6.mq5 10: SymbolInfoTick(Symb,Tick)] = 24 ms.
        Alert: Time[Test6.mq5 14: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 4 ms.
        Alert: Time[Test6.mq5 30: HistoryOrderSelect(0)] = 3 ms.
        Alert: Time[Test6.mq5 35: SymbolInfoDouble(Symb,SYMBOL_ASK)] = 2 ms.


SZZY Com tal valor de parâmetro de entrada, há muito menos alertas.

input int inAlertTime = 10; // Нижний порог в миллисекундах


Mas o resultado também é mais significativo.

        Alert: Time[Test6.mq5 21: HistorySelect(Tick.time,INT_MAX)] = 19 ms.
        Alert: Time[Test6.mq5 21: HistorySelect(Tick.time,INT_MAX)] = 10 ms.
        Alert: Time[Test6.mq5 38: SymbolInfoDouble(Symb,SYMBOL_ASK)] = 10 ms.
        Alert: Time[Test6.mq5 13: SymbolInfoTick(Symb,Tick)] = 10 ms.
        Alert: Time[Test6.mq5 38: SymbolInfoDouble(Symb,SYMBOL_ASK)] = 10 ms.
        Alert: Time[Test6.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 148 ms.
        Alert: Time[Test6.mq5 74: SymbolName(0,true)] = 11 ms.
 

Finalmente, comigo modificando um monte de pedidos às vezes leva de 3 a 10 segundos por pedido. Depois disso, leva um longo tempo de 0,1 segundos novamente.

Puxou para cima os logs do servidor - é instantâneo lá.


É muito desagradável para um Expert Advisor de batalha.

2020.06.04 15:24:48.771 Alert: Time[NewTicks.mqh 31: ::SymbolInfoTick(_Symbol,Tick)] = 61 ms.
2020.06.04 15:25:21.729 Alert: Time[NewTicks.mqh 31: ::SymbolInfoTick(_Symbol,Tick)] = 29 ms.
2020.06.04 15:27:57.842 Alert: Time[NewTicks.mqh 31: ::SymbolInfoTick(_Symbol,Tick)] = 142 ms.


Alguns valores fantásticos.

 
fxsaber:

Finalmente, comigo modificando um monte de pedidos às vezes leva de 3 a 10 segundos por pedido. Depois disso, leva um longo tempo de 0,1 segundos novamente.

Logs de servidor levantados - lá instantaneamente.

A situação se repetiu em outro servidor comercial.

O terminal modificou a posição aberta em 2,5 segundos. No servidor - 2 milissegundos.

Muito provavelmente, esta é também a fonte de problemas com a execução do FORTS.

ФОРТС. Вопросы по исполнению
ФОРТС. Вопросы по исполнению
  • 2020.03.30
  • www.mql5.com
С большими проблемами удалось это сделать (начальник отдела по работе с профессиональными клиентами ДЦ Открытие Евгений Сергеевич,.
 

Retransmissões.

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

MetaTrader 5 construir 1700 plataforma beta: Projetos em MetaEditor e ferramentas sintéticas

Renat Fatkhullin, 2017.12.14 12:47

Este é um indicador da qualidade da comunicação. A porcentagem de pacotes de rede retransmitidos no protocolo TCP/IP.

Ela é contada globalmente no nível da interface de rede para todas as aplicações em todo o sistema operacional. Quando você suspeitar de lentidão e problemas, olhe para esta métrica. Crítico quando o servidor do corretor está muito distante. Por exemplo, para comerciantes asiáticos e um corretor na Europa.

Já a 3% de retransmissão, você pode dizer que não pode negociar. O nível extremo de retransmissões é dado pela má rede wifi.

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Novo MetaTrader 5 build 2360: Integração expandida com SQLite

Renat Fatkhullin, 2020.04.06 12:33

A norma deve ser inferior a 1%. E já 3% de perda de rede mata serviços de baixa latência.

Por exemplo, nossas retransmissões são de 0,68 - 0,75% com obviamente mais usuários (temos 17k online no MetaQuotes-Demo). E nós servimos o mundo inteiro, não Moscou/Rússia.

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Bichos, insetos, perguntas

Renat Fatkhullin, 2017.12.17 23:03

Estas são estatísticas da interface de rede de todo o computador, onde Metatrader é apenas um dos usuários. Não está necessariamente relacionado com o servidor comercial.

As estatísticas gerais podem ser facilmente corrompidas por um navegador da web depois de falhar o acesso a algum site distante e com falhas. Também é possível que um wifi local pegue um conflito de rede e receba dezenas de por cento de retransmissões em pontos aleatórios no tempo.

Em caso de retransmissões de 20% não haverá conexão com o servidor comercial e as reconexões serão constantes e infinitas. O terminal tem conexão constante e até mesmo 3-5% de retransmissão será fatal para ele manter longas conexões.

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Bichos, insetos, perguntas

Renat Fatkhullin, 2017.12.18 11:36

Tenha em mente que esta é uma característica técnica de sua pilha TCP/IP local , relatada pelo sistema operacional, e não um indicador da qualidade de uma conexão específica com os servidores comerciais. Inclui toda a atividade da rede, incluindo a atividade do sistema/telefone.


A conexão de um cluster comercial é conhecida por ser de alta qualidade e nós registramos muitos parâmetros (esta é uma funcionalidade padrão da plataforma), coletando instantâneos de um minuto e análises subseqüentes.

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Bichos, insetos, perguntas

Renat Fatkhullin, 2017.12.18 00:13

Verificado.

Nenhum dos nós em nosso grupo de demonstração, incluindo a Ásia, teve qualquer reinício ou aumento no nível de retransmissão durante todo o dia (e em outros dias também). Tudo está entre 0,5% e 1,5% normal.


Parece que tenho muita coisa.

Agora é meia-noite, as cotações raramente são atualizadas. Os retransmissores estão aumentando diante dos meus olhos. Quero colocar Alerta em VPS a um valor alto > 1% para comércio de baixa latência. Mas com valores tão grandes, esta idéia se torna inútil.


O que eu posso recomendar? O tracert para o servidor comercial? Algum tipo de programa de monitoramento? Em geral, como garantir que o MT5 esteja pronto para a baixa latência?


ZS Assim que as citações começam a se mover mais rapidamente, o índice cai muitas vezes.

 
fxsaber:

Retransmissores.


Parece que eu tenho muito disso.

5-6 da manhã:

Casa (óptica, ETH para roteador, cabo para computador) - 8-19%, ping 60-70

VPS na Holanda (momentaneamente 1 MT5 com gráficos de 9 moedas/11) - 1,2-1,6%, ping 3,7