ブログタイトルを「FX自動売買システム開発部」から「autoFX」に変更しました!

OnInit/OnDeinit関数とグローバル変数の関係

パラメーターや時間足を変更してもグローバル変数は初期化されない

パラメーターや時間足を変更すると、その都度、OnDeinit関数とOnInit関数がこの順で再実行されます。

この時、グローバル変数はどうなるかと言いますと、特に影響を受けません。データは保持されたままです。

初期化されるような気がしますが、それは気のせいです。初期化されません。

逆に言えば、パラメーターや時間足を変更した際に特定のグローバル変数を初期化したいなら、明示的に初期化の処理を記述しなければなりません。

記述場所はOnDeinit関数の方が良いでしょう。パラメーターや時間足を変更した時だけ初期化するといった制御が可能ですので。

例えば、こんなコードを書くことで、パラメーターや時間足を変更した時だけ、特定のグローバル変数を初期化できます。

int gVariable = 0; // グローバル変数

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  // 時間足を変えるか、パラメーターを変えた場合
  if(reason == REASON_CHARTCHANGE || reason == REASON_PARAMETERS){
    gVariable = 0; // 初期化
  }else{
    // 上記の理由以外では何もしない
  }
}

こんな考慮が必要なケースはあまりないかもしれませんが、誰かの役に立てば幸いです。

MQL4プログラミングの最新記事8件

>完全放ったらかしEA 「AutoEndlessCatchRange」

完全放ったらかしEA 「AutoEndlessCatchRange」

「本業が忙しい!」「でも資産運用したい!」そんなあなたに最適なEAです。兼業トレーダーの方はチャートを毎日みて分析してトレードする時間はなかなか確保できないものです。トレードは本EAに任せて、本業やプライベートの時間をもっと増やしませんか?元々は自分自身のために開発したEAですので、手抜き無しのガチものです。

CTR IMG