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

 
fxsaber:

Caros desenvolvedores, poderiam me informar como a MQL_MEMORY_USED é calculada?

Eu fiz um cálculo da memória que todas as variáveis EA ocupam.

É inferior a 10%. Se eu entendi corretamente, MQL_MEMORY_USED contém o cache de Histórico e o cache CopyTicks. Mas ainda é muito menos.

Ao mesmo tempo, o Expert Advisor paralelo consome várias vezes menos. Mas o princípio é o mesmo.

Em geral, o que está incluído neste valor?


Salvei um modelo com o Expert Advisor e o apliquei no mesmo gráfico, causando recarga. Já o vi assim.

O uso da memória mudou quase por uma ordem de grandeza. Até agora, é difícil explicar o que isso significa.

Muitos programas têm efeito cumulativo do uso de memória. Este é um pecado de navegadores e às vezes até de palavras. O Terminal também pode ser culpado por isso. Além disso, todos os registros são escritos por padrão e é fácil passar uma semana se você tiver muitas ações em um giga. Este é um mal que deve ser gerenciado. Mas não está claro como.

 
Vladimir Pastushak:

Talvez você saiba como programar um instrumento financeiro e não ficar pendurado por muito tempo ?

Através de um indicador

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2020.10.22
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 

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

MT5 e Velocidade em Ação

Renat Fatkhullin, 2020.10.14 04:15

Para o tiquetaque em massa, coloque mais memória.

4gb (preço de 20 euros) não é bom em 2020 quando se trata de análise e pesquisa.

Para os produtos de mercado, esta abordagem não é boa em nenhum lugar. Temos que contornar a retenção de 10 segundos de dados desnecessários através de uma muleta desse tipo.

      while (!IsStopped() && ::TerminalInfoInteger(TERMINAL_MEMORY_USED) > inMaxMemory)
      {
        Alert("::TerminalInfoInteger(TERMINAL_MEMORY_USED) = " + (string)::TerminalInfoInteger(TERMINAL_MEMORY_USED));
        
        Sleep(1000);
      }

Fazer um produto de mercado trivial na forma de uma Market Screener não é na verdade uma tarefa viável para a MT5 devido ao consumo excessivo de memória.

 
fxsaber:

Fazer um produto trivial de mercado na forma de uma Market Screener não é na verdade uma tarefa viável para o MT5 devido ao consumo excessivo de memória.

O terminal come tanta memória após o lançamento.

Após a execução do screener, começou a comer 2 gigs (TERMINAL_MEMORY_USED e não diminuiu com o tempo). Isto é com apenas um gráfico aberto para 5000 M1-bars.


Não salvou uma captura de tela. Mas decidiu dar um exemplo, que mostra um Terminal que come memória e não em si mesmo, onde é apenas estúpido.

// Создание копий оригинальных символов из Обзора рынка в виде пользовательских.
#property script_show_inputs

input datetime inStartTime = D'2020.06.01'; // С какого времени закачивать тики

void OnStart()
{
  for (int i = SymbolsTotal(true) - 1; !IsStopped() && (i >= 0); i--)
  {
    const string Symb = SymbolName(i, true);
    
    if (!SymbolInfoInteger(Symb, SYMBOL_CUSTOM)) // Если символ не кастомный.
    {
      Alert(Symb + " - Start.");
      
      MqlTick Ticks[];
      
      if (CopyTicksRange(Symb, Ticks, COPY_TICKS_ALL, (long)inStartTime * 1000) > 0) // Взяли с него тики.
      {
        const string CustomSymb = "CUSTOM_" + Symb;
      
        if (SymbolInfoInteger(CustomSymb, SYMBOL_EXIST) || CustomSymbolCreate(CustomSymb, AccountInfoString(ACCOUNT_SERVER), Symb)) // Содали кастомный.
        {
          Alert((string)i + ": " + Symb + " - " + (string)CustomTicksReplace(CustomSymb, 0, LONG_MAX, Ticks)); // Поместили в него тики.
          
          SymbolSelect(CustomSymb, true);
        }
       }
    }
  }
}


O roteiro simplesmente faz cópias dos símbolos originais do Market Watch. Eu deveria adicionar todos os símbolos no MQ-Demo e executar este roteiro pela primeira vez no frio e depois novamente no quente.

