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

 
Renat Fatkhullin:

um objeto de banco de dados de símbolos sincronizados. Os locos de leitura/escrita são misturados, uma vez que há um tick constante de escrita.

Existe um objeto de banco de dados de símbolos para todos os símbolos ao mesmo tempo? Se for o caso, então acontece que o pedido de um tick para EURUSD retarda potencialmente o pedido de um tick para GBPUSD.


Você pode preparar um MqlTick para ele no momento em que o OnTick for chamado, para que ele não seja solicitado do banco de dados em geral?

 
fxsaber:

Você pode preparar um MqlTick para o OnTick, para que ele não seja chamado do banco de dados em geral?

Isso seria bom, então talvez a MQL5 tenha variáveis pré-definidas como em 4 - Ask and Bid

 

O mais provável é que a desaceleração seja causada pelo alto consumo de CPU no lado MT5, quando muitos EAs estão em execução. Não sei como é com o MT4. Caso contrário, é difícil explicar por que os atrasos aparecem em um terminal vazio que funciona paralelamente.

Definitivamente, a minimização do uso do ambiente comercial API irá resolver o problema. Após a dança do pandeiro, comunicarei os resultados.

 
fxsaber:

Você entendeu errado. Cada EA é puramente comercial (no Testador por carrapatos reais que não diminuem de velocidade) e não depende de outros. Toda lógica de negociação é executada apenas no OnTick, sem spam das ordens de negociação, sem recorrência, sem globalização e sem recursos.

OnTrade*, OnBook não são utilizados. Segundo timer e OnChartEvent para o caso quando certas teclas são pressionadas.


Estou certo de que a implementação adequada (por você ou por mim) de instantâneos reduzirá muito o número de chamadas de funções ambientais regulares. Da mesma forma, os atrasos serão drasticamente reduzidos.

Nunca pensei que isso chegaria a truques de instantâneo. Estou estudando a questão, porque a implementação padrão do MT5 EA é, infelizmente, coxa.

Eu não posso acreditar em seu caso.

Mostramos nossos cálculos
 
Renat Fatkhullin:
Não acredito em seu caso de forma alguma.

Através do TeamViewer ou similar, pronto para demonstrar.

 
::TerminalInfoInteger(TERMINAL_BUILD) = 2605
(bool)::TerminalInfoInteger(TERMINAL_X64) = true
(bool)::TerminalInfoInteger(TERMINAL_VPS) = false
::HistoryDealsTotal() = 13973
::HistoryOrdersTotal() = 18606
::TerminalInfoInteger(TERMINAL_MAXBARS) = 5000
::TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1464
::MQLInfoInteger(MQL_MEMORY_USED) = 5
::ObjectsTotal(0) = 462
ChartsTotal = 16
::SymbolsTotal(true) = 19 (16 + 3)

Por favor, informe como reduzir o consumo de memória pelo Terminal? Estou usando carrapatos frescos do CopyTicks para 16 caracteres. Parece que cada CopyTicks mantém em memória 128K ticks. Eu não preciso deles, mas os guardo na memória. O que é preciso quase 1,5 GB? Os desenvolvedores podem ver que parte da memória é usada para quê? Algum gestor de tarefas rudimentares.

 
fxsaber:

O mais provável é que a desaceleração seja causada pelo alto consumo de CPU no lado MT5, quando muitos EAs estão em execução. Não sei como é com o MT4. Caso contrário, é difícil explicar por que os atrasos aparecem em um Terminal vazio que funciona paralelamente.

Definitivamente, a minimização do uso do ambiente comercial API irá resolver o problema. Escreverei sobre os resultados depois de dançar com pandeiros.

Era exatamente disto que eu estava falando há algumas páginas atrás. Além disso, os EAs podem ser bastante simples e baseados em símbolos não líquidos, ou seja, a questão não é o número de operações matemáticas que ocorrem dentro do código de cada um dos EAs. O problema reside no próprio terminal e não conseguiremos resolvê-lo melhorando nosso código. Infelizmente :(

P.S. Eu reescrevi a lógica usada em metade dos meus EAs do OnBook de volta para o OnTick e substituí o Core i5 por Xeon E5-2678. Parece que a velocidade deveria aumentar, mas, infelizmente, um milagre não aconteceu :(

 
HistóriaSelecione os atrasos nas funções OnTrade.
// Демонстрация лага HistorySelect в OnTrade*-функциях.
#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

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

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

const bool Init = EventSetTimer(1);

void OnTimer()
{
  static MqlTradeRequest Request = {0};
  static MqlTradeResult Result = {0};

  if (PositionSelectByTicket(Result.order)) // Если позиция открыта - закрываем.
  {
    Request.type = ORDER_TYPE_SELL;
    Request.price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
    Request.position = Result.order;
  }
  else // Иначе - открываем.
  {
    Request.action = TRADE_ACTION_DEAL;
    Request.type = ORDER_TYPE_BUY;
    Request.symbol = _Symbol;
    Request.volume = 0.1;
    Request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
    Request.position = 0;
  }

  const bool AntiWarning = OrderSendAsync(Request, Result); // Асинхронный приказ не случайно
}

void OnTrade()
{
  _B2(HistorySelect(0, INT_MAX));  
}


Em quase todos os passos.

2020.09.23 11:59:46.351 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 3 ms.
2020.09.23 11:59:46.354 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:48.294 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:48.296 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:49.283 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:49.285 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:50.296 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:50.302 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 5 ms.
2020.09.23 11:59:51.275 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:51.277 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:52.267 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:52.269 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:54.277 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 3 ms.
2020.09.23 11:59:54.282 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 5 ms.


Esperamos que a construção do cache não demore tanto, e este atraso se deve ao acesso ao banco de dados durante a atualização do banco.

 

Alguma idéia por que o mt5 não possui o separador "Comissões"? Eles só aparecem após o fechamento de um comércio.

Alguma idéia por que o mt5 não possui o separador "Comissões"? Eles só aparecem após o fechamento de um comércio.

 

Se você executar esta EA em uma conta sem posições ou ordens atuais.

// Создает маркет-ордер в случае, если нет текущих позиций и ордеров.
bool PositionOpen()
{
  bool Res = (!PositionsTotal() && !OrdersTotal());
  
  if (Res)
  {
    MqlTradeRequest Request = {0};
    MqlTradeResult Result;
    
    Request.action = TRADE_ACTION_DEAL;
    Request.symbol = _Symbol;
    Request.volume = 0.1;
    Request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
    
    Res = OrderSendAsync(Request, Result);    
  }
  
  return(Res);
}

void OnInit()
{
  PositionOpen();
}

void OnTrade()
{
  PositionOpen();
}

e depois fechar manualmente a posição aberta pela EA, então haverá três posições abertas na sebe (na posição de rede de triplo volume).


É este o comportamento correto? Provavelmente não entendo bem o Terminal. Então, por favor, explique.