Diskussion zum Artikel "Das Beispiel eines Indikators, der die Linien Unterstützung / Widerstands zeichnet"

 

Neuer Artikel Das Beispiel eines Indikators, der die Linien Unterstützung / Widerstands zeichnet :

Im Artikel wird das Realisierungsbeispiel des Indikators für den Aufbau der Linien Unterstützung/Widerstands aufgrund der formalisierten Bedingungen aufgeführt. Sie haben die Möglichkeit, den Indikator zu verwenden, aber verstehen auch nebenbei, wie einfach es ist, das zu realisieren. Nun können Sie selbst die Bedingungen für den Aufbau der Linien formulieren, die Sie nötig finden, dabei den Code des Indikators nach Ihren Wünschen ein wenig ändern.

Welche Kriterien werden wir zur Auswahl des zweiten Punktes verwenden? Erstens können wir den zweiten Fraktal nehmen, der nach unserem ersten Punkt geht: das zeigt die nächste Linie. Aber wir können auch andere Auswahlregeln verwenden — zum Beispiel, den höchsten Punkt auf dem Chart, die Linie für die Linie des Widerstands, durch die der Preis nach oben nicht überschreitet hat (oder den niedrigsten Punkt auf dem Chart, die Linie für die Linie der Unterstützung, durch die der Preis nach unten nicht überschreitet). Sie können die Auswahlregeln des zweiten Punktes selbst bestimmen. Wir halten uns auf dem nächsten zweiten Fraktal auf, nach dem wir eben die Linien der Unterstützung/Widerstands bauen werden.  

Die Punkteauswahl des Aufbaues der Linien

Autor: Andrey Kisselyov

 

Können Sie schräge Ebenen von der anderen Seite her zeichnen?

D.h. Unterstützungs- und Widerstandslinien beim Aufstieg nicht von unten, sondern im Gegenteil von oben einzeichnen?

 
Alexandr Gavrilin:

Können Sie schräge Ebenen auch von der anderen Seite her zeichnen?

D.h. die Unterstützungs- und Widerstandslinien bei einem Anstieg nicht von unten, sondern im Gegenteil von oben zeichnen?

Guten Tag.
Ja, natürlich, es ist nicht so schwierig, wie es scheint.
 

Literate Jungs, bitte sagen Sie mir, wie man das maximale Hoch und Tief für die eingestellte Anzahl von Bars in MQL5 finden.

In mql4 ist es zum Beispiel einfach, dies zu tun.

_High   = NormalizeDouble(iHigh(Symb,PERIOD_CURRENT,iHighest(Symb,PERIOD_CURRENT,MODE_HIGH,CanalBar,0)), Digits); // Berechne den höchsten Preis für den letzten CanalBar 
_Low    = NormalizeDouble(iLow (Symb,PERIOD_CURRENT,iLowest (Symb,PERIOD_CURRENT,MODE_LOW, CanalBar,0)), Digits); // Berechnung des niedrigsten Tiefstpreises für den letzten CanalBar
   

Hier nehmen wir einfach, was wir gefunden haben und zeichnen eine Linie auf dem Diagramm.

Aber wie man das Hoch und Tief für die Anzahl der Balken in mql5 findet, ist ein Rätsel. iHighest und iLowest

so wie ich es verstehe, gibt es hier kein einfaches Verständnis.

Ich wäre Ihnen dankbar, wenn Sie mir helfen könnten, und wenn es einen Beispielcode gäbe, wäre das im Allgemeinen großartig.

danke.

 
Konstantin Seredkin:

Literate Jungs, bitte sagen Sie mir, wie man das maximale Hoch und Tief für die eingestellte Anzahl von Bars in MQL5 finden.

In mql4 ist es zum Beispiel einfach, das zu tun.

Hier nehmen wir einfach, was wir gefunden haben und zeichnen eine Linie auf dem Chart.

Aber wie man das Hoch und Tief für die Anzahl der Balken in mql5 findet, ist ein Rätsel. iHighest und iLowest

so wie ich es verstehe, gibt es hier kein einfaches Verständnis.

Ich wäre Ihnen dankbar, wenn Sie mir helfen könnten, und wenn es ein Code-Beispiel gäbe, wäre es im Allgemeinen großartig.


_High   = NormalizeDouble(high[ArrayMaximum(high, 0, CanalBar)], Digits); // Berechne den höchsten Preis für den letzten CanalBar 

Wobei high ein Array von hohen Barpreisen ist

Wenn es sich um einen Indikator handelt, erhalten Sie es in OnCalculation,
wenn es sich um einen Expert Advisor handelt, fordern Sie es über CopyHigh an.

Vergessen Sie nicht ArraySetAsSeries true


Danke.

 

SPS

 
Konstantin Seredkin:

Literate Jungs, bitte sagen Sie mir, wie man das maximale Hoch und Tief für die eingestellte Anzahl von Bars in MQL5 finden.

In mql4 ist es zum Beispiel einfach, dies zu tun.

Hier nehmen wir einfach, was wir gefunden haben und zeichnen eine Linie auf dem Diagramm.

Aber wie man das Hoch und Tief für die Anzahl der Balken in mql5 findet, ist ein Rätsel. iHighest und iLowest

so wie ich es verstehe, gibt es hier kein einfaches Verständnis.

Ich wäre Ihnen dankbar, wenn Sie mir helfen können, und wenn es ein Code-Beispiel gibt, wäre es im Allgemeinen großartig

Ich danke Ihnen.

zunächst zu Ihrem Code. ich würde ihn einfacher gestalten, ausgehend von der Tatsache, dass Sie das Maximum im aktuellen Chart abfragen, gebe ich Ihnen ein Beispiel für Scheitelpunkte, für Tiefpunkte ist alles fast gleich.
Sie verwechseln Befehle zur allgemeinen Abfrage aller Daten mit Befehlen zur Abfrage der aktuellen Daten, was in diesem Fall unnötig ist.
//für aktuelle Daten (Zugriff auf aktuelle Daten von jedem EA oder Indikator) wird
   _High=NormalizeDouble(High[iHighest(Symb,_Period,MODE_HIGH,CanalBar)],_Digits);

//für allgemeine Daten (Zugriff von jedem EA oder Indikator auf alle Daten in der Datenbank) wird 
   _High=NormalizeDouble(iHigh(Symb,PERIOD_CURRENT,iHighest(Symb,PERIOD_CURRENT,MODE_HIGH,CanalBar)),MarketInfo(Symb,MODE_DIGITS));

und nun zum Code in mt5.

   double high[];
   ArrayResize(high,CanalBar);
   CopyHigh(Symb,PERIOD_CURRENT,0,CanalBar,high);
   _High=NormalizeDouble(high[ArrayMaximum(high)],SymbolInfoInteger(Symb,SYMBOL_DIGITS));
   ArrayFree(high);

in diesem fall ist der zugriff auf alle daten in der datenbank für ein beliebiges symbol aus einem beliebigen indikator oder EA gegeben.
es besteht keine notwendigkeit, sich über die richtung der indizierung Gedanken zu machen, da wir nur das maximum benötigen, egal wo es sich befindet.
der befehl ArrayMaximum() (laut hilfe) liefert den gewünschten wert unter berücksichtigung der richtung der array-indizierung.

c/u.

P.S. Ich würde den Preis nicht normalisieren, das ist unnötig, es sei denn, Sie bauen einen Pipsmith, der 1 Punkt von einem Trade abfängt.

 
Andrey Kisselyov:
Erstens, auf Ihrem Code. Ich würde es einfacher machen, basierend auf der Tatsache, dass Sie das Maximum auf dem aktuellen Chart anfordern, werde ich Ihnen ein Beispiel für Tops geben, für Talsohlen ist alles fast das gleiche.
Sie verwechseln Befehle der allgemeinen Anfrage an alle Daten mit Befehlen der Anfrage an aktuelle Daten, die in diesem Fall unnötig ist.

und nun zum Code in mt5.

in diesem Fall ist der Zugriff auf beliebige Daten in der Datenbank für ein beliebiges Symbol aus einem beliebigen Indikator oder EA gegeben.
es ist nicht nötig, sich über die Richtung der Indizierung Gedanken zu machen, da wir nur das Maximum benötigen, egal wo es sich befindet.
der Befehl ArrayMaximum() (gemäß der Hilfe) gibt den erforderlichen Wert unter Berücksichtigung der Richtung der Array-Indizierung zurück.

c/u.

P.S. Ich würde den Preis nicht normalisieren, das ist unnötig, es sei denn, Sie bauen einen Pipsmith, der 1 Punkt aus einem Handel auffängt.


Gut, das ist alles geklärt

Nun eine weitere Frage

Die Implementierung sieht folgendermaßen aus

input int CanalBar  = 200; // Anzahl der zu berechnenden Balken

//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTick()
  {

   double high[];
   ArrayResize(high,CanalBar);
   CopyHigh(_Symbol,PERIOD_CURRENT,0,CanalBar,high);
   double _High=NormalizeDouble(high[ArrayMaximum(high)],SymbolInfoInteger(_Symbol,SYMBOL_DIGITS));
   ArrayFree(high);
   
   
   HLineCreate(0,"HIGH",0,_High,"",clrBlue,1,1); // Zeichnen Sie eine Linie in das Diagramm.

  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Erzeugt eine horizontale Linie|
//+------------------------------------------------------------------+
//| Basierend auf:|
//| MQL5 Referenzhandbuch / Standardkonstanten, Enums und Strukturen
/ Objektkonstanten / Objekttypen / OBJ_HLINE |
//+------------------------------------------------------------------+
bool HLineCreate(const long            chart_ID=0,        // Diagramm-ID
                 const string          name="HLine",      // Zeilenname
                 const int             sub_window=0,      // Nummer des Unterfensters
                 double                price=0,           // Zeilenpreis
                 const string          toolTip="\n",      // Text der QuickInfo
                 const color           clr=clrRed,        // Linienfarbe
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // Linienstil
                 const int             line_width=1,      // Linienstärke
                 const bool            back=false,        // im Hintergrund
                 const bool            selection=true,    // zum Verschieben auswählen
                 const bool            hidden=true,       // versteckt in der Liste der Objekte
                 const long            z_order=0,         // Priorität Mausklick
                 const int             timeFrames=OBJ_ALL_PERIODS)//Das Objekt in verschiedenen Zeiträumen anzeigen
  {
//--- den Fehlerwert zurücksetzen
   ResetLastError();
//--- eine horizontale Linie erzeugen
   if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
     {
      Print(LINE_NUMBER,__FUNCTION__,
            ": failed to create a horizontal line! Error code = ",GetLastError());
      return(false);
     }
//--- den Text für die QuickInfo festlegen
   ObSetString(chart_ID,name,OBJPROP_TOOLTIP,toolTip);
//--- Einstellen der Linienfarbe 
   ObSetIntegerColor(chart_ID,name,OBJPROP_COLOR,clr);
//--- Einstellen der Art der Zeilendarstellung
   ObSetIntegerLineStyle(chart_ID,name,style);
//--- Einstellung der Linienstärke
   ObSetIntegerInt(chart_ID,name,OBJPROP_WIDTH,line_width);
//--- Anzeige im Vordergrund (falsch) oder im Hintergrund (wahr)
   ObSetIntegerBool(chart_ID,name,OBJPROP_BACK,back);
//--- Aktivierung (true) oder Deaktivierung (false) des Mauszeilen-Bewegungsmodus
//--- bei der Erstellung eines grafischen Objekts mit der Funktion ObjectCreate wird standardmäßig das Objekt
//--- kann nicht ausgewählt und verschoben werden. Innerhalb dieser Methode wird der Auswahlparameter
//--- ist standardmäßig auf true eingestellt, so dass Sie dieses Objekt auswählen und verschieben können
   ObSetIntegerBool(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObSetIntegerBool(chart_ID,name,OBJPROP_SELECTED,selection);
//--- Ausblenden (true) oder Anzeigen (false) des Namens des grafischen Objekts in der Liste der Objekte
   ObSetIntegerBool(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- die Priorität für den Empfang des Mausklick-Ereignisses auf dem Diagramm festlegen
   ObSetIntegerLong(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- Einstellen der Sichtbarkeit von Objekten in verschiedenen Zeitfenstern 
   ObSetIntegerInt(chart_ID,name,OBJPROP_TIMEFRAMES,timeFrames);
//--- erfolgreiche Ausführung
   return(true);
  }


Beim Start des visuellen Tests wird die Linie auf dem Chart gezeichnet, steht aber still, die Linie ändert ihre Werte im Laufe des Tests nicht, ist es in mql5 notwendig, den Berechnungen irgendwie einen zusätzlichen Tritt in den Hintern zu geben ?

 
Konstantin Seredkin:

In Ordnung, das ist alles erledigt.

Nun eine weitere Frage

Die Implementierung ist wie folgt


Wenn man den visuellen Test startet, wird die Linie auf dem Diagramm gezeichnet, aber sie steht still, ihre Werte ändern sich während des Tests nicht, muss man in mql5 den Berechnungen zusätzlich irgendwie einen Tritt in den Hintern geben ?

Versuchen Sie dies:

void HLineCreate(const long            chart_ID=0,        // Diagramm-ID
                 const string          name="HLine",      // Zeilenname
                 const int             sub_window=0,      // Nummer des Unterfensters
                 double                price=0,           // Zeilenpreis
                 const string          toolTip="\n",      // Text der QuickInfo
                 const color           clr=clrRed,        // Linienfarbe
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // Linienstil
                 const int             line_width=1,      // Linienstärke
                 const bool            back=false,        // im Hintergrund
                 const bool            selection=true,    // zum Verschieben auswählen
                 const bool            hidden=true,       // versteckt in der Liste der Objekte
                 const long            z_order=0,         // Priorität Mausklick
                 const int             timeFrames=OBJ_ALL_PERIODS)//Das Objekt in verschiedenen Zeiträumen anzeigen
  {
  if(ObjectFind(chart_ID, name)<0) {
//--- eine horizontale Linie erzeugen
   ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price);
//--- den Text für die QuickInfo festlegen
   ObjectSetString(chart_ID,name,OBJPROP_TOOLTIP,toolTip);
//--- Einstellen der Linienfarbe 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- Einstellen der Art der Zeilendarstellung
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- Einstellung der Linienstärke
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);
//--- Anzeige im Vordergrund (falsch) oder im Hintergrund (wahr)
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- Aktivierung (true) oder Deaktivierung (false) des Mauszeilen-Bewegungsmodus
//--- bei der Erstellung eines grafischen Objekts mit der Funktion ObjectCreate wird standardmäßig das Objekt
//--- kann nicht ausgewählt und verschoben werden. Innerhalb dieser Methode wird der Auswahlparameter
//--- ist standardmäßig auf true eingestellt, so dass Sie dieses Objekt auswählen und verschieben können
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- Ausblenden (true) oder Anzeigen (false) des Namens des grafischen Objekts in der Liste der Objekte
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- die Priorität für den Empfang des Mausklick-Ereignisses auf dem Diagramm festlegen
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- Einstellen der Sichtbarkeit von Objekten in verschiedenen Zeitfenstern 
   ObjectSetInteger(chart_ID,name,OBJPROP_TIMEFRAMES,timeFrames);
     }
//--- Festlegen der Bindungsmethode
   ObjectSetDouble(chart_ID,name,OBJPROP_PRICE,price);
  }
 
Konstantin Seredkin:

In Ordnung, das ist alles erledigt.

Nun eine weitere Frage

Die Implementierung ist wie folgt


Wenn man den visuellen Test startet, wird die Linie auf dem Diagramm gezeichnet, steht aber still, die Wertelinie ändert sich während des Tests nicht, muss man in mql5 den Berechnungen zusätzlich irgendwie einen Tritt in den Hintern geben ?

Befehl
if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
wenn es bereits ein Objekt mit diesem Namen ist nicht implementiert, als Folge, wird Ihr Preis auf der bestehenden Linie nicht ändern.
wie Sie richtig gesagt wurde, sollte es durch Befehl getan werden.

ObjectSetDouble(chart_ID,name,OBJPROP_PRICE,price);
und noch eine Bemerkung, versuchen Sie, sich nicht in Klassen und andere Weisheiten zu verstricken, wenn es eine Möglichkeit gibt, einfacher zu schreiben, indem Sie Befehle für den direkten Zugriff verwenden.
wenden Sie nur die Befehle an, die notwendig sind, es ist nicht notwendig, bei jedem Zugriff alle Parameter der Zeile durchzugehen, schließlich müssen Sie nur den Preis der Zeile ändern.

mit Respekt.
 

Danke Leute, jetzt ist alles geregelt.