E depois da corrida quente (quando os carrapatos já estão em SSD na forma de arquivos tkc) vou observar um enorme esgotamento de memória onde não é necessário em uma implementação adequada.


Entretanto, rodando o roteiro, descobri que ele está pendurado no MQ-Demo. Ele só pode ser descarregado através de terminação anormal, após o que o Terminal não libera mais de 1 GB de memória.


É fácil comparar esta captura de tela com a do início.

 

Desculpe, não tenho certeza se se trata de um bug ou de uma característica. Ainda não encontrei uma resposta por conta própria. Mas a pergunta está relacionada ao desempenho e suponho que é melhor fazê-la aqui.

Se adicionarmos, por exemplo, 22 buffers do tipo DRAW_SECTION a um indicador vazio, então na inicialização de tal indicador para um gráfico contendo 1000000 barras ou mais, o terminal se atrasa significativamente (causa uma carga significativa na CPU) e come quantidades significativas de memória, mesmo que o indicador não calcule nada.

Meu interesse foi despertado pelo fato de que se você usar amortecedores com outros tipos, tudo funciona sem problemas e tal desaceleração não é observada.

Por exemplo, executei o seguinte código em um único gráfico com 1000000 barras e ele consumiu cerca de 500 MBytes e desfasamentos, especialmente o próprio gráfico.

#property indicator_chart_window

#property indicator_buffers   22
#property indicator_plots     22

#property indicator_type1     DRAW_SECTION
#property indicator_type2     DRAW_SECTION
#property indicator_type3     DRAW_SECTION
#property indicator_type4     DRAW_SECTION
#property indicator_type5     DRAW_SECTION
#property indicator_type6     DRAW_SECTION
#property indicator_type7     DRAW_SECTION
#property indicator_type8     DRAW_SECTION
#property indicator_type9     DRAW_SECTION
#property indicator_type10     DRAW_SECTION
#property indicator_type11     DRAW_SECTION
#property indicator_type12     DRAW_SECTION
#property indicator_type13     DRAW_SECTION
#property indicator_type14     DRAW_SECTION
#property indicator_type15     DRAW_SECTION
#property indicator_type16     DRAW_SECTION
#property  indicator_type17     DRAW_SECTION
#property  indicator_type18     DRAW_SECTION
#property  indicator_type19     DRAW_SECTION
#property  indicator_type20     DRAW_SECTION
#property  indicator_type21     DRAW_SECTION
#property  indicator_type22     DRAW_SECTION

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
{  
   return INIT_SUCCEEDED;   
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   return rates_total;
}

Mas se eu mudar o tipo de amortecedor para, digamos, DRAW_LINE, a carga no processador é reduzida drasticamente, os atrasos não são observados e a memória consome 5 vezes menos (cerca de 100 MBytes consumidos).

#property indicator_chart_window

#property indicator_buffers   22
#property indicator_plots     22

#property indicator_type1     DRAW_LINE
#property indicator_type2     DRAW_LINE
#property indicator_type3     DRAW_LINE
#property indicator_type4     DRAW_LINE
#property indicator_type5     DRAW_LINE
#property indicator_type6     DRAW_LINE
#property indicator_type7     DRAW_LINE
#property indicator_type8     DRAW_LINE
#property indicator_type9     DRAW_LINE
#property indicator_type10     DRAW_LINE
#property indicator_type11     DRAW_LINE
#property indicator_type12     DRAW_LINE
#property indicator_type13     DRAW_LINE
#property indicator_type14     DRAW_LINE
#property indicator_type15     DRAW_LINE
#property indicator_type16     DRAW_LINE
#property  indicator_type17     DRAW_LINE
#property  indicator_type18     DRAW_LINE
#property  indicator_type19     DRAW_LINE
#property  indicator_type20     DRAW_LINE
#property  indicator_type21     DRAW_LINE
#property  indicator_type22     DRAW_LINE

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
{  
   return INIT_SUCCEEDED;   
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   return rates_total;
}   

Testes semelhantes foram feitos em construções diferentes, até 2019 e a situação é a mesma.

Eu ficaria grato em saber do que se trata e se é normal, em princípio?
 
fxsaber:

Um cidadão individual retirouum duplicado de uma carga inestimável de código MQL de suas calças largas, o que mostrou que sob as mesmas condições a muleta funcionava mais rápido que a função normal.

Um teste muito simples:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   TestSymbolInfoTick();
   TestPositionSelectByTicket();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void TestSymbolInfoTick()
  {
   MqlTick Tick;
//---
   ulong start,end,max_time=0,avr_time=0,counter=0;
   int   count=100000;
   for(int i=0; i<count; i++)
     {
      start=GetMicrosecondCount();
      SymbolInfoTick(_Symbol, Tick);
      end=GetMicrosecondCount()-start;
      //---
      if(end>max_time)
         max_time=end;
      if(end>100)
        {
         avr_time+=end;
         counter++;
        }
     }
   Print("SymbolInfoTick max bad time: ",DoubleToString(max_time/1000.0,3)," ms; avr bad time: ",counter ? DoubleToString(avr_time/1000.0/counter,3):"0"," ms; bad iterations: ",counter," total iterations: ",count);
  }  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void TestPositionSelectByTicket()
  {
//---
   ulong start,end,max_time=0,avr_time=0,counter=0;
   int   count=100000;
   for(int i=0; i<count; i++)
     {
      start=GetMicrosecondCount();
      GetBid();
      end=GetMicrosecondCount()-start;
      //---
      if(end>max_time)
         max_time=end;
      if(end>100)
        {
         avr_time+=end;
         counter++;
        }
     }
   Print("GetBid max bad time: ",DoubleToString(max_time/1000.0,3)," ms; avr bad time: ",counter ? DoubleToString(avr_time/1000.0/counter,3):"0"," ms; bad iterations: ",counter," total iterations: ",count);
  }

20 Consultores especialistas em EURUSD, ou seja, todos os processos OnTick simultaneamente. A construção do terminal é 2664. O teste está sendo executado sem otimização, compilação e outras cargas adicionais a 100% CPU - você não vai executar um verdadeiro "hft" de negociação com este fundo, vai?

Diário de teste típico:

2020.10.29 11:10:49.133 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 28.004 ms; avr bad time: 0.393 ms; bad iterations: 1569 total iterations: 100000
2020.10.29 11:10:49.136 SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 4.795 ms; avr bad time: 0.361 ms; bad iterations: 1783 total iterations: 100000
2020.10.29 11:10:49.137 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 25.367 ms; avr bad time: 0.425 ms; bad iterations: 1496 total iterations: 100000
2020.10.29 11:10:49.138 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 2.681 ms; avr bad time: 0.352 ms; bad iterations: 1804 total iterations: 100000
2020.10.29 11:10:49.139 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 4.264 ms; avr bad time: 0.370 ms; bad iterations: 1734 total iterations: 100000
2020.10.29 11:10:49.142 SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 7.049 ms; avr bad time: 0.362 ms; bad iterations: 1803 total iterations: 100000
2020.10.29 11:10:49.142 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 13.376 ms; avr bad time: 0.365 ms; bad iterations: 1754 total iterations: 100000
2020.10.29 11:10:49.144 SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 18.048 ms; avr bad time: 0.417 ms; bad iterations: 1516 total iterations: 100000
2020.10.29 11:10:49.144 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 21.280 ms; avr bad time: 0.372 ms; bad iterations: 1769 total iterations: 100000
2020.10.29 11:10:53.837 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.631 ms; avr bad time: 0.143 ms; bad iterations: 205 total iterations: 100000
2020.10.29 11:10:53.837 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.517 ms; avr bad time: 0.134 ms; bad iterations: 170 total iterations: 100000
2020.10.29 11:10:53.837 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.483 ms; avr bad time: 0.144 ms; bad iterations: 178 total iterations: 100000
2020.10.29 11:10:53.838 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.517 ms; avr bad time: 0.147 ms; bad iterations: 182 total iterations: 100000
2020.10.29 11:10:53.844 SymbolInfoTick (EURUSD,H1)      SymbolInfoTick max bad time: 0.582 ms; avr bad time: 0.134 ms; bad iterations: 165 total iterations: 100000
2020.10.29 11:10:53.845 SymbolInfoTick (EURUSD,H1)      SymbolInfoTick max bad time: 0.518 ms; avr bad time: 0.137 ms; bad iterations: 195 total iterations: 100000
2020.10.29 11:10:53.845 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.530 ms; avr bad time: 0.139 ms; bad iterations: 160 total iterations: 100000
2020.10.29 11:10:53.846 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.575 ms; avr bad time: 0.138 ms; bad iterations: 143 total iterations: 100000
2020.10.29 11:10:53.848 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.593 ms; avr bad time: 0.143 ms; bad iterations: 206 total iterations: 100000
2020.10.29 11:10:53.849 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.446 ms; avr bad time: 0.138 ms; bad iterations: 147 total iterations: 100000
2020.10.29 11:10:53.850 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.661 ms; avr bad time: 0.146 ms; bad iterations: 191 total iterations: 100000
2020.10.29 11:10:53.850 SymbolInfoTick (EURUSD,H1)      SymbolInfoTick max bad time: 0.471 ms; avr bad time: 0.141 ms; bad iterations: 219 total iterations: 100000
2020.10.29 11:10:53.851 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.442 ms; avr bad time: 0.137 ms; bad iterations: 198 total iterations: 100000
2020.10.29 11:10:53.851 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.574 ms; avr bad time: 0.140 ms; bad iterations: 215 total iterations: 100000
2020.10.29 11:10:53.853 SymbolInfoTick (EURUSD,H1)      SymbolInfoTick max bad time: 0.507 ms; avr bad time: 0.140 ms; bad iterations: 222 total iterations: 100000
2020.10.29 11:10:53.857 SymbolInfoTick (EURUSD,H1)      SymbolInfoTick max bad time: 0.776 ms; avr bad time: 0.165 ms; bad iterations: 341 total iterations: 100000
2020.10.29 11:10:53.858 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.568 ms; avr bad time: 0.156 ms; bad iterations: 381 total iterations: 100000
2020.10.29 11:10:53.860 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.896 ms; avr bad time: 0.164 ms; bad iterations: 293 total iterations: 100000
2020.10.29 11:10:53.861 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 6.124 ms; avr bad time: 0.178 ms; bad iterations: 219 total iterations: 100000
2020.10.29 11:10:53.862 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.794 ms; avr bad time: 0.164 ms; bad iterations: 356 total iterations: 100000
2020.10.29 11:10:54.686 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 4.870 ms; avr bad time: 0.339 ms; bad iterations: 1575 total iterations: 100000
2020.10.29 11:10:54.728 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 6.442 ms; avr bad time: 0.343 ms; bad iterations: 1691 total iterations: 100000
2020.10.29 11:10:54.732 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 7.568 ms; avr bad time: 0.349 ms; bad iterations: 1671 total iterations: 100000
2020.10.29 11:10:54.755 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 13.354 ms; avr bad time: 0.365 ms; bad iterations: 1634 total iterations: 100000
2020.10.29 11:10:54.773 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 9.385 ms; avr bad time: 0.352 ms; bad iterations: 1734 total iterations: 100000
2020.10.29 11:10:54.778 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 2.526 ms; avr bad time: 0.342 ms; bad iterations: 1748 total iterations: 100000
2020.10.29 11:10:54.785 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 15.195 ms; avr bad time: 0.356 ms; bad iterations: 1708 total iterations: 100000
2020.10.29 11:10:54.790 SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 5.180 ms; avr bad time: 0.347 ms; bad iterations: 1796 total iterations: 100000
 
Anton:

Um teste muito simples:

20 EAs no EURUSD, ou seja, todos os processos OnTick ao mesmo tempo. Terminal construído 2664. O teste está funcionando sem otimização, compilação e outra carga de trabalho adicional em 100% CPU - você não vai executar um verdadeiro "hft" de negociação com este fundo, vai?

Diário de teste típico:

Você cria condições de estufa ao fazer iterações de 100K durante 1,5 segundos no mesmo tick. Eu, por outro lado, esperei propositadamente por carrapatos que não geraram um OnTick.

Olhando através de meus registros comerciais, percebo a execução do SymbolInfoTick dentro de alguns milissegundos. E eu sei por 100% que a CPU estava ociosa naquela época.


