UninitializeReason,_UninitReason
初期化解除の理由コードを得る方法として関数「UninitializeReason」とシステム変数「_UninitReason」の 2つがあります。
この 2つの関数及び変数が得る結果は同じです。どちらを使っても大丈夫です。
これらは、EAをチャート上で動かしている時に、EAを削除したり、入力パラメータを変更した時に、その作業コードを 0~9の値で取得することができます。
データ型と構成・戻り値
int UninitializeReason(); // 関数
int _UninitReason; // 変数
戻り値は、0~9 の初期化理由コードが取得されます。取得される値とそれに対応する定数、内容はこちらです。
引数 [0]
引数無し。
使用例
初期化解除の理由コードの表示テスト
コード
関数「UninitializeReason」でコードを取得していますが、変数「_UninitReason」でも OKです。変数「_UninitReason」をコメントにしていますので、入れ替えて試してみてください。
// 例1 初期化解除の理由コードの表示テスト
#property strict
extern int hensu = 100;
void OnInit() {
int r = UninitializeReason(); // 関数
//int r = _UninitReason; // 変数
int xpixcel = (int)(ChartGetInteger(0,CHART_WIDTH_IN_PIXELS));
int ypixcel = (int)(ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS));
int fontsize = 15; // フォントサイズ
int xWidth = xpixcel - 200; // 幅
int yHeight = 20; // 高さ
ObjectsDeleteAll();// オブジェクト全削除
ObjectCreate("obj_label", OBJ_LABEL,0,0,0); // テキストラベルオブジェクト生成
ObjectSet("obj_label", OBJPROP_XDISTANCE,xWidth); // テキストラベルオブジェクトX軸位置設定
ObjectSet("obj_label", OBJPROP_YDISTANCE,yHeight); // テキストラベルオブジェクトY軸位置設定
ObjectSetText("obj_label", "理由コード:" + (string)r, fontsize , "MS ゴシック" , clrYellow);
Print("理由コード:",r);
}
void OnDeinit(const int reason) {
if(UninitializeReason() == 1 || UninitializeReason() == 4) { //オブジェクトテキストをEA削除時消すための処理
ObjectsDeleteAll(ChartID());
}
}
結果
結果は、❶~➌の作業をした時にエキスパートタグのメッセージで表示される内容です。
❶コンパイルをするとターミナルのエキスパートタグのメッセージに「理由コード:0」が表示されます。(チャートの右上にも表示されます) これは一連のプログラムの操作が終了したことを表しています。
それとは別に、この初期化解除コードは UninitializeReason関数を使わなくてもエキスパートタグのメッセージでも確認することができます。「uninit reason 2」は再コンパイルした時の理由コードで、自動でメッセージに出力されます。「uninit reason 0」は表示されません。
➋EAを適用したチャートの時間軸を「H1」→「M30」などに変更すると「理由コード:3」と表示されます。「uninit reason 3」は、自動でメッセージに出力されます。
➌パラメータを変更すると Print関数により「理由コード:5」と表示されます。
MT4のチャート上で、右クリック → エキスパートアドバイザ → 設定 → 「パラメーターの入力」タグから「値」を 100以外にしてください。又、こちらでも「uninit reason 5」が自動でメッセージに出力されます。(これを使って EA動作中に入力パラメータの変更をした時、警告して EAを止めるか継続させるかの確認をすることが可能です)
OnDeinit関数での初期化解除の理由コードによる描画削除
OnDeinit関数は、EAを削除する時に動く関数で 例1では、初期化解除の理由コードが「1」と「4」の時、つまり「EAをチャートから削除」、「チャートを閉じる」時にチャート上に描画されていた線や文字を削除します。
この処理をしないと、描画などをした場合、線や文字がそのまま残ることになります。次のコードは線や文字が残る例です。試しに次のコードをコピペしてコンパイル、EAを適用後、EAを削除してみてください。
取得した作業コードを用いることで、EAを削除する際に、オブジェクト機能を使って描画やコメントを書いていたものを消すことができます。これを使わない場合、EAを削除してもチャート上にそれらが残ったままになります。
コード
// 例2 初期化解除の理由コードの表示テスト 削除処理をしていないのでEAを削除しても文字が残る
#property strict
extern int hensu = 100;
void OnInit() {
int r = UninitializeReason(); // 関数
//int r = _UninitReason; // 変数
int xpixcel = (int)(ChartGetInteger(0,CHART_WIDTH_IN_PIXELS));
int ypixcel = (int)(ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS));
int fontsize = 15; // フォントサイズ
int xWidth = xpixcel - 200; // 幅
int yHeight = 20; // 高さ
ObjectsDeleteAll();// オブジェクト全削除
ObjectCreate("obj_label", OBJ_LABEL,0,0,0); // テキストラベルオブジェクト生成
ObjectSet("obj_label", OBJPROP_XDISTANCE,xWidth); // テキストラベルオブジェクトX軸位置設定
ObjectSet("obj_label", OBJPROP_YDISTANCE,yHeight); // テキストラベルオブジェクトY軸位置設定
ObjectSetText("obj_label", "理由コード:" + (string)r, fontsize , "MS ゴシック" , clrYellow);
Print("理由コード:",r);
}
void OnDeinit(const int reason) {
}
結果
備考
通常は EAプログラム中に描画が無くても「例1」のように描画を削除するコードは入れておくと良いでしょう。
void OnDeinit(const int reason) {
if(UninitializeReason() == 1 || UninitializeReason() == 4) { // オブジェクトテキストをEA削除時消すための処理(値を使用)
ObjectsDeleteAll(ChartID());
}
初期化解除の理由コードは、所定の関数OnDeinit (const int reason) のパラメーターとしても渡されます。これにより描画を削除するコードは次のように「定数」を使用しても書くことができます。
void OnDeinit(const int reason) {
if(reason == REASON_REMOVE || reason == REASON_CHARTCLOSE) { // オブジェクトテキストをEA削除時消すための処理(定数を使用)
ObjectsDeleteAll(ChartID());
}
}
以下のコードを EAを組む時の基本型としておくと良いでしょう。
上記までは条件を付けてオブジェクトテキストを削除していましたが、OnDeinit関数は EAを削除する時に動く関数なので、必要が無ければ次のように条件を付けないで削除しても問題ありません。
// EAを作成する時の基本の型
#property strict
void OnInit() {
}
void OnDeinit(const int reason) {
ObjectsDeleteAll(); // オブジェクトテキストをEA削除時消すための処理
}
void OnTick() {
}