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

 

Merci pour votre explication.

Je vois mieux maintenant.

SCFX

 

Bonjour,

Je me gratte la tête avec cette erreur folle.

Toujours ce simple indicateur de code à 4 lignes qui disparaît lorsque je change de timeframe.

C'est fou, j'ai déjà appliqué les suggestions postées ici mais j'ai toujours échoué.

Je me sens si mal...

S'il vous plaît, aidez-moi.

Merci beaucoup,

SCFX

//+------------------------------------------------------------------+
//|                                                        H_roc.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//#property indicator_minimum -3.5
//#property indicator_maximum 3.5
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "boring"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
//--- indicator buffers
double         boring[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,boring);
   
          
//---
   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=300;
//---
 
 for(int i=1;i<=limit  ;i++)
{  if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50
     ) 
      boring[i]=Close[i];
    
}  
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
scfx:

Bonjour,

Je me gratte la tête avec cette erreur folle.

Toujours ce simple indicateur de code à 4 lignes qui disparaît lorsque je change de timeframe.

C'est fou, j'ai déjà appliqué les suggestions postées ici mais j'ai toujours échoué.

Je me sens si mal...

S'il vous plaît, aidez-moi.

Merci beaucoup,

SCFX



2014.06.15 11:26:39.908 divide zero dans 'test.mq4' (59,44)
 
angevoyageur:
2014.06.15 11:26:39.908 zero divide in 'test.mq4' (59,44)


Merci de votre réponse.

Sur mon journal, il n'y a pas d'avis de ce type mais lorsque je change de TF, cet indicateur est supprimé.

Je n'arrive toujours pas à le réparer.

SCFX

2014.05.18 08:41:31.080Indicateur personnalisé H_889_boring GBPUSD,H1 : supprimé
2014.05.18 08:41:25.441 Indicateur personnalisé H_889_boring GBPUSD,H4 : chargé avec succès

 
scfx:

Je ne peux toujours pas le réparer.

SCFX

C'est parce que vous n'essayez pas très fort.

Vous n'apprendrez rien si vous demandez à d'autres personnes de le faire pour vous, la seule façon est de le faire vous-même pour le comprendre, la seule façon de le faire vous-même est d'examiner chaque ligne de code, de la décomposer et de comprendre exactement ce qu'elle fait et il y a plusieurs façons de le faire.

for(int i=1;i<=limit  ;i++)
{  if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50
     ) // what is this parentheses doing here ? How can you expect to write code that works if you are this sloppy about it ?
      boring[i]=Close[i];
    
}  

Ce sont toutes des choses que vous pouvez faire pour vous aider à trouver la cause du problème.

  • Vous avez dit avoir vérifié l'onglet "Journal", avez-vous regardé dans l'onglet "Experts" à côté ?
  • Je t'ai déjà dit la semaine dernière que ton code provoquait un array out of range, as-tu regardé ce que cela signifie ?
  • Il y a un débogueur dans metaeditor, tu pourrais essayer d'apprendre à l'utiliser pour déboguer ton code.
  • Tu pourrais utiliser Print() pour vérifier les valeurs de tes variables pendant l'exécution du code.

Si vous aviez cliqué sur l'onglet experts, il vous aurait dit que votre indicateur a fait une division par zéro sur cette ligne, le changement d'horizon temporel n'a rien à voir avec cela.

if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50

Cela signifie donc que ce High[i]-Low[i] était nul pour une raison quelconque. Si vous regardez l'indicateur sur le graphique, vous pouvez voir que l'indicateur a dessiné certaines de ses valeurs et qu'il s'arrête à une barre où il n'y a qu'un tick. S'il n'y a qu'un tick, high[i] == low[i], ce qui causerait une division par zéro.

Maintenant, assurez-vous que high[i]-low[i] n'est pas utilisé s'il est égal à zéro.

   int limit=rates_total-prev_calculated;
   if(limit<=0) limit=300;
//---
   for(int i=1;i<=limit  ;i++)
   {
    if(High[i] - Low[i] == 0) continue; // --------------- skip this bar
    
    if( MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50 ) 
    {boring[i]=Close[i];
   }}
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Maintenant, vous verrez que l'onglet experts vous indique que le code n'a plus fait de division par zéro mais qu'il a généré une erreur de type array out of range sur cette ligne.

if(high[i] - low[i] == 0)  

Alors que se passe-t-il si vous enlevez tous les calculs et condidtions pour tester la boucle ?

   int limit=rates_total-prev_calculated;
   if(limit<=0) limit=300;
//---

   for(int i=1;i<=limit  ;i++)
   { 
    boring[i]=Close[i];
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Maintenant, l'onglet experts signale à nouveau une erreur de type "array out of range", cette fois sur cette ligne :

boring[i]=Close[i];

Vous savez donc maintenant que votre code provoque un array out of range chaque fois qu'un tableau de prix est utilisé dans la boucle. Trouvez donc ce qui ne va pas dans la boucle et pourquoi Close[i], Low[i], High[i] sont hors limites. Vous pouvez voir que l'indicateur dessine tout le chemin jusqu'à la fin du graphique, donc l'erreur doit être à la fin, les indices de tableau les plus élevés.

   int limit=rates_total-prev_calculated; // what is the value of limit in this calculation when prev_calulated == 0 ?
   if(limit<=0) limit=300;
//---

   for(int i=1;i<=limit;i++) // how does the value of limit compare with the highest available Close[] array index ?

Il semble que vous essayez de créer un indicateur sans apprendre à coder une boucle qui fonctionne correctement. Il y a beaucoup d'exemples de la façon de le faire. Regardez le code des indicateurs inclus et expérimentez avec eux jusqu'à ce que vous compreniez exactement comment ils fonctionnent, puis essayez de créer un indicateur pour dessiner une simple ligne qui fonctionne correctement avant d'essayer de lui faire effectuer des calculs.
 

@ scfx

La seule personne qui peut réparer est vous. Ou allez sur https://www.mql5.com/en/job

et postez le travail là-bas.

 
SDC:
...

S'il vous plaît, SDC, pas besoin d'être si dur, même si vous avez raison.
 
angevoyageur:

S'il vous plaît SDC, pas besoin d'être si dur, même si vous avez raison.

lol j'ai un peu reformulé mon message ;)

 

Désolé, je vous ai induit en erreur, je m'excuse, l'indicateur peut être codé comme ça :

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

 for(int i=limit;  i>=0; i--)
   {
    if(High[i] - Low[i] == 0) continue; // --------------- skip this bar
    

// Please test it, check if it's OK;
// Put the indicator in a backtest EA, say MACDSample, to check it
 

Si le graphique comporte moins de 3000 barres, il sera toujourshors de portée.