Un minuto e mezzo di differenza tra l'ora locale e l'ora fresca di zecca. Cosa fare. - pagina 6

 
prostotrader:

Guardate attentamente il codice!

TimeTradeServer() è preso solo per determinare il giorno e basta (questo controllo è fatto "per sicurezza")!

TimeTradeServer() può essere omesso del tutto!

L'ho guardato. Sono d'accordo, ho scritto male, ma la funzione, secondo me, non risolve ancora il problema. Ad essere onesti, non sono sicuro del perché sia necessario. Sembra che lei:

1. Ottiene il numero di millisecondi da un tick;

2. Rompi la zecca nei suoi componenti;

3. Poi rimonti di nuovo la zecca? È qui che non mi è chiaro a cosa serva questo? Otterrete sempre lo stesso valore che è stato originariamente passato alla funzione. O forse mi manca qualcosa?

E poi si confronta il tempo del tick con quello precedente;


Dobbiamo sapere l'ora del server, vero? Senza il tempo del server, non possiamo determinare se il thread di un personaggio è in ritardo rispetto ai thread di altri personaggi.

Cioè, il tuo codice non si lega al tempo del server e non confronta il tempo del server con il tempo del thread, cosa che dobbiamo fare. Per capire non il ritardo dello stack dai tick di un singolo simbolo (come pensavo inizialmente quando mi sono addentrato in questa discussione), ma il ritardo del trasferimento dei dati su un insieme di simboli dal server al terminale.

 
Alexey Kozitsyn:

Il controllo sembra dover essere fatto tramite TimeGMTOffset. Più tardi farò un esempio.

È divertente, sei una persona esperta (non un principiante).

Non hai bisogno di nessun tempo, tranne il tempo delle zecche in arrivo!

Ricorda il tempo (all'inizializzazione) dell'ultimo tick, e poi tutti i confronti vanno con questo tempo!

 
Alexey Kozitsyn:

Ho dato un'occhiata. Sono d'accordo, l'ho scritto in modo un po' scorretto, ma la funzione, secondo me, non risolve ancora il compito in questione. Ad essere onesti, non sono sicuro del perché sia necessario. Sembra che tu lo sia:

3. Poi rimontare di nuovo la zecca? È qui che non mi è chiaro a cosa serva? Otterrete sempre lo stesso valore che è stato originariamente passato alla funzione. O mi manca qualcosa?


Questo codice è "tirato" dal mio Expert Advisor, dove controllo se il tick è corrente e se è entro

sessioni di trading

Aggiunto da

La "scomposizione" del tick è necessaria per determinare il tempo esatto (millisecondi) (senza data), poiché nelle impostazioni di sessione del mio EA

Ho solo impostato il tempo

input string          TimeStMon    = "10:00:00";               //Время начала утренней сессии
input string          TimeStDay    = "14:05:00";               //Время начала дневной сессии
input string          TimeStEvn    = "19:05:00";               //Время начала вечерней сессии
 
prostotrader:

È semplicemente ridicolo, sei una persona esperta (non un principiante).

Non hai bisogno di nessun tempo, tranne il tempo delle zecche in arrivo!

Ricordate il tempo (all'inizializzazione) dell'ultimo tick, e poi tutti i confronti vanno con questo tempo!

Scriverò il mio esempio più tardi, entrerò nella questione in modo più dettagliato. Non escludo che forse mi sbaglio (così come pivomoe) e tu hai ragione.

 
prostotrader:

Questo codice è "tirato" dal mio EA dove controllo la rilevanza del tick e il tempo in cui il tick si trova

sessioni di trading

Aggiunto

La "scomposizione" del tick è necessaria per determinare l'ora esatta (senza data), poiché nelle impostazioni di sessione del mio EA

Ho solo impostato il tempo

Esattamente, colpa mia, l'ho perso.

 
Alexey Kozitsyn:

Esattamente, colpa mia, non l'avevo vista così.

È solo che TC non era inizialmente chiaro su ciò che voleva ottenere (o forse è stato frainteso).

Ecco, eseguilo e controlla:

//+------------------------------------------------------------------+
//|                                                         Time.mq5 |
//|                                                   Copyright 2019 |
//|                                                                  |
//+------------------------------------------------------------------+
enum FRESH_TICK
{
  UNKNOWN_TICK,
  NEW_TICK,
  CUR_TICK,
  OLD_TICK
};
//
MqlTick stored_ticks[];
bool is_book;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  int result = CopyTicks(Symbol(), stored_ticks, COPY_TICKS_ALL, 0, 1);
  if(result > 0)
  {
    is_book = MarketBookAdd(Symbol());
    if(is_book == false) return(INIT_FAILED);
  } else return(INIT_FAILED);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  if(is_book == true) MarketBookRelease(Symbol()); 
}
//+------------------------------------------------------------------+
// Expert Book event function                                        |
//+------------------------------------------------------------------+  
void OnBookEvent(const string &symbol)
{
  if(symbol == Symbol())
  {
    MqlTick a_ticks[];
    int result = CopyTicks(symbol, a_ticks, COPY_TICKS_ALL, 0, 1);
    if(result > 0)
    {
      FRESH_TICK tick_state = CheckTickTime(a_ticks[0]);
      switch(tick_state)
      {
       case UNKNOWN_TICK: Print(EnumToString(UNKNOWN_TICK), " - Тик не определен."); //Тик не определен
       break;
       case NEW_TICK: Print(EnumToString(NEW_TICK), " - Новый тик");     //Торговое время, можно отсылать ордера;
       break;
       case CUR_TICK: Print(EnumToString(CUR_TICK), " - Текущий тик");    //По усмотрению разработчика;
       break;
       case OLD_TICK: Print(EnumToString(OLD_TICK), " - Старый тик");     //По усмотрению разработчика;
       break;
      }
    }  
  }
}
//+------------------------------------------------------------------+
//| Expert Check Market Time function                                |
//+------------------------------------------------------------------+
FRESH_TICK CheckTickTime(MqlTick &a_tick)
{
  if(a_tick.time_msc > stored_ticks[0].time_msc)
  {
    stored_ticks[0] = a_tick;
    return(NEW_TICK);
  }
  else
  {
    if(stored_ticks[0].time_msc == a_tick.time_msc)
    {
      if((stored_ticks[0].ask == a_tick.ask) && (stored_ticks[0].bid == a_tick.bid) &&
         (stored_ticks[0].flags == a_tick.flags) && (stored_ticks[0].last == a_tick.last) &&
         (stored_ticks[0].time == a_tick.time) && (stored_ticks[0].volume == a_tick.volume) &&
         (stored_ticks[0].volume_real == a_tick.volume_real))
        {
          return(CUR_TICK);
        }
        else return(OLD_TICK);
        
    }
    else return(OLD_TICK);
  }
  return(UNKNOWN_TICK);
} 
      
 
prostotrader:

È solo che il TC non era sicuro di quello che voleva ottenere in primo luogo.

Ecco, eseguilo e controlla:

Michael, non ci sono domande sull'arrivo della nuova zecca/controllo della vecchia zecca. Non ci sono nemmeno domande al tuo codice. La domanda è diversa. Dovete controllare questa situazione:

14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Получен НОВЫЙ тик по символу                     GAZR-3.19 time_msc= 2019.03.20 14:53:11.638
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   ХОТЯ до этого был получeн тик                     RTS-3.19 time_msc  2019.03.20 14:53:13.695
 
Alexey Kozitsyn:

Michael, non ci sono domande sull'arrivo della nuova zecca/controllo della vecchia zecca. Né c'è alcun dubbio sul suo codice. La domanda è diversa. Ho bisogno di controllare la seguente situazione:

Ho modificato il codice (vedi sopra) il (OLD_TICK) è apparso.

E sapendo che il nuovo pacchetto può contenere un "vecchio" tick, lo sviluppatore deve usarlo a sua discrezione.

 
prostotrader:

Ho modificato il codice (vedi sopra) e (OLD_TICK) è apparso.

Non importa... flussi di caratteri DIVERSI.

 
Alexey Kozitsyn:

Non importa... flussi di caratteri DIVERSI.

Allora non capisco proprio COSA mi serve????

Se l 'ora corrente è quella del SERVER - devi dimenticartene finché non la trasmettono!
o usare quello che è TimeTradeServer()