¡¡¡¡¡¡¡inicialización global fallida!!!!!!! - página 2

 

No hay problema, angevogeur

El código era originalmente este:

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

Simplemente lo he modificado a esto:

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

Como puedes ver, no cambié la "carne" de las funciones. Simplemente hice las modificaciones necesarias para ajustarse a la nueva funcionalidad. Una cosa que todavía tengo un poco confusa es el cambio de start() a OnStart() o OnTick(), lo que sea (lo he olvidado en este momento, pero sigo usando start() sin problemas. Debo mencionar que este es un indicador personalizado. Otra cosa de la que me quejo es de las limitaciones de lo que puedes usar dependiendo de si estás codificando un EA, un indicador o un script. Hay algunas cosas que tienen sentido (como no permitir que se implementen operaciones a menos que estés codificando un EA) y otras que no (como la prohibición de usar un MessageBox en un indicador). Otra cosa que realmente me molesta es no tener eventos disponibles para cosas como aperturas y cierres de operaciones. Esto sería muy útil para lo que estoy montando ahora mismo.

Un ejemplo de lo que estoy consiguiendo con mi última declaración es la siguiente: Quiero ser capaz de mostrar una señal de compra si se cumplen ciertos criterios, mostrar una señal de cierre de la operación de compra si se cumplen ciertos criterios, pero también quiero permitir que mi usuario sea capaz de cancelar la señal de compra y esperar a otra si lo desean y lo mismo para la señal de cierre. Si deciden cerrar la operación, quiero que las señales de Compra y Cierre desaparezcan y que el indicador esté pendiente de los criterios de entrada para otra operación. Las partes de cancelación funcionan perfectamente pero no puedo detectar los eventos de Apertura y Cierre porque MQL4 no proporciona la mensajería para ello.

Si has mirado mi perfil, habrás visto que no soy en absoluto un programador novato. El lenguaje simplemente no proporciona toda la funcionalidad que un profesional espera y necesita de una plataforma de desarrollo moderna. En otro orden de cosas, no consigo que la depuración funcione, lo cual es una queja importante. Seguí la documentación, pero cuando traté de poner en marcha el depurador obtuve un gráfico que hizo aparecer el diálogo de propiedades para inicializar mi indicador, pero cuando pulsé Okay para terminar la configuración del indicador, el gráfico desapareció y eso fue todo. Tal vez las cosas se pierden en la traducción del ruso al inglés y se me escapa algo o tal vez el "pastel" no está del todo cocido. Como profesional sé lo monumental que es la tarea de crear un lenguaje y un entorno de desarrollo como éste. Mis observaciones se refieren más a la naturaleza de las informaciones para el personal de desarrollo que a las quejas.

Prof

 
ProfessorMetal:

No hay problema, angevogeur

El código era originalmente este:


Prof

Lo siento pero el código que has publicado no compila. Te pido el código para intentar reproducir tu problema.
 

Si no has declarado las variables que estoy estableciendo y tampoco tienes los métodos que estoy llamando declarados y desarrollados, no compilará. No puede. Habría esperado que lo supieras. He posteado lo que creía que pedías, la solución que arreglaba mi problema. En cualquier caso, si usted está con MetaQuotes y está tratando de averiguar lo que está pasando con MetaTrader y solucionarlo, he publicado más abajo. Comentar el bloque if en init(), declarar MA_Display_Time_Frame globalmente como un entero y añadir estos métodos :

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

Dado que esto está destinado a ser un producto comercial que no es todo el código del indicador por cualquier medio, pero esto debe compilar y potencialmente causar el problema utilizando el original init() y deinit() métodos. Es suficiente para crear un par de etiquetas y botones. Como mencionó uno de los carteles, el fallo era intermitente. Sin embargo, estaba relacionado con cualquier acción que provocara la desinicialización del indicador, como cambiar las propiedades del indicador, cambiar los marcos temporales o detener y reiniciar el terminal. Si quiere probar a cambiar las propiedades, añada estos externos a los globales:

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

Si añades los externos, no es necesario comentar el bloque if que hace referencia a ellos.Eso debería ser suficiente para que compile e intente reproducir el problema. El problema no se ha producido desde que cambié las antiguas funciones de inicialización y desinicialización y pasé a las nuevas versiones. Si necesitas algo más házmelo saber. Estaré atento al hilo.

 

Tuve una situación similar, el indi funcionaba bien cuando se dejaba caer en el gráfico.

Funcionó bien después del cambio de parámetros, funcionó bien después del cambio de Tf.

Después de cerrar el MT4 y reiniciarlo, el indi no aparecía.

Estaba en la lista de indicadores del gráfico, pero no funcionaba.

Después de abrir la ventana de parámetros y hacer clic en el botón OK, el indi desapareció inmediatamente de la lista.

Intenté todos los trucos, incluyendo los descritos en los posts anteriores, pero nada funcionó.

Resultó ser el problema de la división por 0.

La simple condición: if(x!=0) resolvió el problema.

 

Sí, acabo de tener el mismo problema con otro indi.

Sin el "if" cada vez que se inicia la plataforma, el indi tiene el problema de la división por 0,

el nuevo MT4 parece no tener información almacenada hasta que se marque.

La otra solución sería usar el OnCalculate() en lugar de start() o OnStart(), supongo.

Pero, eso es algo para quejarse a MetaQuotes.

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

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

Hay que usar el truco del retorno (0).

Alguien va a elaborar un poco si hay interés.

 
deysmacro:

Hay que usar el truco del retorno (0).

Alguien se explayará un poco si hay interés.


Bueno, los indicadores antiguos que se pueden encontrar en todas partes en el Internet no tienen su código modificado automáticamente.

Si alguien sabe retocar los códigos y entiende el problema, puede hacerlo por su cuenta.

Todos los demás están obligados a sentir la incomodidad de no ver sus indi's cada vez que abren la MT4.

Si tienen una plantilla, pueden usarla para restaurar el indi, pero eso significa hacer esto cada vez.

Las plantillas son otra historia, en el nuevo Built 625.

 

Chicos,

Todos ustedes están fuera de la marca. Lo que describís es un problema de sincronización que siempre ha sido un problema. Puedes solucionarlo de forma muy sencilla con esto:

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

Cualquier error de división por cero que puedas estar obteniendo se debe a que estás intentando hacer cálculos antes de que el servidor se haya asentado. Si estás haciendo cálculos en la función de inicialización - ¡NO! Pon el código anterior en tu start() o OnStart() y ENTONCES haz lo que necesites. Dadas, tratar de hacerlo tan simple como lo estás haciendo te va a morder a lo grande. Estás teniendo suerte con tu indi.

Cuando un indi desaparece, tienes un fallo de inicialización. Si miras tus logs verás "fallo de inicialización global". Tienes que averiguar por qué te sale eso y solucionarlo. Si no lo haces, todo lo que has hecho es poner una tirita en un corte que necesitaba puntos de sutura y se volverá contra ti.

 

Me parece que este error no tiene nada que ver con OnInit() y la descripción del error es engañosa.

Con una sola línea de código

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á el error de matriz fuera de rango.

Cambia el marco temporal y obtendrá Global initialisation failed y el indicador será eliminado del gráfico

 
Podría ser, GumRai, Parece que hay diferentes problemas aquí. Uno de ellos es deinit() no se llama cuando debería ser y dejar las cosas colgando alrededor. Lo que estás viendo con OnCalculate() suena como un fallo en la implementación de MQL de la función, si entiendo cómo se supone que funciona. Otro es tratar de hacer cosas antes de que el servidor se ha establecido y "inicializado" la información del lado del servidor. Sólo estoy adivinando aquí, pero el último también puede estar causando lo que estás viendo con OnCalculate(). Suena como los desarrolladores MQL tienen un poco de depuración que hacer. Para ser justos, lo que están intentando no es trivial. Los fallos son de esperar.