Skripte: KeyFinder 2.0

 

KeyFinder 2.0:

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

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

Autor: Pavel Trofimov

 

Die Schaltfläche, die das Skript löscht (funktioniert nicht immer), bleibt auf dem Bildschirm (nicht immer). MT4 Terminal, Alpari, bild 765


 
Es ist mir gelungen, Ihre Situation zu simulieren. Dieses Verhalten ist das Ergebnis der Verwendung eines anderen Skripts nach KeyFinder 2.0. Ich habe noch nicht herausgefunden, wie man dieses Problem auf Code-Ebene lösen kann. In Bezug auf die Verwendung - wenden Sie KeyFinder 2.0 erneut an und die Schaltfläche wird wieder "funktionieren".
 
Vielleicht ist es sinnvoller, das Programm als Indikator zu gestalten und den Bildschirm zu löschen, wenn der Indikator aus dem Diagramm entfernt wird?
 
komposter:
Vielleicht wäre es sinnvoller, das Programm als Indikator zu erstellen und den Bildschirm zu löschen, wenn der Indikator aus dem Diagramm entfernt wird?
Ich arbeite gerade an einem Indikator. Das Skript ist ein "Test für meinen Stift".
 
Rubick:
Es ist mir gelungen, Ihre Situation zu simulieren. Dieses Verhalten ist das Ergebnis der Verwendung eines anderen Skripts nach KeyFinder 2.0. Ich habe noch nicht herausgefunden, wie man dieses Problem auf Code-Ebene lösen kann. In Bezug auf die Verwendung - wenden Sie KeyFinder 2.0 erneut an und die Schaltfläche wird wieder "funktionieren".
Ich habe versucht, die auf dem Bildschirm festsitzende Schaltfläche auf alle möglichen Arten zu umgehen. Am einfachsten ist es, das Währungspaar-Fenster zu löschen und es neu zu erstellen. Die Informationen, die das Skript anzeigt, sind sehr nützlich. Ich verwende zum Beispiel viele Dinge im Handel (Murray-Levels - TirMethod, Handelsmodelle Third Wave und Consolidation) und überall brauche ich einen ähnlichen Indikator (ZigZag, ZipPips,), und das Skript hilft, die Korrektheit der Konstruktion von Zahlen und die Proportionalität von Extrema zu beurteilen. Warten wir also auf den Indikator. Halten Sie uns auf dem Laufenden. Haben Sie eine Seite in einem sozialen Netzwerk? Viel Glück und Erfolg für Sie!
 
ernst.yagafarof:
Ich habe versucht, die Schaltfläche, die auf dem Bildschirm "klebt", auf alle möglichen Arten zu bekämpfen. Am einfachsten ist es, das Währungspaar-Fenster zu löschen und es von Grund auf neu zu erstellen. Die vom Skript angezeigten Informationen sind sehr nützlich. Ich verwende zum Beispiel viele Dinge im Handel (Murray-Levels - TirMethod, Handelsmodelle Third Wave und Consolidation) und überall brauche ich einen ähnlichen Indikator (ZigZag, ZipPips,), und das Skript hilft, die Korrektheit der Konstruktion von Zahlen und die Proportionalität der Extrema zu beurteilen. Warten wir also auf den Indikator. Halten Sie uns auf dem Laufenden. Haben Sie eine Seite in einem sozialen Netzwerk? Viel Glück und Erfolg für Sie!
Ich habe mein Profil aktualisiert.
 
Ich habe gute Nachrichten! Ich habe den Entwurf und das Schreiben einer Klasse für den Indikator abgeschlossen, jetzt schreibe ich den Indikator selbst, ich plane, es nächste Woche zu beenden - höchstens, zumindest über das aktuelle Wochenende.
 
Rubick:
Ich habe gute Nachrichten! Ich habe den Entwurf und das Schreiben der Klasse für den Indikator abgeschlossen, jetzt schreibe ich den Indikator selbst, ich plane, nächste Woche fertig zu werden - höchstens über das laufende Wochenende.
Ich danke Ihnen. Wir freuen uns schon sehr darauf!
 

Auf was kann ich es anwenden?

Ich habe Ihr Skript in den Indikator eingefügt. Wenn ich das Diagramm wechsle, wird alles neu berechnet.

GBPUSDH4.

//+------------------------------------------------------------------+
//|KeyFinder.mq5 |
//|Trofimov Pavel |
//|trofimovpp@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Trofimov Pavel"
#property link      "trofimovpp@mail.ru"
#property version   "1.00"
#property description "Warnung! Dieser Algorithmus verwendet Zyklen in den Berechnungen!"
#property description "Es wird dringend empfohlen, maximal 1000 Takte für die Bearbeitung einzustellen!"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
//--- Eingabeparameter
input int      MinDimesion = 5;          // Minimale Dimensionalität der Punkte
input int      MaxBars     = 300;        // Anzahl der zu verarbeitenden Takte
input string   LabelName   = "KF_Label"; //
//+------------------------------------------------------------------+
//| Benutzerdefinierte Initialisierungsfunktion für Indikatoren |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Zuordnung von Indikatorpuffern

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   CleanChart();
   Comment("");
  }
//+------------------------------------------------------------------+
//| Benutzerdefinierte Indikator-Iterationsfunktion |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
//Überprüfung der Verfügbarkeit der Geschichte für die festgelegte Anzahl von Takten
   int SMaxBars=Bars(Symbol(),0),iMaxBars=MaxBars;
   if(SMaxBars<MaxBars)
     {
      iMaxBars=SMaxBars;
      Comment("Der Parameter MaxBars ist zu groß eingestellt".+"\n"+"Für die Berechnungen werden "+IntegerToString(SMaxBars)+" Bars.");
     };
   int clean=CleanChart();//das Diagramm bei der Wiederanwendung löschen
   MqlRates  rates_array[];
   string Com="";
   int iCod=CopyRates(Symbol(),Period(),0,iMaxBars,rates_array);//Anzahl der Array-Elemente
   iCod=iCod-1;//Index des größten Elements im Array
   Com="Arbeitet... Wartet darauf!";
   Comment(Com);
   if(iCod>0)
     {
      FindUpKeyPoints(iCod,rates_array);//Finden Sie die wichtigsten Stichpunkte
      Com=Com+"\n"+"Die wichtigsten Punkte wurden bearbeitet.+"\n";
      Comment(Com);
      FindLowKeyPoints(iCod,rates_array);//Finden Sie untere Schlüsselpunkte
      Comment("Verarbeitung abgeschlossen".);
     }
   else
      Comment("Mangel an Verarbeitungsleisten!!!");
//--- Rückgabewert von prev_calculated für den nächsten Aufruf
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|| Suche nach den wichtigsten Eckpunkten|
//+------------------------------------------------------------------+
void FindUpKeyPoints(int temp_iCod,MqlRates &temp_rates[])
  {
   int HD=1;
   for(int i=temp_iCod-MinDimesion; i>(MinDimesion-1); i--)// Taktzyklus von final - MinDimension bis null + MinDimension
     {
      HD=getHighDimension(temp_rates,i,temp_iCod);//Ermittlung der Dimensionalität der Punkte
      if((HD>=MinDimesion) || (HD==-1))
        {
         // Erstellen einer Markierung, wenn sie unter die MinDimension-Bedingungen fällt
         string Ob_Name=LabelName+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 wir die Dimension nicht bestimmen können, markieren wir sie mit einem Ball.
            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);
           };
        };
     };
  }
//+------------------------------------------------------------------+
//|Suche nach unteren Schlüsselpunkten |
//+------------------------------------------------------------------+
void FindLowKeyPoints(int temp_iCod,MqlRates &temp_rates[])
  {
   int LD=1;//Initialisierung der Punktabmessungen
   bool iCreate;
   for(int i=temp_iCod-MinDimesion; i>(MinDimesion-1); i--)
     {
      LD=getLowDimension(temp_rates,i,temp_iCod);
      if((LD>=MinDimesion) || (LD==-1))
        {
         string Ob_Name=LabelName+IntegerToString(i)+"_1";//Sorgen Sie sich um Balken, bei denen der Tiefst- und der Höchststand 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 kein Objekt 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 kein Objekt erstellen".);
           };
        };
     };
  }
//+------------------------------------------------------------------+
//| Bestimmung der Dimensionalität des oberen Punktes |
//+------------------------------------------------------------------+
int getHighDimension(MqlRates &tmpRates[],int tmp_i,int tmp_iCod)
  {
   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 Dimensionalität des unteren Punktes |
//+------------------------------------------------------------------+
int getLowDimension(MqlRates &tmpRates[],int tmp_i,int tmp_iCod)
  {
   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);
  }
//+-------------------------------------------------------------------------------+
//| Löschen des Graphen von Objekten, die durch das Skript erstellt wurden, im Falle einer erneuten Anwendung
//+-------------------------------------------------------------------------------+
int CleanChart()
  {
   string Label=LabelName;
   int obj_total=ObjectsTotal(0,0,-1),n=0;
   for(int obj=obj_total-1; obj>=0; obj--)
     {
      string objname=ObjectName(0,obj,0,-1);
      if(StringFind(objname,Label)>=0)
         ObjectDelete(0,objname);
      n++;
     }
   return(n);
  }
//+------------------------------------------------------------------+
Dateien:
KeyFinder.mq5  16 kb
 
Ich habe es ausprobiert und fand es gut ..... ein paar Einstellungen, um es auf dem neuesten Stand zu halten.