Diskussion zum Artikel "Entwicklung fortschrittlicher ICT-Handelssysteme: Implementierung von Orderblöcken in einem Indikator"

 

Neuer Artikel Entwicklung fortschrittlicher ICT-Handelssysteme: Implementierung von Orderblöcken in einem Indikator :

In diesem Artikel erfahren Sie, wie Sie einen Indikator erstellen, der die Abschwächung von Orderblöcken erkennt, zeichnet und Alarm schlägt. Wir werden auch einen detaillierten Blick darauf werfen, wie man diese Blöcke auf dem Chart identifiziert, genaue Alarme setzt und ihre Position mit Hilfe von Rechtecken visualisiert, um die Preisaktion besser zu verstehen. Dieser Indikator ist ein wichtiges Instrument für Händler, die den Smart Money Concepts und der Inner Circle Trader-Methode folgen.

Orderblöcke sind Zonen auf dem Chart, in denen schwebende Aufträge wahrscheinlich darauf warten, ausgeführt zu werden.

Dies ist typischerweise der Fall, wenn ein großer Marktteilnehmer, z. B. ein Finanzinstitut, eine bedeutende Position eingehen möchte, aber nicht über genügend Liquidität verfügt, um den gesamten Auftrag auf einmal auszuführen, ohne den Markt zu beeinträchtigen. Nach den grundlegenden Gesetzen von Angebot und Nachfrage treibt die Ausführung eines Teils des Auftrags den Preis in die Höhe (im Falle eines Kaufs), da aggressiv nach Verkäufern gesucht wird, die die für den Abschluss des Geschäfts erforderliche Liquidität bereitstellen können.

Da der institutionelle Teilnehmer den gesamten Auftrag nicht auf einmal ausführen kann, ohne eine erhebliche Preisverschiebung zu verursachen, teilt er den Auftrag in kleinere Teile auf. So können sie den Handel abschließen, ohne dass sich der Kurs erheblich bewegt, bevor sie ihre Position vollständig eingegangen sind.

Auf der Grundlage dieses Konzepts können wir diese Zonen auf einem Preis-Chart als Bereiche mit starkem Ungleichgewicht zwischen Angebot und Nachfrage (sowohl beim Kauf als auch beim Verkauf) identifizieren. Im Folgenden werden wir drei Möglichkeiten zur Identifizierung dieser Zonen und zu ihrer Implementierung in den Code untersuchen.


Autor: Niquel Mendoza

 

Guten Tag Mendoza

Vielen Dank für diese Bemühungen.

meine Frage ist; da wir die Funktion OnCalculate verwenden:

int OnCalculate(const int rates_total,

const int prev_calculated,

const datetime &time[],// Zeitreihe der Öffnungszeiten

const double &open[], // Zeitreihe der Eröffnungskurse

const double &high[],// Zeitreihe der Höchstpreise

const double &low[],// Zeitreihe der Tiefstpreise

const double &close[],// Zeitreihe der Schlusskurse

const long &tick_volume[],// Zeitreihe des Tick-Volumens

const long &volume[],// Zeitreihe der Bar-Preise

const int &spread[])//


Warum sollten wir neue Arrays erstellen und sie neu anordnen?

 
Ahmed Fouad Abdellatief OnCalculate Funktion verwenden:

int OnCalculate(const int rates_total,

const int prev_calculated,

const datetime &time[],// Zeitreihe der offenen Zeiten

const double &open[], // Zeitreihe der Eröffnungskurse

const double &high[],// Zeitreihe der Höchstpreise

const double &low[],// Zeitreihe der Tiefstpreise

const double &close[],// Zeitreihe der Schlusskurse

const long &tick_volume[],// Zeitreihe des Tick-Volumens

const long &volume[],// Zeitreihe der Balkenpreise

const int &spread[])//


Warum sollten wir neue Arrays erstellen und sie neu anordnen?

Hallo Ahmed, vielen Dank für deinen Kommentar. Sie haben Recht. Es besteht keine Notwendigkeit, neue Arrays zu erstellen, da die Funktion OnCalculate uns bereits alle Daten zur Verfügung stellt, die wir verwenden können. Ich habe es damals aus Gewohnheit gemacht, aber es ist am besten, direkt mit den Daten zu arbeiten, die bereits vorhanden sind. Übrigens, wenn Sie den aktuellsten Code haben möchten, lasse ich ihn hier für Sie. In diesem neuen Code werden die Arrays verwendet, die bereits standardmäßig vorhanden sind, die Logik zur Erkennung der Ordnungsblöcke ist die gleiche.
 
Niquel Mendoza #:
datetime  mitigados_alcsitas(double price, const double &lowArray[], const  datetime &Time[], datetime start, datetime end)
 {
  int startIndex = iBarShift(_Symbol, PERIOD_CURRENT, start);
  int endIndex = iBarShift(_Symbol, PERIOD_CURRENT, end);

  NormalizeDouble(price, _Digits);
  for(int i = startIndex - 2 ; i >= endIndex + 1 ; i--)
   {
    if(price > lowArray[i])
     {
      return Time[i]; //si encuentra que si hubo retorna el tiempo de la vela donde hubo la mitigacion
      Print("el orderblock tuvo mitigaciones", TimeToString(end));
     }
   }

  return 0; //En caso no se haya encontrado niguna mitigacion retorna 0
 }

Und so weiter in vier benachbarten Funktionen.

 
trader6_1 #:

Und so weiter in vier benachbarten Funktionen.

Hallo, Sie haben völlig recht. Ich habe mich geirrt, als ich dachte, NormalizeDouble funktioniere per Referenz. Es gibt tatsächlich einen gerundeten Wert zurück, und damit eine Variable diesen Wert annehmen kann, muss man ihn ihr explizit zuweisen. Das tut mir leid; ich glaube, ich habe es so gelernt, als ich den Code geschrieben habe, und so ist es hängen geblieben. Es tut mir wirklich leid. Ich verwende NormalizeDouble hier eher als Vorsichtsmaßnahme, obwohl ich nicht glaube, dass es eine signifikante Auswirkung auf die Überprüfung hat, ob ein bullischer Orderblock abgeschwächt wurde (basierend auf meinen Tests). Vielen Dank für diesen Hinweis. Wir könnten "price = NormalizeDouble(price, _Digits)" direkt zuweisen oder diese Zeile löschen, da die Normalisierung die Überprüfung nicht wesentlich zu beeinflussen scheint.

 
Vielen Dank, vielen Dank für das Gespräch. Fahren Sie mit dem nächsten Teil fort.
 
Niquel Mendoza #:
Hallo Ahmed, vielen Dank für deinen Kommentar. Du hast recht. Es ist nicht nötig, neue Arrays zu erstellen, denn die Funktion OnCalculate stellt uns bereits alle Daten zur Verfügung, die wir verwenden können. Ich habe es damals aus Gewohnheit getan, aber es ist am besten, direkt mit den Daten zu arbeiten, die bereits vorhanden sind. Übrigens, wenn Sie den aktuellsten Code haben möchten, lasse ich ihn hier für Sie. In diesem neuen Code werden die Arrays verwendet, die bereits standardmäßig vorhanden sind, die Logik zur Erkennung der Auftragsblöcke ist die gleiche.
Niquel Mendoza #:
Hallo Ahmed, vielen Dank für deinen Kommentar. Du hast Recht. Es besteht keine Notwendigkeit, neue Arrays zu erstellen, da die OnCalculate-Funktion uns bereits alle Daten zur Verfügung stellt, die wir verwenden können. Ich habe es damals aus Gewohnheit getan, aber es ist am besten, direkt mit den Daten zu arbeiten, die bereits vorhanden sind. Übrigens, wenn Sie den aktuellsten Code haben möchten, lasse ich ihn hier für Sie. In diesem neuen Code werden die Arrays verwendet, die bereits standardmäßig vorhanden sind, die Logik zur Erkennung der Bestellblöcke ist die gleiche.

Es gibt noch einen weiteren Grund für die Erstellung separater Arrays: Wenn Sie sich entscheiden, die Logik in einen EA einzubauen, gibt es keine OnCalculate-Funktion. Auch wenn Sie eine Multi-Währungs- oder Multi-Time-Frame-Version erstellen möchten, benötigen Sie mehrere Arrays oder Multi-Demen-Arrays und 90% der Arbeit ist bereits erledigt.

Meine Frage ist, warum die meisten Entwickler die Daten in Zeitreihen umwandeln? Ich habe einen MQ4 EA in MQ5 konvertiert und wusste nicht, dass die Zeitreihen verfügbar waren, also habe ich alle Arrays als Nullbasen und nicht als Zeitreihen behalten.Ich habe festgestellt, dass es das Leben sehr viel einfacher macht, da es eine 1:1-Entsprechung zwischen den Daten und den unterstützenden Arrays gibt, kein Zurücksetzen, Größenanpassung und erneutes Zurücksetzen für Zeitserien, nur Größenanpassung und schließlich, was am wichtigsten ist, nur ein Bar-Nummerierungssystem. Für die Metaquotes-Funktionen, die auf einer Zeitserie bestehen, mache ich die umgekehrte Indizierung beim Aufruf.


Hallo noch einmal, ich habe gerade Ihren Quellcode heruntergeladen, Version 1, kompiliert und auf einH4 EURUSD-Diagramm angewendet und nichts erschien. Ich ging zum Eigenschaften-Panel, änderte nichts und schloss und das png erschien. Nur grüne Balken, keine roten, und onc sie beginnen, sie tun mot beenden. Irgendwelche Vorschläge?Ich habe den Teil2 aus der obigen Diskussion heruntergeladen, und der hatte im Allgemeinen die gleichen Probleme, aber auch drei neuere. Die Start-Stopp-Grün-Rot-Probleme waren offensichtlich. Es scheint außerdem, dass es unterschiedliche Kriterien gab, da die Anzahl der Bänder nicht genau übereinstimmte. Außerdem habe ich versucht, die grüne Farbe in clrLime zu ändern, und sie änderte sich, war aber definitiv nicht Lime.

Außerdem: Wie machen Sie die Animation? Verwenden Sie den Strategy Tester? Ich frage, weil ich den Strategy Tester nicht dazu bringen kann, korrekt auf dem Bildschirm zu erscheinen, wenn ich einen EA im visuellen Modus oder einen Indikator teste.
Dateien:
EURUSDH4_1.png  72 kb
EURUSDH4.png  63 kb
 

Hallo Niquel,

ich füge eine leicht überarbeitete Version Ihres Teils 2 bei.

Ich habe ErrorDescription(errornumber) hinzugefügt, die sich in STDLIB.EX5 befindet, um Ihre verschiedenen Fehlermeldungen zu erläutern. Aus irgendeinem Grund konnte ich den Import nicht direkt in den Indikator einfügen, also habe ich ihn in eine Include-Datei BlockOrder Common.mqh aufgenommen, wo er für mich funktioniert. Können Sie den Indikator durch Google Translate laufen lassen, um den Text ins Englische zu konvertieren?

Ich habe auch eine Versionsnummer, 2.01, in das Programm eingefügt. Mit Hilfe des Defines habe ich die Versionsnummer als Präfix für RectangleCreate hinzugefügt, damit Version 1 und 2 zusammen ausgeführt werden können, obwohl ich Version 1 nicht geändert habe.

Als Vorschlag könnte man einen gleitenden Durchschnitt der Volumina berechnen und am unteren Rand des Bildschirms anzeigen. Ich nehme an, dass dazu eine Dezimalanpassung notwendig sein wird.


Ich freue mich schon auf Ihr nächstes Update


CapeCoddah

 
CapeCoddah #:

Es gibt noch einen weiteren Grund für die Erstellung separater Arrays. Wenn Sie sich entscheiden, die Logik in einen EA einzubauen, gibt es keine OnCalculate-Funktion. Auch wenn Sie eine Multi-Währungs- oder Multi-Time-Frame-Version erstellen möchten, benötigen Sie mehrere Arrays oder Multi-Demen-Arrays und 90% der Arbeit ist bereits erledigt.

Meine Frage ist, warum die meisten Entwickler die Daten in Zeitreihen umwandeln? Ich habe einen MQ4 EA in MQ5 konvertiert und wusste nicht, dass die Zeitreihen verfügbar waren, also habe ich alle Arrays als Nullbasen und nicht als Zeitreihen behalten.Ich habe festgestellt, dass es das Leben sehr viel einfacher macht, da es eine 1:1-Entsprechung zwischen den Daten und den unterstützenden Arrays gibt, kein Zurücksetzen, Größenanpassung und erneutes Zurücksetzen für Zeitserien, nur Größenanpassung und schließlich, was am wichtigsten ist, nur ein Bar-Nummerierungssystem. Für die Metaquotes-Funktionen, die auf einer Zeitserie bestehen, mache ich die umgekehrte Indizierung beim Aufruf.

Hallo CapeCoddah, In meinem Fall verwende ich in der Regel Arrays in Form von Zeitreihen, um mit Preisdaten oder Indikatoren zu arbeiten, hauptsächlich aus Bequemlichkeit und aus Gewohnheit. Ich weiß jedoch, dass dies nicht immer der beste Grund ist, sie zu verwenden. Bei Indikatoren kann es oft praktischer sein, mit nullbasierten Arrays zu arbeiten, da sie die Indexverwaltung vereinfachen und die Notwendigkeit einer ständigen Neuinitialisierung oder Größenänderung verringern. In meinem Fall habe ich mich bei der Programmierung des Orderblocks-Indikators für die Verwendung von Zeitreihen entschieden, weil ich die Abfrage der Orderblöcke von Anfang an so strukturiert habe.

 
CapeCoddah #:

Hallo noch einmal, ich habe gerade Ihren Quellcode, Version 1, heruntergeladen, kompiliert und auf einH4 EURUSD-Diagramm angewandt, und es erschien nichts. Ich ging zum Eigenschaften-Panel, änderte nichts und schloss und das png erschien. Nur grüne Balken, keine roten, und wenn sie beginnen, beenden sie mot. Irgendwelche Vorschläge?Ich habe den Teil2 aus der obigen Diskussion heruntergeladen, und der hatte im Allgemeinen die gleichen Probleme, aber auch drei neuere. Die Start-Stopp-Grün-Rot-Probleme waren offensichtlich. Es scheint außerdem, dass es unterschiedliche Kriterien gab, da die Anzahl der Bänder nicht genau übereinstimmte. Außerdem habe ich versucht, die grüne Farbe in clrLime zu ändern, und sie änderte sich, war aber definitiv nicht Lime.

Außerdem: Wie machen Sie die Animation? Benutzen Sie den Strategy Tester? Ich frage, weil ich den Strategy Tester nicht dazu bringen kann, korrekt auf dem Bildschirm zu erscheinen, wenn ich einen EA im visuellen Modus teste, oder wenn ich einen Indikator teste.

Was das erste Problem betrifft, so könnte es daran liegen, dass der Indikator die Daten nicht korrekt lädt. Das passiert normalerweise, wenn Sie den Chart wechseln oder einen neuen Chart öffnen. Wenn es sich jedoch um ein bereits verwendetes Diagramm handelt, wäre es sinnvoll, weiter zu untersuchen, warum die Orderblöcke nicht erhalten werden. In diesem Fall wäre es sinnvoll, Debug-Meldungen (Print) in den Code aufzunehmen, um das Problem zu identifizieren.

Was das zweite Problem betrifft, bei dem nur bullische Orderblöcke gezeichnet werden, könnte es daran liegen, dass der EURUSD im H4-Zeitrahmen derzeit bei 600-700 Candlestick-Hochs liegt. In diesem Zusammenhang ist es möglich, dass alle bärischen Orderblöcke abgeschwächt wurden, weshalb sie nicht auf dem Chart angezeigt werden.

Was die Änderung der Kriterien betrifft, so habe ich einige boolesche Variablen im Code reduziert. Es wäre jedoch kein Problem, diese Bedingungen bei Bedarf wieder einzuführen.

Was die Farben betrifft, so wendet die letzte Version, die ich in den Kommentaren gepostet habe, Transparenz auf die Farben der Rechtecke des Auftragsblocks an. Vielleicht ist das der Grund, warum die Farben visuell nicht mit denen früherer Versionen übereinstimmen. Was schließlich die Animation betrifft, so habe ich nicht ganz verstanden, worauf Sie sich bezogen haben. Könnten Sie genauer erklären, was Sie in diesem Zusammenhang mit Animation meinen?

 
Niquel Mendoza #:

Hallo CapeCoddah, In meinem Fall verwende ich in der Regel Arrays in Form von Zeitreihen, um mit Preisdaten oder Indikatoren zu arbeiten, hauptsächlich aus Bequemlichkeit und aus Gewohnheit. Ich weiß jedoch, dass dies nicht immer der beste Grund ist, sie zu verwenden. Bei Indikatoren kann es oft praktischer sein, mit nullbasierten Arrays zu arbeiten, da sie die Indexverwaltung vereinfachen und die Notwendigkeit einer ständigen Neuinitialisierung oder Größenänderung verringern. In meinem Fall habe ich mich bei der Programmierung des Orderblocks-Indikators für die Verwendung von Zeitreihen entschieden, weil ich die Abfrage der Orderblöcke von Anfang an so strukturiert habe.

Ich habe mir gerade Ihren Code angesehen. Als ich in MQ4 die Größe von Arrays änderte, fand ich heraus, dass ich die Zeitreihe für das Array auf false setzen, die Größe ändern und die Zeitreihe auf true zurücksetzen musste. Da ich dies in MQ5 nicht verwende, weiß ich nicht, ob es immer noch angemessen ist.