Ausführliche Erklärung von iCustom - Seite 3

 
NewCoder47:

Danke Dabbler. Ich habe den vollständigen EA und Indikator angehängt. Ich habe die Anweisungen zu iCustom gelesen und verstehe alles bis auf den Teil mit den Parametern,

Was geht in den Parametern sind die Werte, die Sie für die externen Variablen in den Indikator verwenden möchten ... in diesem Fall diese ...

//---- 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;
 

Schauen wir uns noch einmal die Hilfedatei an.

double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift) 
 

und sehen uns die Definition des ... Teils an.

... - Parameter gesetzt (falls erforderlich). Die übergebenen Parameter und ihre Reihenfolge müssen mit der Reihenfolge der Deklaration und dem Typ der externen Variablen des benutzerdefinierten Indikators übereinstimmen.


Sie haben 9 externe Variablen und benötigen daher 9 Parameter in der richtigen Reihenfolge und mit dem richtigen Typ

     double     STDBuffer = iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,0,0);
     double     stddevma =  iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,1,0);

Kinderleicht.

Dann fragen Sie: "Gibt es auch eine Möglichkeit, physisch zu sehen, welche Werte an den EA gesendet werden?"

Ja, natürlich.

Comment("StdBuffer=" + STDBuffer+"\nstddevma=" + stddevma);
 
dabbler:
 double     STDBuffer = iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,0,0);
 double     stddevma =  iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,1,0);

Ja, außer dass Null ein Tippfehler ist.

Beginnen Sie mit dem Indikator und generieren Sie den Code.

Indikator
EA
Dateiname des Indikators ohne Erweiterung, einschließlich Leerzeichen, falls vorhanden.
#define SFX "SFX"
#define, da er konstant ist. Definieren Sie es einmal, damit es keine Tippfehler gibt.
extern string PairName = "";     // Leave blank for ...

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=Sm...
extern int StdDev.MA.Price = 0;  // 0 Close price, 1 O...
extern int MA.Fast.Period = 3;
extern int MA.Fast.Method = 2;   //  0=SMA 1=EMA 2=Sm ...
extern int MA.Fast.Shift = 0;

extern bool CheckOncePerBar = true;
string  PairName            = "";     
int     StdDev.MA.Period    = 12;  
int     StdDev.MA.Shift     =  0;    
int     StdDev.MA.Method    =  MODE_SMA; 
int     StdDev.MA.Price     =  PRICE_CLOSE;  
int     MA.Fast.Period      =  3;
int     MA.Fast.Method      =  MODE_SMMA;
int     MA.Fast.Shift       =  0;
#define CheckOncePerBar        true;
Werte, die NICHT die Puffer beeinflussen, können konstant gemacht werden.
   SetIndexBuffer(0, STDBuffer);
   SetIndexBuffer(1, stddevma);
Möglicherweise müssen Sie den Code lesen, um die Bedeutung der Puffer zu erfahren. z.B..
STDBuffer[i]= iStdDev(...)
stddevma[i] = iMAOnArray(
#define SFX_STD   0
#define SFX_STDMA 1
Die Aufrufe lauten dann
double     STDBuffer = iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STD, 0)
double     stddevma =  iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STDMA, 0)
 

Vielen Dank für Ihre Antwort. also


 ExtMapBuffer1[i+3] = lower_fractal_7b;     could be used as calculated value when reversal fractal is called?

 
ubzen:
Ja. Die ganze Zeit. Ich spreche von Extern Values. Und ich nehme an, Sie sprechen von Puffern.

Ja, UBZEN,


Ich habe auch versucht, was Sie vorgeschlagen haben und es hat den Wert zurückgegeben, der in meinem Indikator angegeben ist....

Es ist einfach, leicht hinzuzufügen oder zu verwenden, ohne all diese langen Parameter.... besonders die mit Arrays.......

Ich könnte mich beim Kompilieren der Parameter verirren, aber nicht ihr............ die PRO'S hier

Vielen Dank.... Ich habe ein paar Tage lang nach dieser Antwort gesucht

 
WHRoeder: Die Anrufe sind dann:
double     STDBuffer = iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STD, 0)
double     stddevma =  iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STDMA, 0)
Die dann gekapselt werden sollten.
double getSFX(int eBuf, int iBar = 0, int eTF=0){ 
   return( iCustom(NULL, eTF ,SFX,
                      PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                      StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                      MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                   eBuf, iBar) ); 
}
:
double     STDBuffer = getSFX(SFX_STD, 0);
double     stddevma  = getSFX(SFX_STDMA, 0);
:
 
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.

