inizializzazione globale fallita!!!!!!! - pagina 2

 

Nessun problema, angevogeur

Il codice era originariamente questo:

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

L'ho semplicemente modificato in questo:

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

Come puoi vedere, non ho cambiato la "carne" delle funzioni. Ho semplicemente fatto le modifiche necessarie per conformarsi alla nuova funzionalità. Una cosa su cui sono ancora un po' confuso è il cambiamento da start() a OnStart() o OnTick(), qualunque sia (l'ho dimenticato al momento, ma sto ancora usando start() senza problemi. Dovrei menzionare che questo è un indicatore personalizzato. Un'altra cosa di cui mi lamento sono le limitazioni su ciò che puoi usare a seconda che tu stia codificando un EA, un indicatore o uno script. Ci sono alcune cose che hanno senso (come non permettere l'implementazione di trade a meno che non si stia codificando un EA) e altre che non hanno senso (come il divieto di usare un MessageBox in un indicatore). Un'altra cosa che mi preoccupa molto è non avere eventi disponibili per cose come le aperture e le chiusure dei trade. Questo sarebbe davvero utile per quello che sto mettendo insieme in questo momento.

Un esempio di ciò che sto ottenendo con la mia ultima affermazione è questo: Voglio essere in grado di visualizzare un segnale di acquisto se determinati criteri sono soddisfatti, visualizzare un segnale di chiusura della negoziazione se determinati criteri sono soddisfatti, ma voglio anche consentire al mio utente di essere in grado di annullare il segnale di acquisto e aspettare un altro se lo desiderano e idem per il segnale di chiusura. Se scelgono di chiudere il trade, voglio che i segnali Buy e Close Buy scompaiano e che l'indicatore osservi i criteri di entrata per un altro trade. Le parti di cancellazione funzionano perfettamente, ma non posso rilevare gli eventi Open e Close perché MQL4 non fornisce la messaggistica necessaria.

Se avete guardato il mio profilo, avrete visto che non sono affatto un programmatore principiante. Il linguaggio semplicemente non fornisce tutte le funzionalità che un professionista si aspetta e di cui ha bisogno da una moderna piattaforma di sviluppo. Su un'altra nota, non riesco a far funzionare il debugging, che è una grande lamentela. Ho seguito la documentazione, ma quando ho provato a mettere in moto il debugger ho ottenuto un grafico che ha fatto apparire la finestra di dialogo delle proprietà per inizializzare il mio indicatore, ma quando ho premuto Ok per finire la configurazione dell'indicatore il grafico è scomparso e questo è tutto. Forse le cose si perdono nella traduzione dal russo all'inglese e mi manca qualcosa o forse la "torta" non è del tutto cotta. Come professionista so quanto sia monumentale il compito di creare un linguaggio e un ambiente di sviluppo come questo. Le mie osservazioni sono intese più nella natura di FYI per lo staff di sviluppo piuttosto che di lamentele.

Prof

 
ProfessorMetal:

Nessun problema, angevogeur

Il codice era originariamente questo:


Prof

Mi dispiace ma il codice che hai postato non ha compilato. Ti chiedo il codice per provare a riprodurre il tuo problema.
 

Se non avete dichiarato le variabili che sto impostando e non avete nemmeno i metodi che sto chiamando dichiarati ed elaborati, non si compila. Non può. Mi sarei aspettato che tu lo sapessi. Ho postato quello che pensavo tu stessi chiedendo - la soluzione che ha risolto il mio problema. In ogni caso, se sei con MetaQuotes e stai cercando di capire cosa sta succedendo con MetaTrader e risolverlo, ho postato più sotto. Commentate il blocco if in init(), dichiarate MA_Display_Time_Frame globalmente come un intero e aggiungete questi metodi :

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

Poiché questo è destinato ad essere un prodotto commerciale, questo non è tutto il codice dell'indicatore, ma questo dovrebbe compilare e potenzialmente causare il problema usando i metodi originali init() e deinit(). È abbastanza per creare un paio di etichette e pulsanti. Come menzionato da uno dei poster, il fallimento era intermittente. Era, comunque, legato a qualsiasi azione che avrebbe causato la deinizializzazione dell'indicatore, come cambiare le proprietà dell'indicatore, cambiare i time frame o fermare e riavviare il terminale. Se volete provare a cambiare le proprietà, aggiungete questi externs ai globali:

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

Se aggiungete gli externs, non c'è bisogno di commentare il blocco if che fa riferimento ad essi. Questo dovrebbe essere sufficiente per farvi compilare e provare a riprodurre il problema. Il problema non si è più verificato da quando ho cambiato le vecchie funzioni di inizializzazione e deinizializzazione e sono passato alle nuove versioni. Se hai bisogno di qualcos'altro fammelo sapere. Terrò d'occhio il thread.

 

Ho avuto una situazione simile, l'indi ha funzionato bene quando è caduto sul grafico.

Ha funzionato bene dopo il cambio dei parametri, ha funzionato bene dopo il cambio di Tf.

Dopo aver chiuso MT4 e riavviato, l'indi non è apparso.

Era nella lista degli indicatori sul grafico, ma non funzionava.

Dopo aver aperto la finestra dei parametri e aver cliccato il pulsante OK, l'indi è scomparso immediatamente dalla lista.

Ho provato tutti i trucchi, compresi quelli descritti nei post precedenti, ma niente ha funzionato.

Si è rivelato essere il problema della divisione per 0!

La semplice condizione: if(x!=0) ha risolto il problema.

 

Sì, ho appena avuto lo stesso problema con un altro indi.

Senza il "se" ogni volta che la piattaforma viene avviata, l'indi ha il problema della divisione per 0,

il nuovo MT4 sembra non avere informazioni memorizzate fino a quando non viene spuntato.

L'altra soluzione sarebbe quella di usare OnCalculate() invece di start() o OnStart(), credo?

Ma questo è qualcosa di cui lamentarsi con MetaQuotes.

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

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

Dovete usare il trucco del ritorno (0).

Qualcuno elaborerà un po' se c'è interesse.

 
deysmacro:

Dovete usare il trucco del ritorno (0).

Qualcuno elaborerà un po' se c'è interesse.


Beh, i vecchi indicatori che puoi trovare ovunque su internet non hanno il loro codice modificato automaticamente.

Se qualcuno sa modificare i codici e capisce il problema, può farlo da solo.

Tutti gli altri sono solo destinati a sentire il disagio di non vedere i loro indi ogni volta che aprono MT4.

Se hanno un template, possono usarlo per ripristinare gli indi, ma questo significa farlo ogni volta.

I template sono un'altra storia, nel nuovo Built 625.

 

Ragazzi,

siete tutti fuori strada. Quello che state descrivendo è un problema di tempistica che è sempre stato un problema. Potete occuparvene molto semplicemente con questo:

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

Qualsiasi errore di divisione per zero che potreste ottenere è dovuto al fatto che state cercando di fare calcoli prima che il server si sia sistemato. Se state facendo calcoli nella funzione di inizializzazione - NON fatelo! Metti il codice di cui sopra nel tuo start() o OnStart() e POI fai quello che ti serve. Dadas, cercare di renderlo così semplice come stai facendo tu ti farà perdere molto tempo. Sei fortunato con il tuo indi.

Quando un indi scompare, hai un errore di inizializzazione. Se guardi i tuoi log vedrai "fallimento di inizializzazione globale". Devi capire perché lo stai ottenendo e raddrizzarlo. Se non lo fate, tutto quello che avete fatto è mettere un cerotto su un taglio che aveva bisogno di punti e vi si ritorcerà contro.

 

Mi sembra che questo errore non abbia nulla a che fare con OnInit() e la descrizione dell'errore è fuorviante.

Con una sola linea di codice

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

Darà l'errore di array fuori range.

Cambiate timeframe e otterrete Global initialisation failed e l'indicatore verrà rimosso dal grafico

 
Potrebbe essere, GumRai, Sembra che ci siano diversi problemi qui. Uno è deinit() che non viene chiamato quando dovrebbe e lascia le cose in sospeso. Quello che stai vedendo con OnCalculate() sembra un difetto nell'implementazione di MQL della funzione, se ho capito come dovrebbe funzionare. Un altro è cercare di fare qualcosa prima che il server si sia sistemato e abbia "inizializzato" le informazioni lato server. Sto solo tirando a indovinare, ma l'ultima potrebbe anche essere la causa di ciò che state vedendo con OnCalculate(). Sembra che gli sviluppatori di MQL abbiano un po' di lavoro di debug da fare. Ad essere onesti, quello che stanno tentando non è banale. I glitch sono solo da aspettarsi.