Tiki in Echtzeit - Seite 17

 
Yuriy Zaytsev:

SIND SIE SICH DA SICHER?


4 Sekunden ???? Das gibt's doch nicht! Glaubst du wirklich, dass der Prozessor 4 Sekunden lang eingefroren ist oder der Speicher 4 Sekunden lang freigegeben wird? Machst du Witze?

Wahrscheinlicher ist, dass es sich um die Schreibwarteschlange auf der Festplatte handelt.

Die Festplatte ist langsamer als der Speicher und der Prozessor.

Und dann flush() , es gibt einen solchen Befehl in der Sprache C, wahrscheinlich wissen Sie, es wird ausgeführt, wenn es bequem und komfortabel ist und kann mit einer gewissen Verzögerung öfter im Zusammenhang mit dem Laden der Festplatte ausgeführt werden.

So wird es genannt, wenn die Puffer auf die Festplatte zurückgesetzt werden müssen.

Nun, ich bin mir da nicht so sicher, da ich es nicht experimentell in MT überprüft habe. Aber es ist eine Art Standard - wozu gibt es in einem Protokoll die Zeit des Schreibens auf die Festplatte, wenn die Zeit des Ereignisses, das dieses Schreiben in ein Protokoll verursacht hat, wichtiger ist, ist das nicht logisch?

Und wenn wir davon ausgehen, dass das Protokoll auf die Festplatte geschrieben wird Schreibzeit, und wenn die Festplatte geladen ist, sowieso haben Sie eine Verzögerung in der physikalischen Aufzeichnung, und die Zeit wird das Senden eines Befehls zum Schreiben in den Schreibpuffer.

d.h. der Flush verändert den Puffer nicht - er setzt ihn nur etwas später zurück, wenn es eine Verzögerung gibt.

wp. zu Recht darauf hingewiesen, dass Sie die Zeit zu schreiben, weil in jedem Fall nur die Zeit, die das Terminal selbst beim Schreiben in das Protokoll bildet, gibt es keinen Sinn in der Orientierung.

 
Aleksey Mavrin:

Nun, ich bin mir da nicht so sicher, denn ich habe es in MT nicht experimentell überprüft. Aber es ist eine Art von Standard - warum im Protokoll die Zeit der Aufzeichnung auf der Festplatte, wenn wichtiger ist die Zeit des Ereignisses, das diese Aufzeichnung in das Protokoll, logisch verursacht?

Und wenn wir davon ausgehen, dass das Protokoll auf die Festplatte geschrieben wird Schreibzeit, und wenn die Festplatte geladen ist, sowieso haben Sie eine Verzögerung in der physikalischen Aufzeichnung, und die Zeit wird das Senden eines Befehls zum Schreiben in den Schreibpuffer.

d.h. der Flush verändert den Puffer nicht - er setzt ihn nur etwas später zurück, wenn es eine Verzögerung gibt.

s.s. zu Recht darauf hingewiesen, dass Sie die Zeit zu schreiben, weil in jedem Fall nur die Zeit, die das Terminal selbst beim Schreiben in das Protokoll bildet, gibt es keinen Sinn in der Orientierung.


Ich habe angenommen, dass die Zeit kurz vor dem Schreiben auf die Festplatte eingefügt wird, dann passt alles zusammen.

Lassen Sie uns versuchen, das Szenario Schritt für Schritt zu beschreiben - um es klarer zu machen


1-Das Häkchen kam (onTick drücken) - sollte gedruckt werden

2-And OnTick druckt ein Protokoll - es wurde erfolgreich gespeichert

3-Dieses Häkchen kommt auch bei OnTick an - es sollte ebenfalls gedruckt werden.

4 - Und jetzt kommt der Alptraum Windows spuckt in diesem Moment plötzlich 20 Datenströme von verschiedenen Programmen auf die Festplatte und sperrt die Festplatte vorübergehend -

Der Treiber hat seinen Datenmagnetkopf woanders hingelegt -) und schreibt seine eigenen Daten.

5 - Dies ist der Moment, in dem der Metatrader versucht, etwas an den DISK zu senden.

Aber die Festplatte ist furchtbar beschäftigt mit dem Windows-Betriebssystem - Das Betriebssystem sagt dem Metatrader, sorry MQ, ich habe Wichtigeres zu tun - warten Sie

6- 4 Sekunden vergehen.

7- und dann hat Windows nach 4 Sekunden - die Warteschlange zum Laufwerk geleert - und sagt zum MetaTrader - Dear trading terminal - you want to write something to disk? - Ok, schreib es!

8-metatrader schreibt mit einer Verzögerung von 4 Sekunden auf die Festplatte und zeichnet die ZEIT im Protokoll auf, nicht wann er Daten auf die Festplatte schreiben wollte - sondern wann er es tatsächlich getan hat.

Daher kommen auch die 4 Sekunden.



---

Jedes andere Szenario, z. B. wenn das Terminal die Ortszeit in den Puffer schreibt, aber der Schreibvorgang um 4 Sekunden verzögert wird, funktioniert nicht.

sonst wäre der Zeitpunkt übereinstimmend gewesen!

 
Aleksey Mavrin:

Nun, ich bin mir da nicht so sicher, denn ich habe es in MT nicht experimentell überprüft. Aber es ist eine Art von Standard - warum im Protokoll die Zeit der Aufzeichnung auf der Festplatte, wenn wichtiger ist die Zeit des Ereignisses, das diese Aufzeichnung in das Protokoll verursacht, logisch?

Und wenn wir davon ausgehen, dass das Protokoll auf die Festplatte geschrieben wird Schreibzeit, und wenn die Festplatte geladen ist, sowieso haben Sie eine Verzögerung in der physischen Aufzeichnung, und die Zeit wird das Senden eines Befehls zum Schreiben in den Schreibpuffer.

d.h. der Flush verändert den Puffer nicht - er setzt ihn nur etwas später zurück, wenn es eine Verzögerung gibt.

s.s. zu Recht darauf hingewiesen, dass Sie die Zeit zu schreiben, weil in jedem Fall nur die Zeit, die das Terminal selbst erzeugt, wenn das Schreiben in das Protokoll, gibt es keinen Sinn, sich auf.

Und wenn Sie das nicht überprüfen, dann schimpfen Sie nicht.

Wissen Sie überhaupt, worüber wir in diesem Thema sprechen?

Zeigen Sie mir den Test, oder verschwinden Sie von hier.

 
Aleksey Mavrin:

Nun, ich bin mir da nicht so sicher, denn ich habe es in MT nicht experimentell überprüft. Aber es ist eine Art von Standard - warum im Protokoll die Zeit der Aufzeichnung auf der Festplatte, wenn wichtiger ist die Zeit des Ereignisses, das diese Aufzeichnung in das Protokoll verursacht, logisch?

Und wenn wir davon ausgehen, dass das Protokoll auf die Festplatte geschrieben wird Schreibzeit, und wenn die Festplatte geladen ist, sowieso haben Sie eine Verzögerung in der physischen Aufzeichnung, und die Zeit wird das Senden eines Befehls zum Schreiben in den Schreibpuffer.

d.h. der Flush verändert den Puffer nicht - er setzt ihn nur etwas später zurück, wenn es eine Verzögerung gibt.

s.s. hat zu Recht angemerkt, dass man die Zeit schreiben muss, weil auf jeden Fall nur die Zeit, die das Terminal selbst beim Schreiben in das Log bildet, keinen Sinn macht.

Nur in unserem Fall bekommen wir die Zeit, um auf die Festplatte zu schreiben!

Aber die Zeit kann in der GetTickDescription-Prozedur eingestellt werden, ich habe dem Autor oben darüber geschrieben.

Und wenn er sie dort platziert hätte, hätten wir nicht in 4 Sekunden über die mögliche Ursache der Verzögerung diskutiert. Im Protokoll wäre höchstwahrscheinlich die Ortszeit für OnBock und OnTick gleich gewesen, aber die Zeit auf der Festplatte wäre um 4 Sekunden unterschiedlich gewesen.

//+------------------------------------------------------------------+ 
//| возвращает строковое описание тика                               | 
//+------------------------------------------------------------------+ 
string GetTickDescription(MqlTick &tick)
{
..
..
Sergey Chalyshev:

Und wenn Sie es nicht überprüft haben, dann ist es Ihnen auch egal.

Haben Sie eine Ahnung, worum es in diesem Thema geht?

Zeigen Sie mir den Test, oder verpissen Sie sich von hier.

Seien Sie nicht so streng mit mir.

 

Es ist möglich, dieses Tick-Catching zu verbessern, es für eine oder zwei Wochen einzustellen und vielleicht den Moment zu erwischen, in dem das Datum der Aufzeichnung im Protokoll mit dem Datum des Ereignisses übereinstimmt.

Natürlich ist es möglich, diesen Vorgang zu beschleunigen, indem man regelmäßig einen Datenträger für die Aufnahme lädt.

Eine andere Frage, die wichtigste: Warum sollte man mit dieser Forschung Zeit verschwenden?) Was ist der praktische Nutzen?

---

Zur Zeit ist es klar, dass Ticks zuerst in OnTick kommen und erst dann in OnBuk, das Schöne ist, dass OnBuk nicht nur bei Ticks aufgerufen wird, sondern z.B. bei Volumenänderungen am Markt, d.h. jemand hat eine Order eröffnet, geschlossen oder gelöscht, das Volumen hat sich geändert. Und das ist eine ganz wichtige Information für den Markt.

Und natürlich nach der Logik der Handelsentscheidungen auf dem Markt der Aktien / Futures logisch, genau in OnBuk zu nehmen, und nicht in OnTick.

 
Sergey Chalyshev:

Und wenn Sie es nicht überprüft haben, dann ist es Ihnen auch egal.

Haben Sie eine Ahnung, worum es in diesem Thema geht?

Zeigen Sie mir den Test, oder verpissen Sie sich von hier.

Du bist derjenige, der kläfft, Dick, 16 Seiten haben nicht daran gedacht, das Ereignis vor dem Druck zu messen und die Geschwindigkeit zu schreiben, die sie messen, Experten, verdammt).

Das, worauf Sie mich so stolz hingewiesen haben, sagen sie, ich habe es nicht überprüft, Sie verstehen nicht einmal wirklich, wovon ich rede, wette ich. Aber es ist unwahrscheinlich, dass Sie es verstehen werden.

Und die Tatsache, dass dieser Zeitpunkt nicht genau der Zeitpunkt der Aufzeichnung auf der Festplatte ist, wird überprüft.

 
Sergey Chalyshev:

Und wenn Sie es nicht überprüft haben, dann ist es Ihnen auch egal.

Haben Sie eine Ahnung, worum es in diesem Thema geht?

Zeigen Sie mir den Test, oder verpissen Sie sich von hier.

Wie wäre es damit, Klugscheißer, zeige mir wenigstens einen glaubwürdigen Weg, um zu testen, worauf du hinauswillst, und ich werde aussteigen und zugeben, dass ich es nicht verstanden habe, andernfalls gibst du zu, dass du es selbst nicht verstehst, entschuldigst dich oder steigst selbst aus.

Nämlich - mindestens eine 100% zuverlässige Möglichkeit, experimentell zu überprüfen, welche Zeit das Terminal in das Protokoll schreibt, nämlich die Hauptoptionen:

1. die Zeit, zu der das Terminal den Druckbefehl in der Warteschlange erhält.

2. Zeitpunkt des Starts des Druckbefehls.

3. Zeitpunkt der Beendigung des Drucks im Puffer).

Diese Variante kann der genaue Zeitpunkt sein:

4. Zeitpunkt der Druckausführung auf der Festplatte.

 
Aleksey Mavrin:

Wie wäre es damit, Klugscheißer, du zeigst mir wenigstens einen zuverlässigen Weg, um zu überprüfen, worauf du hinauswillst, und ich werde aussteigen und zugeben, dass ich es nicht verstanden habe, andernfalls gibst du zu, dass du es selbst nicht verstehst, entschuldigst dich, oder steigst selbst aus.

Nämlich - mindestens eine 100% zuverlässige Möglichkeit, experimentell zu überprüfen, welche Zeit das Terminal in das Protokoll schreibt, nämlich die Hauptoptionen:

1. die Zeit, zu der das Terminal den Druckbefehl in der Warteschlange erhält.

2. Zeitpunkt des Starts des Druckbefehls.

3. Zeitpunkt der Beendigung des Drucks im Puffer).

Diese Variante kann der genaue Zeitpunkt sein:

4. die Ausführungszeit des Ausdrucks auf die Festplatte.

Was ist also der Grund?

Ich warte auf deinen Code...

 
prostotrader:

Worum geht es also?

Ich warte auf deinen Code...

Auf welchen Code warten Sie noch? Habe ich Ihnen etwas versprochen? Wie hoch war der Preis noch mal?)

p/s/ Auch Sie haben, wie Ihr Freund, nicht verstanden, wovon ich spreche.
 

Während der Debatte habe ich ein weiteres Experiment durchgeführt.

//+------------------------------------------------------------------+
//|                                                   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;
ulong st_time, func_time;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  is_book = MarketBookAdd(Symbol());
  st_time = GetMicrosecondCount();
  func_time = GetMicrosecondCount();
  Print(__FUNCTION__, "; Time: ", MathAbs((func_time - st_time)/1000), " ms");
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  if(is_book == true) MarketBookRelease(Symbol());
}
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
{
  if(Symbol() == symbol)
  {
    func_time = GetMicrosecondCount();
    Print(__FUNCTION__, "; Time: ", MathAbs((func_time - st_time)/1000), " ms");
  }
}
void OnTick()
{
  func_time = GetMicrosecondCount();
  Print(__FUNCTION__, "; Time: ", MathAbs((func_time - st_time)/1000), " ms");
}
//+------------------------------------------------------------------+

Ich meine, bei der Initialisierung wird die Zeit um eine Mikrosekunde verkürzt,

und vor jedem Druck bohre ich die Zeit erneut.

Idealerweise sollte es so sein

2020.02.04 21:28:01.316	Ticks_test_2 (GOLD-3.20,M1)	OnTick; Time: 1395 ms
2020.02.04 21:28:01.316	Ticks_test_2 (GOLD-3.20,M1)	OnBookEvent; Time: 1395 ms

Aber sehr oft sieht es so aus (Log-Belichtungen):

2020.02.04 21:28:11.133 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 11212 ms
2020.02.04 21:28:11.139 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 11218 ms

2020.02.04 21:28:15.603 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 15682 ms
2020.02.04 21:28:15.609 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 15688 ms

2020.02.04 21:28:29.521 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 29599 ms
2020.02.04 21:28:29.790 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 29868 ms
2020.02.04 21:28:29.790 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 29868 ms

2020.02.04 21:28:33.109 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 33188 ms
2020.02.04 21:28:33.115 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 33194 ms

2020.02.04 21:28:40.800 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 40878 ms
2020.02.04 21:28:40.807 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 40885 ms

2020.02.04 21:28:41.891 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 41969 ms
2020.02.04 21:28:41.896 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 41974 ms

2020.02.04 21:28:52.984 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 53063 ms
2020.02.04 21:28:52.991 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 53070 ms

2020.02.04 21:28:54.457 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 54536 ms
2020.02.04 21:28:55.276 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 55355 ms

2020.02.04 21:29:10.643 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 70722 ms
2020.02.04 21:29:10.650 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 70729 ms

2020.02.04 21:29:14.674 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 74752 ms
2020.02.04 21:29:14.681 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 74759 ms

2020.02.04 21:29:25.306 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 85384 ms
2020.02.04 21:29:25.313 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 85390 ms

2020.02.04 21:29:30.468 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 90546 ms
2020.02.04 21:29:30.481 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 90559 ms

2020.02.04 21:29:30.866 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 90944 ms
2020.02.04 21:29:30.874 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 90951 ms

2020.02.04 21:29:36.680 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 96758 ms
2020.02.04 21:29:36.688 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 96766 ms

2020.02.04 21:29:37.891 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 97968 ms
2020.02.04 21:29:37.910 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 97987 ms

Die Ortszeit wird also in den Ausdruck geschrieben, wenn der Ausdruck aufgerufen wird.

Aber das passt nicht zu den 4 Sekunden...