MT5 e la velocità in azione - pagina 7

 
fxsaber:

Tu non capisci niente. Quando torniamo, entriamo nelle funzioni On della coda generata. Questo può causare una pausa che impedisce al primo OrderSend di inviare il secondo corretto.

In cosa consiste la pausa/ritardo? Nella copia di 3 strutture?

OnTradeTransaction( параметры )
{
        поместить параметры в очередь
        OnMain();
}

Lei propone di accumulare la coda salvando tutte le funzioni On dopo il ritorno, in attesa della funzione On, che dirà che il primo OrderSend è finito. E poi inviare solo il secondo OrderSend.

Non è necessario accumulare tutti gli eventi. Non aspettare il prossimo evento per copiare - puoi elaborare gli eventi prima del ritorno e inviare il secondo OrderSend non appena arrivano i prerequisiti per questo

Inoltre non ti rendi conto che la posizione take può essere eseguita durante il primo OrderSend, ma la sua OnTradeTransaction sarà nella coda più tardi (nello stesso microsecondo, ma più tardi) rispetto alla OnTradeTransaction finale del primo OrderSend.

E come ti aiuta in una situazione del genere?

bool HandleNextEvent(ENUM_EVENT_TYPE);

Sarà ultimo sia qui che là

 
fxsaber:

Tu non capisci niente. Quando torniamo, entriamo nelle funzioni On della coda generata. Questo può causare una pausa che impedisce al primo OrderSend di inviare il secondo corretto subito dopo il primo.

Lei propone di accumulare la coda salvando tutte le funzioni On dopo il ritorno, in attesa della funzione On, in cui ci sarà un messaggio sulla fine del primo OrderSend. E poi inviare solo il secondo OrderSend.

Allo stesso tempo non capite che la posizione take può essere eseguita durante il primo OrderSend, ma la sua OnTradeTransaction sarà nella coda più tardi (nello stesso microsecondo, ma più tardi) rispetto alla OnTradeTransaction finale del primo OrderSend.

Non c'è nessuna coda. Il nuovo evento sarà processato dopo quello corrente, e tutti gli eventi che si sono verificati durante questo periodo saranno ignorati.

 
La coda, o stack, è formata da voi, MQ non lo fa.
 

Secondo me, la soluzione al problema sarebbe quella di poter "sottoscrivere" un ordine. Cioè, che il terminale generi un evento quando si verifica una transazione su un ordine.

Ma questo dovrebbe essere implementato dagli sviluppatori, non da noi. Tutte le nostre soluzioni, in un modo o nell'altro, torneranno alla storia degli accordi. Non ho una criticità così microseconda, ma è davvero

Ma è davvero fastidioso scrivere moto complesse per scoprire se un accordo è passato o non passato, se i livelli sono scattati o se qualcuno ha corretto una posizione nel terminale.

Anche se sembrerebbe una cosa semplice - un evento su un trade su una posizione - e tutto sarebbe molto più facile.

 
Maksim Emeliashin:

Ma spetta agli sviluppatori implementare questo, non a noi.

Gli sviluppatori dovrebbero solo fornire gli strumenti. MQL è essenzialmente un linguaggio di programmazione di basso livello (proprio come C++). Non si usa in termini di compiti ma di calcoli. E prendi tutte le decisioni di alto livello da solo. Possono mancare gli strumenti, ma non le soluzioni pronte all'uso

 
A100:

Qual è il ritardo della pausa? Nel copiare 3 strutture?

Nell'elaborazione di una coda di eventi diversi.

Come ti aiuterebbe in una situazione del genere?

Sarà l'ultimo qui o lì.

Sarò consapevole della chiusura della presa.

 
Алексей Тарабанов:

Non c'è nessuna coda. Il nuovo evento sarà processato dopo l'evento corrente e tutti gli eventi che si sono verificati durante questo periodo saranno ignorati.

Incompetente.

 
fxsaber:

Ci sono vari eventi in coda da elaborare.

Sarò consapevole della chiusura sul tee.

Fermiamoci al fatto che davvero (senza codice conHandleNextEvent) non capisco cose elementari.

Come nota finale, la differenza tra il propostoHandleNextEvent e quello che ho scritto è che è tramite ricorsione e io l'ho tramite un ciclo. Inoltre, la coda è inizialmente formata e potete gestirla ... gestite alcuni eventi in una volta sola e rimandateli per un altro momento, avete completa libertà.

 
Qual è la ragione per cui questo EA non si allerta?
const MqlTick GetMarketWatchTick( void )
{
  MqlTick Tick = {0};
  
  ::SymbolInfoTick(_Symbol, Tick);
  
  return(Tick);
}

const MqlTick GetLastHistoryTick()
{
  MqlTick Tick[1];
  
  ::CopyTicks(_Symbol, Tick, COPY_TICKS_ALL, 0, 1);
  
  return(Tick[0]);
}

void OnTick()
{
  if (GetMarketWatchTick().time_msc > GetLastHistoryTick().time_msc) // Тик из Обзора рынка свежее, чем последний тик из истории.
    Alert("Hello!");
}


Allo stesso tempo, lo stesso controllo, cucito nel consigliere di trading di combattimento sullo stesso terminale, Alert. Quale potrebbe essere la ragione?

 

2474.

        Last tick time. Selected orders: 0; max time: 0.187 ms; avr time: 0.022 ms; 100000 iterations
        Last 3 days. Selected orders: 1956; max time: 1.832 ms; avr time: 0.301 ms; 100000 iterations
        Orders total: 56561

È diventato molto buono. Se l'avete cambiato - Grazie. Terrò d'occhio le prestazioni in modalità di combattimento.


PS In modalità combattimento, quando si effettuano scambi, quasi sempre ritarda (solo uscite superiori a 5 millisecondi).

2020.06.03 13:57:27.895 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 14 ms.
2020.06.03 13:57:47.780 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 5 ms.
2020.06.03 14:03:49.844 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 9 ms.
2020.06.03 14:03:51.063 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 8 ms.
2020.06.03 14:03:55.115 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 12 ms.
2020.06.03 14:03:56.935 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 6 ms.

Altrimenti sembra essere molto meglio del 2470.