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

 
fxsaber:

Cansado de depurar os instantâneos. Por fim, tornou-o perfeito. Um conselheiro, nada. Dois - perfeito. 20 - desastre: A CPU está abaixo de 100%. HistóriaAtrasos de seleção por muitos milissegundos.

Parece que o MT5 não se destina a operar muitos Expert Advisors ao mesmo tempo.

Você está escrevendo um teste de estresse ou um Expert Advisor habitual?

O mais provável é que seja exatamente um teste de estresse com múltiplas roscas em uma única base. Portanto, vou repetir:

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.09.16 12:47

Se eu entendi corretamente, não há um EA lá, mas um testador de estresse em cada símbolo. Isto muda completamente o caso. E mostra a ocultação das condições iniciais.

Ou seja, em 8(4+HT) CPU 16 fios (+N fios do terminal do trabalhador em paralelo), sem parar e sem atraso, quebrar em um objeto de banco de dados de símbolos sincronizados. Os cadeados de leitura/escrita são misturados porque há uma escrita constante de carrapatos.

Normalmente em tal perfil, dependendo da inclinação do processador e seu domínio dos fios, cada fio pode passar de 60% a 80% do tempo de espera.

E isto é independente do tipo de tarefa.

Se você está realmente tendo uma batalha sem parar por um recurso em 20 fios, há várias opções:

  1. desacoplar logicamente o acesso e não se envolver em testes de estresse
  2. ir para seu próprio cache (variante do ponto 1)
  3. Atualize seu hardware (não se deixe enganar pelo fato de que a i7 2600k não é ruim - é ruim)


Leia a caixa cuidadosamente. Se os fios N atingirem um único objeto de sincronização, a espera vazia será de 60-80%.

E o limite de eficiência multi-tarefa será em torno de 8-12 roscas. Conforme o número de roscas aumenta, a taxa de amostragem cairá. Em 2600k, o limite de eficiência é ainda mais baixo.

 
Renat Fatkhullin:

Você está escrevendo um teste de estresse ou um trabalho de um especialista comum?

Ordinário

Ao invés disso, é um teste de estresse com múltiplas roscas em uma única base. Portanto, vou repetir:

Se de fato você estiver fazendo uma batalha sem parar por um único recurso em 20 fios, há várias opções:

  1. desacoplar logicamente o acesso e não lidar com o teste de estresse
  2. ir para seu próprio cache (variante do ponto 1)
  3. Atualize seu hardware (não se deixe enganar pelo fato de que a i7 2600k não é ruim - é ruim)


Leia a caixa cuidadosamente. Se os fios N atingirem um único objeto de sincronização, a espera vazia será de 60-80%.

E o limite de eficiência multi-tarefa será em torno de 8-12 roscas. Conforme o número de roscas aumenta, a taxa de amostragem cairá. Em 2600k, o limite de eficiência é ainda mais baixo.

Histórico de cache completo. Mas mesmo isto requer chamar HistorySelect(0, INT_MAX).

Como experiência, cortei todas as chamadas à história necessárias para a lógica comercial. A carga sobre a CPU diminuiu muito.


Geralmente, se existem 20 robôs, então chamá-los em toda a história significa que você pode causar um desastre com apenas um terminal. Sobre vários Terminais dos quais não podemos sequer falar.

E parece que o objeto sincrônico não é apenas história. SymbolInfoTick, CopyTicks e algo mais, ao que parece.

De qualquer forma, não consigo nem mesmo ter cinco Terminais funcionando com uma dúzia de robôs em cada um.

Olhar para o perfil de frenagem é um aborrecimento.

 
fxsaber:

Ordinário

Caching completo da história. Mas mesmo isto requer chamar HistorySelect(0, INT_MAX).

Como experiência, eu cortei todas as chamadas históricas necessárias para a lógica comercial. A carga sobre a CPU diminuiu muito.


Geralmente, se existem 20 robôs, então chamá-los em toda a história significa que você pode causar um desastre com apenas um terminal. Sobre vários Terminais dos quais não podemos sequer falar.

E parece que o objeto sincrônico não é apenas história. SymbolInfoTick, CopyTicks e algo mais, ao que parece.

De qualquer forma, não consigo nem mesmo ter cinco Terminais funcionando com uma dúzia de robôs em cada um.

Olhar para o perfil de frenagem é um aborrecimento.

Nenhuma evidência, nem dados numéricos.

1) Quantas vezes por segundo cada EA faz consultas de HistorySelect?

2) Exatamente quais funções estão desacelerando?

3) Logs?

4) Qual é o princípio dos robôs?

 
fxsaber:

No total, se existem 20 robôs, então, abordar a história neles é causar um desastre com apenas um Terminal. Os Terminais Múltiplos estão fora de questão.

Talvez pelo contrário - cada terminal suportará seu próprio objeto sincrônico, e não haverá uma fila de 20 EAs para ele?

Tente executar 1 robô em 1 terminal, será interessante ver o resultado.

 
Andrey Khatimlianskii:

Talvez pelo contrário - cada terminal suportará seu próprio objeto de sincronização e não haverá uma fila de 20 EAs para ele?

Tente executar 1 robô em 1 terminal, é interessante ver o resultado.

Infelizmente, o resultado desta experiência não responderá à pergunta: o que fazer?

 
fxsaber:

Infelizmente, o resultado desta experiência não responderá à pergunta: o que fazer?

Reconsiderar o conceito do robô comercial

Adicionado

Eu tenho 3 terminais em demonstração real + 1 em que trabalho

Cada terminal tem 42 robôs que utilizam OnBoorEvent de 3 a 4 caracteres,

Além disso, a cada 0,5 segundos o temporizador aciona + cada robô acessa as Variáveis Globais do terminal,

e usa 8,34 GB de 32 GB de RAM e 6,7% de CPU

E nada abranda, exceto o servidor TM5 no início das sessões de negociação.

 
Renat Fatkhullin:

Não há provas, nem dados numéricos.

1) Quantas vezes por segundo cada especialista faz consultas de HistorySelect?

2) Quais são exatamente as funções que estão desacelerando?

3) Logs?

4) Qual é o princípio por trás dos robôs?

É muito difícil para mim responder a estas perguntas, porque nem eu mesmo consigo lidar com o que está diminuindo a velocidade. O perfilador nem sequer funciona. Suas medidas são batota, pois o atraso já vem da CPU. A redução do acesso às funções ambientais através de instantâneos e caching, infelizmente, não deu o efeito esperado. Estou esperando um profiler, que será capaz de compilar o Expert Advisor.


Enquanto eu estava ocupado, encontrei tal confusão no Strategy Tester com o histórico do comércio.

void OnTick()
{
  static bool FirstRun = true;
    
  if (FirstRun)
  {
    MqlTick Tick;

    if (SymbolInfoTick(_Symbol, Tick) && Tick.ask)
    {
      MqlTradeRequest Request = {0};
      MqlTradeResult Result;
      
      Request.action = TRADE_ACTION_PENDING;
      Request.type = ORDER_TYPE_BUY_LIMIT;
      Request.symbol = _Symbol;
      Request.volume = 1;
      Request.price = Tick.ask - 10000 * _Point;

      if (OrderSend(Request, Result)) // Выставили отложку.
      {
        Request.action = TRADE_ACTION_DEAL;      
        Request.type = ORDER_TYPE_BUY;
        Request.price = Tick.ask;
        
        FirstRun = !OrderSend(Request, Result); // Открыли позицию.
      }
    }
  }

  HistorySelect(0, INT_MAX); // Результат зависит от этой строки.  
}

