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

 
fxsaber:

En Asesores de Combate, he envuelto funciones por todas partes en lugares sospechosos a _B(FuncName(...), AlertTime).

Se olvidó que es muy caro.

        Alert: Time[SyncEA.mqh 309: ::TerminalInfoInteger(TERMINAL_MEMORY_USED)] = 21 ms.
 
fxsaber:

En el mejor de los casos, gasto decenas de milisegundos en cada tic sólo por HistorySelect.

Perfil del asesor de combate.


 
Es eso o algo más. Cuando un pedido se realiza con éxito, se devuelve su ticket? ¿Le dice algo el retorno de la función HistoryOrderSelect(ticket)? ¿Por qué molestarse en utilizar el costoso HS, excepto cuando se pone en marcha el robot?
 
Vladimir Simakov:
¿Por qué utilizar el costoso HS, excepto cuando se pone en marcha el robot?

Escribió al principio del hilo.

 
fxsaber:

Usted hace un PedidoEnvío. Si, inmediatamente después de finalizar el OrderSend, una determinada posición no se ha cerrado al mismo tiempo, se realiza otro OrderSend. Esta es toda la lógica que necesitas para programar. No se utiliza Async.

Ahora la situación que ocurrió para nuestro robot. Ha enviado un OrderSend y mientras se ejecuta el Limiter se ha disparado y entonces se ha ejecutado el TP de nuestra posición, como he mencionado anteriormente.

Realmente no entiendo nada de esto - si puedes, por favor, explica los pasos con más detalle. Lo único que obtuve fue que sólo se utiliza el manejador de eventosOnTradeTransaction, lo que significa que no necesitamos la gestión de la prioridad del manejo de eventos y el sugerido

bool HandleNextEvent(ENUM_EVENT_TYPE);

degenera en

bool HandleNextEvent();
¿Cuál era la petición? DanosHandleNextEvent()
OnTradeTransaction(...)
{
        /*вычисления1*/
        HandleNextEvent();
        /*вычисления2*/
}
Ahora el manejador de eventos secundario en el esquema se propone que se implemente así:
On2TradeTransaction(...)
{
        if флаг установлен goto label
        /*вычисления1*/
                запомнить результаты вычислений
                установить флаг
                return;
label:          извлечь результаты вычислений
        /*вычисления2*/
}
 
A100:

Aquí es donde realmente no lo entiendo - si puedes, por favor, descríbelo con más detalle paso a paso.

void OnMain()
{
  OrderSend(OP_BULIMIT); // Во время выполнения сработал и другой отложенник и тейк позиции (после отложенника).
  
  // Следующий OrderSend должен быть незамедлительно вызван.
  if (наблюдаемая позиция закрылась по тейку) // Проблема определить это без доступа к очереди.
    OrderSend(OP_BUYLIMIT)  
  else
    OrderSend(OP_SELLLIMIT)    
}
 
fxsaber:

¿Por qué no se puedevolver después de llamar aOrderSend?

void OnMain()
{
        if (first)
        {
                OrderSend(OP_BULIMIT); // Во время выполнения сработал и другой отложенник и тейк позиции (после отложенника).
                return;
        }
//...
}

La próxima vez que regrese a OnMain cuando se haya añadido un nuevo evento a la cola (o por temporizador)

 

A100:

¿Por qué la llamada aOrderSend no puede ir seguida deun retorno?

No hay ninguna limitación.

La próxima vez que vuelva a OnMain cuando se añada un nuevo evento a la cola (o por temporizador)

El siguiente evento es la ejecución de una orden pendiente y no de una toma de posición.

 
fxsaber:

El siguiente evento es la ejecución de la orden pendiente, no la toma de la posición.

Se sugiere regresar repetidamente, hasta leer toda la cola actual o para un número determinado de eventos. Cuando los eventos comerciales terminen - habrá un retorno del temporizador y tendrás acceso a todos los eventos a la vez

 
void OnMain()
{
        if (first)
        {
                OrderSend(OP_BULIMIT); // Во время выполнения сработал и другой отложенник и тейк позиции (после отложенника).
                return; 
        }
        if ( OnTrade событие последнее )
                return; //может еще есть
        if ( OnTimer событие последнее )
        { // все торговые события в лукошке
                if (наблюдаемая позиция закрылась по тейку) // Проблема определить это без доступа к очереди.
                        OrderSend(OP_BUYLIMIT)  
                else
                        OrderSend(OP_SELLLIMIT)
        }
}
hay una solución más elegante, sin OnTimer... Piénsalo bien
Razón de la queja: