Mercato chiuso - pagina 5

 

Cari sviluppatori!

VI CHIEDO di leggere attentamente questo messaggio.

Penso di aver capito il motivo per cui appare la discrepanza temporale!!!

Oggi:

Terminale

23:49:58.148    Trades  'xxxxx': buy limit 2.00 UCHF-3.18 at 0.9310
23:49:58.154    Trades  'xxxxx': accepted buy limit 2.00 UCHF-3.18 at 0.9310
23:49:58.156    Trades  'xxxxx': buy limit 2.00 UCHF-3.18 at 0.9310 placed for execution in 8.040 ms

Esperto

2017.09.21 23:49:58.182 trader (UCHF-3.18,H1)     StopTrading: Время сервера = 23:50:00; Статус ордера = BUY_ORDER; Билет = 77833993  Buy ордер отклонён.
2017.09.21 23:49:58.182 trader (UCHF-3.18,H1)     Alert: Эксперт остановлен. Инструмент UCHF-3.18
2017.09.21 23:49:58.182 trader (UCHF-3.18,H1)     OnTradeTransaction: Buy ордер отклонён брокером(биржей). Билет = 77833993 Причина: 0 0

Meccanismo di controllo del tempo.

Quando la profondità del mercato cambia per un simbolo(lavoro solo con la profondità del mercato)

//+------------------------------------------------------------------+
// Expert Book event function                                        |
//+------------------------------------------------------------------+  
void OnBookEvent(const string &symbol)
{
  if(symbol == Symbol()))
  {
    if(CheckMarketTime(symbol)
    {
      //Выставление ордеров и т.д.
    }
  }     
}

La funzioneCheckMarketTime è chiamata

//+------------------------------------------------------------------+
//| Expert Check Market Time function                                |
//+------------------------------------------------------------------+
bool CheckMarketTime(const string a_symbol)
{
  if(SymbolInfoTick(a_symbol, cur_tick))
  {
    sv_time.year = 0;
    TimeToStruct(cur_tick.time, sv_time);
    if(sv_time.year > 0)
    {
      if((sv_time.day_of_week == int(FirstDay)) ||
         (sv_time.day_of_week == int(SecondDay))) return(false);
      tts_time.year = 0;
      TimeTradeServer(tts_time);
      if(tts_time.year > 0)
      {   
        if((tts_time.day_of_week == sv_time.day_of_week) &&
           (tts_time.hour == sv_time.hour) &&
           (tts_time.min == sv_time.min))
        {
          ulong cur_time = sv_time.hour * 3600 + sv_time.min * 60 + sv_time.sec;
          if(((cur_time >= time_st_mon) && (cur_time < 50370)) ||
             ((cur_time >= time_st_day) && (cur_time < 67470)) ||
             ((cur_time >= time_st_evn) && (cur_time < 85770)))
          {
            return(true);
          }
        }
      }
    }
  }
  return(false);
}

Dopo aver ottenuto i dati sull'ultimo tick per il simbolo

if(SymbolInfoTick(a_symbol, cur_tick))

Controllo il tempo, ma(MOLTO IMPORTANTE) !!!!

MqlTick (IMMEDIATAMENTE) non contiene l'ultimo timeframe, se

nella profondità del mercato è cambiato SOLO il volume dello stesso prezzo.

Faccio questa supposizione perché non c'è

Flags TICK_FLAG_ASK_VOLUMEe TICK_FLAG_BID_VOLUME

La funzione OnBookEvent ha funzionato (il volume di tale e tale prezzo è cambiato), ma

MqlTick non ha registrato il tempo di questo cambiamento.

Si prega di aggiungere queste bandiere a MqlTick, rispettivamente con il tempo aggiornato.

Aggiunto

Per qualche motivo non riesco a fare una registrazione nel CD

 
prostotrader:

MqlTick (QUI) non registra l'ultimo tempo se

nella tazza dei prezzi è cambiato SOLO il volume dello stesso prezzo.

Assolutamente corretto. E questo è un comportamento corretto. MqlTick prende i dati dalla stessa fonte da cui viene riempita la storia dei tick. Non ci dovrebbero essere duplicati nella cronologia dei tick, perché la cronologia dei tick in MT5 non memorizza il volume anche su bestbands.

È stato sollevato da molto tempo che non c'è un modo diretto per conoscere il tempo a cui corrisponde la storia del tick. Scopritelo in un altro modo.

 
fxsaber:

Assolutamente giusto. E questo è il comportamento corretto. MqlTick prende i dati dalla stessa fonte da cui viene riempita la storia dei tick. Non ci dovrebbero essere duplicati nella cronologia dei tick, perché la cronologia dei tick in MT5 non memorizza il volume anche su bestbands.

È stato sollevato per molto tempo che non c'è un modo diretto per conoscere il tempo a cui corrisponde la storia del tick. Scopritelo in un altro modo.


Sarebbe così gentile da suggerirmi quale?

Aggiunto

Se ricevo una notifica che qualcosa è cambiato nel takan, allora

perché non aggiungere un campo per comodità ("poco sangue")

datetime book_change; ?

O ancora più semplice, aggiungere il seguente campo a MqlBookInfo

datetime book_change;

Tanto più che questo tempo è tradotto dallo scambio.

 
prostotrader:

Sarebbe così gentile da dirmi quale?

// Время последнего тика символа
long GetSymbolTime( const string Symb )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(Symb, Tick) ? Tick.time_msc : 0);
}

// Время последнего тика Обзора рынка
long GetMarketWatchTime( void )
{
  long Res = 0;
  
  for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
  {
    const long TmpTime = GetSymbolTime(SymbolName(i, true));
    
    if (TmpTime > Res)
      Res = TmpTime;
  }
  
  return(Res);
}

// Текущее время на торговом сервере без учета пинга
long GetCurrenTime( void )
{
  static ulong StartTime = GetMicrosecondCount();
  static long PrevTime = 0;
  
  const long TmpTime = GetMarketWatchTime();
  
  if (TmpTime > PrevTime)
  {
    PrevTime = TmpTime;
    
    StartTime = GetMicrosecondCount();
  }
  
  return(PrevTime + (long)((GetMicrosecondCount() - StartTime) / 1000));
}

void OnInit()
{
  MarketBookAdd(_Symbol);
}

void OnDeinit( const int )
{
  MarketBookRelease(_Symbol);
}

string TimeToString( const long Value )
{
  return((string)(datetime)(Value / 1000) + "." + (string)IntegerToString(Value % 1000, 3, '0'));
}

void OnBookEvent( const string& )
{
  Comment(TimeToString(GetCurrenTime()));
}
 
fxsaber:

Non essere ridicolo... :)

 
prostotrader:

Se mi è stato notificato che qualcosa è cambiato in takan, allora

perché non aggiungere un campo per comodo ("pochi soldi")

datetime book_change; ?

O semplicemente, aggiungete la struttura MqlBookInfo con l'opzione

datetime book_change;

Soprattutto, che questo tempo è tradotto dallo scambiatore.

Solo che non è datetime, ma lungo - millisecondi. E

Forum sul trading, sistemi di trading automatico e test di strategia

Mercato chiuso

fxsaber, 2017.09.22 09:17

Laquestione è stata sollevata per molto tempo che non c'è un modo diretto per conoscere il tempo a cui corrisponde la finestra di scommessa.

Con suggerimenti simili.

 

Forse dopo l'attivazione di OnBookEvent

richiedere CopyTicks su questo personaggio?

Farò un tentativo...

 
prostotrader:

Forse dopo l'attivazione di OnBookEvent

richiedere CopyTicks su questo personaggio?

Non sarebbe d'aiuto, ovviamente. L'unica opzione ora è scoprire la tempistica del led del tumbler.

 
fxsaber:

Non servirà, ovviamente. L'unica opzione ora è scoprire i tempi del led del vetro.


È interessante :)

#property copyright "Copyright 2017 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
MqlTick a_ticks[], b_ticks;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!MarketBookAdd(Symbol()))
   {
     Print("Book not added!");
     return(INIT_FAILED);
   }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
    MarketBookRelease(Symbol());   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(symbol == Symbol())
    {
      int res = CopyTicks(symbol, a_ticks, COPY_TICKS_ALL, 0, 1);
      if(res > 0)
      {
        if(SymbolInfoTick(symbol, b_ticks))
        {
          Print("CopyTicks time = ", TimeToString(a_ticks[0].time, TIME_SECONDS), "; SymbolInfoTick = ", TimeToString(b_ticks.time, TIME_SECONDS));
        }
      }
    }
  }

Risultato

2017.09.22 11:18:36.029 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:27; SymbolInfoTick = 11:18:35
2017.09.22 11:18:36.933 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:27; SymbolInfoTick = 11:18:35
2017.09.22 11:18:37.577 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:27; SymbolInfoTick = 11:18:37
2017.09.22 11:18:38.257 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:27; SymbolInfoTick = 11:18:37
2017.09.22 11:18:38.317 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:38; SymbolInfoTick = 11:18:38
2017.09.22 11:18:38.511 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:38; SymbolInfoTick = 11:18:38
2017.09.22 11:18:38.871 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:38; SymbolInfoTick = 11:18:38
2017.09.22 11:18:39.071 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:38; SymbolInfoTick = 11:18:38
2017.09.22 11:18:39.545 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:38; SymbolInfoTick = 11:18:38
2017.09.22 11:18:39.655 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:38; SymbolInfoTick = 11:18:39

???????

Non so nemmeno cosa dire....

 
prostotrader:

Non so nemmeno cosa dire....

void OnInit()
{
  MarketBookAdd(_Symbol);
}

void OnDeinit( const int )
{
  MarketBookRelease(_Symbol);
}

string GetTickFlag( uint tickflag )
{
  string flag = "";

#define  TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : "";
  TICKFLAG_MACRO(BID)
  TICKFLAG_MACRO(ASK)
  TICKFLAG_MACRO(LAST)
  TICKFLAG_MACRO(VOLUME)
  TICKFLAG_MACRO(BUY)
  TICKFLAG_MACRO(SELL)
#undef  TICKFLAG_MACRO

  if (flag == "")
    flag = " FLAG_UNKNOWN (" + (string)tickflag + ")";
     
  return(flag);
}

#define  TOSTRING(A) " " + #A + " = " + (string)Tick.A

string TickToString( const MqlTick &Tick )
{
  return(TOSTRING(time) + "." + (string)IntegerToString(Tick.time_msc % 1000, 3, '0') +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

void OnBookEvent( const string &Symb )
{
  if (Symb == _Symbol)
  {
    MqlTick Tick1, Tick2[];
    
    if (SymbolInfoTick(_Symbol, Tick1) && (CopyTicks(_Symbol, Tick2, COPY_TICKS_ALL, 0, 1) > 0))
      Print("\nMqlTick: " + TickToString(Tick1) + "\nCopyTick: " + TickToString(Tick2[0]));
  }
}

vedrete che i tempi saranno diversi solo in queste situazioni

Test3 (RTS-12.17,M1)    MqlTick:  time = 2017.09.22 11:21:50.668 bid = 112000.0 ask = 112010.0 last = 112000.0 volume = 5 FLAG_UNKNOWN (0)
Test3 (RTS-12.17,M1)    CopyTick:  time = 2017.09.22 11:21:50.572 bid = 112000.0 ask = 112010.0 last = 112000.0 volume = 5 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL


È stato discusso più volte che MqlTick non restituisce un tick così com'è. Che ci sono due flussi di tick - quotazione e transazione. E che in CopyTicks vengono uniti a volte retroattivamente, perché i flussi non sono sincronizzati. E che i tempi di MqlTick e CopyTicks possono non coincidere.