und werden Sie Mitglied unserer Fangruppe
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Bewerten Sie es im Terminal MetaTrader 5
KeyFinder 2.0 - Skript für den MetaTrader 5
- Ansichten:
- 1327
- Rating:
- 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
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
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
Indikator von Preislevels mit runden Zahlen 00, 20, 50, 80.
KeyFinderDieses Skript findet DeMark Pivot-Punkte, blendet diese auf dem Chart ein und zeigt deren Dimensionen an.
Fundamentalanalyse mit Regulierungsbehörden.
Indicator Arrows IIZeichnet Aufwärts/Abwärts-Pfeile im Chartfenster.