Secuencia de ejecución de Init() y DeInit() - página 25

 
Alexey Viktorov:

Dimitri me parece que eres un programador educado. ¿No te han enseñado las reglas de etiqueta en la programación?

Para el resto puedes escribir como en el viejo mql4 con la posibilidad de desbordamiento de arrays y otros supuestos. Se obtiene un error en la respuesta... Bueno, vuelve a marcarlo... Sigamos, no tenemos tiempo... Y luego te encuentras con un problema que no vale nada en un lenguaje más estricto y empiezas a culpar a los desarrolladores...

Cristo ha resucitado.


Cuando se crea un objeto existente no pasa nada terrible, tampoco pasa nada terrible, simplemente no se crea el objeto y ya está.
 
Nikolai Semko:

Creo que también añadiré una solución más adelante, pero sin utilizar las variables globales del terminal y los archivos, y con posibilidad de aplicar varios indicadores idénticos en una misma ventana.

Por cierto, es una tarea interesante escribir una función que produzca un valor diferente para cada conjunto diferente de parámetros de entrada del indicador.

Lo primero que se me ocurrió fue a través del ChartSaveTemplate.


Renunciar a los recursos globales, aparentemente.

 
fxsaber:

Por cierto, es una tarea interesante escribir una función que produzca un valor diferente para cada conjunto diferente de parámetros de entrada del indicador.

Lo primero que se me ocurrió fue a través de ChartSaveTemplate.


Para renunciar a los globales - aparentemente recursos.


Por supuesto, los recursos - me parecen la mejor solución, porque son invisibles, a diferencia de las variables globales del terminal y los archivos, y son rápidos. Además, puedes pasar arrays a través de ellos, igual que a través de archivos, pero más rápido, porque todo ocurre en la RAM. También pertenecen a la ventana, no al terminal, como en el caso del global. Además, puede crear un recurso para todos los mismos indicadores en una ventana.

No, creo que ChartSaveTemplate es demasiado engorroso. Intentaré crear un recurso común para todas las instancias de un indicador sin utilizar cambios globales, plantillas y archivos.

 
Nikolai Semko:

Mi ejemplo fue creado para mostrar el problema de la secuencia ambigua de la Unidad de la nueva TF y la Unidad de la antigua TF, no como una solución.

Sólo has evitado el problema, no lo has resuelto.
En mi ejemplo, sólo es importante eliminar el objeto en la Unidad del antiguo TF en cualquier caso, incluso cuando se cambia el TF, y en la Unidad del nuevo objeto se crea de nuevo.

Si la secuencia es primero Deunit de la antigua TF, luego Unit de la nueva TF, como debería ser lógicamente. A continuación, el objeto se borra y se vuelve a crear.

Si la secuencia es primero la Unidad de la nueva TF y luego la Deunidad de la antigua TF, entonces el objeto simplemente se modifica cuando se intenta crear en la Unidad, porque aún no se ha borrado. Y luego es borrado por la Deunit de la antigua TF. Este es el error.

Ese era el objetivo de este ejemplo: mostrar lo que puede encontrar cualquier programador que no haya leído esta rama y no conozca esta "característica".
Este ejemplo no pretende ser una solución. Como variantes de la solución se presentan aquí y aquí. Creo que también añadiré una solución más adelante, pero sin utilizar las variables globales y los archivos del terminal y para que esta solución funcione aunque se pongan varios indicadores idénticos en una ventana. ¿Ha intentado resolver este problema? O sólo eres capaz de encontrar errores en el código de los demás, sobre todo cuando no los hay.


Es un pecado decir palabrotas hoy, pero me apetece...

No he podido leer tus tonterías hasta el final.

Repito una vez más que no hay que hacer un problema donde no lo hay.

La respuesta a todas sus preguntas en su código estaba aquí

Alexey Viktorov:

¿Qué sentido tiene utilizar el ejemplo primitivo de las calles de doble sentido?

Será mejor que uses un ejemplo de código casi correcto .

No contaba con el absolutismo.

Eso es todo... vete Satanás, no me lleves a pecar.

 
Alexey Viktorov:

Es un pecado decir palabrotas hoy, pero me apetece...

No he podido leer tus tonterías hasta el final.

Lo diré de nuevo, no pongas el problema donde no existe.

La respuesta a todas las preguntas de su código estaba aquí.

No contaba con los absolutos.

Eso es... que Satanás se vaya, no nos lleve al pecado.


Oh, hombre, tienes que ir a otro foro. Donde los psicoterapeutas dan consejos. Lo entiendo, lo entiendo. Déficit de amor en la infancia, quieren atención y amor. Lo siento. Te ayudaré si necesitas algo. Puedes escribirme en persona. No estoy bromeando.

Y más vale que no lo hagas aquí, porque hemos divertido demasiado a la gente.

¡LA RESURRECCIÓN EN VERDAD!

 
Un buen método de trabajo. Ejecutar
#property indicator_chart_window
#property indicator_plots   0

void OnInit()
{
  Print(__FUNCTION__ + (string)ChartIndicatorGet(0, 0, MQLInfoString(MQL_PROGRAM_NAME)));
}

void OnDeinit( const int Reason )
{
  Print(__FUNCTION__);
}

int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double& price[])
{
  return(rates_total);
}

Y cambiar el TF. ¡No habrá ni un solo Deinit! Todos los indicadores pasarán desapercibidos, consumiendo recursos. Y sólo quería

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

fxsaber, 2016.09.22 16:14

¿Cómo puedo conocer mi mango en un gráfico en un indicador? A través deChartIndicatorName no es adecuado ya que devuelve un nombre corto. Y con el mismo nombre puede estar ya funcionando el mismo indicador con diferentes parámetros de entrada.

Resulta que si quieres conocer su mango, debes usar ChartIndicatorGet, pero como se muestra en el ejemplo anterior, será un verdadero problema - el indicador será desinstalable.

Qué pena.


Ni siquiera puedo hacer esto.

Foro sobre trading, sistemas de trading automatizados y comprobación de estrategias

Bichos, errores, preguntas

fxsaber, 2016.09.23 10:20

¿Cómo puedo saber miINDICATOR_SHORTNAME? Las funciones IndicatorGet* no existen.

No hay manera de saber desde el indicador qué sub_window golpeó. Es sólo un montón de vagabundos.

 
fxsaber:

El indicador no permite saber en qué subventana se encuentra. Es sólo un montón de vagabundos.

https://www.mql5.com/ru/docs/chart_operations/chartwindowfind
Документация по MQL5: Операции с графиками / ChartWindowFind
Документация по MQL5: Операции с графиками / ChartWindowFind
  • www.mql5.com
Операции с графиками / ChartWindowFind - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber:
¡Un pequeño y genial tiphack! Ejecutar

Y cambiar el TF. ¡No habrá ni un solo Deinit! Todos los indicadores pasarán desapercibidos, consumiendo recursos. Y sólo quería

Resulta que si quieres conocer su mango, debes usar ChartIndicatorGet, pero, como se muestra en el ejemplo anterior, será un verdadero fastidio: el indicador será indeleble.

Se volverá irrecuperable.

Me he enfrentado a algo así. Los desarrolladores aconsejan leer la ayuda con más atención ya que hay un ejemplo:

//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
   //--- количество окон на графике (всегда есть хотя бы одно главное окно) 
   int windows=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL); 
   //--- про ходим по окнам 
   for(int w=0;w<windows;w++) 
     { 
      //--- сколько индикаторов в данном окне/подокне 
      int total=ChartIndicatorsTotal(0,w); 
      //--- переберем все индикаторы в окне 

      for(int i=0;i<total;i++) 
        { 
         //--- получим короткое имя индикатора 
         string name=ChartIndicatorName(0,w,i); 
         //--- получим хэндл индикатора 
         int handle=ChartIndicatorGet(0,w,name); 
         //--- выведем в журнал 
         PrintFormat("Window=%d,  index=%d,  Name=%s,  handle=%d",w,i,name,handle); 
         //--- обязательно освобождаем хендл индикатора, как только он становится ненужным 
         IndicatorRelease(handle); 
        } 
     } 
  }
Sin embargo, luego añadieron que el comportamiento sería "corregido". Pero, al parecer, todavía se está ajustando.
 
Alexey Kozitsyn:
https://www.mql5.com/ru/docs/chart_operations/chartwindowfind

Gracias, pero existe la misma limitación: no hay manera sin un nombre corto (¿cómo lo sabes?).

 
Alexey Kozitsyn:

Me he encontrado con algo así. Los desarrolladores me aconsejaron que leyera la ayuda con más atención, ya que hay un ejemplo:

Sin embargo, luego añadió que el comportamiento sería "corregido". Pero aparentemente todavía se está ajustando.

Esto realmente ayudó, ¡gracias!

Lo principal es no hacer IndicatorRelease en Deinit.