Mon indicateur disparaît chaque fois que je change de cadre temporel.

 

Bonjour,

Je commence avec un indicateur (La PREMIÈRE PARTIE). Il fonctionne bien, en changeant de cadre temporel.

Ensuite, j'ajoute la deuxième partie qui est : Si Close[i]-Close[i+1] est inférieur à la médiane de la valeur de la différence des 100 dernières barres, je vais attribuer la valeur 0 à tous les tampons.

Maintenant, l'indicateur combiné fonctionne bien sur un graphique mais lorsque je change de période, cet indicateur disparaît. Je dois le rattacher au graphique.

Je pense que le problème est causé par Array mais je ne sais pas comment le résoudre.

Quelqu'un peut-il m'aider à résoudre cette erreur ?

Merci beaucoup.

SCFX

//+------------------------------------------------------------------+
//|                                                          hf1.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              httakeprofit://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "httakeprofit://www.mql5.com"
#property version   "1.00"
#property strict

//--- indicator settings
//#property indicator_chart_window
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_width1 2  
#property indicator_width2 2 
#property indicator_width3 1 
#property indicator_width4 1 
#property indicator_width5 1 

#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_color4 Orange
#property indicator_color5 Orange

//--- input parameter
input int kperiod=30;
input int dperiod=9;
input int slow=9;
input int sample_roc_quartile=100;

//--- buffers
double buy[];
double sell[];
double stoploss[];
double takeprofit1[];
double takeprofit2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void) //*/*/*/*/*/
  {
//--- indicator buffers mapping
//--- 1 additional buffer used for counting.
   //IndicatorBuffers(6);
   IndicatorDigits(Digits);
//--- indicator line
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexBuffer(0,buy);
   SetIndexArrow(0,241);
   
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexBuffer(1,sell);
   SetIndexArrow(1,242);

   SetIndexStyle(2,DRAW_ARROW);
   SetIndexBuffer(2,stoploss);

   SetIndexStyle(3,DRAW_ARROW);
   SetIndexBuffer(3,takeprofit2); 
         
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexBuffer(4,takeprofit1);  
   
  
//--- name for DataWindow and indicator subwindow label

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
      int limit=rates_total-prev_calculated;
      
      double roc_s[];
      ArrayResize(roc_s,sample_roc_quartile+1);

//---

//------------------------------------------ 

for(int i=0; i<limit; i++)
{  

//FIRST PSART 

   if(iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i)>iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i)   &&   iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))   
      {  buy[i]=Close[i]; 
         stoploss[i]=Low[i]-0.005; 
         takeprofit1[i]=Close[i]+0.005;
         takeprofit2[i]=Close[i]+0.01;
         }
      
   if(iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i)   &&   iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)>iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))   
      {  sell[i]=Close[i]; 
         stoploss[i]=High[i]; 
         takeprofit1[i]=Close[i]-0.0050;
         takeprofit2[i]=Close[i]-0.01;
         }   
         
//SECOND PART         
   for(int j=0;j<=sample_roc_quartile;j++)
   {
      roc_s[j]=Close[i+j]-Close[i+j+1];
      ArraySort(roc_s);
      
      if(   (Close[i]-Close[i+1])<roc_s[50]  )
         {  buy[i]=0; 
            stoploss[i]=0; 
            takeprofit1[i]=0;
            takeprofit2[i]=0;
         }
    }     
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Il est possible que le tableau soit hors de portée et que l'indicateur soit supprimé.

int limit=rates_total-prev_calculated;

for(int i=0; i<limit; i++)
iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))

Il est possible que vous obteniez un message dans le journal concernant un échec d'initialisation globale.
Vérifiez vos journaux

 

Merci pour votre suggestion.

J'ai vérifié le journal, il n'y a aucune erreur ou avertissement.

Je ne suis pas sûr que le (i+1) cause des problèmes puisque seul (ou en supprimant simplement la deuxième partie), cet indicateur fonctionne bien.

SCFX

 

Il y a des erreurs J'ai compilé votre code et l'ai testé :

2014.05.22 22:39:43.936 Indicateur personnalisé Test Indicator 3 XAUUSD,M1 : supprimé
2014.05.22 22:39:43.905 Test Indicator 3 XAUUSD,M1 : échec de l'initialisation globale
2014.05.22 22:39:43.905 Test Indicator 3 XAUUSD,M5 : uninit reason 3 //----------------------- change chart
2014.05.22 22:39:17.323array out of range dans 'Test Indicator 3.mq4' (117,32)
2014.05.22 22:39:15.591 Indicateur de test 3 XAUUSD,M5 : initialisé
2014.05.22 22:39:09.570 Indicateur personnalisé Test Indicator 3 XAUUSD,M5 : chargé avec succès

 
scfx:

Merci pour votre suggestion.

J'ai vérifié le journal, il n'y a aucune erreur ou avertissement.

Je ne suis pas sûr que le (i+1) cause des problèmes puisque seul (ou en supprimant simplement la deuxième partie), cet indicateur fonctionne bien.

SCFX


Alors c'est probablement ceci

roc_s[j]=Close[i+j]-Close[i+j+1];

Vous essayez d'obtenir le prix de clôture de barres qui n'existent pas.

 

Vous devriez ajouter une ligne lorsque l'indicateur est lancé pour la première fois : prev_calculated == 0,

quelque chose comme ça :

 int limit = -100;
   if( prev_calculated == 0 ) limit = 3000;// will calculate 3000 Bars
    else                      limit = rates_total-prev_calculated;
      

pas d'erreur sur mon ordinateur non plus ;-)

 

Salut ffoorr,

Votre solution est vraiment bonne.

Pour vous dire la vérité, j'ai engagé quelqu'un pour la réparer hier soir. Oui il l'a fait mais le code est inefficace, voir ci-dessous, car il a ajouté un for(i) supplémentaire.

J'apprécierais si vous pouviez m'expliquer ce que signifie prev_calculated ==0. Je ne comprends pas.

//+------------------------------------------------------------------+
//|                                                          hf1.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              httakeprofit://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "httakeprofit://www.mql5.com"
#property version   "1.00"
#property strict

//--- indicator settings
//#property indicator_chart_window
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_width1 2  
#property indicator_width2 2 
#property indicator_width3 1 
#property indicator_width4 1 
#property indicator_width5 1 

#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_color4 Orange
#property indicator_color5 Orange

//--- input parameter
input int kperiod=30;
input int dperiod=9;
input int slow=9;
input int sample_roc_quartile=100;

//--- buffers
double buy[];
double sell[];
double stoploss[];
double takeprofit1[];
double takeprofit2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void) //*/*/*/*/*/
  {
//--- indicator buffers mapping
//--- 1 additional buffer used for counting.
   //IndicatorBuffers(6);
   IndicatorDigits(Digits);
//--- indicator line
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexBuffer(0,buy);
   SetIndexArrow(0,241);
   
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexBuffer(1,sell);
   SetIndexArrow(1,242);

   SetIndexStyle(2,DRAW_ARROW);
   SetIndexBuffer(2,stoploss);

   SetIndexStyle(3,DRAW_ARROW);
   SetIndexBuffer(3,takeprofit2); 
         
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexBuffer(4,takeprofit1);  
   
  
//--- name for DataWindow and indicator subwindow label

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
      int limit=rates_total-prev_calculated;
          if(limit<=0)limit =2;
     
      double roc_s[];
      ArrayResize(roc_s,sample_roc_quartile+1);

//---

//------------------------------------------ 

for(int i=1; i<limit; i++)
{  

//FIRST PSART 

   if(iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i)>iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i)   
   &&   iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))   
      {  buy[i]=Close[i]; 
         stoploss[i]=Low[i]-0.005; 
         takeprofit1[i]=Close[i]+0.005;
         takeprofit2[i]=Close[i]+0.01;
         }
      
   if(iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i)   
   &&   iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)>iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))   
      {  sell[i]=Close[i]; 
         stoploss[i]=High[i]; 
         takeprofit1[i]=Close[i]-0.0050;
         takeprofit2[i]=Close[i]-0.01;
         }   
} 

    
//SECOND PART   

//--------------------------------------- HERE IS THE WHAT HE DID
int mid = (sample_roc_quartile +1)/2;
  
for(int i=1; i<limit&&(i+1)<rates_total; i++)
{    

//---------------------------------------------


  for(int j=0;j<=sample_roc_quartile&&(i+j+1)<rates_total;j++)
   {
      roc_s[j]=Close[i+j]-Close[i+j+1];
      ArraySort(roc_s);
   }   
      
      if( (Close[i]-Close[i+1])<roc_s[mid]  )
         {  buy[i]=0; 
            stoploss[i]=0; 
            takeprofit1[i]=0;
            takeprofit2[i]=0;
         }
    
 }    

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Bonjour à tous...


J'ai des problèmes pour installer l'indicateur traditionnel IBFX MACD et d'autres modèles dans mon MT4.

Dans la version précédente, je n'avais qu'à copier et coller mes fichiers dans le dossier "indicator" situé dans le dossier "expert".

La version actuelle n'a que le dossier "MQL4" qui consiste en un dossier "expert" et un dossier "indicateur" séparés.

J'ai essayé de coller dans les deux dossiers et de redémarrer ma plateforme mais cela ne fonctionne pas.

pas se produire.

Est-ce que quelqu'un peut me conseiller sur ce problème ? ou peut-être d'autres moyens pour moi d'obtenir l'indicateur MACD traditionnel avec 2 lignes EMA ?

Merci

Douglas
 
douglas beng vous devez arrêter de poser vos questions sur les sujets des autres quand elles ne sont pas liées à leur sujet. COMMENCEZ VOTRE PROPRE SUJET.
 
douglas_heng: J'ai des problèmes pour installer l'indicateur traditionnel IBFX MACD et d'autres modèles dans mon MT4.
Ne pas Ne pas multiplier les (6) messages. Ne pas détourner les messages des autres.
 
scfx:

Salut ffoorr,

Votre solution est vraiment bonne.

Pour vous dire la vérité, j'ai engagé quelqu'un pour la réparer hier soir. Oui il l'a fait mais le code est inefficace, voir ci-dessous, car il a ajouté un for(i) supplémentaire.

J'apprécierais si vous pouviez m'expliquer ce que signifie prev_calculated ==0. Je ne comprends pas.


eh bien scfx, je ne comprends pas la deuxième partie de votre indicateur, donc je ne peux pas le dire.

Quand on démarre un indicateur pour la première fois, (mis sur un graphique) prev_calcul est égal à Zéro par construction, donc on peut fixer le point de départ à partir duquel l'indicateur va commencer à calculer .

if( prev_calculated == 0) limit = 100 ;

ou

if( prev_calculated < 50) limite = 500 :

ou dire

if( prev_calculated < 500) limit = 3000 : (tout de même, le début du graphique n'est pas utilisé)

int limit = -100;
   if( prev_calculated == 0 ) limit = 3000;// will calculate 3000 Bars
    else                      limit = rates_total-prev_calculated;

at the first lauch of the indicator limit = 3000;

for(int i=1; i<3000; i++) // draw 3000 bars 

at the second lauch limit = 0; // ( because rates_total-prev_calculated = 0)  ;
for(int i=1; i<0; i++)    //   draw the last bars only, faster

très bonne idée cette indi ......

Raison: