Init()およびDeInit()実行シーケンス - ページ 8

 

時間軸を変更する際の問題解決オプション


TFを変更しただけの場合

1)グラフィカル・オブジェクトを削除 する必要はないでしょう。

2) 一部の変数の再初期化は必要ないのでは?


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:

時間軸を変更する際の問題解決オプション


TFを変更しただけの場合

1)グラフィカル・オブジェクトを削除 する必要はないでしょう。

2) 一部の変数の再初期化は必要ないのでは?


ただ、インジケーターでスタティックが効かず リセット されてしまうのが難点です。 Expert Advisor では動作しますが、インジケーターでは 動作しません
 
Yuriy Zaytsev:

時間軸を変更する際の問題解決オプション


時間軸の変更だけなら

1)グラフィカル・オブジェクトを削除 しない方がいいかもしれません。

2) 変数を再初期化しないほうがいいのかもしれない



あなたのコードは動作しません。

もう一度言います。

Initeが終わった後にDeinitが動作することがあるので、IniteでDeinitの結果を制御することはできません。

 
Sergey Chalyshev:


あなたのコードは 動作 しません。

もう一度言います。

DeinitはIniteが実行された後に起動することができるので、IniteでDeinitの結果を制御することはできません。

インジケータでは動かないという ことですか? Expert Advisorでは動きます。
 
Yuriy Zaytsev:
インジケーターでは動かないという ことですか? エキスパートでは動きます。
Expert Advisorについては問題ありません。このトピックは、あくまで指標に関するものです。よく読んでみてください。
 
Sergey Chalyshev:

これらの非初期化のコードをインジケータでどのように処理するか、何のためにこれらのコードが必要なのか?結局のところ、インジケーターで待機する可能性はなく、スリープは機能しません。

私が書いたものを何度も読み返したのではありませんか?

インジケータに方法はない。最初から5つでできるわけがない。なぜなら、あなたはインジケーターの全く新しいコピーとそのすべての結果をダウンロードするからです。

 
Nikolai Semko:
専門家でも問題ない。このトピックは、あくまで指標に関するものです。よく読んでみてください。

最初の投稿を読みました。
と書いてあり、引用します。
"ライティング・インディケーター "または "コ・アセッサー"
 
Yuriy Zaytsev:

最初の投稿を読みました。
と書いてあり、引用します。
"指示者または共著者が書いたもの"
そこでチップは終了です。
何かを書く前に、最初の投稿を読むことに限定するのは、必ずしも賢明ではありません。
 
Nikolai Semko:
以上でExpert Advisorsは終了です。
何かを書く前に最初の投稿を読むことに限定するのは、必ずしも賢明ではありません。

まあ、何が合理的で何が合理的でないかというと、まったく正確ではありませんが。
書く前にお題を少し駆け足で書いてみました。

コード例をお題に貼り付けて、これでお題を読んだ人は、この仕組みがインジケーターでは機能せず、EAで機能することがわかると思います。

このトピックの著者は、少なくとも1つの質問に対して、例を挙げての回答を得たのです。
 
Yuriy Zaytsev:

まあ、何が合理的で何が合理的でないかというと、あまり正確ではありませんが。
書く前に少し調べてみたんです。

これで、この仕組みがインジケータでは機能せず、EAで機能することが、このテーマを読まれた方にはお分かりいただけたと思います。
もちろん、コードもありがとうございます。Expert AdvisorではTFを変更しても変数は再初期化されないが、indicatorsでは再初期化されるため、問題なく動作する。本当にアドバイスに役立ちたいのであれば、あまり急がずにもう一度「実行」してください。