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

 
deysmacro:
Comment() no afecta al gráfico, la mayoría de las veces.

  if(ObjectFind(Symbol()+"Lot_Size_Label")==0)
   {         
  int x_check=ObjectGet(Symbol()+"Lot_Size_Label",OBJPROP_XDISTANCE);
  int y_check=ObjectGet(Symbol()+"Lot_Size_Label",OBJPROP_YDISTANCE);
  Comment(x_check+ " , "+y_check); 
   }

Comment() para comprobar los datos de las coordenadas.

Deberían cambiar cuando la etiqueta va a la derecha, pero no lo hacen.

Es decir, las coords son las que deberían ser.

La etiqueta desaparece a la derecha.

 

Las coordenadas son XDISTANCE = 225; YDISTANCE = 27; CORNER = 3;

Primero, cargando el indi en el gráfico, etiqueta en su sitio:

Segundo, cerrando MT4 y reiniciándolo, etiqueta a la derecha:

Tercero, tras desplazar los Tf's, la etiqueta salta hacia atrás:

Es algo que tiene que ver con los anclajes relacionados con los cálculos de las esquinas y debe ser un error de B646.

 
¿Qué tiene que ver todo eso con la inicialización global fallida?
 
SDC:
¿Qué tiene que ver todo eso con la inicialización global fallida?

Ese B646 tiene un grave error.
 
Dadas:


Gracias, yo tenía el mismo problema con los objetos que no se eliminan en deinit.

Estaba desarrollando algo de indi, y obtuve estos resultados extraños, luego vi en la lista de objetos, que todavía estaban allí.

Conseguí evitarlo, probablemente de la forma más sencilla, mediante ObjectDelete() en el inicio().

Sí, cambiando init() por OnInit() y deinit() por OnDeinit() conseguí que las etiquetas volvieran a estar bien. ¡Gracias!

Luego, después de un tiempo, ¡¡¡no lo hizo!!! Siguen haciendo el mismo baile.


De nada, Dadas. Sin embargo, yo no usaría ObjectDelete() en el método de inicio. Eso es mejor hacerlo en OnDeInit(). La razón es la siguiente: si pones el código en OnStart() o OnCalculate() se va a ejecutar cada vez que llegue un tick. Eso es malo por dos razones 1) añade un montón de operaciones que consumen un tiempo que no puedes permitirte perder en una aplicación en tiempo real y 2) no tiene sentido hacerlo en la mayoría de las situaciones - normalmente sólo va a importar cuando se desinicializa un gráfico. Sólo debe hacerlo en los métodos de "inicio" si un cambio de precio afectará a sus objetos de alguna manera. Como ejemplo, considere esto (que es parte de una aplicación que tengo la intención de vender, pero compartir esto es genial :-) ).

// If no trade is progress, there is no Position Value to display
      if (ObjectFind("PositionValue") > 0)
                ObjectDelete("PositionValue");
                
      if (ObjectFind("PipsProfitLoss") > 0)
                ObjectDelete("PipsProfitLoss");
                
      if (ObjectFind("CurrentStop") > 0)
                ObjectDelete("CurrentStop");
                
      if (ObjectFind("PipsLockedIn") > 0)
                ObjectDelete("PipsLockedIn");
                
      if (ObjectFind("ProfitLockedIn") > 0)
                ObjectDelete("ProfitLockedIn");
                
      if (GlobalVariableCheck(CurrentPairPercentageRisk))
         GlobalVariableDel(CurrentPairPercentageRisk);

Este código atrapa los objetos que han quedado de una operación cerrada si es que existen.

Por cierto - NO hagas esto:

string AcctCurrency = AccountCurrency();
       
      if (AcctCurrency == "")
          return(rates_total);

Has entendido mal la intención del código. Está diseñado para NO ejecutar el indie hasta que el servidor se haya "asentado". Por eso devuelve 0. De esta manera el código indie no se ejecutará hasta que toda la información que necesita esté disponible. Sinceramente no he trabajado con OnCalculate() porque no lo he necesitado pero puedo decir que lo que estás haciendo es una invitación al desastre. No le estás diciendo a tu programa: "No ejecutes este código hasta que tengas datos válidos", sino que estás lanzando cosas al viento y esperando lo mejor. A decir verdad, no sé qué haría tu código si no estuviera recibiendo información fiable del servidor. Después de una cantidad considerable de lectura, su nuevo método OnCalculate() no tiene sentido para mí. me parece que está calculando innecesariamente y entregando una información de carga que haría por sí mismo si lo necesitara y ahorrándose el tiempo de computación al no molestarse con lo que no necesita. No estoy seguro de lo que están tratando de lograr con esto.

¡Feliz codificación!

 
ProfessorMetal:


De nada, Dadas. Sin embargo, yo no usaría ObjectDelete() en el método de inicio. Eso es mejor hacerlo en OnDeInit(). La razón es la siguiente: si pones el código en OnStart() o OnCalculate() se va a ejecutar cada vez que llegue un tick. Eso es malo por dos razones 1) añade un montón de operaciones que consumen un tiempo que no puedes permitirte perder en una aplicación en tiempo real y 2) no tiene sentido hacerlo en la mayoría de las situaciones - normalmente sólo va a importar cuando se desinicializa un gráfico. Sólo debe hacerlo en los métodos de "inicio" si un cambio de precio afectará a sus objetos de alguna manera. Como ejemplo, considere esto (que es parte de una aplicación que tengo la intención de vender, pero compartir esto es genial :-) ).

Este código atrapa los objetos que han quedado de una operación cerrada, si es que existen.

Por cierto - NO haga esto:

Has entendido mal la intención del código. Está diseñado para NO ejecutar el indie hasta que el servidor se haya "asentado". Por eso devuelve 0. De esta manera el código indie no se ejecutará hasta que toda la información que necesita esté disponible. Sinceramente no he trabajado con OnCalculate() porque no lo he necesitado pero puedo decir que lo que estás haciendo es una invitación al desastre. No le estás diciendo a tu programa: "No ejecutes este código hasta que tengas datos válidos", sino que estás lanzando cosas al viento y esperando lo mejor. A decir verdad, no sé qué haría tu código si no estuviera recibiendo información fiable del servidor. Después de una cantidad considerable de lectura, su nuevo método OnCalculate() no tiene sentido para mí. me parece que está calculando innecesariamente y entregando una información de carga que haría por sí mismo si lo necesitara y ahorrándose el tiempo de computación al no molestarse con lo que no necesita. No estoy seguro de lo que están tratando de lograr con esto.

¡Feliz codificación!


¡Gracias de nuevo!

He encontrado la respuesta a las etiquetas flotantes.

Parece que ahora hay que enlazar el Ancla de Objeto en el propio código:

https://docs.mql4.com/en/constants/objectconstants/enum_anchorpoint

Por lo tanto, debo añadir smth como el siguiente:

if(Corner==0) Anchor=ANCHOR_LEFT;
if(Corner==1) Anchor=ANCHOR_RIGHT;
if(Corner==2) Anchor=ANCHOR_LEFT;
if(Corner==3) Anchor=ANCHOR_RIGHT; 

y luego usar otra línea para fijar el objeto:

    ObjectSet(objname,OBJPROP_ANCHOR,Anchor);

¡La vida definitivamente no es más fácil!

¡¡Y entonces esto no ayuda, después de todo!!

BTW. Te diré lo que están tratando de lograr:

Quieren evitar que la mayor cantidad de gente posible se meta con los códigos.

Tiene que ser lo más comercial posible.

Hasta hace poco, casi cualquiera podía trastear con el simple mql4.

Ahora, el objetivo es comercializarlo todo.

 
Dadas:

¡Ese B646 tiene un grave error!
Puede ser, pero la inicialización global fallida es un error específico no relacionado con esta discusión sobre los puntos de anclaje de los objetos.
 
ProfessorMetal:


su nuevo método OnCalculate() no tiene sentido para mí. me parece que está calculando y entregando innecesariamente una información de carga que usted haría por sí mismo si lo necesitara y ahorrándose el tiempo de computación al no molestarse con lo que no necesita. No estoy seguro de lo que están tratando de lograr con esto.

¡Feliz codificación!

OnCalculate proporciona el resultado de calcular cuántas barras ya han sido procesadas por el indicador. Reemplaza la antigua función IndicatorCounted. También logra la compatibilidad con mql5 porque las matrices de series se pasan a ella por referencia, frente a la antigua forma de mql4 de utilizar las matrices de series globales. Desde el punto de vista de la codificación hay muy poca diferencia.

 

Una vez más, de nada, Dadas. Me había olvidado del uso de las propiedades ANCHOR aunque hago uso de ellas en algunas de mis cosas.

SDC, gracias por la información. La documentación no aclara realmente su propósito. Sospecho que el significado se ha perdido en la traducción del ruso al inglés. Ahora tiene más sentido. Supongo que no está pensado para ser utilizado en lugar de OnStart(), sino que se utiliza en lugar de IndicatorCounted(). Sería una buena adición a la documentación para proporcionar un ejemplo que muestra una especie de "antes" y "después" de demostrar la sustitución de IndicatorCounted() con OnCalculate(). Tendré que volver a revisar la documentación a la luz de tu explicación y ver cómo encajan las piezas. Gracias de nuevo.

Profesor

 

Utiliza int OnCalculate() en lugar de int start(). Se ejecuta en cada tick como start(). Un antes y un después se vería algo así,

int start()
  {
   int i=0, limit=0;
   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars < 0) return(-1);
//----
   limit = Bars-counted_bars-1;
   for (i = limit; i >= 0; i--)
   {
//---- indicator calculations
   }
   return(0);
  }

//--------------------------------------------------
//--------------------------------------------------

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[])
  {
   int i=0, limit=0;
//--- check for possible errors
   if(prev_calculated < 0) return(-1);
//---
   limit = rates_total-prev_calculated;
   for(i = limit; i >= 0; i--)
   {
//--- indicator calculations
   }
   return(rates_total);
  }

Los parámetros formales de OnCalculate lo hacen más autónomo, el programador no tiene que depender de llamar a todo tipo de globales, lo que aparentemente en los círculos de la oop es un mal codificador, un tirón de orejas. En la práctica no hay mucha diferencia entre usar uno u otro. También OnCalculate es el mismo que mql5 por lo que tienes la opción de escribir código compatible.