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

 

Opción para resolver problemas al cambiar los plazos


Si acabas de cambiar de TF

1) Probablemente no sea necesario eliminar los objetos gráficos.

2) Quizá no sea necesario reinicializar algunas variables


static int ChanGeTF = 0;  // Признак смены ТФ , держим как статическую переменную в памяти эксперта
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   if( ChanGeTF == 0) // при первом вызове код в OnInit полностью обрабатывается  , но не отработает если просто менялся ТФ
     {
      // тут сформируем переменные для нашего эксперта которые отработают  при первом старте экперта
      // возможно сформируем графические объекты 
     }
    else
    {
      ChanGeTF=0;  
     // сюда попадет при смене ТФ 
     // а формировать ничего уже не будем ,  у нас все сформировано и мы не желаем делать инициализацию переменных
     // но если необходимо - что то обработаем в код OnInit 
    }

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Print(__FUNCTION__,"_UninitReason = ",getUninitReasonText(_UninitReason));   // пишем в лог причину входа в DeInit - очень полезная информация
   if ( REASON_CHARTCHANGE != _UninitReason )
     {
      // сюда не попадаем , если произошла смена ТФ
      // удалим графические объекты - для полноценного завершения работы эксперта 
      // 
     }
    else
    {
      // сюда попадем если просто произошла смена ТФ 
      // сделаем то что нам интересно - но при этом - к примеру - не будем удалять с графика графические объекты
         ChanGeTF=1; 
    }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string getUninitReasonText(int reasonCode)
  {
   string text="";
//--- 
   switch(reasonCode)
     {
      case REASON_ACCOUNT:
         text="Account was changed";break;
      case REASON_CHARTCHANGE:
         text="Symbol or timeframe was changed";
         break;
      case REASON_CHARTCLOSE:
         text="Chart was closed";break;
      case REASON_PARAMETERS:
         text="Input-parameter was changed";break;
      case REASON_RECOMPILE:
         text="Program "+__FILE__+" was recompiled";
         break;
      case REASON_REMOVE:
         text="Program "+__FILE__+" was removed from chart";break;
      case REASON_TEMPLATE:
         text="New template was applied to chart";break;
      default:text="Another reason";
     }
//--- 
   return text;
  }

 
Yuriy Zaytsev:

Opción para resolver problemas al cambiar los plazos


Si acabas de cambiar de TF

1) Probablemente no sea necesario eliminar los objetos gráficos.

2) Quizá no sea necesario reinicializar algunas variables


El único problema es quela estáticano funciona en el indicador, se resetea. Funciona en el Asesor Experto, pero no en el indicador
.
 
Yuriy Zaytsev:

Opción para resolver problemas al cambiar los plazos


Si sólo hubiera un cambio de horario

1) Tal vez no debería eliminar los objetos gráficos.

2) Tal vez no deba reiniciar ninguna variable



Su código no funcionará.

Una vez más:

No puede controlar los resultados de Deinit en Inite, porque Deinit puede funcionar después de que Inite haya terminado.

 
Sergey Chalyshev:


Su código no funcionará.

Una vez más:

No puede controlar los resultados de Deinit en Inite, ya que Deinit puede activarse después de que Inite se haya ejecutado.

¿Quieres decir que no funcionará- en el indicador? Funciona en los Asesores Expertos.
 
Yuriy Zaytsev:
¿Quieres decir que no funcionará- en un indicador? En los expertos funciona.
No hay ningún problema con los Asesores Expertos. Este tema se refiere sólo a los indicadores. Léelo con atención.
 
Sergey Chalyshev:

¿Cómo procesar estos códigos de desinicialización en un indicador, qué hacen estos códigos? Como no existe la posibilidad de esperar en el indicador, el sueño no funciona.

¿No has leído lo que he escrito varias veces?

No hay manera en los indicadores. No puedes hacerlo en cinco desde el principio. Porque se descarga una copia completamente nueva del indicador con todas las consecuencias.

 
Nikolai Semko:
No hay ningún problema con los expertos. Este tema se refiere sólo a los indicadores. Léelo con atención.

He leído el primer post.
Dice, y cito:
"Indicador escrito o coevaluador"
 
Yuriy Zaytsev:

He leído el primer post.
Dice, y cito:
"Escrito por un indicador o coautor".
Ahí se acaba lo de los EA.
No siempre es prudente limitarse a leer el primer post antes de escribir algo.
 
Nikolai Semko:
Este es el fin de los Asesores Expertos.
No siempre es prudente limitarse a leer el primer post antes de escribir nada.

No es del todo correcto decir qué es razonable y qué no lo es.
Hice un pequeño recorrido por el tema antes de escribirlo.

He pegado un ejemplo de código en el tema y ahora los que lean el tema podrán ver que este mecanismo no funciona en un indicador y que sí lo hace en un EA.

El autor del tema por lo menos consiguió una respuesta a una pregunta, y con un ejemplo.
 
Yuriy Zaytsev:

No es muy preciso decir qué es razonable y qué no.
He investigado un poco sobre el tema antes de escribir.

Ahora los que lean el tema pueden ver que este mecanismo no funciona en un indicador y sí en un EA.
Gracias por el código, por supuesto. Funciona bien con los Asesores Expertos porque cuando cambiamos de TF, las variables no se reinicializan, mientras que en los indicadores sí se reinicializan. Si realmente quieres ayudar con consejos, por favor, vuelve a "correr" con menos prisa.
Razón de la queja: