Tiki in Echtzeit - Seite 15

 
Yuriy Zaytsev:

Aber wenn ich mir das Protokoll ansehe, zeigt es denselben Tick mit einem Unterschied von 4 Sekunden.

p.s.

Ich hasse die Phrase "das kann nicht sein", ich habe mich an den Gedanken gewöhnt, dass alles möglich ist.

Übrigens, vielleicht ist es weit von dem Thema, aber einmal auf die Behauptung, dass die Erde rund ist, sagte auch etwas wie dieses - "es kann nicht sein.

Im Allgemeinen bin ich immer im Zweifel, bis ich es überprüfe und dann noch einmal überprüfe, und vorzugsweise jemand anderes überprüft es ein paar Mal.


Sind Sie sicher, dass Sie den Code, der das Protokoll generiert und die Daten verarbeitet, nicht vermasseln? Der Unterschied liegt bei 4 Sekunden.

Die Ticks befinden sich bereits im Terminal, d. h. sie wurden bereits über das Netz gesendet.

Den Code der Öffentlichkeit zugänglich machen

if(SymbolInfoTick(Symbol(), s_tick) == true)
  {
    Print("SymbolInfoTick: ",GetTickDescription(s_tick));
  }

Und sehen Sie selbst.

 
prostotrader:

Die Tics befinden sich bereits im Terminal, d.h. sie wurden bereits über das Netz übertragen.

Fügen Sie den Open-Access-Code ein

Und sehen Sie selbst.

Danke, ich werde es ausprobieren, ich verfolge das Thema schon lange, ich bin eher als Forscher interessiert.

dieser Code 4 Sekunden lang verzögert?

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
bool is_book;
MqlTick ticks[], s_tick;
ulong last_time, mem_cnt, tot_cnt;
bool is_first;
int t_cnt, result;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  tot_cnt = 0;
  is_book = MarketBookAdd(Symbol());
  result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
  if(result > 0)
  {
    last_time = ulong(ticks[0].time_msc); //запоминаем время последнего известного тика
    is_first = true;
  }
  else
  {
    is_first = false;
    Alert("No start time!");
    return(INIT_FAILED);
  } 
  ArraySetAsSeries(ticks, true);  
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+ 
//| возвращает строковое описание тика                               | 
//+------------------------------------------------------------------+ 
string GetTickDescription(MqlTick &tick) 
  { 
   string res = string(tick.time) + "." +  string(tick.time_msc%1000); 
// 
   bool buy_tick = ((tick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY); 
   bool sell_tick = ((tick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL); 
   bool ask_tick = ((tick.flags&TICK_FLAG_ASK)==TICK_FLAG_ASK); 
   bool bid_tick = ((tick.flags&TICK_FLAG_BID)==TICK_FLAG_BID); 
   bool last_tick = ((tick.flags&TICK_FLAG_LAST)==TICK_FLAG_LAST); 
   bool volume_tick = ((tick.flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME); 
// 
   if((buy_tick== true) || (sell_tick == true)) 
   { 
     res = res + (buy_tick?StringFormat(" Buy Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); 
     res = res + (sell_tick?StringFormat(" Sell Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.bid):""); 
   } 
   else 
   { 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.bid):""); 
     res = res + (last_tick?StringFormat(" Last=%G ",tick.last):""); 
     res = res + (volume_tick?StringFormat(" Volume=%d ",tick.volume):""); 
   } 
   return res; 
  } 
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  if(is_book == true) MarketBookRelease(Symbol());
}
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
{
  if(symbol != Symbol()) return;
  tot_cnt++;
  if(SymbolInfoTick(Symbol(), s_tick) == true)
  {
    Print("SymbolInfoTick: ",GetTickDescription(s_tick));
  }
  if(is_first == true)
  {
    result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //копируем все вновь пришедшие тики от последнего известного времени
    if(result > 0)
    {
      t_cnt = 0;
      for(int i= 0; i<result; i++)
      {
        if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++;             //Считаем кол-во тиков с одинаковым временем
        Print(__FUNCTION__, ": ",GetTickDescription(ticks[i]));
      }
    //  l_tick = ticks[0];
      is_first = false;
      last_time = ulong(ticks[0].time_msc);                             //Запоминаем время последнего тика
    } 
  }
  else
  {
    if(SymbolInfoTick(Symbol(), s_tick) == true)
    {
      Print("SymbolInfoTick: ",GetTickDescription(s_tick));
    }
    result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //забираем тики из последнего (посчитанного пакета тикив и считываем тики из нового пакета)
    if(result > 0)
    {
     // l_tick = ticks[0];
      if(result > t_cnt)
      {
        mem_cnt = t_cnt;
        t_cnt = 0;
        for(int i= 0; i<(result - int(mem_cnt)); i++)
        {
          if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++;           //Считаем кол-во тиков с одинаковым временем
          Print(__FUNCTION__, ": ",GetTickDescription(ticks[i]));
        } 
        if(last_time == ulong(ticks[0].time_msc))
        {
          t_cnt += int(mem_cnt);
        }
        else last_time = ulong(ticks[0].time_msc);
      }
      else
      {
        Print(__FUNCTION__, ": Pending order!");                          //Изменения стакана (добавлен/удален отложенный ордер)
      }
    }
    else
    {
      Print(__FUNCTION__, ": Pending order!");                          //Изменения стакана (добавлен/удален отложенный ордер)
    }
  }
}
//+------------------------------------------------------------------+
 

Das scheint nicht der Fall zu sein.

ich sehe OnTick nicht im Code

 

Offenbar handelte es sich um den folgenden Code

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
bool is_book;
MqlTick ticks[];
ulong last_time, mem_cnt, tot_cnt;
bool is_first;
int t_cnt, result;
enum ENUM_BOOK_OR_TICK
{
        USE_BOOK,       // Use OnBookEvent
        USE_TICK        // Use OnTick
};

input ENUM_BOOK_OR_TICK Mode = USE_BOOK;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  tot_cnt = 0;
  if(Mode == USE_BOOK) is_book = MarketBookAdd(Symbol());
  result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
  if(result > 0)
  {
    last_time = ulong(ticks[0].time_msc); //запоминаем время последнего известного тика
    is_first = true;
  }
  else
  {
    is_first = false;
    Alert("No start time!");
    return(INIT_FAILED);
  } 
  ArraySetAsSeries(ticks, true);  
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+ 
//| возвращает строковое описание тика                               | 
//+------------------------------------------------------------------+ 
string GetTickDescription(MqlTick &tick) 
  { 
   string res = string(tick.time) + "." +  string(tick.time_msc%1000); 
// 
   bool buy_tick = ((tick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY); 
   bool sell_tick = ((tick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL); 
   bool ask_tick = ((tick.flags&TICK_FLAG_ASK)==TICK_FLAG_ASK); 
   bool bid_tick = ((tick.flags&TICK_FLAG_BID)==TICK_FLAG_BID); 
   bool last_tick = ((tick.flags&TICK_FLAG_LAST)==TICK_FLAG_LAST); 
   bool volume_tick = ((tick.flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME); 
// 
   if((buy_tick== true) || (sell_tick == true)) 
   { 
     res = res + (buy_tick?StringFormat(" Buy Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); 
     res = res + (sell_tick?StringFormat(" Sell Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.bid):""); 
   } 
   else 
   { 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.bid):""); 
     res = res + (last_tick?StringFormat(" Last=%G ",tick.last):""); 
     res = res + (volume_tick?StringFormat(" Volume=%d ",tick.volume):""); 
   } 
   return res; 
  } 
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  if(Mode == USE_BOOK)
  {
    Print("USE_BOOK ticks received: ", tot_cnt);
    if(is_book == true) MarketBookRelease(Symbol());
  }
  else
  {
    Print("USE_TICK ticks received: ", tot_cnt);
  }  
}
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
{
  if ( Mode != USE_BOOK || symbol != Symbol() ) return;
  tot_cnt++;
  if(is_first == true)
  {
    result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //копируем все вновь пришедшие тики от последнего известного времени
    if(result > 0)
    {
      t_cnt = 0;
      for(int i= 0; i<result; i++)
      {
        if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++;             //Считаем кол-во тиков с одинаковым временем
        Print(__FUNCTION__, ": ",GetTickDescription(ticks[i]));
      }
      is_first = false;
      last_time = ulong(ticks[0].time_msc);                             //Запоминаем время последнего тика
    } 
  }
  else
  {
    result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //забираем тики из последнего (посчитанного пакета тикив и считываем тики из нового пакета)
    if(result > 0)
    {
      if(result > t_cnt)
      {
        mem_cnt = t_cnt;
        t_cnt = 0;
        for(int i= 0; i<(result - int(mem_cnt)); i++)
        {
          if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++;           //Считаем кол-во тиков с одинаковым временем
          Print(__FUNCTION__, ": ",GetTickDescription(ticks[i]));
        } 
        if(last_time == ulong(ticks[0].time_msc))
        {
          t_cnt += int(mem_cnt);
        }
        else last_time = ulong(ticks[0].time_msc);
      }
      else
      {
        Print(__FUNCTION__, ": Pending order!");                          //Изменения стакана (добавлен/удален отложенный ордер)
      }
    }
    else
    {
      Print(__FUNCTION__, ": Pending order!");                            //Изменения стакана (добавлен/удален отложенный ордер)
    }
  }
}
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
  if ( Mode != USE_TICK ) return;
  tot_cnt++;
  if(is_first == true)
  {
    result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //копируем все вновь пришедшие тики от последнего известного времени
    if(result > 0)
    {
      t_cnt = 0;
      for(int i= 0; i<result; i++)
      {
        if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++;             //Считаем кол-во тиков с одинаковым временем
        Print(__FUNCTION__, ": ",GetTickDescription(ticks[i]));
      }
      is_first = false;
      last_time = ulong(ticks[0].time_msc);                             //Запоминаем время последнего тика
    } 
  }
  else
  {
    result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //забираем тики из последнего (посчитанного пакета тикив и считываем тики из нового пакета)
    if(result > 0)
    {
      if(result > t_cnt)
      {
        mem_cnt = t_cnt;
        t_cnt = 0;
        for(int i= 0; i<(result - int(mem_cnt)); i++)
        {
          if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++;           //Считаем кол-во тиков с одинаковым временем
          Print(__FUNCTION__, ": ",GetTickDescription(ticks[i]));
        } 
        if(last_time == ulong(ticks[0].time_msc))
        {
          t_cnt += int(mem_cnt);
        }
        else last_time = ulong(ticks[0].time_msc);
      }
      else
      {
        Print(__FUNCTION__, ": Pending order!");                          //Изменения стакана (добавлен/удален отложенный ордер)
      }
    }
    else
    {
      Print(__FUNCTION__, ": Pending order!");                          //Изменения стакана (добавлен/удален отложенный ордер)
    }
  }
}
//+------------------------------------------------------------------+
 

Ich habe dem Code meine Zeit hinzugefügt.

Ich erinnere mich an die Zeit, als OnTick() ausgelöst wurde(t_time = GetMicrosecondCount();)

Dann nehme ich mir Zeit, wenn jede Funktion ausgeführt wird

   t_time = GetMicrosecondCount();
//  if(symbol != Symbol()) return;
  //tot_cnt++;
  if(SymbolInfoTick(Symbol(), s_tick) == true)
  {
    func_time = GetMicrosecondCount();
    Print("SymbolInfoTick: time = ", string(func_time - t_time), " mcs ", GetTickDescription(s_tick));
  }
  double a_ask, a_bid, a_last;
  if (SymbolInfoDouble(Symbol(), SYMBOL_ASK, a_ask) == true)
  {
    func_time = GetMicrosecondCount();
    Print("SymbolInfoDouble: time = ", string(func_time - t_time), " mcs ", "ask = ", a_ask);
  }
  if (SymbolInfoDouble(Symbol(), SYMBOL_BID, a_bid) == true)
  {
    func_time = GetMicrosecondCount();
    Print("SymbolInfoDouble: time = ", string(func_time - t_time), " mcs ", "bid = ", a_bid);
  }
  if (SymbolInfoDouble(Symbol(), SYMBOL_LAST, a_last) == true)
  {
    func_time = GetMicrosecondCount();
    Print("SymbolInfoDouble: time = ", string(func_time - t_time), " mcs ", "last = ", a_last);
  }
  if(is_first == true)
  {
    result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //копируем все вновь пришедшие тики от последнего известного времени
    if(result > 0)
    {
      func_time = GetMicrosecondCount();
      t_cnt = 0;
      for(int i= 0; i<result; i++)
      {
        if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++;             //Считаем кол-во тиков с одинаковым временем
        Print(__FUNCTION__, ": time = ", string(func_time - t_time), " mcs ", GetTickDescription(ticks[i]));

Das Ergebnis ist

2020.02.04 13:09:13.101 Ticks_test (GOLD-3.20,M1)       SymbolInfoTick: time = 2 mcs 2020.02.04 13:09:10.720 Bid=1573.1 
2020.02.04 13:09:13.101 Ticks_test (GOLD-3.20,M1)       SymbolInfoDouble: time = 28 mcs ask = 1573.3
2020.02.04 13:09:13.101 Ticks_test (GOLD-3.20,M1)       SymbolInfoDouble: time = 33 mcs bid = 1573.1
2020.02.04 13:09:13.101 Ticks_test (GOLD-3.20,M1)       SymbolInfoDouble: time = 36 mcs last = 1573.4
2020.02.04 13:09:13.101 Ticks_test (GOLD-3.20,M1)       OnTick: time = 41 mcs 2020.02.04 13:09:10.720 Bid=1573.1 
2020.02.04 13:09:13.101 Ticks_test (GOLD-3.20,M1)       OnTick: time = 41 mcs 2020.02.04 13:09:00.328 Ask=1573.3 

D.h. die Laufzeit der einzelnen Funktionen beträgt weniger als 50 Mikrosekunden!

Woher können 4 Sekunden kommen?

Ich glaube, es liefen zwei EAs in einem Terminal und das Terminal hat einfach keine Zeit, um

Es hat einfach keine Zeit, alle Informationen in einem Protokoll "zusammenzuführen", also stellt es die Ortszeit so ein, wie es sie für notwendig hält.

 
prostotrader:

Beim Handel verwende ich persönlich asynchrone Aufträge.

Die Sache ist die (wenn Sie ernsthaft an der Börse handeln), müssen Sie alle Änderungen auf dem Aktienmarkt,

und je früher dieses Ereignis eintritt, desto besser.

Ich für meinen Teil sehe keine Alternative zu OnBook

Prinzipiell ist es möglich, den direkten Aufruf von Handelsoperationen aus OnBook herauszulösen. Alles, was Sie in OnBook tun müssen, ist ein Flag zu bilden, um die Operation auszuführen und das Flag selbst an anderer Stelle zu verarbeiten. Das heißt, die Operation selbst sollte in einer anderen Prozedur durch die Flagge gebildet, die ein Ereignis zu schaffen, aber nach dem Verlassen der Prozedur HeBook, und dann den Code OnBook selbst wird frei von schweren Operationen gestartet werden. Wenn die Aufträge jedoch asynchron geöffnet werden und die Verarbeitung der Bedingungen nicht wahnsinnig umfangreich ist, ist es unwahrscheinlich, dass es zu erheblichen Verzögerungen kommt.

 
prostotrader:

Ich habe dem Code meine Zeit hinzugefügt.

Ich erinnere mich an die Zeit, als OnTick() ausgelöst wurde(t_time = GetMicrosecondCount();)

Dann nehme ich mir Zeit, wenn jede Funktion ausgeführt wird

Das Ergebnis ist

D.h. die Laufzeit der einzelnen Funktionen beträgt weniger als 50 Mikrosekunden!

Woher können 4 Sekunden kommen?

Ich glaube, es liefen zwei EAs in einem Terminal und das Terminal hat einfach keine Zeit, um

Das Terminal hat einfach keine Zeit, alle Informationen in eine Protokolldatei zu "dumpen", und deshalb stellt es die Ortszeit so ein, wie es sie für notwendig hält.

Ich schätze, es stimmt, dass eine solch wilde Verzögerung nicht realistisch ist.


1 - FLUSH hat funktioniert, wenn MQ es selbst entschieden hat!

2 - Technische Verzögerung beim Schreiben auf die Festplatte aufgrund von intensiver Arbeit auf der Festplatte


Es ist möglich, dass sich auf Ihrem lokalen Rechner bereits eine Warteschlange für Schreibvorgänge gebildet hat - was durchaus möglich ist, da ich die Erfahrung gemacht habe, dass mehrere Terabytes an Backups auf die Festplatte geflossen sind

Ich kann nur Folgendes vermuten:

Ich habe schon mehrere Terabytes an Backups auf die Festplatte geholt, z. B. wenn ich Microsoft Office ausgeführt, mein Windows aktualisiert und Filme aus dem Internet aufgenommen habe, oder wenn ich gleichzeitig mit MS SQL auf dem lokalen Rechner gearbeitet habe,

ein paar Backups machen, ein Dutzend 4 Torrents und zwei oder drei Dutzend Programme, die intensiv auf die Festplatte schreiben.

D.h. ich meine, wenn intensiv mit der Festplatte gearbeitet wurde - es ist möglich und es gab eine Verzögerung beim Schreiben des Protokolls auf die Festplatte.

 
Yuriy Zaytsev:

Wahrscheinlich stimmt das, aber bei einer so großen Verzögerung ist das nicht realistisch.


1 - FLUSH funktionierte, als MQ dies von sich aus entschied!

2 - Technische Verzögerung beim Schreiben auf die Festplatte, verursacht durch intensive Arbeit auf der Festplatte.


Es ist möglich, dass sich Ihr lokaler Rechner bereits in einer Schreibwarteschlange befindet, was durchaus möglich ist. Ich habe die Erfahrung gemacht, dass mehrere Terabytes an Sicherungsdaten auf die Festplatte geschüttet wurden.

Ich kann nur Folgendes vermuten:

Ich habe schon mehrere Terabytes an Backups auf die Festplatte geholt, z.B. wenn ich Mac irosoft office laufen ließ, mein Windows aktualisierte und Filme aus dem Internet aufnahm, oder wenn ich gleichzeitig mit MS SQL auf dem lokalen Rechner arbeitete,

ein paar Backups machen, ein Dutzend 4 Torrents und zwei oder drei Dutzend Programme, die intensiv auf die Festplatte schreiben.

Ich meine, wenn intensiv mit der Festplatte gearbeitet wurde, ist es durchaus möglich, dass es eine Verzögerung bei der Protokollierung auf der Festplatte gab.

Dies hat kaum etwas mit der Festplatte zu tun, da MT die Zeit bereits beim Schreiben des Protokolls in den Cache berücksichtigt. Das ist, was ich dachte, das Terminal im Allgemeinen für 4 sec kann auf allgemeine Systemlast, eher RAM und CPU bezogen werden.
 
prostotrader:

Ich habe dem Code meine Zeit hinzugefügt.

Ich erinnere mich an die Zeit, als OnTick() ausgelöst wurde(t_time = GetMicrosecondCount();)

Dann nehme ich mir Zeit, wenn jede Funktion ausgeführt wird

Das Ergebnis ist

D.h. die Laufzeit der einzelnen Funktionen beträgt weniger als 50 Mikrosekunden!

Woher können 4 Sekunden kommen?

Ich denke, dass zwei EAs in einem Terminal liefen und das Terminal einfach keine Zeit hat, um

"Daher stellt sie die Ortszeit so ein, wie sie es für notwendig hält.

Übrigens - damit Sie sich nicht in der Protokollierungszeit verheddern - können Sie die Ortszeit zu dem Array hinzufügen, das Sie im folgenden Code bilden

Dann gibt es im Protokoll einen deutlichen Unterschied zwischen dem Zeitpunkt, an dem das Terminal das Protokoll auf die Festplatte zurückgesetzt hat, und dem Zeitpunkt, an dem der Tick oder das Ereignis von OnBook lokal eingetroffen ist.

Und das ist vom Standpunkt der Forschung aus gesehen richtiger.

//+------------------------------------------------------------------+ 
//| возвращает строковое описание тика                               | 
//+------------------------------------------------------------------+ 
string GetTickDescription(MqlTick &tick) 
  { 
   string res = string(tick.time) + "." +  string(tick.time_msc%1000); 
// 
   bool buy_tick = ((tick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY); 
   bool sell_tick = ((tick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL); 
   bool ask_tick = ((tick.flags&TICK_FLAG_ASK)==TICK_FLAG_ASK); 
   bool bid_tick = ((tick.flags&TICK_FLAG_BID)==TICK_FLAG_BID); 
   bool last_tick = ((tick.flags&TICK_FLAG_LAST)==TICK_FLAG_LAST); 
   bool volume_tick = ((tick.flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME); 
// 
   if((buy_tick== true) || (sell_tick == true)) 
   { 
     res = res + (buy_tick?StringFormat(" Buy Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); 
     res = res + (sell_tick?StringFormat(" Sell Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.bid):""); 
   } 
   else 
   { 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.bid):""); 
     res = res + (last_tick?StringFormat(" Last=%G ",tick.last):""); 
     res = res + (volume_tick?StringFormat(" Volume=%d ",tick.volume):""); 
   } 
   return res; 
  } 
 
Aleksey Mavrin:
MT ist kaum mit der Festplatte verbunden und setzt die Zeit bereits beim Schreiben des Protokolls in seinen Cache. Das ist, was ich dachte, das Terminal im Allgemeinen für 4 Sekunden kann auf die gesamte Systemlast, sondern RAM und CPU bezogen werden.

SIND SIE SICH DA SICHER?


4 Sekunden ????, auf keinen Fall! Glauben Sie wirklich, dass der Prozessor 4 Sekunden lang eingefroren oder der Speicher 4 Sekunden lang freigegeben wurde?

Es ist wahrscheinlicher, dass es an der Schreibwarteschlange auf der Festplatte liegt.

Die Festplatte ist langsamer als der Speicher und der Prozessor.

Der flush()-Befehl ist ein C-Befehl, den Sie wahrscheinlich kennen und der ausgeführt wird, wenn es sich bequem anfühlt und der durch das Booten der Festplatte öfters verzögert werden kann.

So nennt man es, wenn man die Puffer auf die Festplatte auslagern will.

Grund der Beschwerde: