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

 
fxsaber:

Seria interessante comparar o mesmo roteiro com outras plataformas comerciais.

MT4 b1280.

// Мониторинг длительных пиков выполнения важных функций для торговли.
#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)))
  {
    _B2(OrdersHistoryTotal());
    _B2(OrdersTotal());
    _B2(OrderSelect(0, SELECT_BY_POS));
    _B2(OrderSelect(0, SELECT_BY_POS, MODE_HISTORY));
    _B2(OrderSelect(0, SELECT_BY_TICKET));
        
    _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(OrderGetDouble(ORDER_PRICE_CURRENT));
    _B2(OrderGetInteger(ORDER_MAGIC));
    _B2(OrderGetString(ORDER_SYMBOL));
                
    _B2(AccountInfoDouble(ACCOUNT_EQUITY));
        
    _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);      
}


2020.08.27 13:09:46.799 Test6 EURUSD,M1: Alert: Time[Test6.mq4 39: AccountInfoInteger(ACCOUNT_TRADE_EXPERT)] = 7 ms.
2020.08.27 13:09:46.790 Test6 EURUSD,M1: Alert: Time[Test6.mq4 18: OrderSelect(0,SELECT_BY_POS,MODE_HISTORY)] = 2 ms.
2020.08.27 13:09:46.784 Test6 EURUSD,H1: Alert: Time[Test6.mq4 25: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 1 ms.

Apenas três escorregões e muito raramente eles aparecem. Provavelmente, é difícil criar um freio, pois não há HistorySelect e CopyTicks.

 
Fast235:

Portanto, ambos são Haswell, xeon tem uma freqüência operacional muito menor, haverá degradação do desempenho e testes únicos, somente na otimização multi-tarefa será uma vantagem. A i3 dos últimos modelos deve ser muito mais rápida de rodar

perguntar aos desenvolvedores sobre o efeito do nível de cache na velocidade e em geral a velocidade do Zen2 e as últimas informações


adicionar

Ryzen 3700x I have, você pode fazer testes com a Intel

loop it several times with a timer

Não estamos falando aqui de testes, mas de atrasos na execução dos pedidos. Este atraso está lá e está flutuando. E isso incomoda muito tanto o TS quanto a mim.

 
fxsaber:

Apenas três coisas apareceram e depois muito raramente apareceram. Deve ser difícil criar um freio, pois não há HistorySelect e CopyTicks.

Esperou também no MT4.

2020.08.27 13:18:00.306 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 26: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 1 ms.
2020.08.27 13:17:39.820 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 30: TimeLocal()] = 2 ms.
2020.08.27 13:17:32.598 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 30: TimeLocal()] = 36 ms.
2020.08.27 13:17:29.676 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 1 ms.
2020.08.27 13:17:26.468 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 27: SymbolInfoInteger(Symb,SYMBOL_DIGITS)] = 5 ms.
2020.08.27 13:17:26.460 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 13: SymbolInfoTick(Symb,Tick)] = 1 ms.
2020.08.27 13:17:14.528 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 13: SymbolInfoTick(Symb,Tick)] = 3 ms.
2020.08.27 13:16:52.309 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 2 ms.
2020.08.27 13:16:52.308 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 2 ms.
2020.08.27 13:16:52.307 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 36: AccountInfoDouble(ACCOUNT_EQUITY)] = 1 ms.
2020.08.27 13:16:42.448 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 17: OrderSelect(0,SELECT_BY_POS)] = 2 ms.
2020.08.27 13:16:32.480 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 36: AccountInfoDouble(ACCOUNT_EQUITY)] = 3 ms.
2020.08.27 13:16:32.479 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 3 ms.
2020.08.27 13:16:32.477 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 1 ms.
2020.08.27 13:16:29.096 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 26: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 1 ms.
2020.08.27 13:16:14.593 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 23 ms.
2020.08.27 13:14:55.398 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 27: SymbolInfoInteger(Symb,SYMBOL_DIGITS)] = 1 ms.
2020.08.27 13:13:34.891 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 25: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 2 ms.

TimeLocal em 36 milissegundos. Escolher um símbolo com um volume de carrapato maior.

 

A todos os interessados, aqui estão as instruções para a reprodução.

Quem acha que não será tocado.

2020.08.27 13:17:56.139 Test6 (EURUSD,H1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 2 ms.
2020.08.27 13:17:56.167 Test6 (EURUSD,M1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 39 ms.
2020.08.27 13:17:56.198 Test6 (EURUSD,H1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 54 ms.
2020.08.27 13:18:11.512 Test6 (EURUSD,M1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 3 ms.
 
fxsaber:

Escolheu um símbolo com um volume de carrapato maior.

Nem mesmo para verificá-lo. Imagine o símbolo FORTS mais popular com uma assinatura tick. Em vez da lógica OnTick no OnBookEvent. Os atrasos devem ser terríveis.

Precisam de conselhos oficiais sobre o que fazer para minimizar os atrasos.

 
fxsaber:

Para reproduzir os freios, você precisa executar o roteiro em vários caracteres do ÚNICO personagem - fazer com que OnTick seja chamado ao mesmo tempo. Em seguida, os alertas serão feitos a cada sinal sonoro.

O gráfico de carga da CPU mostra que o terminal64.exe carrega até 30% dos oito núcleos lógicos. São apenas quatro gráficos EURUSD com o roteiro em execução. Você pode ver claramente o quanto cada gráfico é carregado de cada vez.

Para onde vão tantos recursos?

Esta pergunta é fácil de responder.

Aqui você copia uma grande quantidade de dados:

    HistorySelect(MathRand(), INT_MAX);

Você está realmente dando um comando para levar todo o histórico comercial disponível do banco de dados do terminal para o ambiente EA, para uso posterior. Você está tentando propositalmente baixar um possível algoritmo de cache de solicitações idênticas.

Mas você não usa todos esses dados, mas os redefine imediatamente na linha seguinte:

    _B2(HistorySelect(Tick.time, INT_MAX));

Obviamente, a base do terminal aqui é um recurso compartilhado com acesso sincronizado. E você criou deliberadamente milhares de pedidos e negócios nele.

Toda essa ação sem sentido se repete 10 vezes a cada tique de vários fios ao mesmo tempo. E você está deliberadamente fazendo estas ações acontecerem simultaneamente a partir de vários fios.

Portanto, você sabe muito bem o que está fazendo e por quê, onde os recursos são gastos e, ao mesmo tempo, afirma que "o atraso é causado pela carga excessiva da CPU por parte do MT5".

Dito isto, você claramente tem um problema com seu computador. Isto é, sim, você está ativamente movendo quantidades significativas de memória, mas isso não deve afetar o tempo de execução das funções, especialmente não relacionadas à HistorySelect() de forma alguma.

Em nossos testes b2582, mesmo com 1000 vezes por tick e 5 EAs em gráficos de um caracter, ou seja, ordens de magnitude maior do que suas condições padrão, não foi observado um único Alerta.

Nosso sistema de teste: Windows 10 build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz

 
Anton:

Esta pergunta é fácil de responder.

É aqui que você copia uma grande quantidade de dados:

Você está realmente dando um comando para levar todo o histórico comercial disponível do banco de dados do terminal para o ambiente EA, para uso posterior. Tentativa propositalmente aleatória de interromper o possível algoritmo de cache de solicitações idênticas.

Mas você não usa todos esses dados, mas os redefine imediatamente na linha seguinte:

Obviamente, a base do terminal aqui é um recurso compartilhado com acesso sincronizado. E você criou deliberadamente milhares de pedidos e negócios nele.

Toda essa ação sem sentido se repete 10 vezes a cada tique de vários fios ao mesmo tempo. E você está deliberadamente fazendo estas ações acontecerem simultaneamente a partir de vários fios.

Portanto, você sabe muito bem o que está fazendo e por quê, onde os recursos são gastos e, ao mesmo tempo, afirma que "o atraso é causado pela carga excessiva da CPU por parte do MT5".

Dito isto, você claramente tem um problema com seu computador. Isto é, sim, você está ativamente movendo quantidades significativas de memória, mas isso não deve afetar o tempo de execução das funções, especialmente não relacionadas à HistorySelect() de forma alguma.

Em nossos testes b2582, mesmo com 1000 vezes por tick e 5 EAs em gráficos de um caracter, ou seja, ordens de magnitude maior do que suas condições padrão, não foi observado um único Alerta.

Nosso sistema de teste: Windows 10 build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz


Colegas,

é hora de você sair do círculo de modelagem da aeronave.

Aqui estão as condições de batalha: 4 terminais, cerca de 300 Expert Advisors, cerca de 30 instrumentos. Um terço deles são assinantes de tumblers. Tudo isso em FORTS. Simular sob tais condições.

 
Dmi3:


Colegas,

é hora de você sair do círculo de modelagem da aeronave.

Aqui estão as condições de combate: 4 terminais, cerca de 300 EAs, cerca de 30 instrumentos. Um terço dos EAs são assinantes de tumblers. Tudo isso em FORTS. Simular sob tais condições.

"Aqui você vai" é aceito como um arquivo zip, mais uma descrição detalhada do problema. Caso contrário, é uma conversa vazia.

O que está sendo discutido aqui é o código da EA apresentado e a eficácia de sua execução. Com base nos problemas identificados, foi feito um trabalho para otimizar o código do terminal.

 
Anton:

"Aqui você vai" é aceito como um arquivo zip, mais uma descrição detalhada do problema. Caso contrário, é uma conversa vazia.

Neste caso, a discussão é sobre o código apresentado pela EA e a eficiência de sua execução. O código do terminal foi otimizado para os problemas identificados.

Eu não tenho nenhum problema, não há nada para enviar.

fxsaber tem problemas. Ele já escreveu 16 páginas aqui.

E Mikhail tem tido os mesmos problemas desde 2014, ele já escreveu 149 páginas: https://www.mql5.com/ru/forum/38456/page149.

Ambos são qualificados o suficiente para lhe dar todas as informações de que você precisa.

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

Esta pergunta é fácil de responder.

É aqui que você copia uma grande quantidade de dados:

Você está realmente dando um comando para levar todo o histórico comercial disponível do banco de dados do terminal para o ambiente EA, para uso posterior. Tentativa propositalmente aleatória de interromper o possível algoritmo de cache de solicitações idênticas.

Você não seguiu a cronologia de desenvolvimento desta linha, portanto, você se permite notas acusatórias em suas declarações.

Eu removi a linha MathRand. Aqui está um breve registro.

2020.08.27 22:38:57.920 Alert: Time[Test6.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 3 ms.
2020.08.27 22:38:57.923 Alert: Time[Test6.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:38:57.926 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:38:57.928 Alert: Time[Test6.mq5 61: AccountInfoDouble(ACCOUNT_EQUITY)] = 1 ms.
2020.08.27 22:38:57.940 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 11 ms.
2020.08.27 22:39:02.227 Alert: Time[Test6.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 1 ms.
2020.08.27 22:39:02.229 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:39:02.238 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 7 ms.
2020.08.27 22:39:02.241 Alert: Time[Test6.mq5 28: HistoryDealSelect(0)] = 1 ms.
2020.08.27 22:40:34.575 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:40:44.407 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:40:44.409 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 9 ms.
2020.08.27 22:40:46.819 Alert: Time[Test6.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 1 ms.
2020.08.27 22:40:52.760 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:40:52.764 Alert: Time[Test6.mq5 28: HistoryDealSelect(0)] = 3 ms.
2020.08.27 22:40:54.907 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:41:11.415 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 5 ms.
2020.08.27 22:41:13.517 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:41:14.689 Alert: Time[Test6.mq5 18: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:41:45.343 Alert: Time[Test6.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:42:12.156 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:42:19.654 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:32.581 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:48.662 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:42:49.754 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:49.756 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:50.803 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:42:50.804 Alert: Time[Test6.mq5 32: HistoryOrderGetInteger(0,ORDER_MAGIC)] = 1 ms.
2020.08.27 22:42:50.805 Alert: Time[Test6.mq5 44: TimeCurrent()] = 1 ms.
2020.08.27 22:43:42.143 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 6 ms.
2020.08.27 22:43:42.148 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 4 ms.
2020.08.27 22:43:54.985 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:44:01.402 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:44:01.405 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.


Mas você não usa todos esses dados, você os descarrega imediatamente na linha seguinte:

Obviamente, a base do terminal aqui é um recurso compartilhado com acesso sincronizado. E você criou deliberadamente milhares de pedidos e negócios nele.

Eu o testei em contas reais onde as encomendas acima de 10K são a norma. Estas não são ordens falsas, pois >70% delas foram executadas.

Na imagem da tela, a propósito, 9331+576 != 12529.

Toda essa ação absurda é repetida 10 vezes em cada tique de vários fios de uma só vez. E você está deliberadamente fazendo essas ações a partir de múltiplos fios ocorrerem simultaneamente.

Estou tendo problemas com caracteres diferentes. Um único símbolo é sugerido para reproduzir o problema mais rapidamente.

A repetição de 10 vezes em cada carrapato é uma necessidade vital. Já que é normal que uma EA contenha uma dúzia de TCs com diferentes majors.

Portanto, você sabe exatamente o que e por que está fazendo e para onde os recursos estão indo, e ainda assim você alega "latência devido à carga excessiva da CPU por parte do MT5".

Dito isto, você claramente tem um problema com seu computador. Quer dizer, sim, você está ativamente movendo quantidades significativas de memória, mas isso não deve afetar o tempo de execução das funções, especialmente não relacionadas à HistorySelect() de forma alguma.

Não posso acusá-lo de incompetência, mas o que você escreveu, para dizer o mínimo, causa perplexidade. HistorySelect é a descoberta de quatro índices (início/fim para a tabela de pedidos e início/fim para a tabela de ofertas). As tabelas são ordenadas por tempo, portanto há (deve haver) uma busca binária na pior das hipóteses. Para pedidos 10K, é instantâneo (calcular o logaritmo binário). Que movimento de volume de memória! Ninguém aqui está falando sobre a temida HistóriaSelectByPosition. A história elementarSelect é afetada.

Em nossos testes b2582, mesmo com 1000 vezes por tick e 5 EAs em gráficos de um caracter, ou seja, ordens de magnitude maior do que suas condições padrão, não é observado um único Alerta.

Nosso sistema de teste: Windows 10 build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz

Favor fornecer detalhes de login para a conta comercial na qual os testes foram conduzidos aqui.