<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>reason_ アーカイブ - 自動売買を作ろう！</title>
	<atom:link href="https://mql-programing.com/archives/tag/reason_/feed/" rel="self" type="application/rss+xml" />
	<link>https://mql-programing.com/archives/tag/reason_/</link>
	<description>MQLプログラミング学習サイト</description>
	<lastBuildDate>Tue, 31 Mar 2026 13:05:07 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://mql-programing.com/main29/wp-content/uploads/2021/02/cropped-ブログアイコン-32x32.jpg</url>
	<title>reason_ アーカイブ - 自動売買を作ろう！</title>
	<link>https://mql-programing.com/archives/tag/reason_/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【MQL4関数】OnDeinit関数とは？アンイニシャルコード発生時に実行されるイベント関数</title>
		<link>https://mql-programing.com/archives/2930/ondeinit/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Sun, 15 May 2022 05:28:14 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[【辞書】MQLリファレンス]]></category>
		<category><![CDATA[その他]]></category>
		<category><![CDATA[イベント関数]]></category>
		<category><![CDATA[MQL]]></category>
		<category><![CDATA[リファレンス]]></category>
		<category><![CDATA[自動売買]]></category>
		<category><![CDATA[reason_]]></category>
		<category><![CDATA[OnDeinit]]></category>
		<category><![CDATA[アンイニシャル定数]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=2930</guid>

					<description><![CDATA[<p>OnDeinit関数とは？ OnDeinit関数は、Expert Advisor（EA）やカスタムインジケーターがチャートから削除されるとき、またはアンイニシャライズ（非初期化）イベントが発生したときに自動的に呼び出され [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/2930/ondeinit/">【MQL4関数】OnDeinit関数とは？アンイニシャルコード発生時に実行されるイベント関数</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<h2><span id="toc1">OnDeinit関数とは？</span></h2>
<p>OnDeinit関数は、Expert Advisor（EA）やカスタムインジケーターがチャートから削除されるとき、またはアンイニシャライズ（非初期化）イベントが発生したときに自動的に呼び出されるイベント関数です。</p>
<p>プログラムの「後片付け」を行うための関数であり、リソースの解放やファイルのクローズ、オブジェクトの削除など、プログラム終了時に必要な処理を記述します。</p>
<h2><span id="toc2">基本的な書式</span></h2>
<pre><code class="language-mql4">void OnDeinit(const int reason)
{
   // 終了時の処理をここに記述
}
</code></pre>
<h3><span id="toc3">引数</span></h3>
<table>
<thead>
<tr>
<th>引数名</th>
<th>型</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>reason</td>
<td>const int</td>
<td>アンイニシャライズの理由コード（なぜOnDeinitが呼ばれたかを示す）</td>
</tr>
</tbody>
</table>
<h3><span id="toc4">戻り値</span></h3>
<p>戻り値はありません（void型）。</p>
<h2><span id="toc5">アンイニシャライズ理由コード（reason）一覧</span></h2>
<p>OnDeinit関数の引数<code>reason</code>には、以下の定数が渡されます。これにより、なぜプログラムが終了するのかを判別できます。</p>
<table>
<thead>
<tr>
<th>定数名</th>
<th>値</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>REASON_PROGRAM</td>
<td>0</td>
<td>ExpertRemove()関数による終了</td>
</tr>
<tr>
<td>REASON_REMOVE</td>
<td>1</td>
<td>チャートからプログラムが削除された</td>
</tr>
<tr>
<td>REASON_RECOMPILE</td>
<td>2</td>
<td>プログラムが再コンパイルされた</td>
</tr>
<tr>
<td>REASON_CHARTCHANGE</td>
<td>3</td>
<td>通貨ペアまたは時間足が変更された</td>
</tr>
<tr>
<td>REASON_CHARTCLOSE</td>
<td>4</td>
<td>チャートが閉じられた</td>
</tr>
<tr>
<td>REASON_PARAMETERS</td>
<td>5</td>
<td>入力パラメータが変更された</td>
</tr>
<tr>
<td>REASON_ACCOUNT</td>
<td>6</td>
<td>別のアカウントが有効化された</td>
</tr>
<tr>
<td>REASON_TEMPLATE</td>
<td>7</td>
<td>別のテンプレートが適用された</td>
</tr>
<tr>
<td>REASON_INITFAILED</td>
<td>8</td>
<td>OnInit()がゼロ以外の値を返した（初期化失敗）</td>
</tr>
<tr>
<td>REASON_CLOSE</td>
<td>9</td>
<td>ターミナルが閉じられた</td>
</tr>
</tbody>
</table>
<h2><span id="toc6">プログラム例1：基本的なOnDeinit関数の使い方</span></h2>
<p>最もシンプルな例として、OnDeinitが呼ばれた理由をログに出力する基本パターンです。</p>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| Expert Advisor - OnDeinit基本例                                    |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| 初期化関数                                                         |
//+------------------------------------------------------------------+
int OnInit()
{
   Print("EAが初期化されました");
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| ティック処理関数                                                    |
//+------------------------------------------------------------------+
void OnTick()
{
   // メイン処理（ここでは省略）
}

//+------------------------------------------------------------------+
//| 終了処理関数                                                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // 終了理由をログに出力する
   Print("EAが終了しました。理由コード: ", reason);
   
   // 理由コードに応じたメッセージを表示
   switch(reason)
   {
      case REASON_PROGRAM:
         Print("→ ExpertRemove()による終了");
         break;
      case REASON_REMOVE:
         Print("→ チャートからEAが削除されました");
         break;
      case REASON_RECOMPILE:
         Print("→ プログラムが再コンパイルされました");
         break;
      case REASON_CHARTCHANGE:
         Print("→ 通貨ペアまたは時間足が変更されました");
         break;
      case REASON_CHARTCLOSE:
         Print("→ チャートが閉じられました");
         break;
      case REASON_PARAMETERS:
         Print("→ パラメータが変更されました");
         break;
      case REASON_ACCOUNT:
         Print("→ アカウントが変更されました");
         break;
      case REASON_TEMPLATE:
         Print("→ テンプレートが適用されました");
         break;
      case REASON_INITFAILED:
         Print("→ 初期化に失敗しました");
         break;
      case REASON_CLOSE:
         Print("→ ターミナルが閉じられました");
         break;
      default:
         Print("→ 不明な理由コード");
         break;
   }
}
</code></pre>
<p>このコードでは、switch文を使ってすべてのアンイニシャライズ理由を判別し、それぞれに対応するメッセージをエキスパートログに出力しています。デバッグ時に非常に役立つ基本パターンです。</p>
<h2><span id="toc7">プログラム例2：チャートオブジェクトの後片付け</span></h2>
<p>EAやインジケーターがチャート上にライン・ラベル・矢印などのオブジェクトを描画した場合、OnDeinitで確実に削除しないとチャートにゴミが残ってしまいます。</p>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| Expert Advisor - オブジェクト削除の例                                |
//+------------------------------------------------------------------+
#define PREFIX "MyEA_"  // オブジェクト名のプレフィックス

//+------------------------------------------------------------------+
//| 初期化関数                                                         |
//+------------------------------------------------------------------+
int OnInit()
{
   // 水平ラインを作成
   string lineName = PREFIX + "HLine";
   ObjectCreate(0, lineName, OBJ_HLINE, 0, 0, Ask);
   ObjectSetInteger(0, lineName, OBJPROP_COLOR, clrRed);
   ObjectSetInteger(0, lineName, OBJPROP_WIDTH, 2);
   
   // テキストラベルを作成
   string labelName = PREFIX + "Label";
   ObjectCreate(0, labelName, OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(0, labelName, OBJPROP_XDISTANCE, 20);
   ObjectSetInteger(0, labelName, OBJPROP_YDISTANCE, 30);
   ObjectSetString(0, labelName, OBJPROP_TEXT, "EA稼働中");
   ObjectSetInteger(0, labelName, OBJPROP_COLOR, clrWhite);
   ObjectSetInteger(0, labelName, OBJPROP_FONTSIZE, 12);
   
   // 矢印オブジェクトを作成
   string arrowName = PREFIX + "Arrow";
   ObjectCreate(0, arrowName, OBJ_ARROW, 0, TimeCurrent(), Bid);
   ObjectSetInteger(0, arrowName, OBJPROP_ARROWCODE, 233);
   ObjectSetInteger(0, arrowName, OBJPROP_COLOR, clrLime);
   
   Print("オブジェクトを3個作成しました");
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| ティック処理関数                                                    |
//+------------------------------------------------------------------+
void OnTick()
{
   // メイン処理（ここでは省略）
}

//+------------------------------------------------------------------+
//| 終了処理関数 - オブジェクトの後片付け                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // プレフィックスが一致するオブジェクトをすべて検索して削除
   int totalObjects = ObjectsTotal(0);
   int deletedCount = 0;
   
   // 後ろから順にループする（削除時のインデックスずれを防ぐ）
   for(int i = totalObjects - 1; i >= 0; i--)
   {
      string objName = ObjectName(0, i);
      
      // プレフィックスが一致するオブジェクトのみ削除
      if(StringFind(objName, PREFIX) == 0)
      {
         ObjectDelete(0, objName);
         deletedCount++;
      }
   }
   
   Print("OnDeinit: ", deletedCount, "個のオブジェクトを削除しました");
   
   // チャートを再描画して反映
   ChartRedraw(0);
}
</code></pre>
<p>ポイントは、オブジェクト名に共通の<strong>プレフィックス</strong>をつけておくことです。OnDeinitではプレフィックスが一致するオブジェクトだけを削除するため、他のEAやインジケーターが作成したオブジェクトを誤って消してしまう心配がありません。また、オブジェクトをループで削除する際は、インデックスがずれないよう<strong>後ろから前に向かってループ</strong>する点も重要です。</p>
<h2><span id="toc8">プログラム例3：ファイルハンドルの安全なクローズ</span></h2>
<p>EAでログファイルやCSVファイルに書き込んでいる場合、OnDeinitでファイルを確実に閉じる必要があります。ファイルを閉じないまま終了すると、データが破損する可能性があります。</p>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| Expert Advisor - ファイルクローズの例                                |
//+------------------------------------------------------------------+
int gFileHandle = INVALID_HANDLE;  // グローバル変数でファイルハンドルを保持

//+------------------------------------------------------------------+
//| 初期化関数                                                         |
//+------------------------------------------------------------------+
int OnInit()
{
   // ログファイルを開く（追記モード）
   string fileName = "TradeLog_" + Symbol() + ".csv";
   gFileHandle = FileOpen(fileName, FILE_WRITE | FILE_CSV | FILE_COMMON, ',');
   
   if(gFileHandle == INVALID_HANDLE)
   {
      Print("エラー: ファイルを開けませんでした。エラーコード: ", GetLastError());
      return(INIT_FAILED);  // 初期化失敗 → OnDeinitがREASON_INITFAILEDで呼ばれる
   }
   
   // ヘッダー行を書き込む
   FileWrite(gFileHandle, "日時", "種別", "通貨ペア", "ロット", "価格", "備考");
   Print("ログファイルを開きました: ", fileName);
   
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| ティック処理関数                                                    |
//+------------------------------------------------------------------+
void OnTick()
{
   // 例：何らかの条件でトレード情報をファイルに書き込む
   static datetime lastWriteTime = 0;
   
   // 1分に1回だけ書き込む例
   if(TimeCurrent() - lastWriteTime >= 60)
   {
      if(gFileHandle != INVALID_HANDLE)
      {
         FileWrite(gFileHandle,
                   TimeToString(TimeCurrent(), TIME_DATE | TIME_SECONDS),
                   "INFO",
                   Symbol(),
                   "0.00",
                   DoubleToString(Bid, Digits),
                   "定期記録");
      }
      lastWriteTime = TimeCurrent();
   }
}

//+------------------------------------------------------------------+
//| 終了処理関数 - ファイルの安全なクローズ                               |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // ファイルハンドルが有効な場合のみクローズする
   if(gFileHandle != INVALID_HANDLE)
   {
      // 最終行として終了情報を書き込む
      FileWrite(gFileHandle,
                TimeToString(TimeCurrent(), TIME_DATE | TIME_SECONDS),
                "DEINIT",
                Symbol(),
                "",
                "",
                "終了理由: " + IntegerToString(reason));
      
      // ファイルをフラッシュ（バッファの内容をディスクに書き出す）
      FileFlush(gFileHandle);
      
      // ファイルを閉じる
      FileClose(gFileHandle);
      gFileHandle = INVALID_HANDLE;  // ハンドルを無効値に戻す
      
      Print("ログファイルを正常にクローズしました");
   }
   else
   {
      Print("ファイルハンドルは無効でした（クローズ不要）");
   }
}
</code></pre>
<p>ファイル操作で重要なのは、<code>FileClose()</code>の前に<code>FileFlush()</code>を呼んでバッファの内容を確実にディスクに書き出すことと、クローズ後にハンドル変数を<code>INVALID_HANDLE</code>にリセットすることです。これにより、万が一OnDeinitが複数回呼ばれるような状況でも安全に動作します。</p>
<h2><span id="toc9">プログラム例4：理由コードに応じた条件分岐処理</span></h2>
<p>実践的なEAでは、終了理由によって処理を分けたいケースがあります。例えば、パラメータ変更時はポジション情報を保持し、完全な終了時のみグローバル変数をクリアする、といった使い分けです。</p>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| Expert Advisor - 理由コードに応じた条件分岐                          |
//+------------------------------------------------------------------+
#define EA_NAME   "MyTradingEA"
#define PREFIX    EA_NAME + "_"

input double Lots         = 0.1;   // ロット数
input int    MagicNumber  = 12345; // マジックナンバー

//+------------------------------------------------------------------+
//| 初期化関数                                                         |
//+------------------------------------------------------------------+
int OnInit()
{
   // グローバル変数から前回の状態を復元（パラメータ変更・再コンパイル時）
   string gvName = PREFIX + "LastTicket";
   if(GlobalVariableCheck(gvName))
   {
      int lastTicket = (int)GlobalVariableGet(gvName);
      Print("前回のチケット番号を復元: ", lastTicket);
   }
   
   // タイマーを設定（1秒間隔）
   EventSetTimer(1);
   
   Print(EA_NAME, " が初期化されました");
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| ティック処理関数                                                    |
//+------------------------------------------------------------------+
void OnTick()
{
   // メインのトレードロジック（ここでは省略）
}

//+------------------------------------------------------------------+
//| タイマーイベント関数                                                 |
//+------------------------------------------------------------------+
void OnTimer()
{
   // 定期処理（ここでは省略）
}

//+------------------------------------------------------------------+
//| 終了処理関数 - 理由コードに応じた条件分岐                             |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // ------------------------------------
   // 1. すべての終了理由で共通の処理
   // ------------------------------------
   
   // タイマーを停止
   EventKillTimer();
   Print("タイマーを停止しました");
   
   // ------------------------------------
   // 2. 一時的な終了の場合（状態を保持）
   // ------------------------------------
   if(reason == REASON_PARAMETERS  ||   // パラメータ変更
      reason == REASON_RECOMPILE   ||   // 再コンパイル
      reason == REASON_CHARTCHANGE ||   // 通貨ペア・時間足変更
      reason == REASON_TEMPLATE)        // テンプレート変更
   {
      Print("一時的な終了です。状態情報を保持します。");
      
      // 現在のポジション情報をグローバル変数に保存
      SaveCurrentState();
      
      // チャートオブジェクトは削除しない（再起動後にそのまま使うため）
      return;
   }
   
   // ------------------------------------
   // 3. 完全な終了の場合（クリーンアップ）
   // ------------------------------------
   if(reason == REASON_REMOVE     ||   // EA削除
      reason == REASON_CHARTCLOSE ||   // チャート閉じ
      reason == REASON_CLOSE      ||   // ターミナル閉じ
      reason == REASON_PROGRAM    ||   // ExpertRemove()
      reason == REASON_ACCOUNT)        // アカウント変更
   {
      Print("完全な終了です。フルクリーンアップを実行します。");
      
      // チャート上のすべての自作オブジェクトを削除
      DeleteAllObjects();
      
      // グローバル変数を削除
      CleanupGlobalVariables();
      
      // チャートのコメントをクリア
      Comment("");
      
      Print(EA_NAME, " のクリーンアップが完了しました");
      return;
   }
   
   // ------------------------------------
   // 4. 初期化失敗の場合
   // ------------------------------------
   if(reason == REASON_INITFAILED)
   {
      Print("初期化に失敗したため終了します");
      // 最小限のクリーンアップのみ実行
      DeleteAllObjects();
      Comment("");
      return;
   }
}

//+------------------------------------------------------------------+
//| 現在の状態をグローバル変数に保存する関数                               |
//+------------------------------------------------------------------+
void SaveCurrentState()
{
   // 保有ポジションのチケット番号を保存
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())
         {
            string gvName = PREFIX + "LastTicket";
            GlobalVariableSet(gvName, OrderTicket());
            Print("チケット番号 ", OrderTicket(), " をグローバル変数に保存しました");
            break;
         }
      }
   }
}

//+------------------------------------------------------------------+
//| 自作オブジェクトをすべて削除する関数                                   |
//+------------------------------------------------------------------+
void DeleteAllObjects()
{
   int count = 0;
   for(int i = ObjectsTotal(0) - 1; i >= 0; i--)
   {
      string objName = ObjectName(0, i);
      if(StringFind(objName, PREFIX) == 0)
      {
         ObjectDelete(0, objName);
         count++;
      }
   }
   if(count > 0)
   {
      Print(count, "個のオブジェクトを削除しました");
      ChartRedraw(0);
   }
}

//+------------------------------------------------------------------+
//| グローバル変数をクリーンアップする関数                                 |
//+------------------------------------------------------------------+
void CleanupGlobalVariables()
{
   int count = 0;
   int total = GlobalVariablesTotal();
   
   // 後ろからループして削除
   for(int i = total - 1; i >= 0; i--)
   {
      string gvName = GlobalVariableName(i);
      if(StringFind(gvName, PREFIX) == 0)
      {
         GlobalVariableDel(gvName);
         count++;
      }
   }
   
   if(count > 0)
      Print(count, "個のグローバル変数を削除しました");
}
</code></pre>
<p>この例では、終了理由を3つのカテゴリ（一時的な終了・完全な終了・初期化失敗）に分類し、それぞれ異なる処理を行っています。パラメータ変更や再コンパイル時にはオブジェクトやグローバル変数を保持し、EA削除やチャートクローズ時には完全なクリーンアップを実行します。</p>
<h2><span id="toc10">よくある使い方のポイント・注意事項</span></h2>
<h3><span id="toc11">1. OnDeinitの実行時間には制限がある</span></h3>
<p>OnDeinit関数の実行には<strong>約2.5秒のタイムリミット</strong>があります。時間のかかる処理（大量のファイル操作やネットワーク通信など）をOnDeinitに入れると、処理が途中で打ち切られる可能性があります。</p>
<h3><span id="toc12">2. パラメータ変更時にもOnDeinitは呼ばれる</span></h3>
<p>EAのプロパティ画面でパラメータを変更して「OK」を押すと、OnDeinit → OnInit の順で呼ばれます。このとき理由コードは<code>REASON_PARAMETERS</code>(5)です。パラメータ変更のたびにオブジェクトが消えてしまう問題を防ぐために、理由コードによる条件分岐が有効です。</p>
<h3><span id="toc13">3. 再コンパイル時にも呼ばれる</span></h3>
<p>MetaEditorでコードを修正してコンパイルすると、稼働中のEAに対してOnDeinit（<code>REASON_RECOMPILE</code>）→ OnInitの順で自動的に呼ばれます。開発中にファイルハンドルのリークなどが起きないよう、OnDeinitでの後片付けは確実に行いましょう。</p>
<h3><span id="toc14">4. グローバル変数のハンドルは必ずリセットする</span></h3>
<p>ファイルハンドルやその他のリソースハンドルをグローバル変数で保持している場合、OnDeinitでクローズした後は必ず<code>INVALID_HANDLE</code>などの無効値に戻してください。これにより、二重解放の問題を防止できます。</p>
<h3><span id="toc15">5. Comment(&#8220;&#8221;)でチャート表示をクリアする</span></h3>
<p><code>Comment()</code>関数でチャート上に情報を表示している場合、OnDeinitで<code>Comment("")</code>を呼んでクリアしないと、EA削除後もテキストがチャートに残り続けます。</p>
<h3><span id="toc16">6. EventKillTimer()を忘れない</span></h3>
<p>OnInitで<code>EventSetTimer()</code>を呼んでタイマーを設定している場合は、OnDeinitで必ず<code>EventKillTimer()</code>を呼んでタイマーを停止しましょう。</p>
<pre><code class="language-mql4">void OnDeinit(const int reason)
{
   // タイマー停止（OnInitでEventSetTimerを使用した場合は必須）
   EventKillTimer();
   
   // チャートコメントのクリア
   Comment("");
   
   // 自作オブジェクトの削除
   ObjectsDeleteAll(0, "MyPrefix_");
   
   // ファイルハンドルのクローズ
   if(fileHandle != INVALID_HANDLE)
   {
      FileClose(fileHandle);
      fileHandle = INVALID_HANDLE;
   }
   
   Print("すべてのクリーンアップが完了しました");
}
</code></pre>
<h3><span id="toc17">まとめ</span></h3>
<p>OnDeinit関数は、プログラムの「品質」を決める重要な関数です。適切な後片付けを行うことで、メモリリークやファイル破損を防ぎ、チャートをきれいな状態に保てます。特に<strong>理由コードによる条件分岐</strong>を活用することで、パラメータ変更時と完全な終了時で異なるクリーンアップ処理を実装でき、より使いやすいEAやインジケーターを作成できます。</p>
<p>投稿 <a href="https://mql-programing.com/archives/2930/ondeinit/">【MQL4関数】OnDeinit関数とは？アンイニシャルコード発生時に実行されるイベント関数</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4定数】アンイニシャル定数（REASON_○○）</title>
		<link>https://mql-programing.com/archives/2767/uninitial/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Sat, 07 May 2022 06:28:45 +0000</pubDate>
				<category><![CDATA[【辞書】MQLリファレンス]]></category>
		<category><![CDATA[定数]]></category>
		<category><![CDATA[MQL]]></category>
		<category><![CDATA[リファレンス]]></category>
		<category><![CDATA[uninitial]]></category>
		<category><![CDATA[reason_]]></category>
		<category><![CDATA[UninitializeReason]]></category>
		<category><![CDATA[OnDeinit]]></category>
		<category><![CDATA[_UninitReason]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=2767</guid>

					<description><![CDATA[<p>アンイニシャル定数（REASON_○○） アンイニシャル定数は、プログラムが終了した理由を定数にしたものです。 エラーコード定数と似ていますが、アンイニシャル定数はプログラムが正常に終了したときに使用されます。 作成した [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/2767/uninitial/">【MQL4定数】アンイニシャル定数（REASON_○○）</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading"><span id="toc1">アンイニシャル定数（REASON_○○）</span></h2>



<p class="wp-block-paragraph"><strong><span class="marker-under-red">アンイニシャル定数は、プログラムが終了した理由を定数にしたものです。</span></strong></p>



<p class="wp-block-paragraph">エラーコード定数と似ていますが、アンイニシャル定数はプログラムが正常に終了したときに使用されます。</p>



<p class="wp-block-paragraph"><strong>作成したプログラムがうまくロードされないとき、デバッグするために使用すると良いでしょう。</strong></p>



<p class="wp-block-paragraph">特に、エラーが出ない場合に、アンイニシャル定数を確認して見ることをオススメします。</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">アンイニシャル定数を取得するには、<strong>UninitializeReason関数</strong>を使用します。</p>



<p class="wp-block-paragraph">UninitializeReason関数を使用することで、最近のアンイニシャル定数を取得することができます。</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">また、アンイニシャル定数は、<strong><a href="https://mql-programing.com/ondeinit/" title="【MQL4関数】OnDeinit関数とは？アンイニシャルコード発生時に実行されるイベント関数">OnDeinit関数</a>の引数</strong>としても使われています。</p>



<p class="wp-block-paragraph">OnDeinit関数は、プログラムが自動的に使う関数なので、特に意識する必要はありませんが知っておくと良いでしょう。</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc2">アンイニシャル定数（REASON_○○）</span></h3>



<figure class="wp-block-table alignfull is-style-stripes"><table><tbody><tr><td><strong>定数</strong></td><td><strong>数値</strong></td><td><strong>説明</strong></td></tr><tr><td>REASON_PROGRAM</td><td>0</td><td>ExpertRemove関数で終了した</td></tr><tr><td>REASON_REMOVE</td><td>1</td><td>プログラムがチャートから削除された</td></tr><tr><td>REASON_RECOMPILE</td><td>2</td><td>プログラムが再コンパイルされた</td></tr><tr><td>REASON_CHARTCHANGE</td><td>3</td><td>通貨ペアまたは時間軸が変更された</td></tr><tr><td>REASON_CHARTCLOSE</td><td>4</td><td>チャートが閉じられた</td></tr><tr><td>REASON_PARAMETERS</td><td>5</td><td>ユーザーによって入力パラメータが変更された</td></tr><tr><td>REASON_ACCOUNT</td><td>6</td><td>トレードサーバーへの再接続が発生した<br>または別アカウントに変更された</td></tr><tr><td>REASON_TEMPLATE</td><td>7</td><td>新しいテンプレートが適用された</td></tr><tr><td>REASON_INITFAILED</td><td>8</td><td>OnInit関数が0以外の値を返した</td></tr><tr><td>REASON_CLOSE</td><td>9</td><td>ターミナルが閉じられた</td></tr></tbody></table></figure>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc3">アンイニシャル定数（REASON_○○）の使い方</span></h2>



<p class="wp-block-paragraph">アンイニシャル定数は、<strong><span class="marker-under-red">_UninitReasonという変数</span></strong>に格納されます。</p>



<p class="wp-block-paragraph">_UninitReason変数は、アンイニシャルされたときに自動的にアンイニシャル定数が格納されます。</p>



<p class="wp-block-paragraph">最近のアンイニシャル変数を取得したい場合は、UninitializeReason関数を使用します。</p>



<p class="wp-block-paragraph"><strong>UninitializeReason関数を使うことにより、_UninitReason変数の値を取得することができます。</strong></p>



<p class="wp-block-paragraph">例えば、以下のように使用します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>void OnStart() {
    ExpertRemove();
    Print(UninitializeReason());
}</code></pre></div>



<p class="wp-block-paragraph">　</p>



<p class="wp-block-paragraph">上記のように記述することで、以下のような出力を得ることができます。</p>



<p class="wp-block-paragraph">0</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc4">プログラム例：アンイニシャル定数を活用したデバッグ</span></h2>



<p class="wp-block-paragraph">以下は、OnDeinit関数内でアンイニシャル定数を使い、プログラムが終了した理由をログに出力するサンプルプログラムです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>//+------------------------------------------------------------------+
//| アンイニシャル定数を活用したデバッグ例
//+------------------------------------------------------------------+
int OnInit()
{
    Print("EA が初期化されました。");
    return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
    // アンイニシャル定数に応じてメッセージを出力
    switch(reason)
    {
        case REASON_PROGRAM:
            Print("終了理由: ExpertRemove関数で終了しました");
            break;
        case REASON_REMOVE:
            Print("終了理由: チャートから削除されました");
            break;
        case REASON_RECOMPILE:
            Print("終了理由: 再コンパイルされました");
            break;
        case REASON_CHARTCHANGE:
            Print("終了理由: 通貨ペアまたは時間軸が変更されました");
            break;
        case REASON_CHARTCLOSE:
            Print("終了理由: チャートが閉じられました");
            break;
        case REASON_PARAMETERS:
            Print("終了理由: 入力パラメータが変更されました");
            break;
        case REASON_ACCOUNT:
            Print("終了理由: アカウントが変更されました");
            break;
        case REASON_TEMPLATE:
            Print("終了理由: テンプレートが適用されました");
            break;
        case REASON_INITFAILED:
            Print("終了理由: OnInit関数が失敗しました");
            break;
        case REASON_CLOSE:
            Print("終了理由: ターミナルが閉じられました");
            break;
        default:
            Print("終了理由: 不明（コード: ", reason, "）");
            break;
    }

    // UninitializeReason関数でも取得可能
    Print("UninitializeReason() の戻り値: ", UninitializeReason());
}

void OnTick()
{
    // 通常のティック処理
}</code></pre></div>



<p class="wp-block-paragraph">　</p>



<p class="wp-block-paragraph">このプログラムでは、OnDeinit関数の引数reasonにアンイニシャル定数が渡されます。switch文を使って各定数に対応するメッセージをログに出力しています。</p>



<p class="wp-block-paragraph"><strong>プログラムが意図せず終了してしまう場合、このようにアンイニシャル定数を確認することで原因を特定しやすくなります。</strong></p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-cocoon-blocks-button-1 button-block"><a href="https://mql-programing.com/sample_program/" class="btn btn-l btn-circle" target="_self">サンプルプログラムはこちら</a></div>



<p class="wp-block-paragraph">　</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-自動売買を作ろう！ wp-block-embed-自動売買を作ろう！"><div class="wp-block-embed__wrapper">

<a href="https://mql-programing.com/make_autotrade_by_myself/" title="【MQL4プログラミング】自動売買の作り方！FXで使えるテンプレートあり" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://i0.wp.com/mql-programing.com/main29/wp-content/uploads/2021/09/make_autotrade_by_myself.jpg?fit=1200%2C675&#038;ssl=1" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【MQL4プログラミング】自動売買の作り方！FXで使えるテンプレートあり</div><div class="blogcard-snippet external-blogcard-snippet">目次 はじめにFX自動売買とはFX自動売買を作るための準備FX自動売買の作り方口座凍結の対策をするプログラムテンプレートを作る決済ロジックをプログラミングするプログラムテンプレートを作るエントリーロジックをプログラミング</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://mql-programing.com/archives/1605/make_autotrade_by_myself/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">mql-programing.com</div></div></div></div></a>
</div></figure>



<figure class="wp-block-embed is-type-wp-embed is-provider-自動売買を作ろう！ wp-block-embed-自動売買を作ろう！"><div class="wp-block-embed__wrapper">

<a href="https://mql-programing.com/mql-reference/" title="MQL4リファレンス【全データ一覧】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://mql-programing.com/main29/wp-content/uploads/2021/02/MQLリファレンス-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://mql-programing.com/main29/wp-content/uploads/2021/02/MQLリファレンス-160x90.jpg 160w, https://mql-programing.com/main29/wp-content/uploads/2021/02/MQLリファレンス-300x169.jpg 300w, https://mql-programing.com/main29/wp-content/uploads/2021/02/MQLリファレンス-1024x576.jpg 1024w, https://mql-programing.com/main29/wp-content/uploads/2021/02/MQLリファレンス-768x432.jpg 768w, https://mql-programing.com/main29/wp-content/uploads/2021/02/MQLリファレンス-120x68.jpg 120w, https://mql-programing.com/main29/wp-content/uploads/2021/02/MQLリファレンス-320x180.jpg 320w, https://mql-programing.com/main29/wp-content/uploads/2021/02/MQLリファレンス.jpg 1120w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">MQL4リファレンス【全データ一覧】</div><div class="blogcard-snippet internal-blogcard-snippet">/*! elementor - v3.6.5 - 27-04-2022 */.e-container.e-container--row .elementor-spacer-inner{width:var(--spacer-size)}.e-</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://mql-programing.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">mql-programing.com</div></div></div></div></a>
</div></figure>



<p class="wp-block-paragraph">　</p>
<p>投稿 <a href="https://mql-programing.com/archives/2767/uninitial/">【MQL4定数】アンイニシャル定数（REASON_○○）</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
