Petit indicateur de gestion de l'argent ruiné par le nouveau MQL4 - page 2

 
@deysmacro : Je sais où se trouve la ligne qui provoque la division par zéro. C'est parce que j'ai besoin de la plage moyenne quotidienne des cinq derniers jours. Plus tard dans l'indicateur je divise quelque chose par cet ATR et tant que les données ne sont pas mises à jour l'ATR est nul et c'est là le problème. J'ai besoin d'être sûr que les données quotidiennes d'au moins les 5 derniers jours sont disponibles. Ce n'est qu'alors que l'ATR sera >0 et que l'indicateur fonctionnera.
 
mar:
@deysmacro : Je sais où se trouve la ligne qui provoque la division par zéro. C'est parce que j'ai besoin de la plage moyenne quotidienne des cinq derniers jours. Plus tard dans l'indicateur, je divise quelque chose par cet ATR et tant que les données ne sont pas mises à jour, l'ATR est nul et c'est là le problème. J'ai besoin d'être sûr que les données quotidiennes d'au moins les 5 derniers jours sont disponibles. Ce n'est qu'alors que l'ATR sera >0 et que l'indicateur fonctionnera.

Mettez les données disponibles dans GV et récupérez-les. De cette façon, lorsque des données arrivent ou qu'il y a des différences dans les données, il suffit de mettre à jour GV.

Peut-être qu'ATR fonctionne de cette façon.


Les gens ont toujours dit "Faites-le fonctionner d'abord, puis optimisez le code."

Parfois, pour que cela fonctionne, la ligne de code est très longue, mais une fois que cela fonctionne, vous pouvez commencer à réduire le code :)

 

Cela peut paraître stupide, mais qu'est-ce que la GV ?

 
Variables globales
 

Bien sûr... :-)

Autre chose que je ne peux pas expliquer : Le code suivant est une petite modification de mon premier code que j'ai posté. C'est aussi un indicateur de Moneymanagement mais j'ai enlevé l'ATR. Il imprime seulement les niveaux de stop loss de 5 à 100 pips par pas de 5 pips. Donc, il n'y a pas de calcul d'ATR du tout. Lorsque vous faites glisser cet indicateur sur votre graphique, il fonctionne parfaitement. Toutes les paires, tous les horizons temporels. Aucun problème. Mais lorsque vous ouvrez le MetaTrader, il provoque une erreur de division par zéro et à nouveau, seul "Label" est imprimé au lieu des niveaux de stop loss.

L'erreur est causée dans cette ligne :

lots=MoneyRisk/SL/(MarketInfo(Symbol(), MODE_TICKVALUE)*multi);

J'ai imprimé TOUTES les variables de cette ligne et je suis arrivé à la conclusion que AccountBalance() est zéro et MarketInfo(Symbol(), MODE_TICKVALUE) est zéro. Donc, évidemment, lorsque vous ouvrez le MetaTrader, aucune donnée n'est disponible. Cela ne se produisait jamais dans l'ancien MetaTrader. Je n'ai donc aucune idée de ce qu'il faut faire...

Voici le code :

#property indicator_chart_window
//--- input parameters
extern int  Risk=5;
extern int SL_Levels=20;
int multi, exp1, SL, i, k;
double MoneyRisk, Spread, modifySpread, lots;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   k=0;
   for(i=1; i<=SL_Levels; i++)
   {
      if (ObjectFind("SL"+i) == -1)
      {
         ObjectCreate("SL"+i, OBJ_LABEL, 0, 0, 0);
         ObjectSet("SL"+i, OBJPROP_CORNER, 1);
         ObjectSet("SL"+i, OBJPROP_XDISTANCE, 3);
         ObjectSet("SL"+i, OBJPROP_YDISTANCE, k);
         k=k+15;    
      }
   }
   if (ObjectFind("Spread") == -1)
   {
      ObjectCreate("Spread", OBJ_LABEL, 0, 0, 0);
      ObjectSet("Spread", OBJPROP_CORNER, 3);
      ObjectSet("Spread", OBJPROP_XDISTANCE, 3);
      ObjectSet("Spread", OBJPROP_YDISTANCE, 1);
   }
   
//-- 4 / 5 Digit Settings --
   multi   = 1;
   exp1     = 0;
   modifySpread = 1;
   if (Digits==5 || Digits==3)
   {
      modifySpread = 0.1;
      multi=10;
      exp1=1;
   }
//----
   SL = 10;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   for(i=1; i<=SL_Levels; i++)
   {
      ObjectDelete("SL"+i);
   }
   ObjectDelete("Spread");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
//----
   Spread     = MarketInfo(Symbol(), MODE_SPREAD)*modifySpread;
   MoneyRisk  = AccountBalance()*Risk*0.01;
   k=0;
   Print(Spread);
   Print(AccountBalance());
   Print(MoneyRisk);
   Print(MarketInfo(Symbol(), MODE_TICKVALUE));
   Print(SL);
   Print(multi);
   for(i=1; i<=SL_Levels; i++)
   {
      lots=MoneyRisk/SL/(MarketInfo(Symbol(), MODE_TICKVALUE)*multi);
      ObjectSetText("SL"+i, SL+ " : "+DoubleToStr(lots, 2), 10, "Calibri", White);
      k=k+15;
      SL = SL+5;     
   }
   SL = 10;
   ObjectSetText("Spread", Spread, 10, "Calibri", White);

   WindowRedraw();
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
lots=MoneyRisk/SL/(MarketInfo(Symbol(), MODE_TICKVALUE)*multi);
Vous ne connaissez pas les bases des ordres de calcul mathématiques ? Je sais tout de suite quel est le problème. Vos ordres de calcul en maths.
 

Pourriez-vous être un peu plus précis ? Quel est exactement le problème avec eux (parce que ça a toujours fonctionné...) ?


Je pense qu'il y a toujours le problème que AccountBalance() et d'autres données dont j'ai besoin de MetaTrader ne sont pas disponibles juste après le démarrage de la plate-forme.

 

Un autre exemple :

#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//----
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
//----
  {
   Comment  (AccountBalance());
//----
   return(0);
  }
//+------------------------------------------------------------------+
Si vous ouvrez le MetaTrader, le résultat sera zéro ! Et il reste nul jusqu'à ce que vous changiez d'horizon temporel ou de paire. Je pense que c'est exactement le problème de l'erreur de division par zéro. Ne pensez-vous pas aussi ?
 
mar:

J'ai imprimé TOUTES les variables de cette ligne et je suis arrivé à la conclusion que AccountBalance() est zéro et MarketInfo(Symbol(), MODE_TICKVALUE) est zéro. Il est donc évident que lorsque vous ouvrez le MetaTrader, aucune donnée n'est disponible. Cela ne se produisait jamais dans l'ancien MetaTrader. Je n'ai donc aucune idée de ce qu'il faut faire...

Voici le code :

Si vous êtes sûr que c'est la cause du problème, ajoutez ceci juste après Start()

if( MarketInfo(Symbol(), MODE_SPREAD)==0 || AccountBalance() == 0 )
   return(0);
 

Hé GumRai,

Je l'ai testé avec l'indicateur ci-dessus. Le solde du compte reste nul même si je laisse MetaTrader fonctionner pendant quelques minutes. Seulement jusqu'à ce que je change quelque chose manuellement (paire, timeframe) le AccountBalance correct est affiché. Et si j'utilise votre solution, je n'ai aucun problème avec l'erreur de division par zéro, mais l'indicateur ne fera jamais son travail parce que le solde du compte reste à zéro.

Je me demande si je suis la seule personne qui a ce problème ? Je pense que c'est un problème général d'importation de données du nouveau MetaTrader...