MT5 e la velocità in azione - pagina 5

 
fxsaber:

In Combat Advisors, ho avvolto funzioni ovunque in luoghi sospetti in _B(FuncName(...), AlertTime).

Ho dimenticato che è molto costoso.

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

Nel migliore dei casi spendo decine di millisecondi per ogni tick solo a causa di HistorySelect.

Il profilo di un consigliere di combattimento.


 
O quello o qualcos'altro. Quando un ordine viene effettuato con successo, il suo biglietto viene restituito? Il ritorno della funzione HistoryOrderSelect(ticket) vi dice qualcosa? Perché preoccuparsi di usare il costoso HS, tranne quando si avvia il robot?
 
Vladimir Simakov:
Perché usare il costoso HS, tranne quando si avvia il robot?

Scritto all'inizio del thread.

 
fxsaber:

Si fa un OrderSend. Se, subito dopo la fine dell'OrderSend, una certa posizione non è stata chiusa allo stesso tempo, si effettua un altro OrderSend. Questa è tutta la logica necessaria per programmare. Async non è usato.

Ora la situazione che si è verificata per il nostro robot. Avete inviato un OrderSend e mentre viene eseguito il Limiter è scattato e quindi il TP della nostra posizione è stato eseguito, come ho detto prima.

Davvero non ci capisco niente - se puoi, per favore descrivi i passi in modo più dettagliato. L'unica cosa che ho ottenuto è che solo il gestore di eventiOnTradeTransaction viene utilizzato, il che significa che non abbiamo bisogno di una gestione delle priorità di gestione degli eventi e il suggerito

bool HandleNextEvent(ENUM_EVENT_TYPE);

degenera in

bool HandleNextEvent();
Qual era la richiesta? DacciHandleNextEvent()
OnTradeTransaction(...)
{
        /*вычисления1*/
        HandleNextEvent();
        /*вычисления2*/
}
Ora il gestore dell'evento secondario nello schema è proposto per essere implementato in questo modo:
On2TradeTransaction(...)
{
        if флаг установлен goto label
        /*вычисления1*/
                запомнить результаты вычислений
                установить флаг
                return;
label:          извлечь результаты вычислений
        /*вычисления2*/
}
 
A100:

È qui che davvero non capisco - se puoi, per favore descrivilo in modo più dettagliato passo dopo passo.

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

Perché non si puòtornare indietro dopo aver chiamatoOrderSend?

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

La prossima volta che si ritorna a OnMain quando un nuovo evento è stato aggiunto alla coda (o dal timer)

 

A100:

Perché la chiamataOrderSend non può essere seguita daun ritorno?

Non c'è nessuna limitazione.

La prossima volta che si ritorna a OnMain quando un nuovo evento viene aggiunto alla coda (o dal timer)

Il prossimo evento è l'esecuzione di un ordine pendente e non di una posizione di presa.

 
fxsaber:

L'evento successivo è l'esecuzione dell'ordine pendente, non l'acquisizione della posizione.

Si suggerisce di ritornare ripetutamente, fino a leggere l'intera coda corrente o per un dato numero di eventi. Quando gli eventi commerciali sono finiti - ci sarà un ritorno del timer e avrai accesso a tutti gli eventi in una volta sola

 
void OnMain()
{
        if (first)
        {
                OrderSend(OP_BULIMIT); // Во время выполнения сработал и другой отложенник и тейк позиции (после отложенника).
                return; 
        }
        if ( OnTrade событие последнее )
                return; //может еще есть
        if ( OnTimer событие последнее )
        { // все торговые события в лукошке
                if (наблюдаемая позиция закрылась по тейку) // Проблема определить это без доступа к очереди.
                        OrderSend(OP_BUYLIMIT)  
                else
                        OrderSend(OP_SELLLIMIT)
        }
}
c'è una soluzione più elegante, senza OnTimer... pensaci
Motivazione: