Markt geschlossen - Seite 5

 

Liebe Entwickler!

ICH FORDERE SIE AUF, diese Nachricht aufmerksam zu lesen.

Ich glaube, ich habe den Grund für die Zeitdiskrepanz herausgefunden!!!

Heute:

Terminal

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

Experte

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

Mechanismus zur Zeitkontrolle.

Wenn sich die Tiefe des Marktes für ein Symbol ändert(ich arbeite nur mit der Tiefe des Marktes)

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

Die FunktionCheckMarketTime wird aufgerufen

//+------------------------------------------------------------------+
//| 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);
}

Abrufen von Daten über den letzten Tick für das Symbol

if(SymbolInfoTick(a_symbol, cur_tick))

Ich prüfe den Zeitrahmen, aber(SEHR WICHTIG) !!!!

MqlTick (IMMEDIATELY) enthält nicht den neuesten Zeitrahmen, wenn

in der Markttiefe hat sich NUR das Volumen des gleichen Preises geändert.

Ich gehe von dieser Annahme aus, weil es keine

TICK_FLAG_ASK_VOLUMEund TICK_FLAG_BID_VOLUME Flaggen

Die Funktion OnBookEvent funktionierte (das Volumen von soundso und soundso hat sich geändert), aber

MqlTick hat den Zeitpunkt dieser Änderung nicht registriert.

Bitte fügen Sie diese Flaggen zu MqlTick hinzu, jeweils mit aktualisierter Zeit.

Hinzugefügt

Aus irgendeinem Grund kann ich in der CD keine Aufnahme machen

 
prostotrader:

MqlTick (RIGHT HERE) zeichnet nicht die letzte Zeit auf, wenn

im Preisbecher hat sich NUR das Volumen desselben Preises geändert.

Völlig richtig. Und das ist ein korrektes Verhalten. MqlTick bezieht die Daten aus der gleichen Quelle, aus der auch die Tick-Historie gefüllt wird. Es sollte keine Duplikate in der Tick-Historie geben, da die Tick-Historie im MT5 das Volumen nicht einmal auf Bestbands speichert.

Es wird seit langem darauf hingewiesen, dass es keine direkte Möglichkeit gibt, die Zeit zu bestimmen, der die Zeckengeschichte entspricht. Finden Sie es auf andere Weise heraus.

 
fxsaber:

Völlig richtig. Und das ist das richtige Verhalten. MqlTick bezieht die Daten aus der gleichen Quelle, aus der auch die Tick-Historie gefüllt wird. Es sollte keine Duplikate in der Tick-Historie geben, da die Tick-Historie im MT5 das Volumen auch bei Bestbands nicht speichert.

Es wird seit langem darauf hingewiesen, dass es keine direkte Möglichkeit gibt, die Zeit zu bestimmen, der die Zeckengeschichte entspricht. Finden Sie es auf andere Weise heraus.


Wären Sie so freundlich, uns mitzuteilen, um welche es sich handelt?

Hinzugefügt

Wenn ich eine Benachrichtigung erhalte, dass sich im Takan etwas geändert hat, dann

warum nicht der Einfachheit halber ein Feld hinzufügen ("wenig Blut")

datetime book_change; ?

Noch einfacher ist es, wenn Sie das folgende Feld zu MqlBookInfo hinzufügen

datetime book_change;

Zumal diese Zeit durch den Austausch übersetzt wird.

 
prostotrader:

Wären Sie so freundlich, mir zu sagen, welche?

// Время последнего тика символа
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:

Mach dich nicht lächerlich... :)

 
prostotrader:

Wenn mir mitgeteilt wurde, dass sich in takan etwas geändert hat, dann

warum nicht ein Feld für die Bequemlichkeit ("wenig Geld") hinzufügen

datetime book_change; ?

Oder fügen Sie einfach eine MqlBookInfo-Struktur mit der

datetime book_change;

Insbesondere, dass diese Zeit durch den Tauscher übersetzt wird.

Nur nicht datetime, sondern long - Millisekunden. Und

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Markt geschlossen

fxsaber, 2017.09.22 09:17

Seit langem wird dasProblem angesprochen, dass es keine direkte Möglichkeit gibt, die Zeit zu erfahren, der das Wettfenster entspricht.

Mit ähnlichen Vorschlägen.

 

Vielleicht nachdem das OnBookEvent ausgelöst wurde

CopyTicks für dieses Zeichen anfordern?

Ich werde es ausprobieren...

 
prostotrader:

Vielleicht nachdem das OnBookEvent ausgelöst wurde

CopyTicks für dieses Zeichen anfordern?

Das würde natürlich nicht helfen. Die einzige Möglichkeit besteht nun darin, den Zeitpunkt der Tumbler-LED herauszufinden.

 
fxsaber:

Das wird natürlich nicht helfen. Die einzige Möglichkeit besteht nun darin, den Zeitpunkt der Glasführung herauszufinden.


Das ist interessant :)

#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));
        }
      }
    }
  }

Ergebnis

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

???????

Ich weiß nicht einmal, was ich sagen soll....

 
prostotrader:

Ich weiß nicht einmal, was ich sagen soll....

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]));
  }
}

Sie werden sehen, dass der Zeitpunkt nur in diesen Situationen anders ist

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


Es wurde bereits mehrfach diskutiert, dass MqlTick keinen Tick zurückgibt, wie er ist. dass es zwei Tickströme gibt - Kurs und Transaktion. Und dass sie in CopyTicks manchmal rückwirkend zusammengeführt werden, weil die Datenströme unsynchronisiert sind. Und dass die Zeiten von MqlTick und CopyTicks nicht übereinstimmen müssen.