É muito simples. Há, condicionalmente, 1 milhão de carrapatos por dia. Mesmo 0,01% dos carrapatos desaceleram 100 carrapatos por dia com defasagens. Você dirá que isso é um absurdo. Eu direi que é ruim. Se eu me deparar com um atraso quando preciso fazer um pedido, é uma perda monetária potencial.


Muito grato por este ramo não passar despercebido, e sobre esta característica em particular, muito trabalho tem sido feito para acelerar as coisas. Entretanto, foi um pouco surpreendente para mim que a horrível muleta pudesse superar a função normal em certas situações. E talvez, se você o resolvesse e eliminasse esse atraso, 100 atrasos potenciais por dia se transformariam em 10.


Eu digo que é muito melhor do que era no início do fio. Mas o fato é que há momentos em que isso não é bom. E eu posso ver que você não quer investigar isso. Eu respeito sua escolha.


Acima citamos a opção de obter os preços atuais. Me serviria completamente se não pegasse o atraso de milissegundos na máquina de ociosidade da UCP.

Também estou preocupado não só com a velocidade da SymbolInfoTick, mas também com a relevância dos preços que ela retorna. Vejo que você não levanta esta questão. Aparentemente, você decidiu olhar para ela mais tarde.

 
fxsaber:

Você cria condições de estufa fazendo iterações de 100K dentro de 1,5 segundos no mesmo tick. Eu, por outro lado, esperei especificamente por carrapatos que não desovaram OnTick.

Ao rever meus registros comerciais, noto que o SymbolInfoTick está funcionando por alguns milissegundos. Eu sei 100% que a CPU estava ociosa naquele momento.

É muito simples. Em um dia há, condicionalmente, 1 milhão de carrapatos. Mesmo uma defasagem de 0,01% é de 100 ticks por dia com defasagens. Você dirá que isso é um absurdo. Eu direi que é ruim. Se eu me deparar com um atraso quando preciso fazer um pedido, é uma perda monetária potencial.

Muito grato por este ramo não passar despercebido, e sobre esta característica em particular, muito trabalho tem sido feito para acelerar as coisas. Entretanto, foi um pouco surpreendente para mim que a horrível muleta pudesse superar a função normal em certas situações. E talvez, se você o resolvesse e eliminasse esse atraso, 100 atrasos potenciais por dia se transformariam em 10.

Eu digo que é muito melhor do que era no início do fio. Mas o fato é que há momentos em que isso não é bom. E eu posso ver que você não quer investigar isso. Eu respeito sua escolha.

Acima citamos a opção de obter os preços atuais. Me serviria completamente se não pegasse o atraso de milissegundos na máquina de ociosidade da UCP.

Também estou preocupado não só com a velocidade da SymbolInfoTick, mas também com a relevância dos preços que ela retorna. Vejo que você não levanta esta questão. Aparentemente, você decidiu olhar para ela mais tarde.

Estas não são condições quentes de forma alguma. Um loop para 100000 pedidos de preço sem Sono() e similares e em 20 fios simultaneamente é um teste de estresse óbvio. Nada como isso deveria estar sequer perto em condições reais.

Se você acha que não há mais carrapatos chegando em 1,5 segundos - ok, faça 10 milhões de consultas, isso não vai mudar nada, sua "muleta" funciona pior:
NG      0       10:26:22.903    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 2.223 ms; avr bad time: 0.146 ms; bad iterations: 22369 total iterations: 10000000
OK      0       10:26:22.934    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 1.759 ms; avr bad time: 0.144 ms; bad iterations: 22462 total iterations: 10000000
KO      0       10:26:22.944    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 4.587 ms; avr bad time: 0.145 ms; bad iterations: 22620 total iterations: 10000000
RS      0       10:26:23.443    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 8.433 ms; avr bad time: 0.162 ms; bad iterations: 36242 total iterations: 10000000
LG      0       10:26:23.487    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 9.660 ms; avr bad time: 0.163 ms; bad iterations: 36378 total iterations: 10000000
KH      0       10:26:23.492    SymbolInfoTick (EURUSD,H1)      SymbolInfoTick max bad time: 8.433 ms; avr bad time: 0.163 ms; bad iterations: 36208 total iterations: 10000000
HK      0       10:26:23.505    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 14.355 ms; avr bad time: 0.164 ms; bad iterations: 36292 total iterations: 10000000
QN      0       10:27:26.728    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 18.589 ms; avr bad time: 0.373 ms; bad iterations: 122026 total iterations: 10000000
HQ      0       10:27:27.042    SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 15.544 ms; avr bad time: 0.371 ms; bad iterations: 123026 total iterations: 10000000
RD      0       10:27:29.190    SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 16.207 ms; avr bad time: 0.370 ms; bad iterations: 127228 total iterations: 10000000
QJ      0       10:27:32.661    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 7.465 ms; avr bad time: 0.495 ms; bad iterations: 994 total iterations: 10000000
CL      0       10:27:32.799    SymbolInfoTick (EURUSD,H1)      SymbolInfoTick max bad time: 16.999 ms; avr bad time: 0.585 ms; bad iterations: 1081 total iterations: 10000000
EP      0       10:27:33.056    SymbolInfoTick (EURUSD,H1)      SymbolInfoTick max bad time: 11.774 ms; avr bad time: 0.515 ms; bad iterations: 1122 total iterations: 10000000
EE      0       10:27:33.555    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 17.385 ms; avr bad time: 0.368 ms; bad iterations: 134761 total iterations: 10000000
FG      0       10:27:35.581    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 10.428 ms; avr bad time: 0.502 ms; bad iterations: 373 total iterations: 10000000
CJ      0       10:27:46.372    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 14.278 ms; avr bad time: 0.360 ms; bad iterations: 153668 total iterations: 10000000
QO      0       10:27:46.819    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 12.494 ms; avr bad time: 0.361 ms; bad iterations: 154170 total iterations: 10000000
KP      0       10:27:46.897    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 17.176 ms; avr bad time: 0.362 ms; bad iterations: 154258 total iterations: 10000000
PE      0       10:27:47.560    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 14.090 ms; avr bad time: 0.362 ms; bad iterations: 156325 total iterations: 10000000
LF      0       10:27:47.946    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 16.794 ms; avr bad time: 0.367 ms; bad iterations: 160557 total iterations: 10000000
IH      0       10:27:47.970    SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 11.241 ms; avr bad time: 0.366 ms; bad iterations: 160307 total iterations: 10000000
KN      0       10:27:51.026    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 4.961 ms; avr bad time: 0.333 ms; bad iterations: 687 total iterations: 10000000
FP      0       10:27:51.517    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 19.844 ms; avr bad time: 0.372 ms; bad iterations: 165266 total iterations: 10000000
LE      0       10:27:51.574    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 15.435 ms; avr bad time: 0.371 ms; bad iterations: 165785 total iterations: 10000000
QE      0       10:27:51.686    SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 13.601 ms; avr bad time: 0.371 ms; bad iterations: 166278 total iterations: 10000000
CK      0       10:27:52.204    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 15.480 ms; avr bad time: 0.374 ms; bad iterations: 161441 total iterations: 10000000
FL      0       10:27:52.262    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 19.503 ms; avr bad time: 0.374 ms; bad iterations: 161363 total iterations: 10000000
FQ      0       10:27:52.504    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 15.440 ms; avr bad time: 0.375 ms; bad iterations: 161927 total iterations: 10000000
KQ      0       10:27:52.507    SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 20.155 ms; avr bad time: 0.375 ms; bad iterations: 161670 total iterations: 10000000
EG      0       10:27:52.558    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 15.634 ms; avr bad time: 0.371 ms; bad iterations: 167511 total iterations: 10000000
OK      0       10:27:52.751    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 14.698 ms; avr bad time: 0.368 ms; bad iterations: 168482 total iterations: 10000000
LL      0       10:27:53.941    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 16.659 ms; avr bad time: 0.364 ms; bad iterations: 171194 total iterations: 10000000
JP      0       10:27:58.244    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 12.019 ms; avr bad time: 0.308 ms; bad iterations: 970 total iterations: 10000000
OD      0       10:27:58.879    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 7.972 ms; avr bad time: 0.299 ms; bad iterations: 1094 total iterations: 10000000
CE      0       10:28:06.402    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 14.140 ms; avr bad time: 0.342 ms; bad iterations: 56289 total iterations: 10000000
EK      0       10:28:06.860    SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 14.013 ms; avr bad time: 0.344 ms; bad iterations: 56008 total iterations: 10000000
QL      0       10:28:06.922    SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 11.626 ms; avr bad time: 0.343 ms; bad iterations: 56676 total iterations: 10000000
ER      0       10:28:07.010    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 13.021 ms; avr bad time: 0.340 ms; bad iterations: 51610 total iterations: 10000000
ER      0       10:28:08.708    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 2.970 ms; avr bad time: 0.317 ms; bad iterations: 24083 total iterations: 10000000

