English Русский 中文 Español 日本語 Português
Faulheit ist der Reiz zum Fortschritt, oder Wie man mit Grafiken Interaktiv Arbeitet

Faulheit ist der Reiz zum Fortschritt, oder Wie man mit Grafiken Interaktiv Arbeitet

MetaTrader 4Beispiele | 28 März 2016, 11:01
501 0
Vladimir
Vladimir

Einführung

In einem englischsprachigen Forum habe ich eine interessante Beschreibung der Fibo-Ebenen Interpretation gefunden. Der Grundgedanke ist, die Korrektur der Impulse-Bewegung nähert sich den der Region zwischen 38,2 bis 61,8. Als ich das dort hochgeladene Video sah und als ich versuchte die Fibo-Ebenen selbst in das Chart zu zeichnen, kam ich zur Verwendung dieses Tools in meiner eigenen Praxis.

Ich möchte es nicht bei den Vor- und Nachteilen dieses Systems belassen. Ich möchte hier eine andere Sache erzählen. Ich bin von Natur aus fail (annehmend, dass ich damit nicht alleine bin) und dieses endlose Zeichnen und Neuzeichnen von Fibos auf der Suche nach Umkehr-Zonen auf einem Chart ha mich genug gelangweilt, ich entschied einen Teil der Arbeit an MQL4 abzugeben.

Das Hauptproblem, das ich lösen muss ist, mit einigen Farben die Zonen der handgezeichneten Fibos auf dem Kurs-Chart automatisch anzuzeigen. Es ist kein Geheimnis, dass die farbige Darstellung von Objekten deren anschauliche Wahrnehmbarkeit verbessert. Außerdem ist es viel einfacher ein Objekt auf dem Chart wahrzunehmen, als eine Vielzahl an Linie mit Zahlen auf ihm zu analysieren, die ständig auf ihm angezeigt werden.



Verarbeitung von Koordinaten Grafischer Objekte

Ich glaube tatsächlich, dass Interaktivität bei der Arbeit mit einem Chart bereitgestellt werden sollte. Wir müssen das Programm dazu bringen Symbole zu zeichnen oder auch die zusätzlichen grafischen Zeichnungen für die von einem Trader gemachten Zeichnungen, und außerdem benötigen wir einen begleitenden Ton, für Fälle in denen beispielsweise die Trendlinie kreuzt.

Es ist notwendig die Vorteile der manuellen Zeichnung zu beachten:

  • Dies ermöglicht es dem Trader Referenz-Punkte von Objekt-Zeichnungen auf dem Chart zuzuweisen.
  • Ausreichende Code-Einträge werden gespart, somit auch die Prozessorlast.
  • Es ist nicht erforderlich eine anfängliche Logik zum Zeichnen eines Objekts auf das Chart zu programmieren. Es ist übrigens nicht so einfach, die erforderliche Logik programmgesteuert zu erreichen. Schauen Sie, wie viele "z;ZigZag" es beispielsweise gibt.

Hier möchte ich zeigen, wie Sie einen Indikator für den Schnittpunkt handgezeichneter Linien umsetzen.

Zunächst zeichnen wir eine Trendlinie in ein Chart. Dann suchen wir diese Linie in der Liste der Objekte. Diese Linie wird, zum Beispiel, so genannt: Trendline 29344. Trendline ist die Beschreibung der Linie selbst, 29344 ist die Nummer, die ihr von dem MetaTrader 4 Client Terminal zugewiesen wurde.

Benennen wir die Trendlinie um in TrDup, es wird die Linie für den Aufwärtstrend sein.

Dann wiederholen wir die gleichen Schritte zum Erzeugen einer weiteren Trendlinie und erstellen die TrDdown Trendlinie, welche den Abwärtstrend anzeigen wird.

(Der 1_01_Tr_Alert Indikator ist eingestellt auf die Zusammenarbeit mit genau diesen Linien, die gleichen Namen werden in Demarks Trendlinien zeichnenden Indikator TL_by_Demark_v6 verwendet)

Jetzt müssen wir die Nummer des Objekts auf dem Chart mit MQL4 auslesen.

int    obj_total=ObjectsTotal();


Wir erhalten die Anzahl der Objekte in der obj_total Variable.

Jetzt haben wir die Anzahl der Objekte und es bleibt das benötigte für die weitere Verarbeitung des Algorithmus zu wählen. Dazu verwenden wir den typischen Operator des Zyklus und ermitteln die "TrDup" und "TrDdown" Objekte.

// Determine the Trend line object
int    obj_total=ObjectsTotal();
  string index;
  for(int i=0;i<obj_total;i++)
    {
     index=ObjectName(i);
      string substrTL_down = StringSubstr (index, 0, 7);
            if (substrTL_down == "TrDdown") string TrDLine_down=index;
      string substrTL_up = StringSubstr (index, 0, 5);
            if (substrTL_up == "TrDup") string TrDLine_up=index;
    
    }

Dann weisen wir deren Namen den TrDLine_down und TrDLine_up String-Variablen zu.

Jetzt haben wir die ermittelten Trendlinien, die wir manuell in das Chart gezeichnet haben. Ab hier ist der Indikator mit den Koordinaten verbunden und in der Lage durch den erforderlichen Algorithmus einige Aktionen mit ihnen durchzuführen

Wir müssen ein Signal erhalten über den Schlusskurs des ersten Balken der Kerze unter dem Schlusskurs des zweiten Balken, vorausgesetzt die Linie befindet sich zwischen den beiden Schlusskursen dieser zwei Balken. Auf diese Weise erhalten wir ein Signal über das Kreuzen der Trendlinie durch den Kurs.

if ((Close[1]>ObjectGetValueByShift(TrDLine, 1)) && (Close[2]<ObjectGetValueByShift(TrDLine, 2)))


Jetzt müssen wir nur die Benachrichtigung und die Medien-Datei ausführen, oder zeichnen, zum Beispiel, einen Pfeil in das Chart nahe dem Balken der Trendlinien-Kreuzung.

Diese Methode ermöglicht die interaktive Zusammenarbeit mit jedem manuell auf dem Chart eingefügten Objekt einfach zu organisieren. Fibo-Ebenen, Kanäle, usw.

Der Indikator zur Anzeige der farbigen Zonen von Fibo-Ebenen, veröffentlicht in dem Onix Forum, kann als Beispiel dienen: http://www.onix-trade.net/forum/index.php?act=attach&type=post&id=27033&setlanguage=1&langid=ru.

Und der ergänzte durch den nen ZigZag Indikator für automatisches Zeichnen der Fibo-Ebenen durch die letzte Welle ist hier: http://www.onix-trade.net/forum/index.php?act=attach&type=post&id=27175&setlanguage=1&langid=ru.

Im Folgenden liefere ich den Code des Indikators für die komplexe Darstellung der Fibo-Zonen, Angabe der der Trendlinie-Kreuzung und Anzeige des aktuellen Kurses auf dem Chart mit "Preislabel" auf das Chart gelegt.

 
//+------------------------------------------------------------------+
//|                                               1.012_InfoFibo.mq4 |
//|                                                                  |
//|                                                     b2w@narod.ru |
//+------------------------------------------------------------------+
#property copyright "http://www.fibook.ru"
#property link      "b2w@narod.ru"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
//---- input parameters
extern bool Auto_Correct_Line = false;// Autocorrection of the last Fibo point
extern bool ClearRectangle = true;//Deleting of the squares while redrawing of the Fibo levels
extern bool TargetZone = true;//Drawing of the target zones
extern int count_Alert=3; //the number of iterations of Alert
double fibs[] = {-0.618, -0.382, -0.237, 0.0, 0.145, 0.382, 0.618, 0.855, 1.0, 1.237, 1.382, 1.618};
color fibsColor[] = {Maroon, Green, ForestGreen, Teal, SteelBlue, ,
                         SteelBlue, Teal, ForestGreen, Green, Maroon};
double Old_Price;
color FontColor=Black;
string TextAlert[7];   
int y=0,count_a=0;
double ftime;
double win_idx;
string NameFibs;
double Spread;
double ExtMapBufferUP[];
double ExtMapBufferDN[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
      Spread=(Ask-Bid);
 
//---- indicators
   SetIndexStyle(0,DRAW_ARROW,0,1);
   SetIndexArrow(0,233);
   SetIndexBuffer(0,ExtMapBufferUP);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW,0,1);
   SetIndexArrow(1,234);
   SetIndexBuffer(1,ExtMapBufferDN);
   SetIndexEmptyValue(1,0.0);
   
      return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
if(ftime!=Time[0]) count_a=0;
//  int    counted_bars=IndicatorCounted();
//----
// Determine if there are the Fibo levels or not
int    obj_total=ObjectsTotal();
  string index;
  for(int i=0;i<obj_total;i++)
    {
     index=ObjectName(i);
      string substr = StringSubstr(index, 0, 4);
            if (substr == "Fibo")  NameFibs=index;
      string substrTL = StringSubstr (index, 0, 9);
            if (substrTL == "Trendline") 
            string TrDLine=index;
      string substrPR = StringSubstr (index, 0, 5);
            if (substrPR == "Arrow") 
            string PR=index;
    }
 
 
// Paramaters of the trend line
      if (StringLen(TrDLine)>1)
         {
            if (ObjectGet(TrDLine, OBJPROP_PRICE1)>ObjectGet(TrDLine, OBJPROP_PRICE2))
               {
               if ((Close[1]>ObjectGetValueByShift(TrDLine, 1)) && 
                                        (Close[2]<ObjectGetValueByShift(TrDLine, 2)))
                 {
                  ExtMapBufferUP[1]=(Low[1]-5*Point); /*Alert (Symbol(),"  Trend UP enter");*/
                  c_alert(1);
                 }
               }
            else
            if (ObjectGet(TrDLine, OBJPROP_PRICE1)<ObjectGet(TrDLine, OBJPROP_PRICE2))
               {
               if ((Close[1]<ObjectGetValueByShift(TrDLine, 1)) && 
                                        (Close[2]>ObjectGetValueByShift(TrDLine, 2)))
                  {
                   ExtMapBufferDN[1]=(High[1]+5*Point);/*Alert (Symbol(),"  Trend DN enter");*/
                     c_alert(1);
                  }
               }         
         }
// The end of calculation of the trend line
if (StringLen(NameFibs) <1) return(-1);// If there are no Fibo levels, then we exit
// Determine where the Fibo levels are drawn
double pr1=ObjectGet(NameFibs, OBJPROP_PRICE1);// first price High
double pr1vrem=ObjectGet(NameFibs, OBJPROP_TIME1);// first time of the price
double pr2=ObjectGet(NameFibs,OBJPROP_PRICE2);// second price Low
double pr2vrem=ObjectGet(NameFibs, OBJPROP_TIME2);// second time of the price
double fibprop=(pr1-pr2);// The difference between HIGH and LOW
double Timeend=(Time[0]+(Period()*360)); // The right side by the time 
                                         // to display the objects on the chart
double TimeNachalo=(Time[0]+Period()*60);// The right side by the time 
                                         // to display the objects on the chart
//+++
            ObjectMove(PR, 0,Time[0], Bid);// The icon of the current price
//+++
// Parameters of the rectangle of the reverse zone..
double verx=(pr1-fibprop*0.382);
double niz=(pr2+fibprop*0.382);
string UP=DoubleToStr(verx+Spread,Digits); 
string DN=DoubleToStr(niz-Spread,Digits); 
  if (Auto_Correct_Line==true)
      {
         if (High[0]>pr1) ObjectMove(NameFibs, 0,Time[0], High[0]);
         if (Low[0]<pr2) ObjectMove(NameFibs, 1,Time[0], Low[0]);
      }
   if (ClearRectangle == true) ObjectsDeleteAll(0,OBJ_RECTANGLE);// Delete the RECTANGLES objects
// Draw the rectangles in the cycle
        for( y=0;y<11;y++)
      {
      ObjectCreate(("Kvadrat"+y), OBJ_RECTANGLE, 0, TimeNachalo,(pr2+fibprop*fibs[y]), 
                                                        Timeend,(pr2+fibprop*fibs[y+1]) );  
      ObjectSet(("Kvadrat"+y),OBJPROP_COLOR,fibsColor[y]);
      }
// The end of drawing
 
                                /* Drawing of the rectangle of the ZONE */
 ObjectCreate("Kvadrat", OBJ_RECTANGLE, 0, TimeNachalo, verx , Timeend , niz);  
 ObjectSet("Kvadrat",OBJPROP_BACK,false);
 
// The array of text data
       TextAlert[0] =   "Attention two targets "; 
       TextAlert[1] =   ("Order up * "+UP);
       TextAlert[2] =   ("Order down   * "+DN); 
       TextAlert[3] =   ("TARGET up 2  * "+(DoubleToStr(pr1+fibprop*0.618,Digits)));
       TextAlert[4] =   ("TARGET up 1  * "+(DoubleToStr(pr1+fibprop*0.382,Digits))); 
       TextAlert[5] =   ("TARGET down 1  * "+(DoubleToStr(pr2-fibprop*0.382,Digits))); 
       TextAlert[6] =   ("TARGET down 2  * "+(DoubleToStr(pr2-fibprop*0.618,Digits)));
double YDist[] = {20, 55, 80, 120, 150, 180, 210};
color TextAlertClr[] = {Yellow, Green, Red, Green, Green, Red, Red};
        
// Output to the screen the message about orders entering
              for(y=0;y<7;y++)
               ObjectDelete("TextAlerts"+y);
if (TargetZone == true)
      {
      if (Bid > niz && Bid < verx)
            for(y=0;y<7;y++)
                  {
                  ObjectCreate(("TextAlerts"+y), OBJ_LABEL, 0, 0, 0);  
                  ObjectSetText(("TextAlerts"+y),TextAlert[y], 12, "Times New Roman",TextAlertClr[y]);
                  ObjectSet(("TextAlerts"+y), OBJPROP_CORNER, 0);
                  ObjectSet(("TextAlerts"+y), OBJPROP_XDISTANCE, 10);
                  ObjectSet(("TextAlerts"+y), OBJPROP_YDISTANCE, YDist[y]);
                  }
      }
 
// The informer of the price and the currency name
ObjectDelete("Market_Price_Label101");
   ObjectCreate("Market_Text_Label101", OBJ_LABEL, 0, 0, 0);
   ObjectSetText("Market_Text_Label101", (Symbol()+"  "+Period()), 16, "Times New Roman", Yellow);
   ObjectSet("Market_Text_Label101", OBJPROP_CORNER, 2);
   ObjectSet("Market_Text_Label101", OBJPROP_XDISTANCE, 5);
   ObjectSet("Market_Text_Label101", OBJPROP_YDISTANCE, 5);
 
  return(0);
  }
 
//+------------------------------------------------------------------+
 
void c_alert(int w)
 {
 ftime=Time[0];
 if(count_a<count_Alert)
 {count_a+=1;
 PlaySound("ku_ku.wav");
 }
 }
 return;


Die Kreuzung der Trendlinie auf dem GBPUSD Stunden-Chart wird im nächsten Bild angezeigt.



Fazit

Die Anwendung von diesem Ansatz zur Verarbeitung der empfangenen Daten ist eine gute Hilfe bei der Arbeit des Traders. Die einfache Entlastung von dem kontinuierlichen Warten auf den erforderlichen Moment zum Aktivieren oder Schließen einer Position, führt nicht nur zur Abnahme von emotionalem Stress, sondern erhöht auch die Chancen den benötigten Moment beim Trading nicht zu verpassen.

Und um alles für Sie sehr einfach zu machen, hänge ich die Vorlage des GBP Charts an, das Sie in den \templates\ Ordner speichern müssen.

Der Indikator selbst muss in den Ordner \experts\indicators\ .

Und die Sound-Datei gehört in den \sounds\ Ordner.

Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/1546

Beigefügte Dateien |
1_012_InfoFibo.mq4 (7.42 KB)
1_01_Tr_Alert.mq4 (3.51 KB)
add_files.zip (5.79 KB)
Wie man Schnelle Nicht-Nachzeichnende ZigZags Schreibt Wie man Schnelle Nicht-Nachzeichnende ZigZags Schreibt
Ein eher universeller Ansatz zum Schreiben von Indikatoren des ZigZag Typs wird vorgeschlagen. Die Methode beinhaltet einen wesentlichen Teil bereits beschriebener ZigZags und ermöglicht Ihnen relativ leicht neue zu erzeugen.
Methode zur Fehlerbestimmung im Code durch Kommentieren Methode zur Fehlerbestimmung im Code durch Kommentieren
Der Artikel beschreibt eine Methode zur Suche nach Fehlern in dem MQL4 Code, die auf Kommentieren basiert. Die Methode erweist sich als nützlich im Fall von auftretenden Problemen während der Kompilierung, verusacht durch Fehler in einem ziemlich großen Code.
HTML Komplettlösung mit MQL4 HTML Komplettlösung mit MQL4
HTML ist heute eine der weitverbreiteten Arten von Dokumenten. Das MetaTrader 4 Client Terminal ermöglicht Ihnen Aufstellungen, Tests und Optimierungsberichte als.htm Dateien zu speichern. Manchmal ist es erforderlich Informationen aus solchen Dateien in einem MQL4 Programm zu erhalten. Der Artikel beschreibt eine der Variationen, wie man die Tag-Struktur und die Inhalte aus HTML erhält.
Ansicht der Technischen AAnalyse im Rahmen von Automatischen Steuerungssystemen (ACS), oder "Umgekehrte Ansicht" Ansicht der Technischen AAnalyse im Rahmen von Automatischen Steuerungssystemen (ACS), oder "Umgekehrte Ansicht"
Der Artikel demonstriert eine alternative Ansicht der technischen Analyse, die sowohl auf den Grundsätzen der modernen automatischen Steuerungstheorie, als auch auf der technischen Analyse selbst basiert. Es ist ein einführender Artikel, der die Theorie mit einigen praktischen Beispielen von ihr darstellt.