globale Initialisierung fehlgeschlagen!!!!!!! - Seite 2

 

Kein Problem, angevogeur

Der Code sah ursprünglich so aus:

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);
 }

Ich habe ihn einfach zu diesem geändert:

//+------------------------------------------------------------------+
//| 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()));
  }

Wie Sie sehen können, habe ich das "Fleisch" der Funktionen nicht verändert. Ich habe lediglich die notwendigen Änderungen vorgenommen, um den neuen Funktionen zu entsprechen. Eine Sache, die ich noch nicht ganz verstanden habe, ist der Wechsel von start() zu OnStart() oder OnTick(), was auch immer es ist (ich habe es im Moment vergessen, aber ich benutze immer noch start() ohne Probleme. Ich sollte erwähnen, dass dies ein benutzerdefinierter Indikator ist. Eine weitere Sache, über die ich mich ärgere, sind die Einschränkungen, was man verwenden kann, je nachdem, ob man einen EA, einen Indikator oder ein Skript programmiert. Es gibt einige Dinge, die Sinn machen (z. B. dass Trades nur dann implementiert werden können, wenn Sie einen EA programmieren), und andere, die keinen Sinn machen (z. B. das Verbot der Verwendung einer MessageBox in einem Indikator). Eine weitere Sache, die mich wirklich stört, ist das Fehlen von Ereignissen für Dinge wie Handelseröffnungen und -schließungen. Dies wäre wirklich hilfreich für das, was ich im Moment zusammenstelle.

Ein Beispiel dafür, worauf ich mit meiner letzten Aussage hinaus will, ist Folgendes: Ich möchte in der Lage sein, ein Kaufsignal anzuzeigen, wenn bestimmte Kriterien erfüllt sind, ein Signal zum Schließen des Kaufs anzuzeigen, wenn bestimmte Kriterien erfüllt sind, aber ich möchte dem Benutzer auch die Möglichkeit geben, das Kaufsignal abzubrechen und auf ein anderes zu warten, wenn er dies wünscht, und das Gleiche gilt für das Schließungssignal. Wenn er sich entscheidet, den Handel zu schließen, möchte ich, dass die Buy- und Close-Buy-Signale verschwinden und der Indikator auf Einstiegskriterien für einen weiteren Handel wartet. Die Annullierungsteile funktionieren perfekt, aber ich kann die Open- und Close-Ereignisse nicht erkennen, weil MQL4 die Nachrichtenübermittlung dafür nicht bereitstellt.

Wenn Sie sich mein Profil angesehen haben, werden Sie gesehen haben, dass ich keineswegs ein unerfahrener Programmierer bin. Die Sprache bietet einfach nicht alle Funktionen, die ein Profi von einer modernen Entwicklungsplattform erwartet und braucht. Ein weiterer Punkt ist, dass ich das Debugging nicht zum Laufen bekomme, was ein großes Problem darstellt. Ich bin der Dokumentation gefolgt, aber als ich versuchte, den Debugger in Gang zu setzen, bekam ich ein Diagramm, das den Eigenschaftsdialog für die Initialisierung meines Indikators öffnete, aber als ich auf Okay drückte, um die Einrichtung des Indikators zu beenden, verschwand das Diagramm und das war's. Vielleicht geht bei der Übersetzung vom Russischen ins Englische etwas verloren und ich übersehe etwas oder der "Kuchen" ist noch nicht ganz fertig. Als Fachmann weiß ich, welch monumentale Aufgabe es ist, eine Entwicklungssprache und -umgebung wie diese zu schaffen. Meine Bemerkungen sind eher als Hinweise für das Entwicklungspersonal gedacht und nicht als Beschwerden.

Prof

 
ProfessorMetal:

Kein Problem, angevogeur

Der Code war ursprünglich dieser:


Prof

Es tut mir leid, aber der Code, den Sie gepostet haben, lässt sich nicht kompilieren. Ich bitte Sie den Code, um zu versuchen, Ihr Problem zu reproduzieren.
 

Wenn Sie die Variablen, die ich setze, nicht deklariert haben und auch die Methoden, die ich aufrufe, nicht deklariert und ausgearbeitet haben, lässt es sich nicht kompilieren. Das kann es nicht. Ich hätte erwartet, dass Sie das wissen. Ich habe gepostet, wonach ich dachte, dass Sie fragen würden - die Lösung, die mein Problem behebt. Wenn Sie mit MetaQuotes arbeiten und versuchen, herauszufinden, was mit MetaTrader los ist, und es zu beheben, habe ich weiter unten mehr gepostet. Kommentieren Sie den if-Block in init() aus, deklarieren Sie MA_Display_Time_Frame global als Ganzzahl und fügen Sie diese Methoden hinzu :

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;
  }

Da es sich hier um ein kommerzielles Produkt handelt, ist das keineswegs der gesamte Code des Indikators, aber er sollte kompilierbar sein und möglicherweise das Problem mit den ursprünglichen init()- und deinit()-Methoden verursachen. Es reicht aus, um ein paar Beschriftungen und Schaltflächen zu erstellen. Wie einer der Poster erwähnte, trat der Fehler nur sporadisch auf. Es hing jedoch mit jeder Aktion zusammen, die den Indikator zur Deinitialisierung veranlasste, wie z. B. das Ändern von Indikatoreigenschaften, das Ändern von Zeitrahmen oder das Stoppen und Neustarten des Terminals. Wenn Sie die Änderung der Eigenschaften testen möchten, fügen Sie diese Externs zu den Globals hinzu:

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

Wenn Sie die Externs hinzufügen, brauchen Sie den if-Block, der auf sie verweist, nicht auszukommentieren, und das sollte ausreichen, um das Problem zu kompilieren und zu reproduzieren. Das Problem ist nicht mehr aufgetreten, seit ich die alten Initialisierungs- und Deinitialisierungsfunktionen geändert und auf die neuen Versionen umgestellt habe. Wenn Sie noch etwas brauchen, lassen Sie es mich wissen. Ich werde den Thread im Auge behalten.

 

Ich hatte eine ähnliche Situation, die indi funktionierte gut, wenn auf der Karte fallen gelassen.

Es funktionierte gut nach Parameter ändern, es funktionierte gut nach Tf Verschiebung.

Nach dem Schließen des MT4 und Neustart, der indi nicht angezeigt.

Er war zwar in der Indikatorenliste auf dem Chart zu sehen, aber er funktionierte nicht.

Nachdem ich das Parameterfenster geöffnet und auf die Schaltfläche OK geklickt hatte, verschwand der Indi sofort aus der Liste.

Ich habe alle Tricks ausprobiert, einschließlich derer, die in den oben genannten Beiträgen beschrieben wurden, aber nichts hat funktioniert.

Es stellte sich heraus, dass es an der Division durch 0 lag!

Die einfache Bedingung: if(x!=0) löste das Problem.

 

Ja, ich hatte gerade das gleiche Problem mit einem anderen indi.

Ohne die "if" jedes Mal, wenn die Plattform gestartet wird, hat die indi die Division durch 0 Problem,

der neue MT4 scheint keine Informationen zu speichern, bis er angekreuzt wird.

Die andere Lösung wäre die Verwendung von OnCalculate() anstelle von start() oder OnStart(), nehme ich an?

Aber das ist etwas, worüber man sich bei MetaQuotes beschweren muss.

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

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

Sie müssen den Return(0) -Trick anwenden.

Jemand wird ein bisschen ausarbeiten, wenn es Interesse gibt.

 
deysmacro:

Sie müssen den Return(0) -Trick anwenden.

Wenn Interesse besteht, wird das jemand näher erläutern.


Nun, alte Indikatoren, die Sie überall im Internet finden können, werden nicht automatisch geändert.

Wenn jemand Codes optimieren kann und das Problem versteht, kann er es selbst tun.

Alle anderen müssen sich damit abfinden, dass sie ihre Indizes nicht jedes Mal sehen, wenn sie den MT4 öffnen.

Wenn sie eine Vorlage haben, können sie diese verwenden, um die Indizes wiederherzustellen, aber das bedeutet, dass sie dies jedes Mal tun müssen.

Templates sind eine andere Geschichte, in der neuen Built 625.

 

Leute,

Ihr liegt alle daneben. Was ihr beschreibt, ist ein Zeitproblem, das schon immer ein Problem war. Das könnt ihr ganz einfach damit beheben:

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

Jeder Fehler, der bei der Division durch Null auftritt, ist darauf zurückzuführen, dass Sie versuchen, Berechnungen durchzuführen, bevor der Server zur Ruhe gekommen ist. Wenn Sie in der Initialisierungsfunktion Berechnungen durchführen - TUN SIE ES NICHT! Fügen Sie den obigen Code in Ihre start() oder OnStart() ein und tun DANN, was Sie tun müssen. Dadas, wenn du versuchst, es so einfach zu machen, wie du es tust, wird dich das teuer zu stehen kommen. Du hast Glück mit deinen Indi.

Wenn ein indi verschwindet, hast du einen Initialisierungsfehler. Wenn du dir deine Logs ansiehst, wirst du "global initialization failure" sehen. Du musst herausfinden, warum du das bekommst und es in Ordnung bringen. Wenn Sie das nicht tun, haben Sie nur ein Pflaster auf eine Wunde geklebt, die genäht werden musste, und es wird auf Sie zurückkommen.

 

Mir scheint, dass dieser Fehler nichts mit OnInit() zu tun hat und die Fehlerbeschreibung irreführend ist.

Mit nur einer einzigen Codezeile

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);
  }

Es wird der Fehler Array out of range ausgegeben.

Ändern Sie den Zeitrahmen und Sie erhalten Global initialisation failed und der Indikator wird aus dem Chart entfernt

 
Könnte sein, GumRai, Klingt wie es gibt verschiedene Probleme hier. Eines davon ist, dass deinit() nicht aufgerufen wird, wenn es sein sollte, und Dinge in der Luft hängen lässt. Was Sie mit OnCalculate() sehen, klingt wie ein Fehler in der MQL-Implementierung der Funktion, wenn ich verstehe, wie sie funktionieren soll. Ein weiterer Grund ist der Versuch, etwas zu tun, bevor der Server sich beruhigt und die serverseitigen Informationen "initialisiert" hat. Ich stelle hier nur Vermutungen an, aber der letzte Punkt könnte auch die Ursache für das sein, was Sie mit OnCalculate() sehen. Hört sich so an, als ob die MQL-Entwickler noch ein wenig Fehlersuche betreiben müssen. Um fair zu sein, ist das, was sie versuchen, nicht trivial. Pannen sind da nur zu erwarten.