Séquence d'exécution de Init() et DeInit() - page 8

 

Option permettant de résoudre les problèmes en cas de changement de calendrier


Si vous venez de changer de TF

1) Il n'est probablement pas nécessaire de supprimer les objets graphiques.

2) Il n'est peut-être pas nécessaire de réinitialiser certaines 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:

Option permettant de résoudre les problèmes en cas de changement de calendrier


Si vous venez de changer de TF

1) Il n'est probablement pas nécessaire de supprimer les objets graphiques.

2) Il n'est peut-être pas nécessaire de réinitialiser certaines variables.


Leseul problème est que lastatiquene fonctionne pas dans l'indicateur, elle est réinitialisée. Cela fonctionne dans l'Expert Advisor, mais pas dans l'indicateur
.
 
Yuriy Zaytsev:

Option permettant de résoudre les problèmes en cas de changement de calendrier


S'il y avait juste un changement de calendrier

1) Vous ne devriez peut-être pas supprimer les objets graphiques.

2) Peut-être que vous ne devriez pas réinitialiser de variables



Votre code ne fonctionnera pas.

Encore une fois :

Vous ne pouvez pas contrôler les résultats de Deinit dans Inite, car Deinit peut fonctionner après Inite.

 
Sergey Chalyshev:


Votre code ne fonctionnera pas.

Encore une fois :

Vous ne pouvez pas contrôler les résultats de Deinit dans Inite, car Deinit peut être déclenché après l'exécution de Inite.

Vous voulez dire qu'il ne fonctionnera pas- dans l'indicateur ? Il fonctionne dans les conseillers experts.
 
Yuriy Zaytsev:
Vous voulez dire que cela ne fonctionnera pas- dans un indicateur ? Dans les experts, cela fonctionne.
Il n'y a pas de problème avec les conseillers experts. Ce sujet ne concerne que les indicateurs. Lisez-le attentivement.
 
Sergey Chalyshev:

Comment traiter ces codes de désinitialisation dans un indicateur, à quoi servent ces codes ? Après tout, il n'y a aucune possibilité d'attendre dans l'indicateur, le sommeil ne fonctionne pas.

N'avez-vous pas lu plusieurs fois ce que j'ai écrit ?

Il n'y a aucun moyen dans les indicateurs. Vous ne pouvez pas le faire en cinq dès le début. Car vous téléchargez une copie entièrement nouvelle de l'indicateur avec toutes ses conséquences.

 
Nikolai Semko:
Il n'y a pas de problème avec les experts. Ce sujet ne concerne que les indicateurs. Lisez-le attentivement.

J'ai lu le premier message.
Il est dit, et je cite :
"Indicateur ou co-instructeur écrit".
 
Yuriy Zaytsev:

J'ai lu le premier message.
Il est dit, et je cite :
"Rédigé par un indicateur ou un co-auteur."
C'est là que ça s'arrête avec les EA.
Il n'est pas toujours judicieux de se limiter à lire le premier message avant d'écrire quelque chose.
 
Nikolai Semko:
C'est la fin des conseillers experts.
Il n'est pas toujours judicieux de se limiter à lire le premier message avant d'écrire quoi que ce soit.

Eh bien, il n'est pas tout à fait exact de dire ce qui est raisonnable et ce qui ne l'est pas.
J'ai fait un petit tour du sujet avant de l'écrire.

J'ai collé un exemple de code dans le sujet et maintenant ceux qui lisent le sujet peuvent voir que ce mécanisme ne fonctionne pas dans un indicateur et qu'il fonctionne dans un EA.

L'auteur du sujet a au moins obtenu une réponse à une question, et avec un exemple.
 
Yuriy Zaytsev:

Eh bien, il n'est pas vraiment exact de dire ce qui est raisonnable et ce qui ne l'est pas.
J'ai fait quelques recherches sur le sujet avant d'écrire.

Maintenant, ceux qui ont lu le sujet peuvent voir que ce mécanisme ne fonctionne pas dans un indicateur et fonctionne dans un EA.
Merci pour le code bien sûr. Cela fonctionne bien avec les Expert Advisors car lorsque nous changeons de TF, les variables ne sont pas réinitialisées, alors que dans les indicateurs elles le sont. Si vous voulez vraiment m'aider en me donnant des conseils, je vous prie de le relancer en moins de temps.