mql5 - vertikale Linie nach einer bestimmten Zeit seit dem letzten Handel - Seite 2

 
Vladimir Karputov:

Ich möchte den Begriff "letzter Handel" klären.

Handelt es sich um den letzten Handel des laufenden Tages? Oder in den letzten N-Tagen?

Das letzte Geschäft innerhalb von 24 Stunden - weiter zurück in der Geschichte muss man nicht gehen.

 
renatmt5:

die letzte Transaktion innerhalb von 24 Stunden - es ist nicht nötig, die Geschichte weiter auszuführen.

Und so funktioniert es:

Der Indikator verwendet den Code zum Erstellen, Verschieben und Löschen einer vertikalen Linie aus derOBJ_VLINE-Hilfe. (im Indikator funktioniert bisher nur das Erstellen von Zeilen). Der Zeilenname wird über den Eingabeparameter"Vertikaler Zeilenname" festgelegt.

Letztes Geschäft Verschieben Vertikale Linie

Dievertikale Linie wird in OnOnit() erzeugt:

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   VLineCreate(0,InpVLineName);
//---
   return(INIT_SUCCEEDED);
  }


Um die Belastung zu minimieren, wird die Historie einmal pro Minute abgefragt. Zu diesem Zweck deklarieren wir die VariableExtLastMove im Bereich der globalen Variablen unseres Programms (in diesem Fall im Indikator)

//---
datetime ExtLastMove=0;                   // "0" -> D'1970.01.01 00:00';

- Diese Variable speichert den Zeitpunkt der letzten Abfrage des Handelsverlaufs.


Dann subtrahieren wir in OnCalculate() die gespeicherte ZeitExtLastMove von der aktuellen Zeit (Zeit des letzten Kurses unter Verwendung eines beliebigenTimeCurrent-Symbols), und wenn die Differenz weniger als 60 Sekunden beträgt, beenden wir das Programm.

//---
   datetime time_current=TimeCurrent();
   if(time_current-ExtLastMove<60) // 60 seconds
      return(rates_total);
   ExtLastMove=time_current;

Wenn die Differenz größer ist, wird eine neue Zeit inExtLastMove eingetragen.


Auf die Handelshistorie wird mit LastProfitForPeriod() zugegriffen.

Hier werden zwei Daten verwendet: von und bis. Das "Bis"-Datum wird auf die Zukunft gesetzt (die aktuelle Zeit plus einen Tag), das"Von"-Datum erhält man, indem man 24 Stunden von der aktuellen Zeitabzieht

   datetime from_date   = time_current-60*60*24;   // time one day ago
   datetime to_date     = time_current+60*60*24;   // time from the future :)
   double   last_profit = LastProfitForPeriod(from_date,to_date);

   Comment("Last profit: ",DoubleToString(last_profit,2));


Das ist alles für den Moment, das ist eine Menge Text...

 
Vladimir, vielen Dank für deinen Code und vor allem für die Kommentare zu seinen Fragmenten!
Ich verstehe nur nicht, warum wir to_date gleich der Zukunft brauchen? Vielleicht bis zum jetzigen Zeitpunkt? Es scheint, dass wir das Ergebnis des Deals in der Zukunft nicht bestimmen können :) Oder brauchen wir diesen Tag in der Zukunft, um den Schlussstrich in der zukünftigen Zeit zu ziehen?
Noch eine Frage zur Schleife.
Soweit ich das verstehe, laden wir ein Array mit Daten zu Geschäften und durchlaufen das Array von Null bis zum letzten Geschäft, wobei wir die Zeit mit der zuletzt geschriebenen vergleichen und die Variable last_time überschreiben, wenn die deal_time später ist. Oder ist es vielleicht umgekehrt - das Feld kann vom Ende her durchsucht werden? Das letzte Element des Arrays wird die letzte abgeschlossene Transaktion sein, für die wir Daten benötigen.
Vielleicht mache ich einige logische Fehler - bitte urteilen Sie nicht zu hart :)
 
bedeutete for(uint i=0;i<Gesamt;i++) ändern in for(uint i=Gesamt;i>=0;i--)
 
Eigentlich braucht man auch keine Schleife - man greift einfach auf das Element des Arrays mit der Ordnungszahl i=total zu
 
Ich verstehe nur nicht, warum wir to_date gleich knock in the future brauchen?

Wir brauchen es so. Um garantiert "von" und "bis" zur aktuellen Zeit zu erhalten.

Oder ist es vielleicht möglich, das Feld vom Ende her zu durchsuchen?

Wenn die Aufgabe darin besteht, das letzte Geschäft zu finden, dann muss das Array durchgehen und genau nach der Zeit suchen - nur für den Fall, dass etwas passiert oder die interne Kernel-Logik geändert wird und Geschäfte zu unterschiedlichen Zeiten zurückgesetzt werden.

 
Vladimir Karputov:

Dies ist der richtige Weg. Garantiert "von" und "bis" zur aktuellen Zeit zu erhalten.

Wenn die Aufgabe darin besteht, das letzte Geschäft zu finden, dann muss das Array durchgehen und nach der genauen Zeit suchen - nur für den Fall, dass etwas passiert oder sich die interne Kernel-Logik ändert und Geschäfte zufällig verworfen werden.

Okay, ich hab's. Im Prinzip wird es angesichts der Begrenzung der Historie auf 24 Stunden keine nennenswerte Belastung geben, wenn man die Daten durchgeht :)

 
renatmt5:

OK, ich hab's. Im Prinzip wird es angesichts der 24-Stunden-Historie keine nennenswerte Belastung geben, wenn man die Daten durchgeht :)

Der letzte Schritt besteht also darin, die Linie in Abhängigkeit vom erzielten Gewinn zu verschieben.

Erinnern Sie sich an die dortigen Umzugsregeln?

 
Ich verstehe richtig, dass last_time und result die Variablen sind, mit denen wir arbeiten. Das Ergebnis bestimmt, um wie viel Zeit die Linie in die Zukunft verschoben (neu gezeichnet) wird. Dann sollte der Codeblock "Gewinn für die Periode" vor dem Block "Verschieben der vertikalen Linie" eingefügt werden, um die Linie unter Berücksichtigung der Daten des letzten Geschäfts zu verschieben.
Ist das richtig oder verwechsle ich etwas?
 

Im Folgenden wird erklärt, warum der Parameter "before" in Zukunft verwendet werden sollte:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Fehler, Irrtümer, Fragen

Renat Fatkhullin, 2016.11.04 12:43

Geben Sie niemals TimeCurrent() als Enddatum an, sondern TimeCurrent()+86400, um sicherzustellen, dass alle Endabschlüsse erfasst werden.

TimeCurrent ist nicht die exakte letzte Zeit, sondern die "letzte bekannte Serverzeit bei Aktualisierungen", die nicht 100%ig genau ist. Vor allem am Anfang.


Grund der Beschwerde: