Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Facebook!
und werden Sie Mitglied unserer Fangruppe
Interessantes Skript?
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Hat Ihnen das Skript gefallen?
Bewerten Sie es im Terminal MetaTrader 5
Ansichten:
1265
Rating:
(37)
Veröffentlicht:
2016.08.02 17:26
Aktualisiert:
2016.11.22 07:34
Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance

Dieses Skript findet DeMark Pivot-Punkte, blendet diese auf dem Chart ein und zeigt deren Dimensionen an.

Dieses Skript hat praktisch die gleiche Funktionalität wie KeyFinder. Es gibt keine visuellen Unterschiede bis auf den Button, der das Skript und alle assoziierten Objekte vom Chart löscht.

Abb. 1. RTS Index Futures Chart nach Anwendung des  KeyFinder 2.0 Skriptes

Abb. 1. RTS Index Futures Chart nach Anwendung des KeyFinder 2.0 Skriptes

Obwohl das Skript optisch und funktional nicht geändert wurde, wurde es im Code doch erheblich geändert.

die CKeyFinder Klasse wurde für das Skript erstellt.

Abb. 2. CKeyFinder class

Abb. 2. CKeyFinder class

Der Code der Klasse steht unten. Da ich versucht habe Kommentare so detailliert wie möglich zu verfassen, sollten Sie keine Probleme haben.

//+------------------------------------------------------------------+
//|                                                    KeyFinder.mqh |
//|                                                   Trofimov Pavel |
//|                                               trofimovpp@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Trofimov Pavel"
#property link      "trofimovpp@mail.ru"
//+------------------------------------------------------------------+
//| Klasse für KeyFinder 2.0                                         |
//+------------------------------------------------------------------+
class CKeyFinder
  {
private:
   // Klassenvariablen
   int               MinDimension;  //Minimale Dimension in Punkten
   int               MaxBars;       //Anzahl der zu verarbeitenden Balken
protected:
   // Klassenmethoden für interne Verwendung
   // Bestimmung der Dimensionen der oberen Punkte
   int               getHighDimension(MqlRates &tmpRates[],int tmp_i,int tmp_iCod);
   // Bestimmung der Dimensionen der unteren Punkte
   int               getLowDimension(MqlRates &tmpRates[],int tmp_i,int tmp_iCod);
public:
   // Klassen Konstruktor
                     CKeyFinder();
   // Klassen Destruktor
                    ~CKeyFinder();
   // Eigenschaft Methode um Dimension zu erhalten   
   int               GetMinDimension();
   // Eigenschaft Methode zum Setzen der Dimension
   void              SetMinDimension(int temp_Val);
   // Eigenschaft Methode um Anzahl der zu verarbeitenden Balken zu holen
   int               GetMaxBars();
   // Eigenschaft Methode zum Setzen der Anzahl der zu verarbeitenden Balken
   void              SetMaxBars(int temp_Val);
   // Methode zum Finden der oberen Pivot-Punkte
   void              FindUpKeyPoints(int temp_iCod,MqlRates &temp_rates[]);
   // Methode zum Finden der unteren Pivot-Punkte
   void              FindLowKeyPoints(int temp_iCod,MqlRates &temp_rates[]);
   // Löschen der Skriptobjekte vom Chart.
   int               CleanChart();
  };
//+------------------------------------------------------------------+
//| Bestimmung der Dimensionen des oberen Punktes                    |
//+------------------------------------------------------------------+
int CKeyFinder::getHighDimension(MqlRates &tmpRates[],int tmp_i,int tmp_iCod)// die Methode erhält ein Array von MqlRates Datentyp, eine Nummer des verarbeiteten Balkens im Array und ein Maixmalindex des Arrays
  {
   int k=1;
   while((tmpRates[tmp_i].high>tmpRates[tmp_i+k].high) && (tmpRates[tmp_i].high>tmpRates[tmp_i-k].high) && ((tmp_i+k)<(tmp_iCod)) && ((tmp_i-k)>0)) k++;
   if(((tmp_i+k)==tmp_iCod) || ((tmp_i-k)==0)) k=-1;
   return(k);
  };
//+------------------------------------------------------------------+
//| Bestimmung der Dimensionen des unteren Punktes                   |
//+------------------------------------------------------------------+
int CKeyFinder::getLowDimension(MqlRates &tmpRates[],int tmp_i,int tmp_iCod)// die Methode erhält ein Array von MqlRates Datentyp, eine Nummer des verarbeiteten Balkens im Array und ein Maixmalindex des Arrays
  {
   int k=1;
   while((tmpRates[tmp_i].low<tmpRates[tmp_i+k].low) && (tmpRates[tmp_i].low<tmpRates[tmp_i-k].low) && ((tmp_i+k)<(tmp_iCod)) && ((tmp_i-k)>0)) k++;
   if(((tmp_i+k)==tmp_iCod) || ((tmp_i-k)==0)) k=-1;
   return(k);
  };
//+------------------------------------------------------------------+
//| Methode GetMinDimension                                          |
//+------------------------------------------------------------------+
int CKeyFinder::GetMinDimension(){return(MinDimension);};
//+------------------------------------------------------------------+
//| Methode SetMinDimension                                          |
//+------------------------------------------------------------------+
void CKeyFinder::SetMinDimension(int temp_Val)
  {
   if(temp_Val>1) MinDimension=temp_Val;
   else
     {
      MessageBox("The set dimension is too low."+"\n"+"Die Standarddimension von 5 wird verwendet","Warnung!",MB_OK+MB_ICONWARNING);
      MinDimension=5;
     };
  };
//+------------------------------------------------------------------+
//| Methode GetMaxBars                                               |
//+------------------------------------------------------------------+
int CKeyFinder::GetMaxBars() {return(MaxBars);};
//+------------------------------------------------------------------+
//| Methode SetMaxBars                                               |
//+------------------------------------------------------------------+
void CKeyFinder::SetMaxBars(int temp_Val)
  {
// Überprüfung der Verfügbarkeit der Historie für die angegebene Anzahl der Balken
   int SMaxBars=Bars(Symbol(),0);
   if(SMaxBars<temp_Val)
     {
      temp_Val=SMaxBars;// Einstellen der maximal verfügbaren Anzahl von Balken
      MessageBox("Der MaxBars Parameter ist zu gross."+"\n"+"Nur "+IntegerToString(temp_Val)+" Balken werden für die Berechnung verwendet.","Warning!",MB_OK+MB_ICONWARNING);
     };

// Prüfen, ob die Anzahl der Balken nicht zu klein ist
   if(temp_Val<(2*MinDimension))
     {
      MessageBox("Die angegebene Anzahl von Balken ist zu klein."+"\n"+"Der Standardwert 300 wird verwendet","Warnung!",MB_OK+MB_ICONWARNING);
      temp_Val=300;
     };
   MaxBars=temp_Val;
  };
//+------------------------------------------------------------------+
//| Methode FindKeyPoints - finden der oberen Schlüsselpunkte        |
//+------------------------------------------------------------------+
void CKeyFinder::FindUpKeyPoints(int temp_iCod,MqlRates &temp_rates[])// die Methode erhält eine Index des maximalen Arrayelements und das MqlRates Array
  {
   int HD=1;   //Initialisierung der Punktdimensionen
   for(int i=temp_iCod-MinDimension; i>(MinDimension-1); i--)// Eine Schleife vom letzten Balken - MinDimension zum Null-Balken + MinDimension
     {
      HD=getHighDimension(temp_rates,i,temp_iCod);//Punktdimensionen holen
      if((HD>=MinDimension) || (HD==-1))
        {//Erzeugung einer Markierung, wenn die MinDimension-Bedingung erfüllt ist
         string Ob_Name="KF_Label"+IntegerToString(i);
         if(HD!=-1)
           {
            ObjectCreate(0,Ob_Name,OBJ_TEXT,0,temp_rates[i].time,temp_rates[i].high);
            ObjectSetInteger(0,Ob_Name,OBJPROP_ANCHOR,0,ANCHOR_LOWER);
            ObjectSetString(0,Ob_Name,OBJPROP_TEXT,0,IntegerToString(HD));
            ObjectSetInteger(0,Ob_Name,OBJPROP_COLOR,clrRed);
           }
         else
           { //Wenn die Dimension nicht bestimmt werden kann eine Markierung verwenden
            ObjectCreate(0,Ob_Name,OBJ_ARROW,0,temp_rates[i].time,temp_rates[i].high);
            ObjectSetInteger(0,Ob_Name,OBJPROP_ARROWCODE,0,159);
            ObjectSetInteger(0,Ob_Name,OBJPROP_ANCHOR,0,ANCHOR_BOTTOM);
            ObjectSetInteger(0,Ob_Name,OBJPROP_COLOR,clrRed);
           };
        };
     };
  };
//+------------------------------------------------------------------+
//| Methode FindLowKeyPoints - Finden der unteren Schlüsselpunkte |
//+------------------------------------------------------------------+   
void CKeyFinder::FindLowKeyPoints(int temp_iCod,MqlRates &temp_rates[])// Die Methode erhält einen Index des maximalen Arrayelements und das MqlRates Array
  {
   int LD=1;//Initialisierung der Punktdimensionen
   bool iCreate;
   for(int i=temp_iCod-MinDimension; i>(MinDimension-1); i--)// Eine Schleife vom letzten Balken - MinDimension zum Null-Balken + MinDimension
     {
      LD=getLowDimension(temp_rates,i,temp_iCod);
      if((LD>=MinDimension) || (LD==-1))
        {
         string Ob_Name="KF_Label"+IntegerToString(i)+"_1";//Vermeiden der Balken bei denen Tief und Hoch Schlüsselpunkte sein können
         if(LD!=-1)
           {
            iCreate=ObjectCreate(0,Ob_Name,OBJ_TEXT,0,temp_rates[i].time,temp_rates[i].low);
            if(iCreate)
              {
               ObjectSetInteger(0,Ob_Name,OBJPROP_ANCHOR,0,ANCHOR_UPPER);
               ObjectSetString(0,Ob_Name,OBJPROP_TEXT,0,IntegerToString(LD));
               ObjectSetInteger(0,Ob_Name,OBJPROP_COLOR,clrGreen);
              }
            else Comment("Kann das Objekt nicht erstellen");
           }
         else
           {
            iCreate=ObjectCreate(0,Ob_Name,OBJ_ARROW,0,temp_rates[i].time,temp_rates[i].low);
            if(iCreate)
              {
               ObjectSetInteger(0,Ob_Name,OBJPROP_ARROWCODE,0,159);
               ObjectSetInteger(0,Ob_Name,OBJPROP_ANCHOR,0,ANCHOR_TOP);
               ObjectSetInteger(0,Ob_Name,OBJPROP_COLOR,clrGreen);
              }
            else Comment("Kann das Objekt nicht erstellen");
           };
        };
     };
  };
//+------------------------------------------------------------------+
//| Methode CleanChart - Entfernen der Objekte vom Chart             |
//+------------------------------------------------------------------+   
int CKeyFinder::CleanChart(void)
  {
   string Label="KF_Label";
   int obj_total=ObjectsTotal(0,0,-1),n=0;
   for(int obj=obj_total-1; obj>=0; obj--) //Entfernung der Objekte die vom Skript erstellt wurden durch Namensmaske
     {
      string objname=ObjectName(0,obj,0,-1);
      if(StringFind(objname,Label)>=0) ObjectDelete(0,objname);
      n++;
     }
   return(n);
  }
//+------------------------------------------------------------------+
//| Klassen Konstruktor                                              |
//+------------------------------------------------------------------+
CKeyFinder::CKeyFinder(){};
//+------------------------------------------------------------------+
//| Klassen Destructor                                               |
//+------------------------------------------------------------------+
CKeyFinder::~CKeyFinder(){};
//+---------------------------------------------------------------------+

Da der größte Teil des Codes in die Klasse verschoben wurde, ist der Code des Hauptskriptes sehr kompakt.

