Librerie: SuTickMulti - pagina 4

 
fxsaber #:

Non ci saranno più tick con l'ultimo tempo noto.

L'OnTimer in millisecondi garantisce che tutti i tick siano trascorsi PRIMA di questo evento del timer. In altre parole, i tick sono aggiornati per tutti i simboli.

Se si intende che l’indicatore spia possa, per qualche motivo tecnico, ritardare il “vecchio” tick e inviarlo dopo uno più recente relativo a un altro strumento, allora probabilmente ciò potrebbe accadere. Altrimenti non vedo problemi direttamente nel codice.

Non credo che il timer garantisca in misura maggiore che tutti i tick siano trascorsi PRIMA del nuovo “evento” (conteggio di un’unità di tempo). Il timer funziona in base all’ora locale, mentre i timestamp nei tick contengono l’ora del server. Pertanto, è meglio non fare affidamento sul timer per la sincronizzazione degli strumenti.

 
Stanislav Korotky #:

Va bene, per i tick va bene così, vista la complessità della sincronizzazione, anche se potremmo impostare un intervallo di tempo in millisecondi e allineare i tick nel tempo.

Ma lo stesso vale anche per i prezzi di apertura, sebbene l’orario di apertura sia lo stesso per tutti i simboli.

E a causa di questo comportamento, è impossibile testare correttamente una serie di sistemi.

 

Esempio del problema.

#include <fxsaber\OnTickMulti\OnTickMulti.mqh> // https://www.mql5.com/it/code/47647

#include <MT4Orders.mqh> // https://www.mql5.com/it/code/16006

input bool inTimer = false; // false - OnTick, true - OnTimer

ulong TimeMsc = TimeTradeServer() * 1000 + (inTimer && EventSetMillisecondTimer(1));

void PositionOpen()
{
  for (uint i = ArraySize(OnTickMultiObject.Symbols); (bool)i--;)
  {
    const string SymbName = OnTickMultiObject.Symbols[i];
    
    OrderSend(SymbName, OP_BUY, 1, SymbolInfoDouble(SymbName, SYMBOL_ASK), 0, 0, 0);
  }
}

void OnTimer()
{
  if (TimeMsc++ == 1759280400081) // 01/10/2025 01:00:00.081
    PositionOpen();
}

// OnTick multicarattere.
void OnTickMulti( const string &Symb, const uint &Index )
{  
  MqlTick Tick;
  
  if (!inTimer && SymbolInfoTick(Symb, Tick) && (Tick.time_msc == 1759280400081) && // 01/10/2025 01:00:00.081
      !OrdersTotal())
    PositionOpen();
}

Nello screenshot sono riportati tutti i dati necessari per riprodurre il fenomeno su MetaQuotes-Demo. Si vede chiaramente che tramite OnTick i tick non sono sincronizzati, mentre tramite OnTimer (estremamente lento) lo sono.

 
fxsaber #:

tramite OnTick i tick non sono sincronizzati, mentre tramite OnTimer (che rallenta terribilmente il sistema) sono sincronizzati.

Sembra che l'unico modo per velocizzare i calcoli in modalità sincronizzata sia la modalità matematica simile a EAToMath.


Oppure salvare in anticipo in un file questi dati relativi a un singolo passaggio.

#include <fxsaber\OnTickMulti\OnTickMulti.mqh> // https://www.mql5.com/it/code/47647