// Проверяет наличие ордера в истории торгов.
bool CheckTicket( const long Ticket )
{
  return(HistoryOrderGetInteger(Ticket, ORDER_TICKET) == Ticket);
}

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnDeinit( const int )
{
  if (HistorySelect(0, INT_MAX))
  {
    PRINT(CheckTicket(4)); // true
    PRINT(CheckTicket(3)); // true
    PRINT(CheckTicket(2)); // false
  }  
}


O resultado é

        AUDCAD : real ticks begin from 2020.07.15 00:00:00
        2020.07.15 00:01:09   buy limit 1 AUDCAD at 0.84993 (0.94914 / 0.94993)
        2020.07.15 00:01:09   market buy 1 AUDCAD (0.94914 / 0.94993)
        2020.07.15 00:01:09   deal #2  buy 1 AUDCAD at 0.94993 done (based on order #3)
        2020.07.15 00:01:09   deal performed [#2  buy 1 AUDCAD at 0.94993]
        2020.07.15 00:01:09   order performed buy 1 at 0.94993 [#3  buy 1 AUDCAD at 0.94993]
        2020.07.15 23:59:58   position closed due end of test at 0.94646 [#3  buy 1 AUDCAD 0.94993]
        2020.07.15 23:59:58   deal #3  sell 1 AUDCAD at 0.94646 done (based on order #4)
        2020.07.15 23:59:58   deal performed [#3  sell 1 AUDCAD at 0.94646]
        2020.07.15 23:59:58   order performed sell 1 at 0.94646 [#4  sell 1 AUDCAD at 0.94646]
        2020.07.15 23:59:58   order canceled due end of test [#2  buy limit 1 AUDCAD at 0.84993]
        final balance 99999653.00 pips
        2020.07.15 23:59:58   CheckTicket(4) = true
        2020.07.15 23:59:58   CheckTicket(3) = true
        2020.07.15 23:59:58   CheckTicket(2) = false


Eu mal tenho notado este erro e estou tentando escrever uma repetição há mais de uma hora. O código é idiota, mas mostra o problema. Não sei se há algo semelhante não no Testador, mas no Terminal.

Cadeia de busca: Oshibka 013.


ZS b2626 - fixo.

 
prostotrader:

Reconsiderar o conceito do robô comercial

Apenas um robô que comercializa todos os símbolos?

 
fxsaber:

Apenas um robô que comercializa todos os símbolos?

Robôs diferentes, mas todos construídos aproximadamente sobre o mesmo padrão.

Há 42 empregos envolvidos em um terminal de cada vez, e em três, 126 são cerca de 400 símbolos

Adicionado

Para repetir (eu)

Cada robô usa OnBoorEvent de 3 a 4 caracteres,

mais a cada 0,5 segundos um timer é acionado + cada robô acessa asVariáveis Globais do terminal,

8,34 GB de 32 GB de RAM é usado e 6,7% de CPU é usado

E nada fica mais lento, exceto o servidor TM5 (ou o hardware Openreach) no início das sessões de negociação.

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
prostotrader:

Robôs diferentes, mas todos construídos aproximadamente de acordo com o mesmo esquema.

Há 42 empregos envolvidos em um terminal de cada vez, e em três - 126 é de cerca de 400 caracteres

Adicionado

Para repetir (eu).

Cada robô usa OnBoorEvent de 3 a 4 caracteres,

mais a cada 0,5 segundos um timer é acionado + cada robô acessa asVariáveis Globais do terminal,

8,34 GB de 32 GB de RAM é usado e 6,7% de CPU é usado

E nada está desacelerando, exceto o servidor TM5 (ou Open's iron) no início das sessões de negociação.

Aqui está o estranho, para mim é o oposto.

Meu dispositivo tem 4 terminais, reduzi o número de Expert Advisors para cerca de 200, cortei todos os OnBooks, mudei de volta para o OnTick e atualizei meu hardware, mas os problemas são os mesmos que com o fxsaber.

Mas já há muito tempo que não há atrasos pela manhã em meu Abridor. E o que eles costumavam ser! Até 75 segundos às vezes :)