//+------------------------------------------------------------------+
//|                                                   KeyFinder2.mq5 |
//|                                                   Trofimov Pavel |
//|                                               trofimovpp@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Trofimov Pavel"
#property link      "trofimovpp@mail.ru"
#property version   "2.00"
#property description "Warnung! Dieser Algorithmus verwendet Schleifen für die Berechnungen!"
#property description "Es wird empfohlen nicht mehr als 1000 für die Verarbeitung einzustellen!"
#property script_show_inputs
Eingabeparameter:
input int      MinDimesion=5; //Minimale Dimension der Punkte
input int      MaxBars=300;   //Die Anzahl der zu verarbeitenden Balken
#include       "KeyFinder.mqh"
#include       <ChartObjects\ChartObjectsTxtControls.mqh>
//+------------------------------------------------------------------+
//| Skript Variablen                                                 |
//+------------------------------------------------------------------+
CKeyFinder           m_keyfinder;      //Deklaration der СKeyFinder Klassenvariable
CChartObjectButton   m_button_close;   //Deklaration der CChartObjectButton Klassenvariable
//+------------------------------------------------------------------+
//| Skript Programmstart Funktion                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//-Initialisierung der Variablen
   MqlRates  rates_array[];
   string Com="\n\n\n";
   int iCod=CopyRates(Symbol(),Period(),0,MaxBars,rates_array);// Azahl von Elementen im MqlRates Array die wir kopieren können
   int sy=10;//Button Position
   if(ChartGetInteger(0,CHART_SHOW_OHLC))
      sy+=16;
//-Setzen der notwendigen Parameter   
   m_keyfinder.SetMaxBars(MaxBars);
   m_keyfinder.SetMinDimension(MinDimesion);
   m_keyfinder.CleanChart();//Löschen der Objekte vom Chart im Falle einer zweiten Anwendung 
   iCod=iCod-1;//ein Index für das Maximum Element im rates_array[]
   Com+="Verarbeitung...Bitte warten!";
//-Erstellung des Buttons und Einstellung seiner Eigenschaften
   m_button_close.Create(0,"ButtonClose",0,10,sy,100,20);
   m_button_close.Description("Skript Schliessen");
   m_button_close.Color(Blue);
   m_button_close.FontSize(8);
   Comment(Com);
//-Verarbeitung der Balken mit Hilfe der CKeyFinder Klassenmethoden   
   if(iCod>0)
     {
      m_keyfinder.FindUpKeyPoints(iCod,rates_array);//Suche nach oberen Schlüsselpunkten
      Com+="\nObere Punkte wurden verarbeitet.\n";
      Comment(Com);
      m_keyfinder.FindLowKeyPoints(iCod,rates_array);//Suche nach unteren Schlüsselpunkten
      Comment("\n\n\nVerarbeitung abgeschlossen");
     }
   else Comment("\n\n\nKeine zu verarbeitenden Balken!!!");
   m_button_close.State(false);
//-Skript in Schleife abarbeiten, bis der Button gedrückt wird
   while(!(m_button_close.State()))
     {
      //--- Chart neu zeichnen
      ChartRedraw();
      Sleep(250);
     };
//-Löschen des Charts durch Drücken auf den Button
   m_keyfinder.CleanChart();
   Comment("");
  }

Und zu guter Letzt einige hilfreiche Links und Erklärungen:

  • Wie man den Code direkt vom MetaEditor lädt
  • Um das Skript in MetaTrader 4 zu verwenden, müssen Sie die Erweiterung der DateiKeyFinder2.mq5 in mq4 ändern und sie im MetaEditor neu compilieren. Die KeyFinder.mqh Datei, die den Klassencode enthält sollte im gleichen Ordner gespeichert werden (zum Beispiel MQL5\Scripts) wie die Haupt-Skript-Datei.

Ich freue mich auf Ihre Kommentare, Feedback und Anregungen. Viel Glück beim Trading!


Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/ru/code/12439

KeyLevels KeyLevels

Indikator von Preislevels mit runden Zahlen 00, 20, 50, 80.

KeyFinder KeyFinder

Dieses Skript findet DeMark Pivot-Punkte, blendet diese auf dem Chart ein und zeigt deren Dimensionen an.

Back to the Future Back to the Future

Fundamentalanalyse mit Regulierungsbehörden.

Indicator Arrows II Indicator Arrows II

Zeichnet Aufwärts/Abwärts-Pfeile im Chartfenster.