Lieber RaptorUK (und andere, die vielleicht helfen können),


in dem zitierten Beitrag beschreiben Sie zwei Möglichkeiten, benutzerdefinierte Indikatorwerte in einem EA zu verwenden. Die erste ist mit iCustom, die ich bereits kenne. Die zweite ist eine, über die ich wirklich gerne mehr erfahren würde, weil ich versucht habe, den Code von benutzerdefinierten Indikatoren in den Körper des Hauptindikators zu internalisieren, aber ohne Erfolg. Wenn ich einen Indikator in eine Funktion umwandle und seinen aktuellsten Wert (den Wert in Element 0) zurückgeben lasse, erhalte ich immer den EMPTY_VALUE für eine Doppelvariable anstelle des berechneten Wertes selbst. Ich habe versucht, die iCustom-Funktion zu verwenden und die Verschiebung auf 0, den aktuellsten Wert, zu setzen. Wenn ich dies tue, beginnt das Terminal mit der Rückgabe von 0, verbunden mit dem Fehler STACK OVERFLOW in der Registerkarte Experten. Beim zweiten Ticken gibt es einen Wert zurück, aber nach jedem Paar gedruckter [0]-Werte gibt es einen weiteren STACK OVERFLOW-Fehler, der immer wieder auftritt. Da iCustom bei der ersten Initialisierung den Wert 0 und STACK OVERFLOW zurückgibt (und erst danach beginnt, korrekte Werte zu liefern), kann ich icustom nicht in meinem EA verwenden, da es icustom jedes Mal, wenn Start() aktiviert wird, für ein anderes Symbol aufruft und dafür mehrere benutzerdefinierte Indikatoren aufruft. Dies bewirkt, dass der EA zum Absturz bringt. Ich verstehe nicht, warum ich einen STACK OVERFLOW Fehler erhalte, wenn ich möchte, dass icustom den letzten Wert [0] zurückgibt, aber ich würde es gerne wissen. Ich ziehe es jedoch vor, den Code aller Indikatoren, die aufgerufen werden, zu internalisieren, indem ich sie in Funktionen innerhalb des Hauptindikators umwandle. Sie sagten etwas über die Verwendung von Arrays und deren Handhabung in einer "as series fashion". Könnten Sie das bitte näher erläutern?

Ich habe eine mq4-Datei des klassischen Indikators ADX.mq4 hinzugefügt. Darin wird der Wert des ADX zweimal gedruckt. Einmal durch Icustom und zum anderen durch den ADX-Code, der in eine Funktion innerhalb des ADX umgewandelt wurde. Icustom(ADX) gibt einen Wert zurück, aber ADX(Symbol,Zeitrahmen) nicht. Er gibt immer wieder den gleichen EMPTY_VALUE von 247456457457 oder so ähnlich zurück. Bitte erklären Sie mir, warum dies geschieht und wie ich dies sowohl in einer EA-Vorlage als auch in einer mq4-Indikatordatei beheben kann.


Mit freundlichen Grüßen und vielen Dank im Voraus


PS: Datei anhängen scheint nicht zu funktionieren. Aber Sie können sowohl den CallicustomvsFunction Beispielindikator als auch den ADX-Indikator von http://www.forexfactory.com/showthre...37#post8569537 herunterladen (mein Name ist Codix)

Dateien:
 
  1. Keine Doppelposts
  2. Versuchen Sie nicht, andere Themen zu kapern; Ihre Fragen betreffen nicht die Verwendung von iCustom.
 

In den obigen Beiträgen(https://www.mql5.com/en/forum/138577/page3#627521 und https://www.mql5.com/en/forum/138577/page3#797401) habe ich Punkte und Worttrenner verwendet.

Das ist seit dem 3. Februar2014 (Build 600) nicht mehr erlaubt. Verwenden Sie einen Unterstrich oder Großbuchstaben.

 
whroeder1:

Verwenden Sie einen Unterstrich oder Großbuchstaben.

Ich wusste nicht, dass es Kamelschreibweise genannt wird. Danke!