Ausführliche Erklärung von iCustom

 

Hallo.

Ich bin neu zu codieren, und bin viel zu lernen, aber ich habe etwas, das ich meinen Kopf um im Moment nicht bekommen kann gestoßen. Ich versuche, das Ergebnis eines Tests in einem meiner Indikatoren, zu einem ea aufrufen, so kann es zu seinen eigenen Tests hinzufügen, bevor ein Handel platzieren. Das Ea ist ein einfaches gleitendes Durchschnittskreuz. Der Indikator ist ein Trending- oder Range-Indikator. Ich habe den Code des Indikators beigefügt.

Ich möchte Hilfe, und wenn möglich einfach erklärt, so kann ich meinen Kopf um, wie es sollte innerhalb des Indikators eingerichtet werden, für die ea, um es zu erkennen. Sobald ich den Indikator sortiert haben, werde ich auf die ea bewegen.

Der Indikator hat zwei Tests, in denen ich die iCustom-Funktion hinzufügen möchte. In diesem Stadium möchte ich sie nur in einem Test hinzufügen, egal in welchem, da ich versuche, sie zu verstehen. Jeder, der mir helfen und es einfach erklären könnte, wäre mir sehr behilflich - ich kann im Internet nichts finden, was es so erklärt, dass ich es verstehe. Das Ergebnis des Tests könnte einfach nur "wahr" sein.

Vielen Dank im Voraus für Ihre Zeit.
Mike

//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Yellow
#property  indicator_color2  Red
#property  indicator_width1  1

//---- indicator parameters
extern string PairName = "";   // Leave blank for the pair of the chart, enter other pair name to compare correlated pairs

extern int StdDev.MA.Period=12;  // D1=20
extern int StdDev.MA.Shift=0;    //
extern int StdDev.MA.Method = 0; // 0=SMA 1=EMA 2=Smoothed 3=Linear Weighted
extern int StdDev.MA.Price = 0;  // 0 Close price, 1 Open price, 2 High price, 3 Low price, 4 Median price, (high+low)/2, 5 Typical price, (high+low+close)/3, 6 Weighted close price, (high+low+close+close)/4

extern int MA.Fast.Period = 3;
extern int MA.Fast.Method = 2;   //  0=SMA 1=EMA 2=Smoothed 3=Linear Weighted
extern int MA.Fast.Shift = 0;

extern bool CheckOncePerBar = true;

int i, limit, counted_bars;
static string Pair1;

datetime CurrentTimeStamp;

//---- indicator buffers
double     STDBuffer[];
double     stddevma[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
  
   IndicatorDigits(Digits+1);
     
//---- drawing settings
   SetIndexStyle(0,DRAW_LINE); // 
   SetIndexStyle(1,DRAW_LINE);

      
//---- indicator buffers mapping
   SetIndexBuffer(0, STDBuffer);
   SetIndexBuffer(1, stddevma);

   
   if (PairName == "") Pair1 = Symbol();
   else Pair1 = PairName;

//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("SFX TOR: "+Pair1+"("+StdDev.MA.Period+")");
   SetIndexLabel(0,"StdDev");
   SetIndexLabel(1,"StdDev MA");

//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()
  {

   counted_bars=IndicatorCounted();
   
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   
//---- macd counted in the 1-st buffer
  for(int i=limit-1; i>=0; i--){
     STDBuffer[i]=iStdDev(Pair1,0,StdDev.MA.Period, StdDev.MA.Shift, StdDev.MA.Method, StdDev.MA.Price, i);
     }
  for(i=limit-1; i>=0; i--){
     stddevma[i] = iMAOnArray(STDBuffer, 0, MA.Fast.Period, MA.Fast.Shift, MA.Fast.Method, i);
     } 
    
//Execute on bar Open
    if( CheckOncePerBar == true ){
      if( CurrentTimeStamp == Time[0] )
         return( 0 );
   }
   
   CurrentTimeStamp = Time [0];
   
//Tests
        
      if( STDBuffer[1] > stddevma[1] ){
      if( STDBuffer[2] <= stddevma[2]){
         PlaySound("alert.wav");
         Alert(Symbol()," M",Period()," 30MCrossing");
         SendMail("30MCrossing","30MCrossing");
      }   
   }
   else{ // if it's not greater then it is either lesser than or equal
      if( STDBuffer[2] >= stddevma[2]){
         PlaySound("alert.wav");
         Alert(Symbol()," M",Period()," 30MCrossing");
         SendMail("30MCrossing","30MCrossing");  
      }
   }
          
//---- done
   return(0);
  }
 

Mit iCustom können Sie auf Ihre Indikatorpuffer zugreifen ... so einfach ist das.

Wenn Sie z.B. einen EA schreiben, dessen Strategie auf 2 Indikatoren basiert, könnten Sie den Indikatorcode in den EA einbauen. Das ist möglich, aber etwas umständlich, da Indikatorpuffer bei EAs nicht funktionieren, Sie müssten Arrays verwenden und sie "serienmäßig" behandeln ... die Alternative ist, die Indikatoren laufen zu lassen und auf ihre Puffer vom EA aus zuzugreifen ... genau das ermöglicht iCustom. Es sind keine Änderungen an den Indikatoren erforderlich ... der EA greift einfach auf die Puffer zu, die er bei den benötigten Shift-Werten benötigt. Im iCustom-Aufruf können auch alle externen Variablen übergeben werden, die für die Einrichtung des Indikators erforderlich sind

 
RaptorUK:

Mit iCustom können Sie auf Ihre Indikatorpuffer zugreifen ... so einfach ist das.

Wenn Sie z.B. einen EA schreiben, dessen Strategie auf 2 Indikatoren basiert, könnten Sie den Indikatorcode in den EA einbauen. Das ist möglich, aber etwas umständlich, da Indikatorpuffer bei EAs nicht funktionieren, Sie müssten Arrays verwenden und sie "serienmäßig" behandeln ... die Alternative ist, die Indikatoren laufen zu lassen und auf ihre Puffer vom EA aus zuzugreifen ... genau das ermöglicht iCustom. Es sind keine Änderungen an den Indikatoren erforderlich ... der EA greift einfach auf die Puffer zu, die er bei den benötigten Shift-Werten benötigt. Im iCustom-Aufruf können auch alle externen Variablen übergeben werden, die zum Einrichten des Indikators benötigt werden.


Danke dafür RaptorUK, aber es ist die eigentliche Kodierung, mit der ich Schwierigkeiten habe. Ich bin sehr neu in MQL4, und haben nur getan, es ein paar Monate, und bin immer noch lernen - so brauche ich eine einfache Erklärung der Codierung und wie man es in den Indikator einrichten.

Vielen Dank

Mike

 

RaptorUK:

Im iCustom-Aufruf können auch alle externen Variablen übergeben werden, die für die Einrichtung des Indikators erforderlich sind.

Berichtigung ...

In dem iCustom-Aufruf

MUSS auch alle externen Variablen übergeben, die für die Einrichtung des Indikators erforderlich sind, sofern zutreffend.
 
NewCoder47:


Vielen Dank für diese RaptorUK, aber es ist die eigentliche Kodierung, dass ich Schwierigkeiten mit habe. Ich bin sehr neu in MQL4, und haben nur getan, es ein paar Monate, und bin immer noch lernen - so brauche ich eine einfache Erklärung der Codierung und wie man es in den Indikator einrichten.

Danke

Mike

Was Sie hier offensichtlich übersehen, ist, dass Sie iCustom nicht in dem Indikator verwenden. Der Indikator ist ein eigenständiges Stück Code. Ihr EA kann nun einen Blick darauf werfen, was im Indikator passiert, indem er den Befehl iCustom verwendet.

https://docs.mql4.com/indicators/iCustom

https://forum.mql4.com/42002

 
dabbler:

Berichtigung ...

Im iCustom-Aufruf heißt es

MUSS

auch alle externen Variablen übergeben, die zum Einrichten des Indikators benötigt werden, sofern zutreffend.
Man kann die externen Werte leer lassen. Der iCustom()-Indikator würde dann seine Standardwerte verwenden.
 
dabbler:

Berichtigung ...

Im iCustom-Aufruf heißt es

MUSS

auch alle externen Variablen übergeben, die zum Einrichten des Indikators benötigt werden.

Ich habe diesbezüglich verschiedene Aussagen gelesen... Ich habe noch nie iCustom verwendet, kann also nicht aus persönlicher Erfahrung sprechen, aber trifft Ihre Aussage auch dann zu, wenn die standardmäßigen externen Variablen benötigt werden?
 
RaptorUK:
Ich habe verschiedene Aussagen dazu gelesen... Ich habe noch nie iCustom verwendet, kann also nicht aus eigener Erfahrung sprechen ... aber trifft Ihre Aussage auch dann zu, wenn die standardmäßigen externen Variablen benötigt werden?
Ja. Das Problem ist, dass die letzten beiden Parameter der iCustom entscheidend sind, so dass Sie nichts weglassen können.
 
dabbler:
Ja. Das Problem ist, dass die letzten beiden Parameter des iCustom entscheidend sind, so dass Sie nichts auslassen können.
Natürlich ... danke.
 
ubzen:
Man kann die externen Werte leer lassen. Der iCustom()-Indikator würde dann seine Standardwerte verwenden.
Nein, das kann man nicht. Ich habe es gerade ausprobiert. Es wird nicht kompiliert, wenn Sie einen der Parameter weglassen, indem Sie einfach eine leere Stelle zwischen den Kommas lassen.
 
NewCoder47:


.... Ich bin sehr neu in MQL4 und arbeite erst seit ein paar Monaten damit und lerne immer noch - daher benötige ich eine einfache Erklärung der Kodierung und wie man sie im Indikator einrichtet....

Ich erkenne den Indikator als den Trend_Or_Range-Indikator von BarrowBoy. Der Schlüssel zum Verständnis von Indikatoren ist das Verständnis von Arrays. Ich hatte eine gesunde Angst vor Arrays, bis mir klar wurde, dass ich sie seit dem ersten Tag in mql4 benutze. OrderSelect() und Ma_CrossOver Logik sind einige der ersten Dinge, die man verstehen muss, um einen EA zu erstellen.

Wie Raptor und Dabber hervorgehoben haben. Sie sind nur eine Reihe von Zahlen, die rückwärts oder vorwärts gezählt werden. Indikatoren haben den zusätzlichen Vorteil, dass sie viel mehr visuelle Werkzeuge als Experten nutzen. Da dieser benutzerdefinierte Indikator beschäftigt allot von Standard-Indikatoren wie Standardabweichung und gleitende Durchschnitte, empfehle ich tun diese Berechnungen innerhalb der EA.