échec de l'initialisation globale !!!!!!! - page 2

 

Pas de problème, angevogeur

Le code était à l'origine ceci :

int init()
  {
      // Check for input errors
      if (Use_LT_TimeFrame_Confirmation)
      {
         if (Number_Of_TimeFrames < 1 || Number_Of_TimeFrames > 4)
         {
            Alert("Initialization Error: Number of time frames for timeframe trend confirmation must be between 2 and 4, inclusively.");
         }
         
         if (Number_Of_Periods_For_Trend_Agreement < 2)
         {
            Alert("Initialization Error: Number of time frames for timeframe trend aggreement must be greater than 1.");
         }
      }
      
      IndicatorShortName("White Wolf Custom Software Moving Averages Indicator");
      
//---- indicators
      SetIndexStyle(0,DRAW_LINE);
      SetIndexBuffer(0,EMABuffer1);
      SetIndexStyle(1,DRAW_LINE);
      SetIndexBuffer(1,EMABuffer2);
      SetIndexStyle(2,DRAW_LINE);
      SetIndexBuffer(2,EMABuffer3);
      SetIndexStyle(3,DRAW_LINE);
      SetIndexBuffer(3,SMABuffer);
   
      SetIndexEmptyValue(0,0.0);
      SetIndexEmptyValue(1,0.0);
      SetIndexEmptyValue(2,0.0);
      SetIndexEmptyValue(3,0.0);
//----

      // MA Period Buttons
      MA_Display_Time_Frame = Period(); // Set the trade entry time frame to the current chart period - this ensures that we have a TF for the MA calculations
   
   // Show the timeframe buttons so the user can refine their entry strategy if they wish
 
      ResetLastError();
      Alert("In init() - Calling CreateMAPeriodButtons()");
      CreateMAPeriodButtons();
      if (GetLastError() != 0)
         Alert("GetLasteError() returned " + IntegerToString(GetLastError()));
         
      ResetLastError();
      Alert("In init() - Calling CreateDismissSignalButtons()");
      CreateDismissSignalButtons();
      if (GetLastError() != 0)
         Alert("GetLasteError() returned " + IntegerToString(GetLastError()));
      
      ResetLastError();
      Alert("In init() - Calling SetPeriodButtonState()");
      SetPeriodButtonState();
      if (GetLastError() != 0)
         Alert("GetLasteError() returned " + IntegerToString(GetLastError()));
   
   // Set normalization factor for current currency pair
   if ((Digits == 4) || (Digits == 5))
         NormalizationFactor = 0.0001;
      else
         NormalizationFactor = 0.01;
   
   return(0);
  }

void deinit()
  {
      Alert("In de-init() - getting ready to delete objects ");
      
      ResetLastError();
      ObjectsDeleteAll(0, OBJ_LABEL);
      Alert("In de-init() - attempting to delete labels - GetLastError() returns  " + IntegerToString(GetLastError()));
      
      ResetLastError();
      ObjectsDeleteAll(0, OBJ_BUTTON);
      Alert("In de-init() - attempting to delete buttons - GetLastError() returns  " + IntegerToString(GetLastError()));

return(0);
 }

Je l'ai simplement modifié en ceci :

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

int OnInit()
  {
      // Check for input errors
      if (Use_LT_TimeFrame_Confirmation)
      {
         if (Number_Of_TimeFrames < 1 || Number_Of_TimeFrames > 4)
         {
            Alert("Initialization Error: Number of time frames for timeframe trend confirmation must be between 2 and 4, inclusively.");
         }
         
         if (Number_Of_Periods_For_Trend_Agreement < 2)
         {
            Alert("Initialization Error: Number of time frames for timeframe trend aggreement must be greater than 1.");
         }
      }
      
      IndicatorShortName("White Wolf Custom Software Moving Averages Indicator");
      
//---- indicators
      SetIndexStyle(0,DRAW_LINE);
      SetIndexBuffer(0,EMABuffer1);
      SetIndexStyle(1,DRAW_LINE);
      SetIndexBuffer(1,EMABuffer2);
      SetIndexStyle(2,DRAW_LINE);
      SetIndexBuffer(2,EMABuffer3);
      SetIndexStyle(3,DRAW_LINE);
      SetIndexBuffer(3,SMABuffer);
   
      SetIndexEmptyValue(0,0.0);
      SetIndexEmptyValue(1,0.0);
      SetIndexEmptyValue(2,0.0);
      SetIndexEmptyValue(3,0.0);
//----

      // MA Period Buttons
      MA_Display_Time_Frame = Period(); // Set the trade entry time frame to the current chart period - this ensures that we have a TF for the MA calculations
   
   // Show the timeframe buttons so the user can refine their entry strategy if they wish
 
      ResetLastError();
      Alert("In init() - Calling CreateMAPeriodButtons()");
      CreateMAPeriodButtons();
      if (GetLastError() != 0)
         Alert("GetLasteError() returned " + IntegerToString(GetLastError()));
         
      ResetLastError();
      Alert("In init() - Calling CreateDismissSignalButtons()");
      CreateDismissSignalButtons();
      if (GetLastError() != 0)
         Alert("GetLasteError() returned " + IntegerToString(GetLastError()));
      
      ResetLastError();
      Alert("In init() - Calling SetPeriodButtonState()");
      SetPeriodButtonState();
      if (GetLastError() != 0)
         Alert("GetLasteError() returned " + IntegerToString(GetLastError()));
   
   // Set normalization factor for current currency pair
   if ((Digits == 4) || (Digits == 5))
         NormalizationFactor = 0.0001;
      else
         NormalizationFactor = 0.01;
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
      Alert("In de-init() - getting ready to delete objects ");
      
      ResetLastError();
      ObjectsDeleteAll(0, OBJ_LABEL);
      Alert("In de-init() - attempting to delete labels - GetLastError() returns  " + IntegerToString(GetLastError()));
      
      ResetLastError();
      ObjectsDeleteAll(0, OBJ_BUTTON);
      Alert("In de-init() - attempting to delete buttons - GetLastError() returns  " + IntegerToString(GetLastError()));
  }

Comme vous pouvez le voir, je n'ai pas changé la "viande" des fonctions. J'ai simplement fait les modifications nécessaires pour me conformer à la nouvelle fonctionnalité. Une chose sur laquelle je suis encore un peu confus est le changement de start() à OnStart() ou OnTick(), quel qu'il soit (j'ai oublié pour le moment, mais j'utilise toujours start() sans problème. Je dois préciser qu'il s'agit d'un indicateur personnalisé. Une autre chose qui me dérange est la limitation de ce que l'on peut utiliser selon que l'on code un EA, un indicateur ou un script. Il y a des choses qui ont du sens (comme l'interdiction d'implémenter des transactions à moins de coder un EA) et d'autres qui n'en ont pas (comme l'interdiction d'utiliser une MessageBox dans un indicateur). Une autre chose qui me dérange vraiment est l'absence d'événements disponibles pour des choses comme l'ouverture et la fermeture des transactions. Cela serait vraiment utile pour ce que je suis en train de mettre en place actuellement.

Voici un exemple de ce à quoi je veux en venir avec ma dernière déclaration : Je veux pouvoir afficher un signal d'achat si certains critères sont remplis, afficher un signal de clôture de transaction d'achat si certains critères sont remplis, mais je veux aussi permettre à mon utilisateur d'annuler le signal d'achat et d'attendre un autre s'il le souhaite, et faire de même pour le signal de clôture. S'il choisit de fermer la transaction, je veux que les signaux d'achat et de fermeture disparaissent et que l'indicateur surveille les critères d'entrée pour une autre transaction. Les parties d'annulation fonctionnent parfaitement mais je ne peux pas détecter les événements d'ouverture et de fermeture car MQL4 ne fournit pas la messagerie pour cela.

Si vous avez regardé mon profil, vous aurez vu que je ne suis en aucun cas un programmeur novice. Le langage ne fournit tout simplement pas toutes les fonctionnalités qu'un professionnel attend d'une plateforme de développement moderne. Dans un autre ordre d'idées, je n'arrive pas à faire fonctionner le débogage, ce qui est un problème majeur. J'ai suivi la documentation, mais lorsque j'ai essayé de mettre le débogueur en marche, j'ai obtenu un graphique qui a fait apparaître la boîte de dialogue des propriétés pour initialiser mon indicateur, mais lorsque j'ai cliqué sur OK pour terminer la configuration de l'indicateur, le graphique a disparu et c'est tout. Peut-être que des choses se perdent dans la traduction du russe à l'anglais et que quelque chose m'échappe ou peut-être que le "gâteau" n'est pas tout à fait cuit. En tant que professionnel, je sais combien la création d'un langage et d'un environnement de développement comme celui-ci est une tâche monumentale. Mes remarques s'apparentent davantage à des conseils pratiques à l'intention du personnel chargé du développement qu'à des plaintes.

Prof

 
ProfessorMetal:

Pas de problème, angevogeur

Le code était à l'origine celui-ci :


Prof

Désolé mais le code que vous avez posté n'a pas compilé. Je vous demande le code pour essayer de reproduire votre problème.
 

Si vous n'avez pas déclaré les variables que je vais définir et si les méthodes que je vais appeler ne sont pas déclarées et étoffées, le programme ne compilera pas. Ce n'est pas possible. Je m'attendais à ce que vous le sachiez. J'ai posté ce que je pensais que vous demandiez - la solution qui a résolu mon problème. Quoi qu'il en soit, si vous utilisez MetaQuotes et que vous essayez de comprendre ce qui se passe avec MetaTrader et de le résoudre, j'ai posté plus d'informations ci-dessous. Commentez le bloc if dans init(), déclarez MA_Display_Time_Frame globalement comme un entier et ajoutez ces méthodes :

void CreateMAPeriodButtons()
  {
//  Alert("In CreateMAPeriodButtons()");
      int X_Distance = 10;
      int Y_Distance = 20;
      // Create MA Period Label
      ObjectCreate("MAPeriodLabel", OBJ_LABEL, 0, 0, 0);
      ObjectSet("MAPeriodLabel", OBJPROP_CORNER, CORNER_RIGHT_UPPER);
      ObjectSet("MAPeriodLabel", OBJPROP_XDISTANCE, X_Distance);
      ObjectSet("MAPeriodLabel", OBJPROP_YDISTANCE, Y_Distance);
      ObjectSetText("MAPeriodLabel", "MA Display Period", 12, "Arial", clrYellow);
      
      // Create Period Buttons
      CreateButton("M1", "M1", 1, 140, 50, 100, 20, "Arial", 12, clrYellow, clrGray);
}

void CreateDismissSignalButtons()
  {
      int X_Distance = 25;
      int Y_Distance = 100;
      
      // Create Dismiss Label
      ObjectCreate("DismissSignalsLabel", OBJ_LABEL, 0, 0, 0);
      ObjectSet("DismissSignalsLabel", OBJPROP_CORNER, CORNER_RIGHT_LOWER);
      ObjectSet("DismissSignalsLabel", OBJPROP_XDISTANCE, X_Distance);
      ObjectSet("DismissSignalsLabel", OBJPROP_YDISTANCE, Y_Distance);
      ObjectSetText("DismissSignalsLabel", "Dismiss Trade Signals", 12, "Arial", clrYellow);
      
      // Create Dismiss Buttons
      
      CreateButton("DismissBuySignal", "Dismiss Buy Signal", CORNER_RIGHT_LOWER, 200, 95, 190, 20, "Arial", 12, clrYellow, clrGray);
}

void CreateButton(string strButtonName, string strButtonText, const int nCorner, const int nXpos, const int nYpos, int nWidth, int nHeight, string strFont, 
                    int nFontSize, int nFontColor, int nBackColor, bool bSelected = false)
  {      
      ObjectCreate(0, strButtonName, OBJ_BUTTON, 0, 0, 0);

      //--- set button coordinates
      
      ObjectSetInteger(0, strButtonName, OBJPROP_CORNER, nCorner);

      ObjectSetInteger(0, strButtonName, OBJPROP_XDISTANCE, nXpos);

      ObjectSetInteger(0, strButtonName, OBJPROP_YDISTANCE, nYpos);
 
      //--- set button size
      ObjectSet(strButtonName, OBJPROP_XSIZE, nWidth);
     
      ObjectSet(strButtonName, OBJPROP_YSIZE, nHeight);

      //--- set the chart's corner, relative to which point coordinates are defined
      
      ObjectSet(strButtonName, OBJPROP_CORNER, nCorner);

      //--- set the text
      
      ObjectSetString(0, strButtonName, OBJPROP_TEXT, strButtonText);
      ObjectSetString(0, strButtonName, OBJPROP_FONT, strFont);
      ObjectSetInteger(0, strButtonName, OBJPROP_FONTSIZE, nFontSize);
      ObjectSetInteger(0, strButtonName, OBJPROP_COLOR, nFontColor);

      //--- set background color
      
      ObjectSetInteger(0, strButtonName, OBJPROP_BGCOLOR, nBackColor);
      
      return;
  }

Puisque ceci est destiné à être un produit commercial, ce n'est pas tout le code de l'indicateur, mais cela devrait compiler et potentiellement causer le problème en utilisant les méthodes originales init() et deinit(). C'est suffisant pour créer un couple d'étiquettes et de boutons. Comme l'un des posters l'a mentionné, l'échec était intermittent. Il était cependant lié à toute action qui aurait provoqué la désinitialisation de l'indicateur, comme la modification des propriétés de l'indicateur, le changement de cadre temporel ou l'arrêt et le redémarrage du terminal. Si vous voulez tester la modification des propriétés, ajoutez ces externs aux globales :

extern int               Number_Of_TimeFrames = 2;
extern int               Number_Of_Periods_For_Trend_Agreement = 25;
extern bool             Allow_Modify_Entry_Timeframe = true;

Si vous ajoutez les externs, il n'est pas nécessaire de commenter le bloc if qui y fait référence. Cela devrait être suffisant pour que vous puissiez compiler et essayer de reproduire le problème. Le problème ne s'est pas produit depuis que j'ai changé les anciennes fonctions d' initialisation et de désinitialisation et que je suis passé aux nouvelles versions. Si vous avez besoin d'autre chose, faites-le moi savoir. Je garderai un œil sur le fil de discussion.

 

J'ai eu une situation similaire, l'indien fonctionnait bien lorsqu'il était déposé sur la carte.

Il a bien fonctionné après le changement de paramètres, il a bien fonctionné après le changement de Tf.

Après avoir fermé le MT4 et l'avoir redémarré, l'indi n'apparaissait pas.

Il était dans la liste des indicateurs sur le graphique, mais il ne fonctionnait pas.

Après avoir ouvert la fenêtre des paramètres et cliqué sur le bouton OK, l'indi a immédiatement disparu de la liste.

J'ai essayé toutes les astuces, y compris celles décrites dans les messages ci-dessus, mais rien n'a fonctionné.

Il s'est avéré que c'était le problème de la division par 0 !

La simple condition : if(x!=0) a résolu le problème.

 

Oui, je viens d'avoir le même problème avec un autre indi.

Sans le "si" à chaque démarrage de la plateforme, l'indi a le problème de division par 0,

le nouveau MT4 semble n'avoir aucune information stockée jusqu'à ce qu'il soit coché.

L'autre solution serait d'utiliser OnCalculate() au lieu de start() ou OnStart(), je suppose ?

Mais, c'est quelque chose dont il faut se plaindre auprès de MetaQuotes.

   double pipValue = MarketInfo(Symbol(),MODE_TICKVALUE); 

   if(pipValue!=0)
    {
   double lots   = AccountBalance()*(RiskPercent/100.0)/(StopLoss*pipValue);
    }
 

Vous devez utiliser l'astuce du retour (0).

Quelqu'un développera un peu plus s'il y a un intérêt.

 
deysmacro:

Vous devez utiliser l'astuce du retour (0).

Quelqu'un élaborera un peu plus si cela suscite de l'intérêt.


Eh bien, les anciens indicateurs que vous pouvez trouver partout sur Internet ne voient pas leur code modifié automatiquement.

Si quelqu'un peut bidouiller des codes et comprendre le problème, il peut le faire tout seul.

Tous les autres ne peuvent que ressentir l'inconfort de ne pas voir leurs indicateurs chaque fois qu'ils ouvrent MT4.

S'ils ont un modèle, ils peuvent l'utiliser pour restaurer l'indicateur, mais cela signifie qu'ils doivent le faire à chaque fois.

Les modèles sont une autre histoire, dans le nouveau Built 625.

 

Les gars,

Vous êtes tous à côté de la plaque. Ce que vous décrivez est un problème de timing qui a toujours été un problème. Vous pouvez vous en occuper très simplement avec ceci :

// Wait for the server "turmoil" to settle before doing anything
      string AcctCurrency = AccountCurrency();
       
      if (AcctCurrency == "")
          return(0);

Toute erreur de division par zéro que vous obtenez est due au fait que vous essayez de faire des calculs avant que le serveur ne soit installé. Si vous effectuez des calculs dans la fonction d'initialisation, ne le faites pas ! Mettez le code ci-dessus dans votre start() ou OnStart() et ensuite faites ce dont vous avez besoin. Dadas, essayer d'être aussi simple que vous l'êtes va vous faire perdre beaucoup de temps. Vous avez de la chance avec votre indi.

Quand un indi disparaît, vous avez un échec d'initialisation. Si vous regardez vos logs, vous verrez "global initialization failure". Vous devez trouver pourquoi vous obtenez cela et le résoudre. Si vous ne le faites pas, vous n'aurez fait que mettre un pansement sur une coupure qui nécessitait des points de suture et cela se retournera contre vous.

 

Il me semble que cette erreur n'a rien à voir avec OnInit() et que la description de l'erreur est trompeuse.

Avec une seule ligne de code

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[])
  {
//---
  Print(High[rates_total]);
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }

On obtient l'erreur array out of range.

Changez d'horizon temporel et vous obtenez Global initialisation failed et l'indicateur est supprimé du graphique.

 
C'est possible, GumRai, on dirait qu'il y a plusieurs problèmes ici. L'un est que deinit() n'est pas appelé quand il devrait l'être et laisse des choses en suspens. Ce que vous voyez avec OnCalculate() ressemble à un problème dans l'implémentation de la fonction MQL, si je comprends comment elle est censée fonctionner. Un autre problème est d'essayer de faire quelque chose avant que le serveur ne se soit installé et ait "initialisé" les informations côté serveur. Je ne fais que supposer ici, mais le dernier point peut également être la cause de ce que vous voyez avec OnCalculate(). On dirait que les développeurs de MQL ont un peu de débogage à faire. Pour être juste, ce qu'ils tentent n'est pas trivial. Il faut s'attendre à des ratés.
Raison: