Explication détaillée d'iCustom - page 3

 
NewCoder47:

Merci Dabbler. J'ai joint l'EA et l'indicateur complets. J'ai lu les déclarations sur iCustom, et j'ai tout compris sauf la partie sur les paramètres,

Ce qui entre dans les paramètres sont les valeurs que vous voulez utiliser pour les variables externes dans l'indicateur... dans ce cas, celles-ci....

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

Regardons à nouveau le fichier d'aide.

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

en regardant la définition de la partie ....

... - Paramètres passés (si nécessaire). Les paramètres passés et leur ordre doivent correspondre à l'ordre de déclaration et au type des variables externes de l'indicateur personnalisé.


Vous avez 9 variables externes et donc besoin de 9 paramètres dans le bon ordre et avec le bon type.

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

C'est simple comme bonjour.

Puis vous demandez : "Y a-t-il un moyen de voir physiquement quelles valeurs sont envoyées à l'EA ?"

Bien sûr.

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

Oui, sauf que Null est une faute de frappe.

Commencez par l'indicateur et générez le code.

Indicateur
EA
Nom de fichier de l'indicateur sans extension, y compris les blancs s'il y en a.
#define SFX "SFX"
#define puisque c'est une constante. Définissez-le une fois pour qu'il n'y ait pas de fautes de frappe.
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;
Les valeurs qui n'affectent PAS les buffers peuvent être rendues constantes.
   SetIndexBuffer(0, STDBuffer);
   SetIndexBuffer(1, stddevma);
Il peut être nécessaire de lire le code pour trouver la signification des tampons. Par exemple
STDBuffer[i]= iStdDev(...)
stddevma[i] = iMAOnArray(
#define SFX_STD   0
#define SFX_STDMA 1
Les appels sont alors
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)
 

Merci pour votre réponse.


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

 
ubzen:
Oui. Tout le temps. Je parle des valeurs externes. Et je suppose que tu parles de Buffers.

Oui UBZEN,


J'ai également essayé ce que vous avez suggéré et il a retourné la valeur telle qu'elle est indiquée dans mon indicateur.....

il est simplement, facile à ajouter ou à utiliser sans tous ces longs paramètres.... surtout celui avec les tableaux.......

Je pourrais me perdre dans la compilation des paramètres, pas vous............ les PRO'S ici.

merci beaucoup.... J'ai cherché cette réponse pendant quelques jours.

 
WHRoeder: Les appels sont alors :
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)
Qui doivent ensuite être encapsulés.
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:

iCustom vous permet d'accéder aux tampons de vos indicateurs... c'est aussi simple que cela.

Par exemple, vous écrivez un EA qui a une stratégie basée sur 2 Indicateurs, vous pourriez intégrer le code de l'Indicateur dans l'EA, c'est possible mais c'est un peu compliqué car les tampons des Indicateurs ne fonctionnent pas sur les EAs, vous devriez utiliser des tableaux et les gérer d'une manière "as series" ... l'alternative est d'avoir les Indicateurs en cours d'exécution et d'accéder à leurs tampons depuis l'EA ... c'est ce que iCustom facilite. Aucune modification n'est nécessaire pour les indicateurs... l'EA accède simplement aux tampons dont il a besoin aux valeurs de décalage dont il a besoin. Dans l'appel iCustom, il peut également passer toutes les variables externes qui sont nécessaires pour configurer l'indicateur, le cas échéant.

Cher RaptorUK (et d'autres qui pourraient être en mesure d'aider),


Dans le message cité, vous décrivez deux façons d'utiliser les valeurs d'indicateurs personnalisés dans un EA. La première est avec iCustom que je connais déjà. La seconde est une méthode que j'aimerais vraiment apprendre à connaître car j'ai déjà essayé d'internaliser le code des indicateurs personnalisés dans le corps de l'indicateur principal, mais sans succès. Vous voyez, lorsque j'ai transformé un indicateur en fonction et que je l'ai laissé retourner sa valeur la plus courante (la valeur de l'élément 0), j'obtiens toujours la valeur EMPTY_VALUE pour une variable double au lieu de la valeur calculée elle-même. J'ai essayé d'utiliser la fonction iCustom, en fixant le décalage à 0, la valeur la plus récente. Lorsque je fais cela, le terminal commence par retourner 0 couplé avec l'erreur STACK OVERFLOW dans l'onglet experts. Lors du deuxième tic-tac, il renvoie une valeur mais après chaque paire de valeurs [0] imprimées, il donne une autre erreur STACK OVERFLOW, cela se répète encore et encore. Parce que iCustom retourne la valeur 0 et STACK OVERFLOW à la première initialisation (et seulement après commence à donner des valeurs correctes) je ne peux pas utiliser icustom dans mon EA parce qu'il appelle icustom pour un symbole différent chaque fois que Start() est activé et il appelle plusieurs indicateurs personnalisés pour cela. Cela provoque un crash de l'EA. Je ne comprends pas pourquoi j'obtiens une erreur STACK OVERFLOW lorsque je veux qu'icustom renvoie la valeur la plus récente [0] mais j'aimerais bien le savoir. Je préfère cependant internaliser le code de tous les indicateurs qui sont appelés en les transformant en fonctions à l'intérieur de l'indicateur principal. Vous avez dit quelque chose à propos de l'utilisation de tableaux et de leur traitement "en tant que série". Pourriez-vous développer ce point ?

J'ai ajouté un fichier mq4 de l'indicateur classique ADX.mq4. A l'intérieur, la valeur de ADX est imprimée deux fois. Une fois par Icustom, et une seconde fois par le code ADX qui a été transformé en fonction dans l'ADX. Icustom(ADX) renvoie une valeur mais ADX(symbol,timeframe) ne le fait pas. Il renvoie toujours la même valeur EMPTY_VALUE de 247456457457 ou quelque chose comme ça, encore et encore. Veuillez expliquer pourquoi cela se produit et comment je peux y remédier à la fois dans un modèle EA et dans un fichier d'indicateur personnalisé mq4.


Cordialement et merci d'avance


PS : le fichier attaché ne semble pas fonctionner. Mais vous pouvez télécharger l'indicateur d'exemple CallicustomvsFunction et l'indicateur personnalisé ADX sur http://www.forexfactory.com/showthre...37#post8569537(mon nom est Codix).

Dossiers :
 
  1. Ne doublez pas les messages
  2. Ne détournez pas d'autres fils de discussion ; Vos questions ne concernent pas l'utilisation d'iCustom.
 

Dans les messages ci-dessus(https://www.mql5.com/en/forum/138577/page3#627521 et https://www.mql5.com/en/forum/138577/page3#797401), j'ai utilisé des points et des séparateurs de mots.

Cela n'est plus autorisé depuis le 3 février2014 (Build 600). Utilisez un trait de soulignement ou une majuscule.

 
whroeder1:

Utilisez un trait de soulignement ou une majuscule.

Je ne savais pas que ça s'appelait "camel case". Merci.