Esta afirmação que você está fazendo é 100% falsa:

Просматривая логи своей торговли, замечаю исполнение SymbolInfoTick в течение нескольких миллисекунд. При этом на 100% знаю, что в этот момент был полный Idle CPU.

Assim como esta sua declaração anterior:

Уверен, что могу доказать, что получение текущих цен у Вас реализовано очень медленно. И CPU-нагрузка создает такие тормоза только из-за неправильной реализации Вами самой главной функции в MQL5.

O acesso aos preços através do SymbolInfoTick é agora muito rápido e está completamente desacoplado do processamento de tick stream. Você está trabalhando com um cache de preços pronto, que é atualizado muito parcimoniosa e rapidamente.

Todos os "0,01% de desaceleração da taxa de tick-downs" só aparecem sob condições de teste de estresse, e isso é um ótimo resultado. Em condições normais, o acesso é garantido muito rápido.

Se você admitir que "muito trabalho foi feito para acelerar" SymbolInfoTick, então você deve acreditar que a "muleta" de obter preços via PositionSelectByTicket não pode ser uma solução melhor.

Por uma razão simples - a implementação do PositionSelectByTicket é completamente idêntica à implementação "lenta" original do SymbolInfoTick.

Como escrevi acima, esta implementação não é lenta no sentido literal da palavra, mas sob carga pesada de CPU, ela tem uma maior probabilidade de tempos de execução mais longos (o que é claramente visível em meu último teste).

Os horários aqui são altamente dependentes do programador de tarefas do sistema rodando sob carga, ou seja, pode haver diferenças de sistema operacional para sistema operacional e até mesmo de versão para versão.

E quanto mais pesada for a carga, mais se testa o desempenho do agendador de tarefas, não do terminal.

Esse é o fim do tópico de desempenho SymbolInfoTick.

Se seus especialistas criam carga no nível dos testes de estresse sintéticos, há apenas uma solução: "o hardware deve corresponder às tarefas".

 

Tenho uma pergunta sobre a relevância dos carrapatos dados pela SymbolInfoTick.

Situação:

1. Fazemos TimeCurretn(); temos tempo 18:00:00

2. Do SymbolInfoTick em um símbolo não etiquetado. Recebemos um tique com o horário 17:58:00.

3. dormir(1)

4. Adiciona um SymbolInfoTick para o símbolo não-esquerdo. Recebemos um tique com a hora 17:59:00.


Isto é, no quarto item temos um novo tick, que é um minuto diferente do TimeCurretn().

Você vê algum problema nesta situação?

Como entrar nesta situação com menos freqüência ?

 
pivomoe:

Tenho uma pergunta sobre a relevância dos carrapatos dados pela SymbolInfoTick.

Situação:

1. Fazemos TimeCurretn(); temos tempo 18:00:00

2. Do SymbolInfoTick em um símbolo não etiquetado. Recebemos um tique com o horário 17:58:00.

3. dormir(1)

4. Adiciona um SymbolInfoTick para o símbolo não-esquerdo. Recebemos um tique com o horário 17:59:00.


Isto é, no quarto item temos um novo tick, que é um minuto diferente do TimeCurretn().

Você vê algum problema nesta situação?

Como entrar nesta situação com menos freqüência ?

SymbolInfoTick envia os dados recebidos do servidor do corretor. O que o servidor enviou é o que você recebe.

Se houver dúvidas sobre o tick stream que é transmitido por seu corretor, então você tem que entrar em contato com seu corretor.