MT5 y la velocidad en acción - página 30

 
Renat Fatkhullin:

un objeto de base de datos de símbolos sincronizado. Las locomotoras de lectura/escritura se entremezclan, ya que hay una escritura de tic constante.

¿Existe un objeto de la base de datos de símbolos para todos los símbolos a la vez? Si es así, resulta que la solicitud de un tick para el EURUSD frena potencialmente la solicitud de un tick para el GBPUSD.


¿Puedes preparar un MqlTick para el momento en que se llama a OnTick, para que no se solicite a la base de datos de forma general?

 
fxsaber:

¿Puedes preparar un MqlTick para OnTick, para que no sea llamado desde la base de datos en la base general?

Eso sería bueno, entonces tal vez MQL5 tendrá variables predefinidas como en 4 - Ask y Bid

 

Lo más probable es que la ralentización sea causada por el alto consumo de CPU en el lado de MT5 cuando se están ejecutando muchos EAs. No sé cómo es con MT4. De lo contrario, es difícil explicar por qué aparecen retrasos en un terminal vacío que funciona en paralelo.

Definitivamente, minimizar el uso de la API del entorno comercial resolverá el problema. Después del baile de la pandereta informaré de los resultados.

 
fxsaber:

Lo has entendido mal. Cada EA es puramente comercial (en el Tester por ticks reales no ralentizados) y no depende de otros. Toda la lógica de negociación se ejecuta sólo en OnTick, sin spam de órdenes de negociación, sin recursividad, sin globalización y sin recursos.

OnTrade*, OnBook no se utilizan. Segundo temporizador y OnChartEvent para el caso de que se pulsen determinadas teclas.


Estoy seguro de que una implementación adecuada (por ti o por mí) de las instantáneas reducirá en gran medida el número de llamadas a las funciones regulares del entorno. En consecuencia, los retrasos se reducirán drásticamente.

Nunca pensé que llegaría a los trucos de las instantáneas. Estoy estudiando el tema, porque la implementación estándar de los EA de MT5 es penosa, por desgracia.

No puedo creer su caso en absoluto.

Hemos mostrado nuestros cálculos
 
Renat Fatkhullin:
No creo en su caso en absoluto.

A través de TeamViewer o similar, listo para demostrar.

 
::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, indíqueme cómo reducir el consumo de memoria de la Terminal. Estoy usando ticks frescos de CopyTicks para 16 caracteres. Parece que cada CopyTicks guarda en memoria 128K ticks. No los necesito en absoluto, pero los guardo en la memoria. ¿Qué es lo que necesita casi 1,5 GB? ¿Pueden los desarrolladores ver qué parte de la memoria se utiliza para qué? Algún gestor de tareas rudimentario.

 
fxsaber:

Lo más probable es que la ralentización sea causada por el alto consumo de CPU en el lado de MT5 cuando se están ejecutando muchos EAs. No sé cómo es con MT4. De lo contrario, es difícil explicar por qué aparecen retrasos en una Terminal paralela vacía.

Definitivamente, minimizar el uso de la API del entorno comercial resolverá el problema. Escribiré sobre los resultados después de bailar con panderetas.

Esto es exactamente de lo que hablaba hace unas páginas. Además, los EAs pueden ser bastante sencillos y basarse en símbolos no líquidos, es decir, la cuestión no es el número de operaciones matemáticas que tienen lugar dentro del código de cada uno de los EAs. El problema está en el propio terminal y no podremos arreglarlo mejorando nuestro código. Desgraciadamente :(

P.D. He reescrito la lógica utilizada en la mitad de mis Expert Advisors de OnBook a OnTick y he sustituido el Core i5 por Xeon E5-2678. Parecería que la velocidad debería aumentar, pero por desgracia, no se produjo el milagro :(

 
HistorySelect se retrasa en las funciones 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));  
}


En casi todos los pasos.

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.


Esperemos que las construcciones de la caché no tarden tanto, y que este retraso se deba al acceso a la base de datos durante la actualización de la misma.

 

¿Alguna idea de por qué mt5 no cuenta con la pestaña "Comisiones"? Sólo aparecen cuando se cierra una operación.

¿Alguna idea de por qué mt5 no cuenta con la pestaña "Comisiones"? Sólo aparecen cuando se cierra una operación.

 

Si ejecuta este EA en una cuenta sin posiciones ni órdenes actuales.

// Создает маркет-ордер в случае, если нет текущих позиций и ордеров.
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();
}

y luego cerrar manualmente la posición abierta por el EA, entonces habrá tres posiciones abiertas en la cobertura (en la posición neta de triple volumen).


¿Es éste el comportamiento correcto? Probablemente no entiendo bien el Terminal. Entonces, por favor, explíquese.

Razón de la queja: