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

Vladimir | 28 März, 2016

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:

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.