// OnTick multicarattere.
void OnTickMulti( const string &Symb, const uint &Index )
{  
  static MqlTick Ticks[];
  static const int Size = ArrayResize(Ticks, ArraySize(OnTickMultiObject.Symbols));  
  
  bool Res = SymbolInfoTick(Symb, Ticks[Index]);

  for (int i = 1; Res && (i < Size); i++)
    Res = (Ticks[i].time_msc == Ticks[i - 1].time_msc);
    
  if (Res)
    ArrayPrint(Ticks);  
}
2025.10.01 01:00:00                    [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2025.10.01 01:00:00   [0] 2025.10.01 01:00:00 1.17345 1.17363 0.0000        0 1759280400081     134       0.00000
2025.10.01 01:00:00   [1] 2025.10.01 01:00:00 1.34417 1.34501 0.0000        0 1759280400081     134       0.00000
2025.10.01 01:00:00   [2] 2025.10.01 01:00:00 0.66103 0.66122 0.0000        0 1759280400081     134       0.00000
2025.10.01 06:07:02                    [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2025.10.01 06:07:02   [0] 2025.10.01 06:07:02 1.17388 1.17390 0.0000        0 1759298822726     134       0.00000
2025.10.01 06:07:02   [1] 2025.10.01 06:07:02 1.34417 1.34422 0.0000        0 1759298822726     130       0.00000
2025.10.01 06:07:02   [2] 2025.10.01 06:07:02 0.65959 0.65967 0.0000        0 1759298822726     134       0.00000
2025.10.01 07:30:23                    [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2025.10.01 07:30:23   [0] 2025.10.01 07:30:23 1.17467 1.17469 0.0000        0 1759303823965       4       0.00000
2025.10.01 07:30:23   [1] 2025.10.01 07:30:23 1.34486 1.34490 0.0000        0 1759303823965     134       0.00000
2025.10.01 07:30:23   [2] 2025.10.01 07:30:23 0.65970 0.65978 0.0000        0 1759303823965       4       0.00000

E nel proprio sistema automatico utilizzare i dati di questo file per la sincronizzazione in OnTick. Funzionerà in modo veloce e corretto.

Подробнее о способах ускорения оптимизации советников в MT5.
Подробнее о способах ускорения оптимизации советников в MT5.
  • 2025.09.02
  • www.mql5.com
Классификация советников. Все советники, запускаемые в Оптимизаторе, делятся на два типа. Торговые. Статистические: "обучение", обработка котировочных данных. Каждый из них тоже делится на два типа
 
fxsaber #:

Esemplificazione del problema.

Nello screenshot sono riportati tutti i dati necessari per riprodurre il problema su MetaQuotes-Demo. Si vede chiaramente che tramite OnTick i tick non sono sincronizzati, mentre tramite OnTimer (che rallenta terribilmente il sistema) lo sono.

Beh, avete utilizzato il vostro codice con una condizione di ingresso nell’operazione basata su ==. Ho scritto sopra che la condizione deve essere rigorosamente >, senza l’uguaglianza. Per effettuare operazioni sincronizzate sugli ultimi prezzi noti fino al 01/10/2025 alle 01:00:00.081 su tutti gli strumenti, devi iniziare a monitorare i tick prima di tale orario, ovvero utilizzare come costante di dimostrazione, ad esempio, >1759280400080. Per ogni algoritmo è necessario modificare la logica: non basterà semplicemente sostituire un tipo di gestore con un altro.

PS. Per sincronizzazione intendo il trading in base agli ultimi prezzi noti. Per la sincronizzazione basata sulla corrispondenza dei millisecondi sono ovviamente necessarie ulteriori verifiche, ma la probabilità che si verifichino tali situazioni (coincidenza dei tick in millisecondi di strumenti diversi) è bassa, il che comporta la perdita di potenziali segnali. Non sono sicuro che tale sincronizzazione abbia un interesse pratico.

 
Stanislav Korotky #:

Per effettuare operazioni sincronizzate agli ultimi prezzi disponibili fino alle 01:00:00 del 01/10/2025.081 su tutti gli strumenti, è necessario iniziare a monitorare i tick prima di tale orario, ovvero utilizzare come costante di riferimento, ad esempio, >1759280400080.

Sono pronto a esaminare la sua versione nel codice.
 

Il modo più semplice per sincronizzare è creare un insieme composto dai tempi di tick dei simboli utilizzati.

È difficile effettuare la sincronizzazione al volo, in un unico passaggio.

La difficoltà sta nell'incertezza del ritardo. Non si sa quale simbolo sarà quello di riferimento.

 
fxsaber #:
Sono pronto a dare un'occhiata alla tua versione nel codice.

Per un test case completo, mi servirebbe capire il problema pratico: si fa trading solo sui tick il cui tempo coincide con una precisione al millisecondo?

Per un esempio artificiale con una sola operazione in un momento noto in anticipo, con tick sincronizzati su tutti gli strumenti, si potrebbe ideare un algoritmo ottimale artificiale, ma a che scopo?

 
Rorschach #:

Ma i prezzi di apertura sono gli stessi, anche se l'orario di apertura è identico per tutti i titoli.

Bisognerebbe precisare meglio il problema. Per quanto riguarda i prezzi di apertura, se l’algoritmo richiede la presenza di barre per tutti i simboli, si attende che iTime(,,0) coincida per tutti i simboli. Per le barre, in questo approccio, di solito non ci sono problemi logici, perché le barre (anche M1) raramente mancano, mentre per i secondi e gli intervalli di tempo più piccoli le lacune nella sincronizzazione possono essere frequenti. Cosa fare in questi casi?

Ritengo che, nella pratica, come criterio di sincronizzazione si debba considerare la presenza di qualsiasi prezzo non più vecchio di un determinato timeout, piuttosto che la rigorosa corrispondenza dei timestamp dei tick.

 
Stanislav Korotky #:

Bisognerebbe precisare meglio il problema. Per quanto riguarda i prezzi di apertura, se l’algoritmo richiede la presenza di barre per tutti i simboli, si attende che iTime(,,0) coincida per tutti i simboli. Per le barre, in questo approccio, di solito non ci sono problemi logici, poiché le barre (anche quelle M1) raramente mancano

Ci si riferisce alla modalità tester basata sui prezzi di apertura.

Stanislav Korotky #:
per i secondi e gli intervalli di tempo ancora più brevi, i problemi di sincronizzazione possono essere frequenti. Cosa fare in questi casi?

Utilizzare l’ultimo valore noto.