Sequenza di esecuzione di Init() e DeInit() - pagina 8

 

Opzione per risolvere i problemi quando si cambiano i tempi


Se hai appena cambiato TF

1) Probabilmente non è necessario cancellare gli oggetti grafici.

2) Forse non è necessario reinizializzare alcune variabili


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:

Opzione per risolvere i problemi quando si cambiano i tempi


Se hai appena cambiato TF

1) Probabilmente non è necessario cancellare gli oggetti grafici.

2) Forse non è necessario reinizializzare alcune variabili


L'unico problema è che lastaticanon funziona nell'indicatore, viene resettata. Funziona nell'Expert Advisor, ma non nell'indicatore
.
 
Yuriy Zaytsev:

Opzione per risolvere i problemi quando si cambiano i tempi


Se ci fosse solo un cambio di orario

1) Forse non si dovrebbero cancellare gli oggetti grafici.

2) Forse non si dovrebbe reinizializzare nessuna variabile



Il vostro codice non funzionerà.

Ancora una volta:

Non potete controllare i risultati di Deinit in Inite, perché Deinit può funzionare dopo che Inite è stato fatto.

 
Sergey Chalyshev:


Il vostro codice non funzionerà.

Ancora una volta:

Non potete controllare i risultati di Deinit in Inite, perché Deinit può essere attivato dopo l'esecuzione di Inite.

Vuoi dire che non funziona in un indicatore? Funziona in Expert Advisors.
 
Yuriy Zaytsev:
Vuoi dire che non funziona- in un indicatore? Negli esperti funziona.
Non ci sono problemi con gli Expert Advisors. Questo argomento riguarda solo gli indicatori. Leggete attentamente.
 
Sergey Chalyshev:

Come trattare questi codici di deinizializzazione in un indicatore, a cosa ci servono questi codici? Dopo tutto, non c'è la possibilità di aspettare nell'indicatore, Sleep non funziona.

Non hai letto più volte quello che ho scritto?

Non c'è modo negli indicatori. Non si può fare in cinque dall'inizio. Perché si scarica una copia completamente nuova dell'indicatore con tutte le sue conseguenze.

 
Nikolai Semko:
Non ci sono problemi con gli esperti. Questo argomento riguarda solo gli indicatori. Leggete attentamente.

Ho letto il primo post.
Dice, e cito:
"Indicatore scritto o Co-Assessore"
 
Yuriy Zaytsev:

Ho letto il primo post.
Dice, e cito:
"Scritto da un indicatore o coautore".
È qui che finisce la storia degli EA.
Non è sempre saggio limitarsi a leggere il primo post prima di scrivere qualcosa.
 
Nikolai Semko:
Questa è la fine degli Expert Advisors.
Non è sempre saggio limitarsi a leggere il primo post prima di scrivere qualcosa.

Beh, non è del tutto esatto dire cosa è ragionevole e cosa no.
Ho fatto un po' di ricerche sull'argomento prima di scriverlo.

Ho incollato un esempio di codice nel soggetto e ora chi legge il soggetto può vedere che questo meccanismo non funziona in un indicatore e che funziona in un EA.

L'autore del topic ha almeno ottenuto una risposta a una domanda, e con un esempio.
 
Yuriy Zaytsev:

Beh, non è proprio esatto dire cosa sia ragionevole e cosa no.
Ho fatto una piccola ricerca sull'argomento prima di scrivere.

Ora chi ha letto il topic può vedere che questo meccanismo non funziona in un indicatore e funziona in un EA.
Grazie per il codice, naturalmente. Funziona bene con Expert Advisors perché quando cambiamo TF, le variabili non vengono reinizializzate, mentre negli indicatori vengono reinizializzate. Se vuoi davvero aiutare con un consiglio, per favore "eseguilo" di nuovo con meno fretta.
Motivazione: