Explication détaillée d'iCustom

 

Bonjour.

Je suis nouveau dans le codage, et j'apprends beaucoup, mais j'ai trouvé quelque chose que je n'arrive pas à comprendre pour le moment. J'essaie d'appeler le résultat d'un test dans un de mes indicateurs, à un ea, afin qu'il puisse l'ajouter à ses propres tests avant de placer un trade. L'application est un simple croisement de moyennes mobiles. L'indicateur est un indicateur de tendance ou de gamme. J'ai joint le code de l'indicateur.

Je voudrais de l'aide, et si possible une explication simple pour que je puisse comprendre comment il doit être configuré dans l'indicateur, pour que l'application le reconnaisse. Une fois que j'aurai résolu le problème de l'indicateur, je passerai à l'application.

L'indicateur a deux tests, dans lesquels je voudrais ajouter la fonction iCustom. A ce stade, je ne veux l'ajouter que dans un seul test, peu importe lequel, car j'essaie de le comprendre. Toute personne disposée à m'aider et à m'expliquer simplement serait la bienvenue - je n'arrive pas à trouver en ligne une explication qui me permette de comprendre. Le résultat du test pourrait tout simplement être "vrai".

Merci d'avance pour votre temps.
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);
  }
 

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 de l'iCustom, il peut également passer toutes les variables externes qui sont nécessaires pour configurer l'indicateur, le cas échéant.

 
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.


Merci pour cela RaptorUK, cependant c'est le codage réel avec lequel j'ai des difficultés. Je suis très novice dans MQL4, je ne le pratique que depuis quelques mois et j'apprends encore. J'ai donc besoin d'une explication simple du codage et de la façon de le configurer dans l'indicateur.

Merci

Mike

 

RaptorUK:

Dans l'appel iCustom , il peut également passer toute variable externe nécessaire à la configuration de l'indicateur, le cas échéant.

Correction ...

Dans l'appel iCustom , il

DOIT

également passer toute variable externe nécessaire à la configuration de l'indicateur, le cas échéant.
 
NewCoder47:


Merci pour cette information RaptorUK, mais c'est le codage réel qui me pose problème. Je suis très novice en MQL4, je ne l'utilise que depuis quelques mois et j'apprends encore. J'ai donc besoin d'une explication simple du codage et de la façon de le configurer dans l'indicateur.

Merci

Mike

Ce qui vous échappe manifestement ici, c'est que vous n'utilisez pas iCustom dans l'indicateur. L'indicateur est un morceau de code autonome. Votre EA peut maintenant jeter un coup d'oeil à ce qui se passe dans l'indicateur en utilisant la commande iCustom .

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

https://forum.mql4.com/42002

 
dabbler:

Correction ...

Dans l'appel iCustom , il

MUST

également passer toutes les variables externes qui sont nécessaires pour configurer l'indicateur, le cas échéant.
On peut laisser les valeurs externes vides. L'indicateur iCustom() utilisera alors ses valeurs par défaut.
 
dabbler:

Correction ...

Dans l'appel iCustom , il

MUST

passer également toutes les variables externes nécessaires à la configuration de l'indicateur, le cas échéant.

J'ai lu différentes déclarations à ce sujet... Je n'ai jamais utilisé iCustom donc je ne peux pas parler de mon expérience personnelle... mais est-ce que votre déclaration reste vraie même si les variables externes par défaut sont nécessaires ?
 
RaptorUK:
J'ai lu différentes déclarations à ce sujet... Je n'ai jamais utilisé iCustom donc je ne peux pas parler de mon expérience personnelle... mais est-ce que votre déclaration est vraie même si les variables externes par défaut sont nécessaires ?
Oui. Le problème est que les deux derniers paramètres de l'iCustom sont cruciaux et que vous ne pouvez rien omettre.
 
dabbler:
Oui. Le problème est que les deux derniers paramètres de l'iCustom sont cruciaux et que vous ne pouvez rien omettre.
Bien sûr... merci.
 
ubzen:
On peut laisser les valeurs externes vides. L'indicateur iCustom() utilisera alors ses valeurs par défaut.
Non, c'est impossible. Je viens de l'essayer. Il ne compilera pas si vous omettez un des paramètres en laissant simplement un espace vide entre les virgules.
 
NewCoder47:


.... Je suis très nouveau dans MQL4, je ne le pratique que depuis quelques mois et j'apprends encore - j'ai donc besoin d'une explication simple du codage et de la façon de le configurer dans l'indicateur.....

Je reconnais l'indicateur comme étant l'indicateur Trend_Or_Range de BarrowBoy. La clé pour comprendre les indicateurs est de comprendre les tableaux. J'avais une peur bleue des tableaux jusqu'à ce que je réalise que je les utilise depuis le premier jour de l'utilisation de mql4. Les logiques OrderSelect() et Ma_CrossOver sont parmi les premières choses que l'on doit comprendre pour faire un EA.

Comme Raptor et Dabber l'ont souligné. Ils sont juste une série de nombres comptés à l'envers ou à l'endroit. Les indicateurs ont la valeur ajoutée d'utiliser beaucoup plus d'outils visuels que les experts. Comme cet indicateur personnalisé utilise beaucoup d'indicateurs standards comme l'écart-type et les moyennes mobiles, je recommande de faire ces calculs dans l'EA.