<?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>自動売買を作ろう！</title>
	<atom:link href="https://mql-programing.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://mql-programing.com/</link>
	<description>MQLプログラミング学習サイト</description>
	<lastBuildDate>Wed, 08 Apr 2026 11:29:52 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://mql-programing.com/main29/wp-content/uploads/2021/02/cropped-ブログアイコン-32x32.jpg</url>
	<title>自動売買を作ろう！</title>
	<link>https://mql-programing.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【MQL4関数】iAlligator関数の使い方！アリゲーターでトレンド判定EAを作ろう</title>
		<link>https://mql-programing.com/archives/13104/%e3%80%90mql4%e9%96%a2%e6%95%b0%e3%80%91ialligator%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%ef%bc%81%e3%82%a2%e3%83%aa%e3%82%b2%e3%83%bc%e3%82%bf%e3%83%bc%e3%81%a7%e3%83%88%e3%83%ac/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Sat, 02 May 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<category><![CDATA[【辞書】MQLリファレンス]]></category>
		<category><![CDATA[インジケーター]]></category>
		<category><![CDATA[アリゲーター]]></category>
		<category><![CDATA[リファレンス]]></category>
		<category><![CDATA[iAlligator]]></category>
		<category><![CDATA[MQL4]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13104</guid>

					<description><![CDATA[<p>iAlligator関数を使えば、アリゲーターインジケーターの3本のライン（顎・歯・唇）の値をMQL4プログラムから取得できます。アリゲーターはトレンドの有無と方向を視覚的に判断できるインジケーターで、EAのエントリーフ [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13104/%e3%80%90mql4%e9%96%a2%e6%95%b0%e3%80%91ialligator%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%ef%bc%81%e3%82%a2%e3%83%aa%e3%82%b2%e3%83%bc%e3%82%bf%e3%83%bc%e3%81%a7%e3%83%88%e3%83%ac/">【MQL4関数】iAlligator関数の使い方！アリゲーターでトレンド判定EAを作ろう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p><strong>iAlligator関数を使えば、アリゲーターインジケーターの3本のライン（顎・歯・唇）の値をMQL4プログラムから取得できます。</strong>アリゲーターはトレンドの有無と方向を視覚的に判断できるインジケーターで、EAのエントリーフィルターとして非常に人気があります。この記事では iAlligator の構文から実践的なEAサンプルまでPREP法で解説します。</p>
<h2><span id="toc1">iAlligator関数とは？なぜトレンド判定に使われるのか</span></h2>
<p>アリゲーター（Alligator）はビル・ウィリアムズが考案したインジケーターです。移動平均線を時間軸でずらした3本のラインで構成されており、ラインが開くとトレンド発生、収束するとレンジ相場という状態を示します。</p>
<p>MQL4では <code>iAlligator()</code> 関数でこの3本のライン値をリアルタイムに取得できるため、「トレンドが発生しているときだけエントリーする」というフィルターロジックをEAに組み込めます。</p>
<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>ライン名</th>
<th>別名</th>
<th>設定（デフォルト）</th>
</tr>
</thead>
<tbody>
<tr>
<td>Jaw（顎）</td>
<td>青ライン</td>
<td>13期間SMMA・8バーシフト</td>
</tr>
<tr>
<td>Teeth（歯）</td>
<td>赤ライン</td>
<td>8期間SMMA・5バーシフト</td>
</tr>
<tr>
<td>Lips（唇）</td>
<td>緑ライン</td>
<td>5期間SMMA・3バーシフト</td>
</tr>
</tbody>
</table>
</figure>
<h2><span id="toc2">iAlligator() の構文と引数</span></h2>
<pre><code class="language-mql4">double iAlligator(
    string symbol,          // 通貨ペア（NULLで現在のチャート）
    int    timeframe,       // 時間足（0で現在の時間足）
    int    jaw_period,      // 顎の期間（デフォルト13）
    int    jaw_shift,       // 顎のシフト（デフォルト8）
    int    teeth_period,    // 歯の期間（デフォルト8）
    int    teeth_shift,     // 歯のシフト（デフォルト5）
    int    lips_period,     // 唇の期間（デフォルト5）
    int    lips_shift,      // 唇のシフト（デフォルト3）
    int    ma_method,       // 移動平均の種類（MODE_SMMA推奨）
    int    applied_price,   // 適用価格（PRICE_MEDIAN推奨）
    int    mode,            // 取得するライン
    int    shift            // 何本前のバーか（0=現在）
);</code></pre>
<h3><span id="toc3">mode の値</span></h3>
<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>定数</th>
<th>値</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>MODE_GATORJAW</td>
<td>1</td>
<td>顎（Jaw）ラインの値</td>
</tr>
<tr>
<td>MODE_GATORTEETH</td>
<td>2</td>
<td>歯（Teeth）ラインの値</td>
</tr>
<tr>
<td>MODE_GATORLIPS</td>
<td>3</td>
<td>唇（Lips）ラインの値</td>
</tr>
</tbody>
</table>
</figure>
<h2><span id="toc4">基本的な使い方：3本のライン値を取得する</span></h2>
<p>iAlligator関数でアリゲーターの各ラインを取得する最もシンプルなコードです。</p>
<pre><code class="language-mql4">// アリゲーターのデフォルト設定で3本のライン値を取得
double jaw   = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW,   1);
double teeth = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, 1);
double lips  = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS,  1);

Print("顎(Jaw): ",   jaw);
Print("歯(Teeth): ", teeth);
Print("唇(Lips): ",  lips);</code></pre>
<h2><span id="toc5">実践例1：アリゲーターでトレンドフィルターを作る</span></h2>
<p>アリゲーターの3本のラインの並び順でトレンドを判定します。唇 &gt; 歯 &gt; 顎なら上昇トレンド、顎 &gt; 歯 &gt; 唇なら下降トレンドと判断できます。</p>
<pre><code class="language-mql4">// トレンド判定関数
// 戻り値: 1=上昇トレンド / -1=下降トレンド / 0=レンジ（睡眠中）
int GetAlligatorTrend()
{
    double jaw   = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW,   1);
    double teeth = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, 1);
    double lips  = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS,  1);

    // 唇 > 歯 > 顎 → 上昇トレンド
    if(lips > teeth && teeth > jaw)
        return 1;

    // 顎 > 歯 > 唇 → 下降トレンド
    if(jaw > teeth && teeth > lips)
        return -1;

    // それ以外 → レンジ（アリゲーターが眠っている状態）
    return 0;
}

void OnTick()
{
    int trend = GetAlligatorTrend();
    if(trend == 1)
        Comment("アリゲーター: 上昇トレンド");
    else if(trend == -1)
        Comment("アリゲーター: 下降トレンド");
    else
        Comment("アリゲーター: レンジ（様子見）");
}</code></pre>
<h2><span id="toc6">実践例2：アリゲーターをフィルターにしたEA</span></h2>
<p>iAlligator関数のトレンド判定と iMA（移動平均）のゴールデンクロスを組み合わせた実践的なEAです。アリゲーターがトレンドを示しているときだけエントリーするため、ダマシを減らせます。</p>
<pre><code class="language-mql4">extern int    MagicNumber = 20001;
extern double Lots        = 0.1;
extern int    FastMA      = 5;
extern int    SlowMA      = 20;

void OnTick()
{
    // ラインが3本とも開いているか（絶対値で判定）
    double jaw   = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW,   1);
    double teeth = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, 1);
    double lips  = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS,  1);

    bool upTrend   = (lips > teeth && teeth > jaw);
    bool downTrend = (jaw  > teeth && teeth > lips);

    // MAクロス判定
    double fastMA_cur  = iMA(NULL, 0, FastMA, 0, MODE_EMA, PRICE_CLOSE, 1);
    double fastMA_prev = iMA(NULL, 0, FastMA, 0, MODE_EMA, PRICE_CLOSE, 2);
    double slowMA_cur  = iMA(NULL, 0, SlowMA, 0, MODE_EMA, PRICE_CLOSE, 1);
    double slowMA_prev = iMA(NULL, 0, SlowMA, 0, MODE_EMA, PRICE_CLOSE, 2);

    bool goldenCross = (fastMA_prev < slowMA_prev &#038;&#038; fastMA_cur > slowMA_cur);
    bool deadCross   = (fastMA_prev > slowMA_prev && fastMA_cur < slowMA_cur);

    if(OrdersTotal() > 0) return;

    // アリゲーターが上昇トレンド ＋ ゴールデンクロス → 買い
    if(upTrend && goldenCross)
    {
        OrderSend(Symbol(), OP_BUY, Lots, Ask, 20, 0, 0,
                  "Alligator+MA", MagicNumber, 0, clrBlue);
    }

    // アリゲーターが下降トレンド ＋ デッドクロス → 売り
    if(downTrend && deadCross)
    {
        OrderSend(Symbol(), OP_SELL, Lots, Bid, 20, 0, 0,
                  "Alligator+MA", MagicNumber, 0, clrRed);
    }
}</code></pre>
<h2><span id="toc7">iAlligator使用時の注意点</span></h2>
<ul>
<li><strong>シフトに注意：</strong>アリゲーターは各ラインが未来方向にシフトされるため、チャート上の表示位置とバーインデックスがずれます。shift=1（1本前）を使って確定済みのバーを参照するのが基本です。</li>
<li><strong>レンジ相場では使わない：</strong>3本のラインが絡み合っている（アリゲーターが眠っている）状態でのエントリーはダマシが増えます。必ず上記のトレンド判定と組み合わせてください。</li>
<li><strong>applied_price はPRICE_MEDIAN：</strong>ビル・ウィリアムズのオリジナル設定は中値（(High+Low)/2）です。PRICE_CLOSEで計算するとチャートの表示と一致しないことがあります。</li>
</ul>
<h2><span id="toc8">まとめ</span></h2>
<p><strong>iAlligator関数は、アリゲーターインジケーターの顎・歯・唇の3本のライン値をMQL4から直接取得できる関数です。</strong>ラインの並び順を見るだけでトレンドの有無・方向を判定できるため、EA開発のフィルターとして非常に使いやすいのが特徴です。</p>
<p>レンジ相場（アリゲーターが眠っている状態）ではエントリーを避け、トレンドが明確に出たときだけ他のシグナルと組み合わせるのがiAlligator活用のポイントです。</p>
<p>投稿 <a href="https://mql-programing.com/archives/13104/%e3%80%90mql4%e9%96%a2%e6%95%b0%e3%80%91ialligator%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%ef%bc%81%e3%82%a2%e3%83%aa%e3%82%b2%e3%83%bc%e3%82%bf%e3%83%bc%e3%81%a7%e3%83%88%e3%83%ac/">【MQL4関数】iAlligator関数の使い方！アリゲーターでトレンド判定EAを作ろう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4関数】iEnvelopes関数の使い方！エンベロープでトレンドフィルターEAを作ろう</title>
		<link>https://mql-programing.com/archives/13096/%e3%80%90mql4%e9%96%a2%e6%95%b0%e3%80%91ienvelopes%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%ef%bc%81%e3%82%a8%e3%83%b3%e3%83%99%e3%83%ad%e3%83%bc%e3%83%97%e3%81%a7%e3%83%88%e3%83%ac/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Fri, 01 May 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<category><![CDATA[【辞書】MQLリファレンス]]></category>
		<category><![CDATA[iEnvelopes]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[インジケーター]]></category>
		<category><![CDATA[エンベロープ]]></category>
		<category><![CDATA[リファレンス]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13096</guid>

					<description><![CDATA[<p>エンベロープ（Envelopes）は移動平均線の上下に一定割合のバンドを描くインジケーターです。価格がバンドを超えたときの反転狙い、またはバンドを突破したときのトレンドフォローなど、さまざまな手法で活用されます。 MQL [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13096/%e3%80%90mql4%e9%96%a2%e6%95%b0%e3%80%91ienvelopes%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%ef%bc%81%e3%82%a8%e3%83%b3%e3%83%99%e3%83%ad%e3%83%bc%e3%83%97%e3%81%a7%e3%83%88%e3%83%ac/">【MQL4関数】iEnvelopes関数の使い方！エンベロープでトレンドフィルターEAを作ろう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>エンベロープ（Envelopes）は移動平均線の上下に一定割合のバンドを描くインジケーターです。価格がバンドを超えたときの反転狙い、またはバンドを突破したときのトレンドフォローなど、さまざまな手法で活用されます。</p>
<p>MQL4では <code>iEnvelopes()</code> 関数を使ってエンベロープの値を取得できます。</p>
<h2><span id="toc1">iEnvelopes() の構文</span></h2>
<pre><code class="language-mql4">double iEnvelopes(
    string  symbol,       // 通貨ペア（NULLで現在のチャート）
    int     timeframe,    // 時間足（0で現在の時間足）
    int     ma_period,    // 移動平均の期間
    int     ma_method,    // 移動平均の種類
    int     ma_shift,     // 移動平均のシフト
    int     applied_price,// 適用価格
    double  deviation,    // 偏差（%）
    int     mode,         // バンドの種類（上・下）
    int     shift         // 何本前のバーか（0=現在）
);</code></pre>
<h2><span id="toc2">引数の詳細</span></h2>
<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>引数</th>
<th>説明</th>
<th>よく使う値</th>
</tr>
</thead>
<tbody>
<tr>
<td>symbol</td>
<td>通貨ペア</td>
<td>NULL（現在のチャート）</td>
</tr>
<tr>
<td>timeframe</td>
<td>時間足</td>
<td>0（現在の時間足）</td>
</tr>
<tr>
<td>ma_period</td>
<td>移動平均の期間</td>
<td>20〜50</td>
</tr>
<tr>
<td>ma_method</td>
<td>移動平均の種類</td>
<td>MODE_SMA / MODE_EMA</td>
</tr>
<tr>
<td>ma_shift</td>
<td>MAのシフト</td>
<td>0（通常）</td>
</tr>
<tr>
<td>applied_price</td>
<td>適用価格</td>
<td>PRICE_CLOSE</td>
</tr>
<tr>
<td>deviation</td>
<td>バンドの偏差（%）</td>
<td>0.1〜0.5</td>
</tr>
<tr>
<td>mode</td>
<td>上下バンドの指定</td>
<td>MODE_UPPER / MODE_LOWER</td>
</tr>
<tr>
<td>shift</td>
<td>何本前のバーか</td>
<td>0（現在）/ 1（1本前）</td>
</tr>
</tbody>
</table>
</figure>
<h3><span id="toc3">mode の値</span></h3>
<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>定数</th>
<th>値</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>MODE_UPPER</td>
<td>1</td>
<td>上バンド（移動平均 + 偏差%）</td>
</tr>
<tr>
<td>MODE_LOWER</td>
<td>2</td>
<td>下バンド（移動平均 &#8211; 偏差%）</td>
</tr>
</tbody>
</table>
</figure>
<h2><span id="toc4">基本的な使い方</span></h2>
<pre><code class="language-mql4">// 20期間SMA、偏差0.2%のエンベロープを取得する
double upperBand = iEnvelopes(NULL, 0, 20, MODE_SMA, 0, PRICE_CLOSE, 0.2, MODE_UPPER, 0);
double lowerBand = iEnvelopes(NULL, 0, 20, MODE_SMA, 0, PRICE_CLOSE, 0.2, MODE_LOWER, 0);

Print("上バンド: ", upperBand);
Print("下バンド: ", lowerBand);</code></pre>
<h2><span id="toc5">実践例1：エンベロープのブレイクアウトでエントリー</span></h2>
<p>価格が上バンドを上抜けたら買い、下バンドを下抜けたら売りのシグナルとして使う例です。</p>
<pre><code class="language-mql4">extern int    MagicNumber = 11001;
extern double Lots        = 0.1;
extern int    MA_Period   = 20;
extern double Deviation   = 0.2;  // バンド幅（%）

//+------------------------------------------------------------------+
//| エンベロープ ブレイクアウトEA                                       |
//+------------------------------------------------------------------+
void OnTick()
{
    // すでにポジションがある場合はスキップ
    if(OrdersTotal() > 0) return;

    double upperBand = iEnvelopes(NULL, 0, MA_Period, MODE_SMA, 0, PRICE_CLOSE, Deviation, MODE_UPPER, 1);
    double lowerBand = iEnvelopes(NULL, 0, MA_Period, MODE_SMA, 0, PRICE_CLOSE, Deviation, MODE_LOWER, 1);
    double prevClose = iClose(NULL, 0, 2);  // 2本前の終値
    double lastClose = iClose(NULL, 0, 1);  // 1本前の終値

    // 上バンドを上抜け → 買いエントリー
    if(prevClose < upperBand &#038;&#038; lastClose > upperBand)
    {
        OrderSend(Symbol(), OP_BUY, Lots, Ask, 20, 0, 0,
                  "Envelope Breakout", MagicNumber, 0, clrBlue);
    }

    // 下バンドを下抜け → 売りエントリー
    if(prevClose > lowerBand && lastClose < lowerBand)
    {
        OrderSend(Symbol(), OP_SELL, Lots, Bid, 20, 0, 0,
                  "Envelope Breakout", MagicNumber, 0, clrRed);
    }
}</code></pre>
<h2><span id="toc6">実践例2：エンベロープをトレンドフィルターとして使う</span></h2>
<p>価格が上バンドより上にある＝上昇トレンドと判断し、他のシグナルと組み合わせるフィルターとして活用する例です。</p>
<pre><code class="language-mql4">// トレンドフィルター関数
// 戻り値: 1=上昇トレンド / -1=下降トレンド / 0=レンジ
int GetTrend()
{
    double upperBand = iEnvelopes(NULL, 0, 20, MODE_SMA, 0, PRICE_CLOSE, 0.2, MODE_UPPER, 1);
    double lowerBand = iEnvelopes(NULL, 0, 20, MODE_SMA, 0, PRICE_CLOSE, 0.2, MODE_LOWER, 1);
    double lastClose = iClose(NULL, 0, 1);

    if(lastClose > upperBand) return  1;  // 上昇トレンド
    if(lastClose < lowerBand) return -1;  // 下降トレンド
    return 0;                             // レンジ（バンド内）
}

void OnTick()
{
    int trend = GetTrend();

    if(trend == 1)
        Comment("トレンド: 上昇（買いシグナルのみ有効）");
    else if(trend == -1)
        Comment("トレンド: 下降（売りシグナルのみ有効）");
    else
        Comment("トレンド: レンジ（様子見）");
}</code></pre>
<h2><span id="toc7">実践例3：反転狙い（逆張り）</span></h2>
<p>価格がバンドに触れたら反転を狙う逆張り戦略です。</p>
<pre><code class="language-mql4">extern int    MagicNumber = 11002;
extern double Lots        = 0.1;
extern int    MA_Period   = 30;
extern double Deviation   = 0.3;

void OnTick()
{
    if(OrdersTotal() > 0) return;

    double upperBand = iEnvelopes(NULL, 0, MA_Period, MODE_EMA, 0, PRICE_CLOSE, Deviation, MODE_UPPER, 1);
    double lowerBand = iEnvelopes(NULL, 0, MA_Period, MODE_EMA, 0, PRICE_CLOSE, Deviation, MODE_LOWER, 1);
    double high1     = iHigh(NULL, 0, 1);
    double low1      = iLow(NULL, 0, 1);

    // 上バンドに高値が触れた → 売り（反転狙い）
    if(high1 >= upperBand)
    {
        OrderSend(Symbol(), OP_SELL, Lots, Bid, 20, 0, 0,
                  "Envelope Mean Reversion", MagicNumber, 0, clrRed);
    }

    // 下バンドに安値が触れた → 買い（反転狙い）
    if(low1 <= lowerBand)
    {
        OrderSend(Symbol(), OP_BUY, Lots, Ask, 20, 0, 0,
                  "Envelope Mean Reversion", MagicNumber, 0, clrBlue);
    }
}</code></pre>
<h2><span id="toc8">偏差（deviation）の目安</span></h2>
<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>通貨ペア</th>
<th>推奨偏差</th>
<th>補足</th>
</tr>
</thead>
<tbody>
<tr>
<td>USDJPY</td>
<td>0.1〜0.3%</td>
<td>ボラティリティが低め</td>
</tr>
<tr>
<td>EURUSD</td>
<td>0.1〜0.2%</td>
<td>標準的な設定</td>
</tr>
<tr>
<td>GBPJPY</td>
<td>0.3〜0.5%</td>
<td>ボラティリティが高め</td>
</tr>
</tbody>
</table>
</figure>
<p>偏差が小さすぎるとノイズが多くなり、大きすぎるとシグナルが少なくなります。バックテストで最適な値を見つけましょう。</p>
<h2><span id="toc9">まとめ</span></h2>
<ul>
<li><code>iEnvelopes()</code> は移動平均の上下にバンドを描くインジケーター関数</li>
<li><strong>MODE_UPPER</strong> で上バンド、<strong>MODE_LOWER</strong> で下バンドの値を取得</li>
<li>ブレイクアウト（トレンドフォロー）と反転狙い（逆張り）の両方に応用できる</li>
<li><code>deviation</code> パラメーターはバックテストで通貨ペアに合わせて調整する</li>
</ul>
<p>投稿 <a href="https://mql-programing.com/archives/13096/%e3%80%90mql4%e9%96%a2%e6%95%b0%e3%80%91ienvelopes%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%ef%bc%81%e3%82%a8%e3%83%b3%e3%83%99%e3%83%ad%e3%83%bc%e3%83%97%e3%81%a7%e3%83%88%e3%83%ac/">【MQL4関数】iEnvelopes関数の使い方！エンベロープでトレンドフィルターEAを作ろう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4】通貨ペア情報を取得する定数と関数を完全解説！ENUM_SYMBOL_INFO_INTEGER / ENUM_SYMBOL_INFO_DOUBLEの使い方</title>
		<link>https://mql-programing.com/archives/13086/%e3%80%90mql4%e3%80%91%e9%80%9a%e8%b2%a8%e3%83%9a%e3%82%a2%e6%83%85%e5%a0%b1%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b%e5%ae%9a%e6%95%b0%e3%81%a8%e9%96%a2%e6%95%b0%e3%82%92%e5%ae%8c%e5%85%a8/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Thu, 30 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【辞書】MQLリファレンス]]></category>
		<category><![CDATA[定数]]></category>
		<category><![CDATA[SymbolInfoInteger]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[SymbolInfoDouble]]></category>
		<category><![CDATA[通貨ペア情報]]></category>
		<category><![CDATA[ENUM定数]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13086</guid>

					<description><![CDATA[<p>はじめに EA（自動売買）やカスタムインジケーターを作成するとき、「現在のスプレッドはいくつ？」「最小ロット数は？」「ストップレベルは？」など、通貨ペア（シンボル）のさまざまな情報をプログラムから取得したい場面がたくさん [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13086/%e3%80%90mql4%e3%80%91%e9%80%9a%e8%b2%a8%e3%83%9a%e3%82%a2%e6%83%85%e5%a0%b1%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b%e5%ae%9a%e6%95%b0%e3%81%a8%e9%96%a2%e6%95%b0%e3%82%92%e5%ae%8c%e5%85%a8/">【MQL4】通貨ペア情報を取得する定数と関数を完全解説！ENUM_SYMBOL_INFO_INTEGER / ENUM_SYMBOL_INFO_DOUBLEの使い方</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<h2><span id="toc1">はじめに</span></h2>
<p>EA（自動売買）やカスタムインジケーターを作成するとき、「現在のスプレッドはいくつ？」「最小ロット数は？」「ストップレベルは？」など、<strong>通貨ペア（シンボル）のさまざまな情報</strong>をプログラムから取得したい場面がたくさんあります。</p>
<p>MQL4では、こうした通貨ペアの情報を取得するために<strong>SymbolInfoInteger関数</strong>と<strong>SymbolInfoDouble関数</strong>が用意されています。そして、それぞれの関数で「何の情報を取得するか」を指定するために使うのが、<strong>ENUM_SYMBOL_INFO_INTEGER</strong>と<strong>ENUM_SYMBOL_INFO_DOUBLE</strong>という列挙型（enum）の定数です。</p>
<p>この記事では、これらの定数と関数の使い方を、実践的なコードサンプルを交えてわかりやすく解説します。</p>
<h2><span id="toc2">SymbolInfoInteger関数とENUM_SYMBOL_INFO_INTEGERとは</span></h2>
<h3><span id="toc3">関数の基本構文</span></h3>
<p><code>SymbolInfoInteger</code>関数は、指定した通貨ペアの<strong>整数型（long型）のプロパティ情報</strong>を取得する関数です。2つの書き方があります。</p>
<pre><code class="language-mql5">// 書き方① 戻り値で直接値を受け取る
long SymbolInfoInteger(
   string symbol,                        // 通貨ペア名
   ENUM_SYMBOL_INFO_INTEGER prop_id       // 取得したいプロパティの識別子
);

// 書き方② 成功/失敗をboolで受け取り、値は第3引数に格納
bool SymbolInfoInteger(
   string symbol,                        // 通貨ペア名
   ENUM_SYMBOL_INFO_INTEGER prop_id,      // 取得したいプロパティの識別子
   long &amp; var                             // 値を受け取る変数
);</code></pre>
<p>書き方②では、関数の戻り値が<code>bool</code>（true/false）になり、取得に成功したかどうかを判定できます。エラーハンドリングを丁寧に行いたい場合はこちらがおすすめです。</p>
<h3><span id="toc4">よく使うENUM_SYMBOL_INFO_INTEGERの定数一覧</span></h3>
<p>以下に、EA開発で特によく使う定数をまとめました。</p>
<table border="1" cellpadding="8" cellspacing="0" style="border-collapse: collapse; width: 100%;">
<thead>
<tr style="background-color: #f0f0f0;">
<th>定数名</th>
<th>説明</th>
<th>用途の例</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>SYMBOL_DIGITS</code></td>
<td>価格の小数点以下の桁数</td>
<td>価格の正規化（NormalizeDouble）に使用</td>
</tr>
<tr>
<td><code>SYMBOL_SPREAD</code></td>
<td>現在のスプレッド（ポイント単位）</td>
<td>スプレッドフィルターの実装</td>
</tr>
<tr>
<td><code>SYMBOL_SPREAD_FLOAT</code></td>
<td>変動スプレッドかどうか（bool）</td>
<td>スプレッドの監視方法の判断</td>
</tr>
<tr>
<td><code>SYMBOL_TRADE_STOPS_LEVEL</code></td>
<td>ストップレベル（ポイント単位）</td>
<td>SL/TPの最小距離チェック</td>
</tr>
<tr>
<td><code>SYMBOL_TRADE_FREEZE_LEVEL</code></td>
<td>フリーズレベル（ポイント単位）</td>
<td>決済価格付近での注文変更制限</td>
</tr>
<tr>
<td><code>SYMBOL_TRADE_MODE</code></td>
<td>取引モード（売買が許可されているか等）</td>
<td>取引可能かどうかの判定</td>
</tr>
<tr>
<td><code>SYMBOL_TRADE_EXEMODE</code></td>
<td>注文執行モード</td>
<td>成行 / 即時 / マーケット執行の判定</td>
</tr>
<tr>
<td><code>SYMBOL_SWAP_MODE</code></td>
<td>スワップの計算方法</td>
<td>スワップ計算ロジックの分岐</td>
</tr>
<tr>
<td><code>SYMBOL_SWAP_ROLLOVER3DAYS</code></td>
<td>3日分のスワップが付く曜日</td>
<td>スワップ戦略の参考</td>
</tr>
<tr>
<td><code>SYMBOL_SELECT</code></td>
<td>気配値表示で選択されているか</td>
<td>マルチ通貨EAでのシンボル確認</td>
</tr>
<tr>
<td><code>SYMBOL_TIME</code></td>
<td>直近のサーバー時間（Tick受信時刻）</td>
<td>データの鮮度チェック</td>
</tr>
</tbody>
</table>
<h3><span id="toc5">SymbolInfoIntegerの使用例</span></h3>
<p>SymbolInfoInteger関数では、SYMBOL_DIGITS で小数点以下の桁数、SYMBOL_SPREAD でスプレッド、SYMBOL_TRADE_STOPS_LEVEL でストップレベル、SYMBOL_TRADE_FREEZE_LEVEL でフリーズレベルなどの情報を取得できます。以下にコードサンプルを示します。</p>
<pre><code class="language-mql5">#property strict

void OnInit()
{
   string symbol = Symbol();

   // 小数点以下の桁数を取得
   int digits = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);
   Print("小数点以下の桁数: ", digits);

   // 現在のスプレッドを取得
   int spread = (int)SymbolInfoInteger(symbol, SYMBOL_SPREAD);
   Print("スプレッド: ", spread, " ポイント");

   // ストップレベルを取得
   int stopLevel = (int)SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL);
   Print("ストップレベル: ", stopLevel, " ポイント");

   // フリーズレベルを取得
   int freezeLevel = (int)SymbolInfoInteger(symbol, SYMBOL_TRADE_FREEZE_LEVEL);
   Print("フリーズレベル: ", freezeLevel, " ポイント");

   // 変動スプレッドかどうか
   bool isFloatSpread = (bool)SymbolInfoInteger(symbol, SYMBOL_SPREAD_FLOAT);
   Print("変動スプレッド: ", isFloatSpread ? "はい" : "いいえ");
}</code></pre>
<p><strong>ポイント：</strong><code>SymbolInfoInteger</code>の戻り値は<code>long</code>型なので、<code>int</code>や<code>bool</code>として使いたい場合は、上記のように<strong>キャスト（型変換）</strong>を行いましょう。ENUM_SYMBOL_TRADE_EXECUTIONなどの列挙型の返り値を受け取る場合は、返り値を対応する列挙型にキャスト（型変換）して変数に代入します。</p>
<h2><span id="toc6">SymbolInfoDouble関数とENUM_SYMBOL_INFO_DOUBLEとは</span></h2>
<h3><span id="toc7">関数の基本構文</span></h3>
<p>SymbolInfoDouble関数は、指定した通貨ペアに関するプロパティ情報(double型)を取得します。この関数で取得する通貨ペアのプロパティ情報の識別子は ENUM_SYMBOL_INFO_DOUBLE 列挙値から選択します。こちらも2つの書き方があります。</p>
<pre><code class="language-mql5">// 書き方① 戻り値で直接値を受け取る
double SymbolInfoDouble(
   string symbol,                        // 通貨ペア名
   ENUM_SYMBOL_INFO_DOUBLE prop_id        // 取得したいプロパティの識別子
);

// 書き方② 成功/失敗をboolで受け取り、値は第3引数に格納
bool SymbolInfoDouble(
   string symbol,                        // 通貨ペア名
   ENUM_SYMBOL_INFO_DOUBLE prop_id,       // 取得したいプロパティの識別子
   double &amp; var                           // 値を受け取る変数
);</code></pre>
<h3><span id="toc8">よく使うENUM_SYMBOL_INFO_DOUBLEの定数一覧</span></h3>
<p>ENUM_SYMBOL_INFO_DOUBLEには、SYMBOL_BID（Bid売値）、SYMBOL_ASK（Ask買値）、SYMBOL_LAST（直近の約定価格）などの価格情報のほか、各種取引条件の定数が含まれています。</p>
<table border="1" cellpadding="8" cellspacing="0" style="border-collapse: collapse; width: 100%;">
<thead>
<tr style="background-color: #f0f0f0;">
<th>定数名</th>
<th>説明</th>
<th>用途の例</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>SYMBOL_BID</code></td>
<td>現在のBid（売値）</td>
<td>売り注文の基準価格</td>
</tr>
<tr>
<td><code>SYMBOL_ASK</code></td>
<td>現在のAsk（買値）</td>
<td>買い注文の基準価格</td>
</tr>
<tr>
<td><code>SYMBOL_POINT</code></td>
<td>1ポイントの価格単位</td>
<td>SL/TPの距離計算</td>
</tr>
<tr>
<td><code>SYMBOL_TRADE_TICK_VALUE</code></td>
<td>1Tickの価値（口座通貨建て）</td>
<td>損益計算</td>
</tr>
<tr>
<td><code>SYMBOL_TRADE_TICK_SIZE</code></td>
<td>最小価格変動幅</td>
<td>価格の丸め処理</td>
</tr>
<tr>
<td><code>SYMBOL_TRADE_CONTRACT_SIZE</code></td>
<td>1ロットあたりの契約サイズ</td>
<td>ポジションサイズ計算</td>
</tr>
<tr>
<td><code>SYMBOL_VOLUME_MIN</code></td>
<td>最小取引ロット数</td>
<td>ロット数のバリデーション</td>
</tr>
<tr>
<td><code>SYMBOL_VOLUME_MAX</code></td>
<td>最大取引ロット数</td>
<td>ロット数のバリデーション</td>
</tr>
<tr>
<td><code>SYMBOL_VOLUME_STEP</code></td>
<td>ロット数の刻み幅</td>
<td>ロット数の正規化</td>
</tr>
<tr>
<td><code>SYMBOL_SWAP_LONG</code></td>
<td>買いスワップ</td>
<td>スワップの確認・計算</td>
</tr>
<tr>
<td><code>SYMBOL_SWAP_SHORT</code></td>
<td>売りスワップ</td>
<td>スワップの確認・計算</td>
</tr>
<tr>
<td><code>SYMBOL_MARGIN_INITIAL</code></td>
<td>初期証拠金</td>
<td>資金管理</td>
</tr>
</tbody>
</table>
<h3><span id="toc9">SymbolInfoDoubleの使用例</span></h3>
<pre><code class="language-mql5">#property strict

void OnInit()
{
   string symbol = Symbol();

   // Bid / Ask を取得
   double bid = SymbolInfoDouble(symbol, SYMBOL_BID);
   double ask = SymbolInfoDouble(symbol, SYMBOL_ASK);
   Print("Bid: ", bid, " / Ask: ", ask);

   // ポイントサイズを取得
   double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
   Print("1ポイント: ", point);

   // ロット関連情報を取得
   double minLot  = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
   double maxLot  = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
   double lotStep = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
   Print("最小ロット: ", minLot, " / 最大ロット: ", maxLot, " / 刻み: ", lotStep);

   // スワップ情報を取得
   double swapLong  = SymbolInfoDouble(symbol, SYMBOL_SWAP_LONG);
   double swapShort = SymbolInfoDouble(symbol, SYMBOL_SWAP_SHORT);
   Print("買いスワップ: ", swapLong, " / 売りスワップ: ", swapShort);
}</code></pre>
<h2><span id="toc10">MarketInfo関数との違い ― なぜSymbolInfoXXXを使うべきか</span></h2>
<p>MQL4には、古くから<code>MarketInfo()</code>関数が存在し、通貨ペアの情報を取得できました。しかし、<code>SymbolInfoInteger</code> / <code>SymbolInfoDouble</code>を使うことをおすすめします。その理由は以下の通りです。</p>
<ul>
<li><strong>型の正確性：</strong>MarketInfo()はすべての値をdouble型で返しますが、SymbolInfoIntegerはlong型を返すため、整数値の精度が保たれ、型チェックが正確になります。</li>
<li><strong>MQL5との互換性：</strong>MT4とMT5の両方で動作するコードを書きたい場合は、SymbolInfoDouble()を使うほうがよいとされています。MQL4ではMarketInfo関数でも同様にポイントサイズを取得できますが、MQL4/5共通でSymbolInfoDouble関数が使えるので、そちらを使っておけばよいでしょう。</li>
<li><strong>エラーハンドリング：</strong>書き方②（bool戻り値版）を使えば、情報が取得できなかった場合を明確に判定できます。</li>
</ul>
<pre><code class="language-mql5">// &#x274c; 古い書き方（MarketInfo）
double spread = MarketInfo(Symbol(), MODE_SPREAD);
double point  = MarketInfo(Symbol(), MODE_POINT);

// &#x2705; 新しい書き方（SymbolInfoXXX）※推奨
int    spread = (int)SymbolInfoInteger(Symbol(), SYMBOL_SPREAD);
double point  = SymbolInfoDouble(Symbol(), SYMBOL_POINT);</code></pre>
<h2><span id="toc11">【実践】通貨ペア情報を一括表示するサンプルEA</span></h2>
<p>最後に、ここまで学んだ内容を活用して、チャートに適用した通貨ペアの主要情報をログに一括出力するサンプルEAを紹介します。</p>
<pre><code class="language-mql5">//+------------------------------------------------------------------+
//| SymbolInfoViewer.mq4                                             |
//| 通貨ペアの主要情報を一括表示するサンプルEA                         |
//+------------------------------------------------------------------+
#property strict

void OnInit()
{
   string sym = Symbol();

   Print("=== ", sym, " の通貨ペア情報 ===");

   // --- Integer型の情報 ---
   Print("小数桁数 (Digits): ",
         (int)SymbolInfoInteger(sym, SYMBOL_DIGITS));

   Print("スプレッド: ",
         (int)SymbolInfoInteger(sym, SYMBOL_SPREAD), " point");

   Print("変動スプレッド: ",
         (bool)SymbolInfoInteger(sym, SYMBOL_SPREAD_FLOAT));

   Print("ストップレベル: ",
         (int)SymbolInfoInteger(sym, SYMBOL_TRADE_STOPS_LEVEL), " point");

   Print("フリーズレベル: ",
         (int)SymbolInfoInteger(sym, SYMBOL_TRADE_FREEZE_LEVEL), " point");

   // 取引実行モードの取得（列挙型へのキャスト）
   ENUM_SYMBOL_TRADE_EXECUTION exeMode
      = (ENUM_SYMBOL_TRADE_EXECUTION)SymbolInfoInteger(sym, SYMBOL_TRADE_EXEMODE);
   Print("取引執行モード: ", EnumToString(exeMode));

   // --- Double型の情報 ---
   Print("Bid: ", SymbolInfoDouble(sym, SYMBOL_BID));
   Print("Ask: ", SymbolInfoDouble(sym, SYMBOL_ASK));
   Print("Point: ", SymbolInfoDouble(sym, SYMBOL_POINT));

   Print("最小ロット: ", SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN));
   Print("最大ロット: ", SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX));
   Print("ロット刻み: ", SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP));
   Print("契約サイズ: ", SymbolInfoDouble(sym, SYMBOL_TRADE_CONTRACT_SIZE));

   Print("TickValue: ", SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE));
   Print("TickSize: ",  SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE));

   Print("買いスワップ: ", SymbolInfoDouble(sym, SYMBOL_SWAP_LONG));
   Print("売りスワップ: ", SymbolInfoDouble(sym, SYMBOL_SWAP_SHORT));

   Print("=== 情報取得完了 ===");
}</code></pre>
<p>このEAをチャートにセットすると、「エキスパート」タブにその通貨ペアの主要な情報が一覧で出力されます。自分のブローカーの設定値を確認したり、EA開発時のデバッグに非常に便利です。</p>
<h2><span id="toc12">注意点とTips</span></h2>
<ul>
<li><strong>気配値表示ウィンドウに注意：</strong>ストラテジーテスターの中ではSymbolInfoやMarketInfoが取得できない時があり、気配値表示ウィンドウに表示されていない通貨ペアでは値が0.0になることがあります。マルチ通貨EAを作る場合は、対象通貨ペアが気配値表示に含まれているか事前に確認しましょう。</li>
<li><strong>ストップレベルが0の場合：</strong>一部のブローカーではストップレベルが0に設定されています。この場合、SL/TPの距離制限がないという意味ではなく、スプレッド分は最低限必要になることが多いため、実際のテストで確認しましょう。</li>
<li><strong>EnumToString関数の活用：</strong>ENUM_SYMBOL_TRADE_EXECUTION型などの列挙型を受け取る場合は、SymbolInfoIntegerの返り値を対応する列挙型にキャストして変数に代入します。<code>EnumToString()</code>を使うと定数名が文字列で返されるのでデバッグに便利です。</li>
</ul>
<h2><span id="toc13">まとめ</span></h2>
<p>今回は、MQL4で通貨ペア情報を取得するための<strong>ENUM_SYMBOL_INFO_INTEGER</strong>と<strong>ENUM_SYMBOL_INFO_DOUBLE</strong>の定数、そして<strong>SymbolInfoInteger関数</strong>と<strong>SymbolInfoDouble関数</strong>の使い方を解説しました。</p>
<p>ポイントを整理すると：</p>
<ul>
<li><strong>整数型の情報</strong>（桁数、スプレッド、ストップレベルなど）→ <code>SymbolInfoInteger()</code></li>
<li><strong>小数型の情報</strong>（価格、ポイント、ロット数、スワップなど）→ <code>SymbolInfoDouble()</code></li>
<li>古い<code>MarketInfo()</code>より型安全でMQL5互換の<code>SymbolInfoXXX</code>を使おう</li>
<li>bool戻り値版を使えば、エラーハンドリングもしっかり行える</li>
</ul>
<p>通貨ペアの情報を正確に取得できるようになると、ロット計算やSL/TP設定、スプレッドフィルターなど、EA開発のあらゆる場面で役立ちます。ぜひ今回のサンプルコードを実際に動かして、自分のブローカーの値を確認してみてください！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13086/%e3%80%90mql4%e3%80%91%e9%80%9a%e8%b2%a8%e3%83%9a%e3%82%a2%e6%83%85%e5%a0%b1%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b%e5%ae%9a%e6%95%b0%e3%81%a8%e9%96%a2%e6%95%b0%e3%82%92%e5%ae%8c%e5%85%a8/">【MQL4】通貨ペア情報を取得する定数と関数を完全解説！ENUM_SYMBOL_INFO_INTEGER / ENUM_SYMBOL_INFO_DOUBLEの使い方</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4】チャート設定定数を完全理解！ENUM_CHART_PROPERTY_INTEGER・STRING・DOUBLEの使い方</title>
		<link>https://mql-programing.com/archives/13083/%e3%80%90mql4%e3%80%91%e3%83%81%e3%83%a3%e3%83%bc%e3%83%88%e8%a8%ad%e5%ae%9a%e5%ae%9a%e6%95%b0%e3%82%92%e5%ae%8c%e5%85%a8%e7%90%86%e8%a7%a3%ef%bc%81enum_chart_property_integer%e3%83%bbstring%e3%83%bbd/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Wed, 29 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【辞書】MQLリファレンス]]></category>
		<category><![CDATA[定数]]></category>
		<category><![CDATA[ChartSetInteger]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[EA開発]]></category>
		<category><![CDATA[チャート設定]]></category>
		<category><![CDATA[ENUM_CHART_PROPERTY]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13083</guid>

					<description><![CDATA[<p>EAやインジケーターを開発していると、「チャートの背景色をプログラムから変更したい」「グリッドを非表示にしたい」「ローソク足の色を統一したい」といった場面に出くわすことがあります。 MQL4では、チャートの見た目や動作を [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13083/%e3%80%90mql4%e3%80%91%e3%83%81%e3%83%a3%e3%83%bc%e3%83%88%e8%a8%ad%e5%ae%9a%e5%ae%9a%e6%95%b0%e3%82%92%e5%ae%8c%e5%85%a8%e7%90%86%e8%a7%a3%ef%bc%81enum_chart_property_integer%e3%83%bbstring%e3%83%bbd/">【MQL4】チャート設定定数を完全理解！ENUM_CHART_PROPERTY_INTEGER・STRING・DOUBLEの使い方</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>EAやインジケーターを開発していると、「チャートの背景色をプログラムから変更したい」「グリッドを非表示にしたい」「ローソク足の色を統一したい」といった場面に出くわすことがあります。</p>
<p>MQL4では、チャートの見た目や動作を制御するための<strong>チャートプロパティ定数</strong>が用意されています。この記事では、<strong>ENUM_CHART_PROPERTY_INTEGER</strong>、<strong>ENUM_CHART_PROPERTY_STRING</strong>、<strong>ENUM_CHART_PROPERTY_DOUBLE</strong>の3種類の列挙型を中心に、チャート設定の操作方法をわかりやすく解説します。</p>
<h2><span id="toc1">チャートプロパティを操作する関数の全体像</span></h2>
<p>MQL4では、チャートプロパティの値を「設定する関数」と「取得する関数」がデータ型ごとにペアで用意されています。</p>
<table border="1" cellpadding="8" cellspacing="0" style="border-collapse: collapse; width: 100%; margin: 1em 0;">
<thead>
<tr style="background-color: #f0f0f0;">
<th>データ型</th>
<th>設定する関数</th>
<th>取得する関数</th>
<th>対応する列挙型</th>
</tr>
</thead>
<tbody>
<tr>
<td>整数型（long）</td>
<td>ChartSetInteger()</td>
<td>ChartGetInteger()</td>
<td>ENUM_CHART_PROPERTY_INTEGER</td>
</tr>
<tr>
<td>浮動小数点型（double）</td>
<td>ChartSetDouble()</td>
<td>ChartGetDouble()</td>
<td>ENUM_CHART_PROPERTY_DOUBLE</td>
</tr>
<tr>
<td>文字列型（string）</td>
<td>ChartSetString()</td>
<td>ChartGetString()</td>
<td>ENUM_CHART_PROPERTY_STRING</td>
</tr>
</tbody>
</table>
<p>これらの関数の第1引数にはチャートIDを指定します。<strong>0を指定すると現在のチャート</strong>を意味します。第2引数に、これから説明する列挙型の定数を渡すことで、どのプロパティを操作するかを指定します。</p>
<h2><span id="toc2">ENUM_CHART_PROPERTY_INTEGER — 整数型プロパティ</span></h2>
<p>最も種類が多く、よく使うのがこの整数型プロパティです。チャートの表示/非表示の切り替え、色の設定、モードの変更など幅広い操作ができます。</p>
<h3><span id="toc3">表示モード系のプロパティ</span></h3>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse: collapse; width: 100%; margin: 1em 0; font-size: 0.95em;">
<thead>
<tr style="background-color: #f0f0f0;">
<th>定数名</th>
<th>説明</th>
<th>設定値</th>
</tr>
</thead>
<tbody>
<tr>
<td>CHART_MODE</td>
<td>チャートの表示タイプ</td>
<td>CHART_BARS / CHART_CANDLES / CHART_LINE</td>
</tr>
<tr>
<td>CHART_FOREGROUND</td>
<td>価格チャートを前面に表示するか</td>
<td>true / false</td>
</tr>
<tr>
<td>CHART_SHIFT</td>
<td>右端にシフト（余白）を設けるか</td>
<td>true / false</td>
</tr>
<tr>
<td>CHART_AUTOSCROLL</td>
<td>自動スクロール（最新バーへ自動移動）</td>
<td>true / false</td>
</tr>
<tr>
<td>CHART_SCALE</td>
<td>チャートのスケール（0〜5）</td>
<td>0（縮小）〜 5（拡大）</td>
</tr>
</tbody>
</table>
<h3><span id="toc4">表示要素の ON/OFF 系プロパティ</span></h3>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse: collapse; width: 100%; margin: 1em 0; font-size: 0.95em;">
<thead>
<tr style="background-color: #f0f0f0;">
<th>定数名</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>CHART_SHOW_GRID</td>
<td>グリッド線の表示/非表示</td>
</tr>
<tr>
<td>CHART_SHOW_PERIOD_SEP</td>
<td>期間区切り線の表示/非表示</td>
</tr>
<tr>
<td>CHART_SHOW_ASK_LINE</td>
<td>Ask（買値）ラインの表示/非表示</td>
</tr>
<tr>
<td>CHART_SHOW_BID_LINE</td>
<td>Bid（売値）ラインの表示/非表示</td>
</tr>
<tr>
<td>CHART_SHOW_DATE_SCALE</td>
<td>横軸（日時スケール）の表示/非表示</td>
</tr>
<tr>
<td>CHART_SHOW_PRICE_SCALE</td>
<td>縦軸（価格スケール）の表示/非表示</td>
</tr>
<tr>
<td>CHART_SHOW_OHLC</td>
<td>四本値（OHLC）の表示/非表示</td>
</tr>
<tr>
<td>CHART_SHOW_ONE_CLICK</td>
<td>ワンクリックトレードパネルの表示/非表示</td>
</tr>
<tr>
<td>CHART_SHOW_VOLUMES</td>
<td>出来高の表示モード</td>
</tr>
</tbody>
</table>
<h3><span id="toc5">色の設定用プロパティ</span></h3>
<p>チャートの配色もすべてプログラムから制御できます。color型の値を指定します。</p>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse: collapse; width: 100%; margin: 1em 0; font-size: 0.95em;">
<thead>
<tr style="background-color: #f0f0f0;">
<th>定数名</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>CHART_COLOR_BACKGROUND</td>
<td>チャートの背景色</td>
</tr>
<tr>
<td>CHART_COLOR_FOREGROUND</td>
<td>前景色（軸やテキストの色）</td>
</tr>
<tr>
<td>CHART_COLOR_GRID</td>
<td>グリッド線の色</td>
</tr>
<tr>
<td>CHART_COLOR_CHART_UP</td>
<td>上昇バー / ローソク足の外枠・ヒゲの色</td>
</tr>
<tr>
<td>CHART_COLOR_CHART_DOWN</td>
<td>下降バー / ローソク足の外枠・ヒゲの色</td>
</tr>
<tr>
<td>CHART_COLOR_CANDLE_BULL</td>
<td>陽線（Bull）の実体の色</td>
</tr>
<tr>
<td>CHART_COLOR_CANDLE_BEAR</td>
<td>陰線（Bear）の実体の色</td>
</tr>
<tr>
<td>CHART_COLOR_CHART_LINE</td>
<td>ラインチャートの色</td>
</tr>
<tr>
<td>CHART_COLOR_ASK</td>
<td>Askラインの色</td>
</tr>
<tr>
<td>CHART_COLOR_BID</td>
<td>Bidラインの色</td>
</tr>
<tr>
<td>CHART_COLOR_STOP_LEVEL</td>
<td>ストップレベルの色</td>
</tr>
</tbody>
</table>
<h3><span id="toc6">読み取り専用のプロパティ</span></h3>
<p>以下のプロパティは値の取得のみ可能で、プログラムから変更はできません（読み取り専用 = r/o）。</p>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse: collapse; width: 100%; margin: 1em 0; font-size: 0.95em;">
<thead>
<tr style="background-color: #f0f0f0;">
<th>定数名</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>CHART_WINDOWS_TOTAL</td>
<td>チャートウィンドウの総数（サブウィンドウ含む）</td>
</tr>
<tr>
<td>CHART_WIDTH_IN_BARS</td>
<td>チャートの幅（バー数単位）</td>
</tr>
<tr>
<td>CHART_WIDTH_IN_PIXELS</td>
<td>チャートの幅（ピクセル単位）</td>
</tr>
<tr>
<td>CHART_HEIGHT_IN_PIXELS</td>
<td>チャートの高さ（ピクセル単位）</td>
</tr>
<tr>
<td>CHART_FIRST_VISIBLE_BAR</td>
<td>画面上で最初に見えるバーの番号</td>
</tr>
<tr>
<td>CHART_VISIBLE_BARS</td>
<td>画面上に表示されているバーの本数</td>
</tr>
<tr>
<td>CHART_IS_OBJECT</td>
<td>オブジェクトとしてのチャートかどうか</td>
</tr>
</tbody>
</table>
<h3><span id="toc7">実践サンプル：チャートの配色をカスタマイズする</span></h3>
<p>以下はEAの<code>OnInit()</code>内でチャートの見た目を一括変更する例です。</p>
<pre><code class="language-mql4">int OnInit()
{
   // チャート表示をローソク足に変更
   ChartSetInteger(0, CHART_MODE, CHART_CANDLES);
   
   // 背景色をダークブルーに設定
   ChartSetInteger(0, CHART_COLOR_BACKGROUND, clrMidnightBlue);
   
   // グリッドを非表示にする（背景色と同色でも可）
   ChartSetInteger(0, CHART_SHOW_GRID, false);
   
   // 陽線（Bull）の色設定
   ChartSetInteger(0, CHART_COLOR_CANDLE_BULL, clrDodgerBlue);
   ChartSetInteger(0, CHART_COLOR_CHART_UP, clrDodgerBlue);
   
   // 陰線（Bear）の色設定
   ChartSetInteger(0, CHART_COLOR_CANDLE_BEAR, clrMediumOrchid);
   ChartSetInteger(0, CHART_COLOR_CHART_DOWN, clrMediumOrchid);
   
   // Askラインを表示する
   ChartSetInteger(0, CHART_SHOW_ASK_LINE, true);
   
   // 設定を反映
   ChartRedraw();
   
   return(INIT_SUCCEEDED);
}</code></pre>
<p><strong>ポイント：</strong>ChartSetInteger()を呼んだだけでは画面にすぐ反映されないことがあります。確実に描画を更新したい場合は、最後に<code>ChartRedraw()</code>を呼びましょう。</p>
<h2><span id="toc8">ENUM_CHART_PROPERTY_DOUBLE — 浮動小数点型プロパティ</span></h2>
<p>Double型のプロパティは数が少なく、主にチャートの価格範囲を取得するために使います。</p>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse: collapse; width: 100%; margin: 1em 0; font-size: 0.95em;">
<thead>
<tr style="background-color: #f0f0f0;">
<th>定数名</th>
<th>説明</th>
<th>備考</th>
</tr>
</thead>
<tbody>
<tr>
<td>CHART_PRICE_MIN</td>
<td>チャート上の最小価格</td>
<td>読み取り専用</td>
</tr>
<tr>
<td>CHART_PRICE_MAX</td>
<td>チャート上の最大価格</td>
<td>読み取り専用</td>
</tr>
<tr>
<td>CHART_SHIFT_SIZE</td>
<td>右端シフトの割合（10〜50%）</td>
<td>設定可能</td>
</tr>
<tr>
<td>CHART_FIXED_POSITION</td>
<td>固定位置（左端からの割合%）</td>
<td>設定可能</td>
</tr>
<tr>
<td>CHART_FIXED_MAX</td>
<td>固定スケール時の最大価格</td>
<td>設定可能</td>
</tr>
<tr>
<td>CHART_FIXED_MIN</td>
<td>固定スケール時の最小価格</td>
<td>設定可能</td>
</tr>
</tbody>
</table>
<h3><span id="toc9">実践サンプル：現在のチャート価格範囲を取得する</span></h3>
<pre><code class="language-mql4">void OnTick()
{
   // 現在チャートに表示されている価格範囲を取得
   double priceMin = ChartGetDouble(0, CHART_PRICE_MIN);
   double priceMax = ChartGetDouble(0, CHART_PRICE_MAX);
   
   Print("表示中の価格範囲: ", priceMin, " ～ ", priceMax);
}</code></pre>
<p><code>CHART_PRICE_MIN</code>と<code>CHART_PRICE_MAX</code>は、画面上に「今見えている」範囲の最小・最大価格です。スクロールやズームに応じて動的に変化するため、現在の表示状態を知りたいときに便利です。</p>
<h2><span id="toc10">ENUM_CHART_PROPERTY_STRING — 文字列型プロパティ</span></h2>
<p>文字列型のプロパティは現在1つだけです。</p>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse: collapse; width: 100%; margin: 1em 0; font-size: 0.95em;">
<thead>
<tr style="background-color: #f0f0f0;">
<th>定数名</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>CHART_COMMENT</td>
<td>チャートの左上に表示されるコメント文字列</td>
</tr>
</tbody>
</table>
<h3><span id="toc11">実践サンプル：チャートにコメントを表示する</span></h3>
<pre><code class="language-mql4">void OnTick()
{
   // ChartSetString でチャートコメントを設定
   string info = "スプレッド: " + IntegerToString(SymbolInfoInteger(_Symbol, SYMBOL_SPREAD))
               + " / Bid: " + DoubleToString(Bid, _Digits);
   
   ChartSetString(0, CHART_COMMENT, info);
   ChartRedraw();
}

// コメントの取得
void ShowCurrentComment()
{
   string currentComment = ChartGetString(0, CHART_COMMENT);
   Print("現在のコメント: ", currentComment);
}</code></pre>
<p><code>ChartSetString()</code>による<code>CHART_COMMENT</code>の設定は、<code>Comment()</code>関数と同様にチャート左上にテキストを表示します。<code>Comment()</code>関数との違いは、チャートIDを指定できるため<strong>他のチャートウィンドウに対してもコメントを設定できる</strong>点です。</p>
<h2><span id="toc12">応用テクニック：チャートの設定を保存・復元する</span></h2>
<p>EAやインジケーターでチャートの見た目を変更する場合、終了時に元の設定に戻すのがマナーです。以下のパターンを覚えておきましょう。</p>
<pre><code class="language-mql4">// グローバル変数に元の設定を保存
color g_origBgColor;
bool  g_origShowGrid;

int OnInit()
{
   // 元の設定を保存
   g_origBgColor  = (color)ChartGetInteger(0, CHART_COLOR_BACKGROUND);
   g_origShowGrid = (bool)ChartGetInteger(0, CHART_SHOW_GRID);
   
   // 新しい設定を適用
   ChartSetInteger(0, CHART_COLOR_BACKGROUND, clrBlack);
   ChartSetInteger(0, CHART_SHOW_GRID, false);
   ChartRedraw();
   
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
   // 元の設定を復元
   ChartSetInteger(0, CHART_COLOR_BACKGROUND, g_origBgColor);
   ChartSetInteger(0, CHART_SHOW_GRID, g_origShowGrid);
   ChartRedraw();
}</code></pre>
<p>こうすることで、EAを取り外したときにチャートが元の見た目に戻ります。ユーザーにとって親切な設計になりますので、ぜひ習慣にしてください。</p>
<h2><span id="toc13">よくある注意点とつまずきポイント</span></h2>
<h3><span id="toc14">① ChartRedraw()を忘れない</span></h3>
<p>チャートプロパティを変更する関数は、実際にはイベントキューにコマンドを追加するだけです。画面への即時反映が必要な場合は、<code>ChartRedraw()</code>を明示的に呼びましょう。</p>
<h3><span id="toc15">② 第1引数のチャートID</span></h3>
<p>第1引数に<strong>0</strong>を指定すると「現在のチャート」を意味します。別のチャートを操作したい場合は、<code>ChartID()</code>や<code>ChartFirst()</code>/<code>ChartNext()</code>で取得したIDを使います。</p>
<h3><span id="toc16">③ 読み取り専用プロパティに注意</span></h3>
<p><code>CHART_WIDTH_IN_PIXELS</code>や<code>CHART_PRICE_MIN</code>などの読み取り専用（r/o）プロパティに対してSet関数を呼んでも、値は変更されません。公式リファレンスで「r/o」の表記を確認しましょう。</p>
<h3><span id="toc17">④ 新しく開いたチャートの操作タイミング</span></h3>
<p><code>ChartOpen()</code>で新しくチャートを開いた直後は、まだデータが読み込まれていない場合があります。<code>CHART_PRICE_MIN</code>や<code>CHART_PRICE_MAX</code>を取得しても0が返ることがあるため、少し待つか、次のティックで取得するようにしましょう。</p>
<h2><span id="toc18">まとめ</span></h2>
<p>MQL4のチャートプロパティ定数は、大きく<strong>3つの列挙型</strong>に分類されます。</p>
<ul>
<li><strong>ENUM_CHART_PROPERTY_INTEGER</strong>：色・表示切替・モード設定など（最も種類が多い）</li>
<li><strong>ENUM_CHART_PROPERTY_DOUBLE</strong>：価格範囲・スケール関連</li>
<li><strong>ENUM_CHART_PROPERTY_STRING</strong>：チャートコメント</li>
</ul>
<p>操作には<code>ChartSetInteger()</code>/<code>ChartGetInteger()</code>、<code>ChartSetDouble()</code>/<code>ChartGetDouble()</code>、<code>ChartSetString()</code>/<code>ChartGetString()</code>の6つの関数を使い分けます。</p>
<p>特に、EAやインジケーターで<strong>チャートの配色カスタマイズ</strong>や<strong>情報表示</strong>を行う際に必須の知識となりますので、まずは本記事のサンプルコードを動かして、チャートプロパティの変更を体験してみてください！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13083/%e3%80%90mql4%e3%80%91%e3%83%81%e3%83%a3%e3%83%bc%e3%83%88%e8%a8%ad%e5%ae%9a%e5%ae%9a%e6%95%b0%e3%82%92%e5%ae%8c%e5%85%a8%e7%90%86%e8%a7%a3%ef%bc%81enum_chart_property_integer%e3%83%bbstring%e3%83%bbd/">【MQL4】チャート設定定数を完全理解！ENUM_CHART_PROPERTY_INTEGER・STRING・DOUBLEの使い方</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4】ENUM_OBJECTとは？オブジェクトタイプ定数の全種類一覧と使い方をわかりやすく解説</title>
		<link>https://mql-programing.com/archives/13080/%e3%80%90mql4%e3%80%91enum_object%e3%81%a8%e3%81%af%ef%bc%9f%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%82%bf%e3%82%a4%e3%83%97%e5%ae%9a%e6%95%b0%e3%81%ae%e5%85%a8%e7%a8%ae%e9%a1%9e/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Tue, 28 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【辞書】MQLリファレンス]]></category>
		<category><![CDATA[定数]]></category>
		<category><![CDATA[ENUM_OBJECT]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[オブジェクト]]></category>
		<category><![CDATA[チャート描画]]></category>
		<category><![CDATA[ObjectCreate]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13080</guid>

					<description><![CDATA[<p>MQL4でチャート上にラインや矢印、テキストなどのグラフィカルオブジェクトを描画するとき、必ず登場するのがENUM_OBJECTという列挙型です。 ObjectCreate関数の第2引数には、このENUM_OBJECTの [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13080/%e3%80%90mql4%e3%80%91enum_object%e3%81%a8%e3%81%af%ef%bc%9f%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%82%bf%e3%82%a4%e3%83%97%e5%ae%9a%e6%95%b0%e3%81%ae%e5%85%a8%e7%a8%ae%e9%a1%9e/">【MQL4】ENUM_OBJECTとは？オブジェクトタイプ定数の全種類一覧と使い方をわかりやすく解説</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>MQL4でチャート上にラインや矢印、テキストなどのグラフィカルオブジェクトを描画するとき、必ず登場するのが<strong>ENUM_OBJECT</strong>という列挙型です。</p>
<p>ObjectCreate関数の第2引数には、このENUM_OBJECTの値を指定して「どの種類のオブジェクトを作るか」を決定します。しかし、オブジェクトタイプは約44種類もあり、「どんな種類があるの？」「どう使い分けるの？」と迷う方も多いのではないでしょうか。</p>
<p>この記事では、<strong>ENUM_OBJECTの全種類を一覧表で整理</strong>し、よく使うオブジェクトの実践的なコードサンプルもあわせて解説します。</p>
<h2><span id="toc1">ENUM_OBJECTとは？</span></h2>
<p><strong>ENUM_OBJECT</strong>は、MQL4で定義されている列挙型（enum）の一つで、チャート上に作成できるグラフィカルオブジェクトの種類を表す定数をまとめたものです。</p>
<p>オブジェクトを作成する<code>ObjectCreate</code>関数のシグネチャは以下のようになっています。</p>
<pre><code class="language-mql4">bool ObjectCreate(
   long         chart_id,   // チャートID（0=現在のチャート）
   string       name,       // オブジェクト名（一意の名前）
   ENUM_OBJECT  type,       // オブジェクトタイプ
   int          sub_window, // サブウィンドウ番号（0=メインウィンドウ）
   datetime     time1,      // 1つ目のアンカーポイントの時刻
   double       price1,     // 1つ目のアンカーポイントの価格
   ...                      // 必要に応じて追加のアンカーポイント
);
</code></pre>
<p>第3引数の<code>type</code>に<strong>ENUM_OBJECTの定数値</strong>を指定することで、水平線・トレンドライン・矢印・テキストラベルなど、目的に合ったオブジェクトを作成できます。</p>
<h2><span id="toc2">全オブジェクトタイプ一覧（カテゴリ別）</span></h2>
<p>ENUM_OBJECTに含まれるオブジェクトタイプを、カテゴリ別に整理しました。</p>
<h3><span id="toc3">ライン系オブジェクト</span></h3>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse; width:100%; max-width:720px;">
<thead>
<tr style="background:#f0f0f0;">
<th>定数名</th>
<th>説明</th>
<th>アンカー数</th>
</tr>
</thead>
<tbody>
<tr>
<td>OBJ_VLINE</td>
<td>垂直線</td>
<td>1</td>
</tr>
<tr>
<td>OBJ_HLINE</td>
<td>水平線</td>
<td>1</td>
</tr>
<tr>
<td>OBJ_TREND</td>
<td>トレンドライン</td>
<td>2</td>
</tr>
<tr>
<td>OBJ_TRENDBYANGLE</td>
<td>角度によるトレンドライン</td>
<td>2</td>
</tr>
<tr>
<td>OBJ_CYCLES</td>
<td>サイクルライン</td>
<td>2</td>
</tr>
<tr>
<td>OBJ_ARROWED_LINE</td>
<td>矢印付きライン</td>
<td>2</td>
</tr>
</tbody>
</table>
<h3><span id="toc4">チャネル系オブジェクト</span></h3>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse; width:100%; max-width:720px;">
<thead>
<tr style="background:#f0f0f0;">
<th>定数名</th>
<th>説明</th>
<th>アンカー数</th>
</tr>
</thead>
<tbody>
<tr>
<td>OBJ_CHANNEL</td>
<td>等距離チャネル</td>
<td>3</td>
</tr>
<tr>
<td>OBJ_STDDEVCHANNEL</td>
<td>標準偏差チャネル</td>
<td>2</td>
</tr>
<tr>
<td>OBJ_REGRESSION</td>
<td>線形回帰チャネル</td>
<td>2</td>
</tr>
<tr>
<td>OBJ_PITCHFORK</td>
<td>アンドリューズ・ピッチフォーク</td>
<td>3</td>
</tr>
</tbody>
</table>
<h3><span id="toc5">ギャン系オブジェクト</span></h3>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse; width:100%; max-width:720px;">
<thead>
<tr style="background:#f0f0f0;">
<th>定数名</th>
<th>説明</th>
<th>アンカー数</th>
</tr>
</thead>
<tbody>
<tr>
<td>OBJ_GANNLINE</td>
<td>ギャンライン</td>
<td>2</td>
</tr>
<tr>
<td>OBJ_GANNFAN</td>
<td>ギャンファン</td>
<td>2</td>
</tr>
<tr>
<td>OBJ_GANNGRID</td>
<td>ギャングリッド</td>
<td>2</td>
</tr>
</tbody>
</table>
<h3><span id="toc6">フィボナッチ系オブジェクト</span></h3>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse; width:100%; max-width:720px;">
<thead>
<tr style="background:#f0f0f0;">
<th>定数名</th>
<th>説明</th>
<th>アンカー数</th>
</tr>
</thead>
<tbody>
<tr>
<td>OBJ_FIBO</td>
<td>フィボナッチ・リトレースメント</td>
<td>2</td>
</tr>
<tr>
<td>OBJ_FIBOTIMES</td>
<td>フィボナッチ・タイムゾーン</td>
<td>2</td>
</tr>
<tr>
<td>OBJ_FIBOFAN</td>
<td>フィボナッチ・ファン</td>
<td>2</td>
</tr>
<tr>
<td>OBJ_FIBOARC</td>
<td>フィボナッチ・アーク</td>
<td>2</td>
</tr>
<tr>
<td>OBJ_FIBOCHANNEL</td>
<td>フィボナッチ・チャネル</td>
<td>3</td>
</tr>
<tr>
<td>OBJ_EXPANSION</td>
<td>フィボナッチ・エクスパンション</td>
<td>3</td>
</tr>
</tbody>
</table>
<h3><span id="toc7">エリオット波動系オブジェクト</span></h3>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse; width:100%; max-width:720px;">
<thead>
<tr style="background:#f0f0f0;">
<th>定数名</th>
<th>説明</th>
<th>アンカー数</th>
</tr>
</thead>
<tbody>
<tr>
<td>OBJ_ELLIOTWAVE5</td>
<td>エリオット推進波（5波）</td>
<td>5</td>
</tr>
<tr>
<td>OBJ_ELLIOTWAVE3</td>
<td>エリオット修正波（3波）</td>
<td>3</td>
</tr>
</tbody>
</table>
<h3><span id="toc8">図形系オブジェクト</span></h3>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse; width:100%; max-width:720px;">
<thead>
<tr style="background:#f0f0f0;">
<th>定数名</th>
<th>説明</th>
<th>アンカー数</th>
</tr>
</thead>
<tbody>
<tr>
<td>OBJ_RECTANGLE</td>
<td>長方形</td>
<td>2</td>
</tr>
<tr>
<td>OBJ_TRIANGLE</td>
<td>三角形</td>
<td>3</td>
</tr>
<tr>
<td>OBJ_ELLIPSE</td>
<td>楕円</td>
<td>3</td>
</tr>
</tbody>
</table>
<h3><span id="toc9">矢印・マーカー系オブジェクト</span></h3>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse; width:100%; max-width:720px;">
<thead>
<tr style="background:#f0f0f0;">
<th>定数名</th>
<th>説明</th>
<th>アンカー数</th>
</tr>
</thead>
<tbody>
<tr>
<td>OBJ_ARROW</td>
<td>矢印（任意のWingdingsコード指定可）</td>
<td>1</td>
</tr>
<tr>
<td>OBJ_ARROW_THUMB_UP</td>
<td>サムズアップ</td>
<td>1</td>
</tr>
<tr>
<td>OBJ_ARROW_THUMB_DOWN</td>
<td>サムズダウン</td>
<td>1</td>
</tr>
<tr>
<td>OBJ_ARROW_UP</td>
<td>上向き矢印</td>
<td>1</td>
</tr>
<tr>
<td>OBJ_ARROW_DOWN</td>
<td>下向き矢印</td>
<td>1</td>
</tr>
<tr>
<td>OBJ_ARROW_STOP</td>
<td>ストップサイン</td>
<td>1</td>
</tr>
<tr>
<td>OBJ_ARROW_CHECK</td>
<td>チェックマーク</td>
<td>1</td>
</tr>
<tr>
<td>OBJ_ARROW_LEFT_PRICE</td>
<td>左向き価格ラベル</td>
<td>1</td>
</tr>
<tr>
<td>OBJ_ARROW_RIGHT_PRICE</td>
<td>右向き価格ラベル</td>
<td>1</td>
</tr>
<tr>
<td>OBJ_ARROW_BUY</td>
<td>買いサイン</td>
<td>1</td>
</tr>
<tr>
<td>OBJ_ARROW_SELL</td>
<td>売りサイン</td>
<td>1</td>
</tr>
</tbody>
</table>
<h3><span id="toc10">テキスト・GUI系オブジェクト</span></h3>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse; width:100%; max-width:720px;">
<thead>
<tr style="background:#f0f0f0;">
<th>定数名</th>
<th>説明</th>
<th>配置基準</th>
</tr>
</thead>
<tbody>
<tr>
<td>OBJ_TEXT</td>
<td>テキスト（チャート座標に固定）</td>
<td>時刻・価格</td>
</tr>
<tr>
<td>OBJ_LABEL</td>
<td>テキストラベル（ピクセル座標に固定）</td>
<td>X・Y座標</td>
</tr>
<tr>
<td>OBJ_BUTTON</td>
<td>ボタン</td>
<td>X・Y座標</td>
</tr>
<tr>
<td>OBJ_EDIT</td>
<td>入力フィールド</td>
<td>X・Y座標</td>
</tr>
<tr>
<td>OBJ_RECTANGLE_LABEL</td>
<td>矩形ラベル（パネル背景など）</td>
<td>X・Y座標</td>
</tr>
<tr>
<td>OBJ_BITMAP</td>
<td>ビットマップ画像（チャート座標）</td>
<td>時刻・価格</td>
</tr>
<tr>
<td>OBJ_BITMAP_LABEL</td>
<td>ビットマップラベル（ピクセル座標）</td>
<td>X・Y座標</td>
</tr>
<tr>
<td>OBJ_EVENT</td>
<td>イベントオブジェクト</td>
<td>時刻</td>
</tr>
</tbody>
</table>
<p>※ アンカー数とは、ObjectCreate関数で指定が必要な座標ポイントの数です。たとえばトレンドラインは始点と終点の2つが必要です。</p>
<h2><span id="toc11">よく使うオブジェクトの実践コード</span></h2>
<p>ここからは、EA開発やインジケーター作成でよく使うオブジェクトタイプを5つ取り上げ、実際のコードとともに解説します。</p>
<h3><span id="toc12">①水平線（OBJ_HLINE）を描画する</span></h3>
<p>水平線は特定の価格レベルにラインを引くオブジェクトです。サポート・レジスタンスラインの表示などに使います。アンカーポイントは<strong>price1のみ</strong>で、time1は意味を持ちませんが、引数として0を渡します。</p>
<pre><code class="language-mql4">void DrawHLine(string name, double price, color clr)
{
   // すでに同名のオブジェクトがあれば削除
   if(ObjectFind(0, name) >= 0)
      ObjectDelete(0, name);

   // 水平線を作成（time1は0でOK、price1に価格を指定）
   ObjectCreate(0, name, OBJ_HLINE, 0, 0, price);

   // 色を設定
   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
   // 線のスタイルを点線に
   ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_DASH);
   // 線の太さ
   ObjectSetInteger(0, name, OBJPROP_WIDTH, 1);
}

// 使用例：現在の価格に赤い水平線を描画
void OnStart()
{
   DrawHLine("SupportLine", Ask - 50 * _Point, clrRed);
}
</code></pre>
<h3><span id="toc13">②垂直線（OBJ_VLINE）を描画する</span></h3>
<p>垂直線は特定の時刻に縦のラインを引くオブジェクトです。セッション区切りや重要なイベント時刻の表示に使います。アンカーポイントは<strong>time1のみ</strong>で、price1は0を渡します。</p>
<pre><code class="language-mql4">void DrawVLine(string name, datetime time, color clr)
{
   if(ObjectFind(0, name) >= 0)
      ObjectDelete(0, name);

   // 垂直線を作成（time1に時刻を指定、price1は0でOK）
   ObjectCreate(0, name, OBJ_VLINE, 0, time, 0);

   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
   ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_DOT);
   ObjectSetInteger(0, name, OBJPROP_WIDTH, 1);
}

// 使用例：現在の足の時刻に青い垂直線を描画
void OnStart()
{
   DrawVLine("EventLine", TimeCurrent(), clrBlue);
}
</code></pre>
<h3><span id="toc14">③矢印マーカー（OBJ_ARROW）を表示する</span></h3>
<p>OBJ_ARROWは、Wingdingsフォントの文字コードを使って任意のアイコンを表示できる汎用的な矢印オブジェクトです。<code>OBJPROP_ARROWCODE</code>プロパティでアイコンの種類を変更できます。</p>
<pre><code class="language-mql4">void DrawArrow(string name, datetime time, double price, int arrowCode, color clr)
{
   if(ObjectFind(0, name) >= 0)
      ObjectDelete(0, name);

   // 矢印オブジェクトを作成
   ObjectCreate(0, name, OBJ_ARROW, 0, time, price);

   // 矢印コードを設定（例: 233=上矢印, 234=下矢印）
   ObjectSetInteger(0, name, OBJPROP_ARROWCODE, arrowCode);
   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
   // 矢印のサイズ
   ObjectSetInteger(0, name, OBJPROP_WIDTH, 2);
}

// 使用例：現在の足に上向き矢印を表示
void OnStart()
{
   DrawArrow("BuySignal", Time[0], Low[0] - 10 * _Point, 233, clrLime);
}
</code></pre>
<p>よく使われるWingdingsコードの例：233（上向き矢印）、234（下向き矢印）、159（大きな丸）、161（チェックマーク）などがあります。</p>
<h3><span id="toc15">④トレンドライン（OBJ_TREND）を描画する</span></h3>
<p>トレンドラインは2つのアンカーポイント（始点と終点）を結ぶ直線です。デフォルトでは右方向に延長されるため、延長が不要な場合は<code>OBJPROP_RAY_RIGHT</code>をfalseに設定します。</p>
<pre><code class="language-mql4">void DrawTrendLine(string name, datetime time1, double price1,
                   datetime time2, double price2, color clr)
{
   if(ObjectFind(0, name) >= 0)
      ObjectDelete(0, name);

   // 2点を指定してトレンドラインを作成
   ObjectCreate(0, name, OBJ_TREND, 0, time1, price1, time2, price2);

   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
   ObjectSetInteger(0, name, OBJPROP_WIDTH, 2);
   // 右方向への延長をオフにする
   ObjectSetInteger(0, name, OBJPROP_RAY_RIGHT, false);
}

// 使用例：5本前の安値から現在の安値へトレンドラインを描画
void OnStart()
{
   DrawTrendLine("MyTrend",
                 Time[5], Low[5],
                 Time[0], Low[0],
                 clrOrangeRed);
}
</code></pre>
<h3><span id="toc16">⑤テキストラベル（OBJ_LABEL）をチャート隅に配置する</span></h3>
<p>OBJ_LABELはピクセル座標ベースのテキストオブジェクトです。チャートをスクロールしても位置が固定されるため、情報パネルやステータス表示に最適です。<code>OBJPROP_CORNER</code>で基準コーナーを、<code>OBJPROP_XDISTANCE</code>と<code>OBJPROP_YDISTANCE</code>で位置を調整します。</p>
<pre><code class="language-mql4">void DrawLabel(string name, string text, int corner, int x, int y,
               color clr, int fontSize)
{
   if(ObjectFind(0, name) >= 0)
      ObjectDelete(0, name);

   // ラベルオブジェクトを作成（time/priceは不要なので0）
   ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);

   // 基準コーナーを設定
   // CORNER_LEFT_UPPER=0, CORNER_RIGHT_UPPER=1
   // CORNER_LEFT_LOWER=2, CORNER_RIGHT_LOWER=3
   ObjectSetInteger(0, name, OBJPROP_CORNER, corner);

   // コーナーからの距離（ピクセル）
   ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
   ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);

   // テキスト内容とフォント
   ObjectSetString(0, name, OBJPROP_TEXT, text);
   ObjectSetString(0, name, OBJPROP_FONT, "Arial Bold");
   ObjectSetInteger(0, name, OBJPROP_FONTSIZE, fontSize);
   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
}

// 使用例：左上にスプレッド情報を表示
void OnStart()
{
   int spread = (int)MarketInfo(Symbol(), MODE_SPREAD);
   string text = "Spread: " + IntegerToString(spread) + " pts";
   DrawLabel("SpreadLabel", text, CORNER_LEFT_UPPER, 20, 30, clrWhite, 12);
}
</code></pre>
<h2><span id="toc17">ObjectCreate使用時の注意点</span></h2>
<p>オブジェクトを使う際に知っておくべきポイントをまとめます。</p>
<h3><span id="toc18">オブジェクト名のルール</span></h3>
<ul>
<li><strong>最大63文字</strong>まで指定できます。</li>
<li><strong>ラテン文字（英数字）の使用が推奨</strong>されています。日本語文字を使うと環境によって文字化けする可能性があります。</li>
<li>同じチャート上で<strong>オブジェクト名は一意</strong>でなければなりません。</li>
</ul>
<h3><span id="toc19">同名オブジェクトが既に存在する場合</span></h3>
<p>ObjectCreate関数は、同名のオブジェクトがすでに存在する場合、<strong>新規作成はせず、既存オブジェクトの座標を変更しようとします</strong>。この場合、関数はfalseを返しますが、エラーではなく座標の更新が行われることがあります。</p>
<p>意図しない動作を防ぐために、作成前に<code>ObjectFind</code>で存在確認し、必要に応じて<code>ObjectDelete</code>で削除してから作成するのが安全です。</p>
<h3><span id="toc20">オブジェクトの後片付け</span></h3>
<p>EA終了時やインジケーター削除時には、作成したオブジェクトを削除するようにしましょう。<code>OnDeinit</code>関数内で処理するのが一般的です。</p>
<pre><code class="language-mql4">void OnDeinit(const int reason)
{
   // プレフィックスが "My_" のオブジェクトをすべて削除
   ObjectsDeleteAll(0, "My_");
}
</code></pre>
<p>オブジェクト名にプレフィックス（接頭辞）を付けておくと、<code>ObjectsDeleteAll</code>の第2引数にそのプレフィックスを指定するだけで一括削除できるので便利です。</p>
<h3><span id="toc21">OBJ_TEXT と OBJ_LABEL の違い</span></h3>
<p><strong>OBJ_TEXT</strong>はチャートの時刻・価格座標に固定されるため、チャートをスクロールするとテキストも一緒に動きます。一方、<strong>OBJ_LABEL</strong>はチャートウィンドウのピクセル座標に固定されるため、スクロールしても常に同じ位置に表示されます。常時表示したい情報にはOBJ_LABELを使いましょう。</p>
<h2><span id="toc22">まとめ</span></h2>
<p>この記事では、MQL4の<strong>ENUM_OBJECT</strong>列挙型について、基本的な概念から全種類の一覧、そして実践的なコードサンプルまでを解説しました。</p>
<ul>
<li><strong>ENUM_OBJECT</strong>は、ObjectCreate関数でオブジェクトの種類を指定するための列挙型</li>
<li>ライン系・チャネル系・フィボナッチ系・矢印系・テキスト系など、<strong>約44種類</strong>のオブジェクトタイプがある</li>
<li><strong>OBJ_HLINE</strong>（水平線）と<strong>OBJ_VLINE</strong>（垂直線）はアンカーポイントが1つだけ</li>
<li><strong>OBJ_ARROW</strong>はWingdingsコードで様々なアイコンを表示可能</li>
<li><strong>OBJ_LABEL</strong>はピクセル座標固定で、情報パネルの作成に最適</li>
<li>オブジェクト名は<strong>63文字以内のラテン文字</strong>を推奨。プレフィックスを付けて管理すると後片付けが楽になる</li>
</ul>
<p>まずは水平線やラベルなど、シンプルなオブジェクトから試してみてください。チャート上にカスタム表示を加えることで、EAやインジケーターの使い勝手が大きく向上します。</p>
<p>投稿 <a href="https://mql-programing.com/archives/13080/%e3%80%90mql4%e3%80%91enum_object%e3%81%a8%e3%81%af%ef%bc%9f%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%82%bf%e3%82%a4%e3%83%97%e5%ae%9a%e6%95%b0%e3%81%ae%e5%85%a8%e7%a8%ae%e9%a1%9e/">【MQL4】ENUM_OBJECTとは？オブジェクトタイプ定数の全種類一覧と使い方をわかりやすく解説</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4】注文タイプ定数を完全解説！OP_BUY・OP_SELL・指値/逆指値の全6種類を一覧で理解しよう</title>
		<link>https://mql-programing.com/archives/13077/%e3%80%90mql4%e3%80%91%e6%b3%a8%e6%96%87%e3%82%bf%e3%82%a4%e3%83%97%e5%ae%9a%e6%95%b0%e3%82%92%e5%ae%8c%e5%85%a8%e8%a7%a3%e8%aa%ac%ef%bc%81op_buy%e3%83%bbop_sell%e3%83%bb%e6%8c%87%e5%80%a4-%e9%80%86/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Mon, 27 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【辞書】MQLリファレンス]]></category>
		<category><![CDATA[定数]]></category>
		<category><![CDATA[OP_BUY]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[注文タイプ定数]]></category>
		<category><![CDATA[OrderSend]]></category>
		<category><![CDATA[待機注文]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13077</guid>

					<description><![CDATA[<p>MQL4で注文を出すとき、必ず使うのがOrderSend()関数です。この関数の第2引数には「注文タイプ」を指定する必要があります。 「OP_BUYは分かるけど、OP_BUYLIMITとOP_BUYSTOPの違いって何？ [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13077/%e3%80%90mql4%e3%80%91%e6%b3%a8%e6%96%87%e3%82%bf%e3%82%a4%e3%83%97%e5%ae%9a%e6%95%b0%e3%82%92%e5%ae%8c%e5%85%a8%e8%a7%a3%e8%aa%ac%ef%bc%81op_buy%e3%83%bbop_sell%e3%83%bb%e6%8c%87%e5%80%a4-%e9%80%86/">【MQL4】注文タイプ定数を完全解説！OP_BUY・OP_SELL・指値/逆指値の全6種類を一覧で理解しよう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>MQL4で注文を出すとき、必ず使うのが<strong>OrderSend()</strong>関数です。この関数の第2引数には「注文タイプ」を指定する必要があります。</p>
<p>「OP_BUYは分かるけど、OP_BUYLIMITとOP_BUYSTOPの違いって何？」「指値と逆指値がごっちゃになる…」という方も多いのではないでしょうか。</p>
<p>この記事では、MQL4の<strong>注文タイプ定数 全6種類</strong>を一覧表で整理し、それぞれのコードサンプル付きで徹底解説します。これを読めば、すべての注文タイプを自信を持って使い分けられるようになります。</p>
<h2><span id="toc1">注文タイプ定数の一覧（全6種類）</span></h2>
<p>まずは全体像を把握しましょう。MQL4で使える注文タイプ定数は以下の6つです。</p>
<table border="1" cellpadding="8" cellspacing="0" style="border-collapse: collapse; width: 100%;">
<thead>
<tr style="background-color: #f0f0f0;">
<th>定数名</th>
<th>数値</th>
<th>種類</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>OP_BUY</strong></td>
<td>0</td>
<td>成行注文</td>
<td>現在価格で買い（ロング）</td>
</tr>
<tr>
<td><strong>OP_SELL</strong></td>
<td>1</td>
<td>成行注文</td>
<td>現在価格で売り（ショート）</td>
</tr>
<tr>
<td><strong>OP_BUYLIMIT</strong></td>
<td>2</td>
<td>指値注文</td>
<td>現在価格より<strong>下</strong>で買い予約</td>
</tr>
<tr>
<td><strong>OP_SELLLIMIT</strong></td>
<td>3</td>
<td>指値注文</td>
<td>現在価格より<strong>上</strong>で売り予約</td>
</tr>
<tr>
<td><strong>OP_BUYSTOP</strong></td>
<td>4</td>
<td>逆指値注文</td>
<td>現在価格より<strong>上</strong>で買い予約</td>
</tr>
<tr>
<td><strong>OP_SELLSTOP</strong></td>
<td>5</td>
<td>逆指値注文</td>
<td>現在価格より<strong>下</strong>で売り予約</td>
</tr>
</tbody>
</table>
<p>数値の0〜5を直接書いても動作しますが、<strong>定数名を使うことで可読性が格段に上がります</strong>。必ず定数名を使いましょう。</p>
<h2><span id="toc2">成行注文：OP_BUY と OP_SELL</span></h2>
<p>成行注文は「今すぐ約定させたい」ときに使う、最も基本的な注文タイプです。</p>
<h3><span id="toc3">OP_BUY（買い成行注文）</span></h3>
<p>買い注文は<strong>Ask（売値）</strong>で約定します。買うときはスプレッド分だけ高い価格で約定する点に注意してください。</p>
<pre><code class="language-mql4">// 買い成行注文の例
int ticket = OrderSend(
    Symbol(),       // 現在の通貨ペア
    OP_BUY,         // 買い注文
    0.1,            // 0.1ロット
    Ask,            // 買いはAsk価格を指定
    3,              // スリッページ許容（ポイント）
    0,              // ストップロス（0 = なし）
    0,              // テイクプロフィット（0 = なし）
    "Buy Order",    // コメント
    12345,          // マジックナンバー
    0,              // 有効期限（成行では無関係）
    clrBlue         // チャート上の矢印色
);

if(ticket < 0)
{
    Print("買い注文エラー: ", GetLastError());
}
else
{
    Print("買い注文成功！ チケット番号: ", ticket);
}</code></pre>
<h3><span id="toc4">OP_SELL（売り成行注文）</span></h3>
<p>売り注文は<strong>Bid（買値）</strong>で約定します。OP_BUYとの違いは、指定する価格がBidになる点です。</p>
<pre><code class="language-mql4">// 売り成行注文の例
int ticket = OrderSend(
    Symbol(),       // 現在の通貨ペア
    OP_SELL,        // 売り注文
    0.1,            // 0.1ロット
    Bid,            // 売りはBid価格を指定
    3,              // スリッページ許容
    0,              // ストップロス
    0,              // テイクプロフィット
    "Sell Order",   // コメント
    12345,          // マジックナンバー
    0,              // 有効期限
    clrRed          // チャート上の矢印色
);

if(ticket < 0)
{
    Print("売り注文エラー: ", GetLastError());
}</code></pre>
<p><strong>重要ポイント：</strong>買いは<strong>Ask</strong>、売りは<strong>Bid</strong>。これを逆にすると<code>ERR_INVALID_PRICE（エラーコード129）</code>が発生します。初心者がつまずきやすいポイントなので、しっかり覚えておきましょう。</p>
<h2><span id="toc5">指値注文：OP_BUYLIMIT と OP_SELLLIMIT</span></h2>
<p>指値注文は「今より有利な価格になったら約定させたい」ときに使います。<strong>逆張りエントリー</strong>に向いている注文タイプです。</p>
<h3><span id="toc6">OP_BUYLIMIT（買い指値注文）</span></h3>
<p>現在のAsk価格より<strong>下</strong>の価格を指定して、「そこまで下がったら買いたい」という注文です。押し目買いのイメージです。</p>
<pre><code class="language-mql4">// 買い指値注文：現在価格より50pips下で買い予約
double entryPrice = Ask - 50 * Point * 10;  // 50pips下（5桁ブローカーの場合）

int ticket = OrderSend(
    Symbol(),
    OP_BUYLIMIT,     // 買い指値注文
    0.1,
    entryPrice,       // 現在のAskより下の価格
    3,
    entryPrice - 30 * Point * 10,  // SL：エントリーから30pips下
    entryPrice + 60 * Point * 10,  // TP：エントリーから60pips上
    "BuyLimit Order",
    12345,
    0,                // 有効期限（0 = 無期限）
    clrBlue
);

if(ticket < 0)
    Print("買い指値注文エラー: ", GetLastError());</code></pre>
<h3><span id="toc7">OP_SELLLIMIT（売り指値注文）</span></h3>
<p>現在のBid価格より<strong>上</strong>の価格を指定して、「そこまで上がったら売りたい」という注文です。戻り売りのイメージです。</p>
<pre><code class="language-mql4">// 売り指値注文：現在価格より50pips上で売り予約
double entryPrice = Bid + 50 * Point * 10;

int ticket = OrderSend(
    Symbol(),
    OP_SELLLIMIT,     // 売り指値注文
    0.1,
    entryPrice,        // 現在のBidより上の価格
    3,
    entryPrice + 30 * Point * 10,  // SL：エントリーから30pips上
    entryPrice - 60 * Point * 10,  // TP：エントリーから60pips下
    "SellLimit Order",
    12345,
    0,
    clrRed
);

if(ticket < 0)
    Print("売り指値注文エラー: ", GetLastError());</code></pre>
<h2><span id="toc8">逆指値注文：OP_BUYSTOP と OP_SELLSTOP</span></h2>
<p>逆指値注文は「今より不利な価格になったら約定させたい」ときに使います。一見すると不利に思えますが、<strong>ブレイクアウト狙いの順張り</strong>には非常に有効です。</p>
<h3><span id="toc9">OP_BUYSTOP（買い逆指値注文）</span></h3>
<p>現在のAsk価格より<strong>上</strong>の価格を指定します。「レジスタンスを上抜けたら買いたい」というブレイクアウト戦略で使います。</p>
<pre><code class="language-mql4">// 買い逆指値注文：現在価格より50pips上で買い予約（上抜けブレイク狙い）
double entryPrice = Ask + 50 * Point * 10;

int ticket = OrderSend(
    Symbol(),
    OP_BUYSTOP,       // 買い逆指値注文
    0.1,
    entryPrice,        // 現在のAskより上の価格
    3,
    entryPrice - 30 * Point * 10,  // SL
    entryPrice + 60 * Point * 10,  // TP
    "BuyStop Order",
    12345,
    0,
    clrBlue
);

if(ticket < 0)
    Print("買い逆指値注文エラー: ", GetLastError());</code></pre>
<h3><span id="toc10">OP_SELLSTOP（売り逆指値注文）</span></h3>
<p>現在のBid価格より<strong>下</strong>の価格を指定します。「サポートを下抜けたら売りたい」というブレイクアウト戦略で使います。</p>
<pre><code class="language-mql4">// 売り逆指値注文：現在価格より50pips下で売り予約（下抜けブレイク狙い）
double entryPrice = Bid - 50 * Point * 10;

int ticket = OrderSend(
    Symbol(),
    OP_SELLSTOP,      // 売り逆指値注文
    0.1,
    entryPrice,        // 現在のBidより下の価格
    3,
    entryPrice + 30 * Point * 10,  // SL
    entryPrice - 60 * Point * 10,  // TP
    "SellStop Order",
    12345,
    0,
    clrRed
);

if(ticket < 0)
    Print("売り逆指値注文エラー: ", GetLastError());</code></pre>
<h2><span id="toc11">注文タイプの分類整理</span></h2>
<p>6つの注文タイプを改めて分類すると、大きく<strong>2つのグループ</strong>に分けられます。</p>
<h3><span id="toc12">成行注文（即時約定）</span></h3>
<ul>
<li><strong>OP_BUY（0）</strong>：今すぐ買う</li>
<li><strong>OP_SELL（1）</strong>：今すぐ売る</li>
</ul>
<h3><span id="toc13">待機注文（予約注文）</span></h3>
<ul>
<li><strong>OP_BUYLIMIT（2）</strong>：今より下で買い予約（逆張り）</li>
<li><strong>OP_SELLLIMIT（3）</strong>：今より上で売り予約（逆張り）</li>
<li><strong>OP_BUYSTOP（4）</strong>：今より上で買い予約（順張り）</li>
<li><strong>OP_SELLSTOP（5）</strong>：今より下で売り予約（順張り）</li>
</ul>
<p>EAのプログラムでは、成行注文だけで十分なケースも多いですが、ブレイクアウトEAや押し目買いEAを作るなら待機注文の理解は必須です。</p>
<h2><span id="toc14">OrderType()で注文タイプを判定する</span></h2>
<p>注文タイプ定数は、注文を出すときだけでなく<strong>ポジション管理</strong>でも重要です。<code>OrderType()</code>関数を使えば、選択中の注文がどのタイプかを判定できます。</p>
<pre><code class="language-mql4">// 自分のEAが持つ買いポジションだけを決済する例
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
    if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        continue;

    // マジックナンバーと通貨ペアで自分の注文か判定
    if(OrderMagicNumber() != 12345)
        continue;
    if(OrderSymbol() != Symbol())
        continue;

    // 注文タイプで分岐
    if(OrderType() == OP_BUY)
    {
        // 買いポジションを決済
        bool result = OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrBlue);
        if(!result)
            Print("決済エラー: ", GetLastError());
    }
    else if(OrderType() == OP_SELL)
    {
        // 売りポジションを決済
        bool result = OrderClose(OrderTicket(), OrderLots(), Ask, 3, clrRed);
        if(!result)
            Print("決済エラー: ", GetLastError());
    }
}</code></pre>
<p>ここでも<strong>買いの決済はBid、売りの決済はAsk</strong>を使う点に注意してください。注文時と決済時で使う価格が逆になります。</p>
<h2><span id="toc15">よくある間違いと注意点</span></h2>
<h3><span id="toc16">1. 価格の指定ミス（AskとBidの混同）</span></h3>
<p>最も多いエラーが<code>ERR_INVALID_PRICE（129）</code>です。以下のルールを覚えましょう。</p>
<table border="1" cellpadding="8" cellspacing="0" style="border-collapse: collapse; width: 100%;">
<thead>
<tr style="background-color: #f0f0f0;">
<th>操作</th>
<th>使う価格</th>
</tr>
</thead>
<tbody>
<tr>
<td>買い注文を出す / 売りポジションを決済する</td>
<td><strong>Ask</strong></td>
</tr>
<tr>
<td>売り注文を出す / 買いポジションを決済する</td>
<td><strong>Bid</strong></td>
</tr>
</tbody>
</table>
<h3><span id="toc17">2. ストップレベルの違反</span></h3>
<p>待機注文の価格が現在価格に近すぎると<code>ERR_INVALID_STOPS（130）</code>が発生します。ブローカーごとに「最低限離さなければならない値幅（ストップレベル）」が設定されています。</p>
<pre><code class="language-mql4">// ストップレベルを取得して安全な価格を計算する
int stopLevel = (int)MarketInfo(Symbol(), MODE_STOPLEVEL);
double minDistance = stopLevel * Point;

// 例：OP_BUYLIMITの場合、Ask - minDistance より下の価格を指定する
double safePrice = Ask - minDistance - 10 * Point;  // 余裕を持たせる</code></pre>
<h3><span id="toc18">3. 待機注文の削除はOrderDelete()を使う</span></h3>
<p>初心者がよく間違えるのが、待機注文の削除に<code>OrderClose()</code>を使ってしまうケースです。</p>
<ul>
<li><strong>OrderClose()</strong>：成行注文（OP_BUY / OP_SELL）の決済に使う</li>
<li><strong>OrderDelete()</strong>：待機注文（LIMIT / STOP系）のキャンセルに使う</li>
</ul>
<pre><code class="language-mql4">// 待機注文を削除する正しい方法
if(OrderType() == OP_BUYLIMIT || OrderType() == OP_SELLLIMIT ||
   OrderType() == OP_BUYSTOP  || OrderType() == OP_SELLSTOP)
{
    bool result = OrderDelete(OrderTicket());
    if(!result)
        Print("待機注文の削除エラー: ", GetLastError());
}</code></pre>
<p>待機注文に対して<code>OrderClose()</code>を使うと<code>ERR_INVALID_FUNCTION_PARAMVALUE（4051）</code>などのエラーになるので注意しましょう。</p>
<h2><span id="toc19">まとめ</span></h2>
<p>MQL4の注文タイプ定数は全部で<strong>6種類</strong>あり、大きく3つのカテゴリに分類できます。</p>
<ul>
<li><strong>成行注文</strong>：OP_BUY（0）/ OP_SELL（1）→ 今すぐ約定</li>
<li><strong>指値注文</strong>：OP_BUYLIMIT（2）/ OP_SELLLIMIT（3）→ 有利な価格で予約（逆張り向き）</li>
<li><strong>逆指値注文</strong>：OP_BUYSTOP（4）/ OP_SELLSTOP（5）→ 不利な方向で予約（ブレイクアウト向き）</li>
</ul>
<p>覚えるべきポイントは以下の3つです。</p>
<ul>
<li><strong>買いはAsk、売りはBid</strong>を必ず守る</li>
<li>待機注文はストップレベルを考慮した価格を設定する</li>
<li>成行注文の決済は<strong>OrderClose()</strong>、待機注文のキャンセルは<strong>OrderDelete()</strong>を使う</li>
</ul>
<p>まずはOP_BUYとOP_SELLの成行注文から始めて、慣れてきたら指値・逆指値注文にも挑戦してみてください。注文タイプを使い分けられれば、EAの戦略の幅が大きく広がります。</p>
<p>投稿 <a href="https://mql-programing.com/archives/13077/%e3%80%90mql4%e3%80%91%e6%b3%a8%e6%96%87%e3%82%bf%e3%82%a4%e3%83%97%e5%ae%9a%e6%95%b0%e3%82%92%e5%ae%8c%e5%85%a8%e8%a7%a3%e8%aa%ac%ef%bc%81op_buy%e3%83%bbop_sell%e3%83%bb%e6%8c%87%e5%80%a4-%e9%80%86/">【MQL4】注文タイプ定数を完全解説！OP_BUY・OP_SELL・指値/逆指値の全6種類を一覧で理解しよう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4】ENUM_APPLIED_PRICE（価格定数）完全ガイド｜PRICE_CLOSEからPRICE_WEIGHTEDまで7種類を徹底解説</title>
		<link>https://mql-programing.com/archives/13074/%e3%80%90mql4%e3%80%91enum_applied_price%ef%bc%88%e4%be%a1%e6%a0%bc%e5%ae%9a%e6%95%b0%ef%bc%89%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bd%9cprice_close%e3%81%8b%e3%82%89price_weighted%e3%81%be/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Sun, 26 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【辞書】MQLリファレンス]]></category>
		<category><![CDATA[定数]]></category>
		<category><![CDATA[価格定数]]></category>
		<category><![CDATA[iMA関数]]></category>
		<category><![CDATA[ENUM_APPLIED_PRICE]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[EA開発]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13074</guid>

					<description><![CDATA[<p>MQL4でインジケーター関数を使うとき、「どの価格を基準に計算するか」を指定する場面が頻繁にあります。たとえば移動平均線を計算するとき、終値を使うのか、高値と安値の平均を使うのかで結果が変わりますよね。 この「どの価格を [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13074/%e3%80%90mql4%e3%80%91enum_applied_price%ef%bc%88%e4%be%a1%e6%a0%bc%e5%ae%9a%e6%95%b0%ef%bc%89%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bd%9cprice_close%e3%81%8b%e3%82%89price_weighted%e3%81%be/">【MQL4】ENUM_APPLIED_PRICE（価格定数）完全ガイド｜PRICE_CLOSEからPRICE_WEIGHTEDまで7種類を徹底解説</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>MQL4でインジケーター関数を使うとき、「どの価格を基準に計算するか」を指定する場面が頻繁にあります。たとえば移動平均線を計算するとき、終値を使うのか、高値と安値の平均を使うのかで結果が変わりますよね。</p>
<p>この「どの価格を使うか」を指定するために用意されているのが、<strong>ENUM_APPLIED_PRICE</strong>（適用価格の列挙型）です。全部で7種類の定数があり、iMA()やiRSI()などの組み込み関数で頻繁に使われます。</p>
<p>この記事では、7つの価格定数それぞれの意味と計算式、そして実際のコードでの使い方をわかりやすく解説します。</p>
<h2><span id="toc1">ENUM_APPLIED_PRICEとは？</span></h2>
<p>ENUM_APPLIED_PRICEは、MQL4で定義されている<strong>列挙型（enum）</strong>のひとつです。テクニカル指標の計算に使う「価格の種類」を指定するために使います。</p>
<p>たとえば、移動平均線を計算する<code>iMA()</code>関数のシグネチャを見てみましょう。</p>
<pre><code class="language-mql4">double iMA(
   string       symbol,           // 通貨ペア
   int          timeframe,        // 時間足
   int          ma_period,        // 期間
   int          ma_shift,         // シフト
   int          ma_method,        // 移動平均の種類
   int          applied_price,    // 適用価格 ← ここ！
   int          shift             // バーのインデックス
);
</code></pre>
<p>この<strong>applied_price</strong>の部分に、ENUM_APPLIED_PRICEの定数を指定します。どの定数を選ぶかによって、計算結果が変わってくるわけです。</p>
<h2><span id="toc2">7つの価格定数一覧</span></h2>
<p>ENUM_APPLIED_PRICEには、以下の7つの定数が定義されています。</p>
<table border="1" cellpadding="8" cellspacing="0" style="border-collapse: collapse; width: 100%;">
<thead>
<tr style="background-color: #f0f0f0;">
<th>定数名</th>
<th>値</th>
<th>説明</th>
<th>計算式</th>
</tr>
</thead>
<tbody>
<tr>
<td>PRICE_CLOSE</td>
<td>0</td>
<td>終値</td>
<td>Close</td>
</tr>
<tr>
<td>PRICE_OPEN</td>
<td>1</td>
<td>始値</td>
<td>Open</td>
</tr>
<tr>
<td>PRICE_HIGH</td>
<td>2</td>
<td>高値</td>
<td>High</td>
</tr>
<tr>
<td>PRICE_LOW</td>
<td>3</td>
<td>安値</td>
<td>Low</td>
</tr>
<tr>
<td>PRICE_MEDIAN</td>
<td>4</td>
<td>中間値</td>
<td>(High + Low) / 2</td>
</tr>
<tr>
<td>PRICE_TYPICAL</td>
<td>5</td>
<td>典型値</td>
<td>(High + Low + Close) / 3</td>
</tr>
<tr>
<td>PRICE_WEIGHTED</td>
<td>6</td>
<td>加重終値</td>
<td>(High + Low + Close + Close) / 4</td>
</tr>
</tbody>
</table>
<h3><span id="toc3">PRICE_CLOSE（終値）— 値: 0</span></h3>
<p>もっとも一般的に使われる適用価格です。各ローソク足の<strong>終値（Close）</strong>を使って計算します。特にこだわりがなければ、まずはこれを選んでおけば問題ありません。多くのトレーダーやテクニカル分析の教科書でも、終値ベースの計算がデフォルトとされています。</p>
<h3><span id="toc4">PRICE_OPEN（始値）— 値: 1</span></h3>
<p>各ローソク足の<strong>始値（Open）</strong>を使って計算します。始値はバーの開始時点の価格なので、「そのバーが始まった瞬間にわかる値」という特徴があります。バックテストやリアルタイム処理で、確定済みの値だけを使いたい場合に選ばれることがあります。</p>
<h3><span id="toc5">PRICE_HIGH（高値）— 値: 2</span></h3>
<p>各ローソク足の<strong>高値（High）</strong>を使って計算します。高値ベースの移動平均線は、レジスタンスライン（上値抵抗線）のような役割として活用できます。</p>
<h3><span id="toc6">PRICE_LOW（安値）— 値: 3</span></h3>
<p>各ローソク足の<strong>安値（Low）</strong>を使って計算します。安値ベースの移動平均線は、サポートライン（下値支持線）のような役割として活用できます。PRICE_HIGHと組み合わせて移動平均チャネルを作る使い方が人気です。</p>
<h3><span id="toc7">PRICE_MEDIAN（中間値）— 値: 4</span></h3>
<p>計算式は <strong>(High + Low) / 2</strong> です。ローソク足の高値と安値のちょうど中間の価格、つまりそのバーの「値幅の中心」を使います。終値の偏りを排除し、そのバーの価格帯の中心で計算したいときに使います。</p>
<h3><span id="toc8">PRICE_TYPICAL（典型値）— 値: 5</span></h3>
<p>計算式は <strong>(High + Low + Close) / 3</strong> です。Median Price（中間値）に終値を加えて3で割った値で、中間値よりも<strong>実際の値動きの結果（終値）を反映</strong>した価格になります。CCI（商品チャネル指数）などのインジケーターでは、このTypical Priceが標準的に使われています。</p>
<h3><span id="toc9">PRICE_WEIGHTED（加重終値）— 値: 6</span></h3>
<p>計算式は <strong>(High + Low + Close + Close) / 4</strong> です。Typical Price（典型値）の計算式で終値を2回カウントすることで、<strong>終値により大きな比重</strong>を置いた価格です。「値幅全体も考慮したいけど、やっぱり終値を重視したい」という場合に適しています。</p>
<p>この3つの関係性を整理すると、次のようになります。</p>
<ul>
<li><strong>Median Price</strong>（HL/2）：ローソク足の値幅の中間値</li>
<li><strong>Typical Price</strong>（HLC/3）：中間値に終値を加え、より実際の値動きに近づけた値</li>
<li><strong>Weighted Close</strong>（HLCC/4）：さらに終値の比重を高め、終値に近づけた値</li>
</ul>
<h2><span id="toc10">実際のコードでの使い方</span></h2>
<h3><span id="toc11">iMA関数での基本的な使用例</span></h3>
<p>もっとも基本的な使い方です。20期間の単純移動平均線を終値ベースで計算します。</p>
<pre><code class="language-mql4">void OnTick()
{
   // 20期間SMAを終値(PRICE_CLOSE)で計算
   double ma_close = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);

   // 20期間SMAを典型値(PRICE_TYPICAL)で計算
   double ma_typical = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_TYPICAL, 0);

   Print("終値ベースSMA: ", ma_close);
   Print("典型値ベースSMA: ", ma_typical);
}
</code></pre>
<p>同じ期間・同じ移動平均の種類でも、適用価格を変えるだけで計算結果が変わることがわかります。</p>
<h3><span id="toc12">iRSI関数での使用例</span></h3>
<p>RSI（相対力指数）でも適用価格を指定できます。</p>
<pre><code class="language-mql4">void OnTick()
{
   // 14期間RSIを終値で計算
   double rsi = iRSI(NULL, 0, 14, PRICE_CLOSE, 0);

   if(rsi > 70)
   {
      Print("RSIが70を超えました（買われすぎ）: ", rsi);
   }
   else if(rsi < 30)
   {
      Print("RSIが30を下回りました（売られすぎ）: ", rsi);
   }
}
</code></pre>
<h3><span id="toc13">HIGH/LOWを使った移動平均チャネルの作成例</span></h3>
<p>PRICE_HIGHとPRICE_LOWを組み合わせると、価格を挟み込むようなチャネル（帯）を作ることができます。</p>
<pre><code class="language-mql4">void OnTick()
{
   int period = 20;

   // 高値ベースの移動平均（上側バンド）
   double upper = iMA(NULL, 0, period, 0, MODE_SMA, PRICE_HIGH, 0);

   // 安値ベースの移動平均（下側バンド）
   double lower = iMA(NULL, 0, period, 0, MODE_SMA, PRICE_LOW, 0);

   // 終値ベースの移動平均（中央線）
   double middle = iMA(NULL, 0, period, 0, MODE_SMA, PRICE_CLOSE, 0);

   Print("上側: ", upper, " 中央: ", middle, " 下側: ", lower);

   // 現在価格が上側バンドを超えたら
   if(Ask > upper)
   {
      Print("価格が移動平均チャネルの上側を突破！");
   }
   // 現在価格が下側バンドを下回ったら
   if(Bid < lower)
   {
      Print("価格が移動平均チャネルの下側を突破！");
   }
}
</code></pre>
<p>このように、適用価格を変えるだけで同じiMA関数から異なる性質のラインを引くことができます。</p>
<h2><span id="toc14">input変数でユーザーに選ばせる方法</span></h2>
<p>EAやカスタムインジケーターを作るとき、適用価格をユーザーがパラメーター画面から選べるようにしたいですよね。MQL4では、<strong>ENUM_APPLIED_PRICEをinput変数の型として使う</strong>ことで、自動的にドロップダウンリストが表示されます。</p>
<pre><code class="language-mql4">// パラメーター設定
input int                 MAPeriod     = 20;            // 移動平均の期間
input ENUM_MA_METHOD      MAMethod     = MODE_SMA;      // 移動平均の種類
input ENUM_APPLIED_PRICE  MAPrice      = PRICE_CLOSE;   // 適用価格

void OnTick()
{
   double ma = iMA(NULL, 0, MAPeriod, 0, MAMethod, MAPrice, 0);
   Print("MA値: ", ma);
}
</code></pre>
<p>このように書くだけで、MetaTraderのパラメーター入力画面に「適用価格」のドロップダウンリストが自動生成されます。ユーザーは「Close price」「Open price」「Median Price (HL/2)」…といった選択肢から直感的に選ぶことができます。</p>
<p>int型で宣言してユーザーに数値を手入力させるよりも、<strong>はるかに使いやすく、入力ミスも防げる</strong>優れた方法です。EAやインジケーターを配布する場合は、ぜひこの書き方を使いましょう。</p>
<h2><span id="toc15">定数の整数値を直接使う場合の注意</span></h2>
<p>ENUM_APPLIED_PRICEの各定数には整数値（0〜6）が割り当てられているため、数値を直接指定しても動作します。</p>
<pre><code class="language-mql4">// 定数名を使う場合（推奨）
double ma1 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);

// 整数値を直接使う場合（非推奨）
double ma2 = iMA(NULL, 0, 20, 0, MODE_SMA, 0, 0);
</code></pre>
<p>上の2行はどちらも同じ結果になりますが、<strong>整数値を直接書く方法はおすすめしません</strong>。理由は以下の通りです。</p>
<ul>
<li><strong>可読性が低い</strong>：「0」だけでは何の価格かすぐにわからない</li>
<li><strong>保守性が悪い</strong>：後から見たとき、あるいは他の人が見たときに意味が伝わらない</li>
<li><strong>タイプミスに気づきにくい</strong>：定数名なら打ち間違えればコンパイルエラーになるが、数値だと範囲外の値でも気づきにくい</li>
</ul>
<p>常に<strong>PRICE_CLOSE</strong>や<strong>PRICE_TYPICAL</strong>のような定数名を使うようにしましょう。</p>
<h2><span id="toc16">どの適用価格を選ぶべきか？</span></h2>
<p>7種類もあると「結局どれを使えばいいの？」と迷いますよね。以下に用途別の目安をまとめます。</p>
<table border="1" cellpadding="8" cellspacing="0" style="border-collapse: collapse; width: 100%;">
<thead>
<tr style="background-color: #f0f0f0;">
<th>用途・場面</th>
<th>おすすめの適用価格</th>
</tr>
</thead>
<tbody>
<tr>
<td>一般的なトレンド分析</td>
<td>PRICE_CLOSE（最も標準的）</td>
</tr>
<tr>
<td>ノイズを減らしたい</td>
<td>PRICE_TYPICAL または PRICE_MEDIAN</td>
</tr>
<tr>
<td>終値重視だがノイズも減らしたい</td>
<td>PRICE_WEIGHTED</td>
</tr>
<tr>
<td>レジスタンスライン的に使いたい</td>
<td>PRICE_HIGH</td>
</tr>
<tr>
<td>サポートライン的に使いたい</td>
<td>PRICE_LOW</td>
</tr>
<tr>
<td>CCIなど特定のインジケーター</td>
<td>PRICE_TYPICAL（標準仕様に従う）</td>
</tr>
</tbody>
</table>
<p>迷ったときは<strong>PRICE_CLOSE</strong>を選んでおけば、まず間違いありません。そこから最適化やバックテストを行って、他の価格定数を試してみるのがよいでしょう。</p>
<h2><span id="toc17">まとめ</span></h2>
<p>ENUM_APPLIED_PRICEは、テクニカル指標の計算に「どの価格を使うか」を指定するための列挙型です。今回のポイントを振り返りましょう。</p>
<ul>
<li><strong>7種類の定数</strong>がある：PRICE_CLOSE（終値）、PRICE_OPEN（始値）、PRICE_HIGH（高値）、PRICE_LOW（安値）、PRICE_MEDIAN（中間値）、PRICE_TYPICAL（典型値）、PRICE_WEIGHTED（加重終値）</li>
<li><strong>iMA()やiRSI()</strong>などの組み込み関数で、applied_priceパラメーターに指定して使う</li>
<li><strong>input変数の型</strong>にENUM_APPLIED_PRICEを使えば、ドロップダウンリストで選択できるようになる</li>
<li>整数値の直接指定は動作するが、<strong>可読性の観点から定数名を使うべき</strong></li>
<li>迷ったら<strong>PRICE_CLOSE</strong>が最も無難で一般的</li>
</ul>
<p>適用価格の選択はインジケーターの計算結果に直接影響するため、それぞれの意味を理解しておくことが大切です。この記事を参考に、自分のEAやインジケーターに最適な適用価格を選んでみてください。</p>
<p>投稿 <a href="https://mql-programing.com/archives/13074/%e3%80%90mql4%e3%80%91enum_applied_price%ef%bc%88%e4%be%a1%e6%a0%bc%e5%ae%9a%e6%95%b0%ef%bc%89%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bd%9cprice_close%e3%81%8b%e3%82%89price_weighted%e3%81%be/">【MQL4】ENUM_APPLIED_PRICE（価格定数）完全ガイド｜PRICE_CLOSEからPRICE_WEIGHTEDまで7種類を徹底解説</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4】時間足定数（ENUM_TIMEFRAMES）完全ガイド｜PERIOD_M1〜PERIOD_MN1の一覧と実践的な使い方</title>
		<link>https://mql-programing.com/archives/13071/%e3%80%90mql4%e3%80%91%e6%99%82%e9%96%93%e8%b6%b3%e5%ae%9a%e6%95%b0%ef%bc%88enum_timeframes%ef%bc%89%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bd%9cperiod_m1%e3%80%9cperiod_mn1%e3%81%ae%e4%b8%80/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Sat, 25 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【辞書】MQLリファレンス]]></category>
		<category><![CDATA[定数]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[EA開発]]></category>
		<category><![CDATA[時間足]]></category>
		<category><![CDATA[マルチタイムフレーム]]></category>
		<category><![CDATA[ENUM_TIMEFRAMES]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13071</guid>

					<description><![CDATA[<p>MQL4でEAやインジケーターを作っていると、「1時間足の移動平均線を取得したい」「日足のローソク足データを参照したい」といった場面が頻繁に出てきます。そんなときに使うのが時間足定数（ENUM_TIMEFRAMES）です [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13071/%e3%80%90mql4%e3%80%91%e6%99%82%e9%96%93%e8%b6%b3%e5%ae%9a%e6%95%b0%ef%bc%88enum_timeframes%ef%bc%89%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bd%9cperiod_m1%e3%80%9cperiod_mn1%e3%81%ae%e4%b8%80/">【MQL4】時間足定数（ENUM_TIMEFRAMES）完全ガイド｜PERIOD_M1〜PERIOD_MN1の一覧と実践的な使い方</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>MQL4でEAやインジケーターを作っていると、「1時間足の移動平均線を取得したい」「日足のローソク足データを参照したい」といった場面が頻繁に出てきます。そんなときに使うのが<strong>時間足定数（ENUM_TIMEFRAMES）</strong>です。</p>
<p>この記事では、MQL4で使える時間足定数をすべて一覧で紹介し、基本的な使い方からマルチタイムフレーム分析への応用まで、実践的なコード例とともに解説します。</p>
<h2><span id="toc1">ENUM_TIMEFRAMESとは？</span></h2>
<p>ENUM_TIMEFRAMESは、MetaTraderのチャート時間足を表す<strong>列挙型（enum）</strong>です。列挙型とは、あらかじめ決められた名前付きの定数をグループ化したもので、「どの時間足か」をプログラム上でわかりやすく指定するために使います。</p>
<p>例えば、1時間足を指定するときに数値の <code>60</code> と書くよりも、<code>PERIOD_H1</code> と書いたほうが圧倒的に読みやすいですよね。これが時間足定数を使う最大のメリットです。</p>
<h2><span id="toc2">時間足定数の一覧（MQL4）</span></h2>
<p>MQL4で使用できる時間足定数は、特殊な <code>PERIOD_CURRENT</code> を含めて全部で<strong>10個</strong>です。以下の表にまとめました。</p>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse: collapse; width: 100%; text-align: center;">
<thead>
<tr style="background-color: #f0f0f0;">
<th>定数名</th>
<th>整数値</th>
<th>意味</th>
<th>1本あたりの秒数</th>
</tr>
</thead>
<tbody>
<tr>
<td>PERIOD_CURRENT</td>
<td>0</td>
<td>現在のチャートの時間足</td>
<td>（チャートに依存）</td>
</tr>
<tr>
<td>PERIOD_M1</td>
<td>1</td>
<td>1分足</td>
<td>60秒</td>
</tr>
<tr>
<td>PERIOD_M5</td>
<td>5</td>
<td>5分足</td>
<td>300秒</td>
</tr>
<tr>
<td>PERIOD_M15</td>
<td>15</td>
<td>15分足</td>
<td>900秒</td>
</tr>
<tr>
<td>PERIOD_M30</td>
<td>30</td>
<td>30分足</td>
<td>1,800秒</td>
</tr>
<tr>
<td>PERIOD_H1</td>
<td>60</td>
<td>1時間足</td>
<td>3,600秒</td>
</tr>
<tr>
<td>PERIOD_H4</td>
<td>240</td>
<td>4時間足</td>
<td>14,400秒</td>
</tr>
<tr>
<td>PERIOD_D1</td>
<td>1440</td>
<td>日足</td>
<td>86,400秒</td>
</tr>
<tr>
<td>PERIOD_W1</td>
<td>10080</td>
<td>週足</td>
<td>604,800秒</td>
</tr>
<tr>
<td>PERIOD_MN1</td>
<td>43200</td>
<td>月足</td>
<td>約2,592,000秒</td>
</tr>
</tbody>
</table>
<p>MQL4の整数値は<strong>「分」を基準</strong>にしています。例えば PERIOD_H1 は60分なので整数値が60、PERIOD_D1 は1440分（24時間×60分）なので1440です。この規則を覚えておくと、値の意味がすぐに理解できます。</p>
<h2><span id="toc3">MQL5との違いに注意</span></h2>
<p>MQL4からMQL5へコードを移植する際に、最もハマりやすいポイントの一つがこの時間足定数の整数値の違いです。</p>
<p>MQL5ではビットシフトを用いた全く異なる整数値が割り当てられています。</p>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse: collapse; width: 100%; text-align: center;">
<thead>
<tr style="background-color: #f0f0f0;">
<th>定数名</th>
<th>MQL4の整数値</th>
<th>MQL5の整数値</th>
</tr>
</thead>
<tbody>
<tr>
<td>PERIOD_M1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>PERIOD_M5</td>
<td>5</td>
<td>5</td>
</tr>
<tr>
<td>PERIOD_H1</td>
<td>60</td>
<td>16385</td>
</tr>
<tr>
<td>PERIOD_D1</td>
<td>1440</td>
<td>16408</td>
</tr>
<tr>
<td>PERIOD_W1</td>
<td>10080</td>
<td>32769</td>
</tr>
<tr>
<td>PERIOD_MN1</td>
<td>43200</td>
<td>49153</td>
</tr>
</tbody>
</table>
<p>分足（M1〜M30）まではMQL4とMQL5で同じ値ですが、<strong>H1以上は完全に異なります</strong>。定数名（PERIOD_H1など）を使っていれば問題ありませんが、整数値をハードコードしていると移植時にバグの原因になります。常に定数名を使う習慣をつけましょう。</p>
<h2><span id="toc4">基本的な使い方</span></h2>
<h3><span id="toc5">iMA()で別の時間足の移動平均線を取得する</span></h3>
<p>最もよく使うパターンが、<code>iMA()</code> などのテクニカル指標関数に時間足を指定するケースです。</p>
<pre><code class="language-mql4">// 現在の通貨ペアの1時間足で、20期間の単純移動平均線を取得
double ma_h1 = iMA(NULL, PERIOD_H1, 20, 0, MODE_SMA, PRICE_CLOSE, 0);

// 日足の20期間移動平均線を取得
double ma_d1 = iMA(NULL, PERIOD_D1, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
</code></pre>
<p>第1引数の <code>NULL</code> は現在の通貨ペアを意味し、第2引数に時間足定数を指定します。</p>
<h3><span id="toc6">iClose()で別の時間足の終値を取得する</span></h3>
<pre><code class="language-mql4">// 日足の1本前（昨日）の終値を取得
double yesterday_close = iClose(NULL, PERIOD_D1, 1);

// 4時間足の現在のバーの始値を取得
double h4_open = iOpen(NULL, PERIOD_H4, 0);
</code></pre>
<h3><span id="toc7">Period()で現在の時間足を取得する</span></h3>
<pre><code class="language-mql4">// 現在のチャートの時間足を取得
int current_tf = Period();

// 現在の時間足が1時間足かどうか判定
if(Period() == PERIOD_H1)
{
    Print("現在のチャートは1時間足です");
}
</code></pre>
<p><code>Period()</code> 関数は現在のチャートの時間足を整数値で返します。PERIOD_CURRENTを指定したときと同じ時間足のデータが取得されます。</p>
<h2><span id="toc8">実践テクニック</span></h2>
<h3><span id="toc9">inputパラメーターでドロップダウン選択にする</span></h3>
<p>EAのパラメーターに <code>ENUM_TIMEFRAMES</code> 型を使うと、MetaTraderのパラメーター設定画面で<strong>ドロップダウンリストから時間足を選択</strong>できるようになります。これは非常に便利なテクニックです。</p>
<pre><code class="language-mql4">input ENUM_TIMEFRAMES InpTimeframe = PERIOD_H1; // 分析する時間足
input int             InpMAPeriod  = 20;         // 移動平均線の期間

void OnTick()
{
    double ma = iMA(NULL, InpTimeframe, InpMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
    // ユーザーが選択した時間足のMAを使って売買判断
}
</code></pre>
<p>ユーザーが数値を手入力する必要がなく、選択ミスも防げるので、EA配布時にも親切な設計になります。</p>
<h3><span id="toc10">PeriodSeconds()で時間足を秒数に変換する</span></h3>
<pre><code class="language-mql4">// 現在の時間足の1本あたりの秒数を取得
int seconds = PeriodSeconds(PERIOD_H1);
Print("1時間足の1本 = ", seconds, "秒"); // 3600秒

// 引数を省略すると現在のチャートの時間足が使われる
int current_seconds = PeriodSeconds();
</code></pre>
<p>時間計算を行う場面（例：「次のバーが生成されるまで何秒か」など）で非常に役立ちます。</p>
<h3><span id="toc11">マルチタイムフレーム分析のEAサンプル</span></h3>
<p>実践的な例として、日足のトレンド方向を確認してからエントリーする簡易EAのロジックを紹介します。</p>
<pre><code class="language-mql4">input ENUM_TIMEFRAMES InpEntryTF  = PERIOD_H1;  // エントリー判断の時間足
input ENUM_TIMEFRAMES InpFilterTF = PERIOD_D1;  // トレンドフィルターの時間足
input int             InpMAPeriod = 20;          // MA期間

void OnTick()
{
    // 上位足（日足）のMAでトレンド方向を判定
    double ma_filter = iMA(NULL, InpFilterTF, InpMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
    double price_filter = iClose(NULL, InpFilterTF, 0);
    
    bool uptrend   = (price_filter > ma_filter);
    bool downtrend = (price_filter < ma_filter);
    
    // エントリー足のMAでエントリーシグナルを判定
    double ma_entry = iMA(NULL, InpEntryTF, InpMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
    double price_entry = iClose(NULL, InpEntryTF, 0);
    
    // 日足が上昇トレンド かつ 1時間足で価格がMAを上抜け → 買いシグナル
    if(uptrend &#038;&#038; price_entry > ma_entry)
    {
        // 買い注文のロジック
        Print("買いシグナル検出！");
    }
    
    // 日足が下降トレンド かつ 1時間足で価格がMAを下抜け → 売りシグナル
    if(downtrend && price_entry < ma_entry)
    {
        // 売り注文のロジック
        Print("売りシグナル検出！");
    }
}
</code></pre>
<p>このように、時間足定数を活用すれば<strong>マルチタイムフレーム分析</strong>のロジックを簡潔に書くことができます。</p>
<h2><span id="toc12">よくある注意点・トラブル</span></h2>
<h3><span id="toc13">整数値の直書きは避ける</span></h3>
<p>以下のように整数値を直接書くのは避けましょう。</p>
<pre><code class="language-mql4">// &#x274c; 悪い例：何を意味しているのかわかりにくい
double ma = iMA(NULL, 60, 20, 0, MODE_SMA, PRICE_CLOSE, 0);

// &#x2705; 良い例：PERIOD_H1と書けば一目で1時間足とわかる
double ma = iMA(NULL, PERIOD_H1, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
</code></pre>
<p>可読性が下がるだけでなく、MQL5へ移植する際にバグの原因になります。</p>
<h3><span id="toc14">ヒストリーデータ不足に注意</span></h3>
<p>別の時間足のデータを参照するとき、MetaTraderにその時間足の<strong>ヒストリーデータが十分にダウンロードされていない</strong>場合があります。特にバックテスト時に、上位足のデータが不足していると正しい結果が得られません。</p>
<p>必要な時間足のチャートを一度開いてデータを読み込ませるか、スクリプトで事前にデータの存在を確認する処理を入れておくと安心です。</p>
<h3><span id="toc15">PERIOD_CURRENTと0の違い</span></h3>
<p><code>PERIOD_CURRENT</code> の整数値は <code>0</code> です。関数に <code>0</code> を渡しても <code>PERIOD_CURRENT</code> を渡しても同じ動作になりますが、コードの意図を明確にするために <code>PERIOD_CURRENT</code> を使うことをおすすめします。</p>
<h2><span id="toc16">まとめ</span></h2>
<p>MQL4の時間足定数（ENUM_TIMEFRAMES）について、重要なポイントを整理します。</p>
<ul>
<li><strong>PERIOD_M1〜PERIOD_MN1</strong>の9つの時間足定数と、<strong>PERIOD_CURRENT</strong>（現在のチャートの時間足）が使える</li>
<li>MQL4の整数値は<strong>「分」が基準</strong>（H1=60, D1=1440など）</li>
<li>MQL5では<strong>H1以上の整数値が全く異なる</strong>ため、移植時は必ず定数名を使う</li>
<li><code>input ENUM_TIMEFRAMES</code> でパラメーター化すると、<strong>ドロップダウン選択</strong>が自動生成されて便利</li>
<li><code>PeriodSeconds()</code> で時間足を秒数に変換でき、時間計算に活用できる</li>
<li>マルチタイムフレーム分析では、上位足のデータ（ヒストリー）が十分にあるか確認が必要</li>
</ul>
<p>時間足定数はEA開発で日常的に使う基本中の基本です。まずは <code>iMA()</code> や <code>iClose()</code> に異なる時間足を指定するところから試してみてください。マルチタイムフレーム分析ができるようになると、EA戦略の幅が大きく広がりますよ！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13071/%e3%80%90mql4%e3%80%91%e6%99%82%e9%96%93%e8%b6%b3%e5%ae%9a%e6%95%b0%ef%bc%88enum_timeframes%ef%bc%89%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bd%9cperiod_m1%e3%80%9cperiod_mn1%e3%81%ae%e4%b8%80/">【MQL4】時間足定数（ENUM_TIMEFRAMES）完全ガイド｜PERIOD_M1〜PERIOD_MN1の一覧と実践的な使い方</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4】グローバル変数関数の使い方を徹底解説！GlobalVariableSet / Get / Check / Del</title>
		<link>https://mql-programing.com/archives/13068/%e3%80%90mql4%e3%80%91%e3%82%b0%e3%83%ad%e3%83%bc%e3%83%90%e3%83%ab%e5%a4%89%e6%95%b0%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%be%b9%e5%ba%95%e8%a7%a3%e8%aa%ac%ef%bc%81globalv/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Fri, 24 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【辞書】MQLリファレンス]]></category>
		<category><![CDATA[変数]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[EA開発]]></category>
		<category><![CDATA[グローバル変数]]></category>
		<category><![CDATA[GlobalVariableSet]]></category>
		<category><![CDATA[MetaTrader4]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13068</guid>

					<description><![CDATA[<p>MQL4でEA（自動売買プログラム）やインジケーターを開発していると、「MT4を再起動しても値を保持しておきたい」「複数のEA間でデータを共有したい」という場面に遭遇します。そんなときに活躍するのが、クライアントターミナ [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13068/%e3%80%90mql4%e3%80%91%e3%82%b0%e3%83%ad%e3%83%bc%e3%83%90%e3%83%ab%e5%a4%89%e6%95%b0%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%be%b9%e5%ba%95%e8%a7%a3%e8%aa%ac%ef%bc%81globalv/">【MQL4】グローバル変数関数の使い方を徹底解説！GlobalVariableSet / Get / Check / Del</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>MQL4でEA（自動売買プログラム）やインジケーターを開発していると、「MT4を再起動しても値を保持しておきたい」「複数のEA間でデータを共有したい」という場面に遭遇します。そんなときに活躍するのが、<strong>クライアントターミナルのグローバル変数</strong>（以下「ターミナルグローバル変数」）です。</p>
<p>この記事では、ターミナルグローバル変数を操作するための主要関数 ── <code>GlobalVariableSet</code>、<code>GlobalVariableGet</code>、<code>GlobalVariableCheck</code>、<code>GlobalVariableDel</code> を中心に、使い方と注意点をわかりやすく解説します。</p>
<h2><span id="toc1">ターミナルグローバル変数とは？── 2種類の「グローバル変数」に注意</span></h2>
<p>MQL4には「グローバル変数」と呼ばれるものが<strong>2種類</strong>あります。ここを混同すると大きな混乱のもとになるので、最初にしっかり区別しましょう。</p>
<h3><span id="toc2">① MQL4プログラム内のグローバル変数</span></h3>
<p>関数の外（<code>OnInit()</code>や<code>OnTick()</code>の外側）で宣言する変数のことです。プログラム全体からアクセスできますが、<strong>EAをチャートから外したりMT4を終了すると値は消えます</strong>。</p>
<pre><code class="language-mql5">// プログラム内グローバル変数の例
int g_tickCount = 0;  // プログラム内のどの関数からもアクセス可能

void OnTick()
{
    g_tickCount++;
    Print("ティック回数: ", g_tickCount);
}
</code></pre>
<h3><span id="toc3">② クライアントターミナルのグローバル変数（本記事の主役）</span></h3>
<p>MT4のメニュー「ツール → グローバル変数」（ショートカット：F3キー）で確認できる変数です。こちらは<strong>MT4を終了してもデータが保持</strong>されます。さらに、同じMT4上で動作している<strong>すべてのEA・インジケーターからアクセス可能</strong>なので、プログラム間のデータ共有にも使えます。</p>
<p>ターミナルグローバル変数の特徴をまとめると、次のとおりです。</p>
<ul>
<li><strong>データ型は double 型のみ</strong>（文字列や整数を直接格納することはできません）</li>
<li><strong>最後のアクセスから4週間</strong>保持され、その後は自動的に削除される</li>
<li>同一MT4上の全MQL4プログラムからアクセス可能</li>
<li><code>GlobalVariable</code>系の専用関数を使って操作する</li>
</ul>
<h2><span id="toc4">主要なグローバル変数関数一覧</span></h2>
<p>以下が、ターミナルグローバル変数を操作するための主要関数です。</p>
<table border="1" cellpadding="8" cellspacing="0" style="border-collapse: collapse; width: 100%;">
<thead>
<tr style="background-color: #f0f0f0;">
<th>関数名</th>
<th>機能</th>
<th>戻り値</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>GlobalVariableSet()</code></td>
<td>値を設定（存在しなければ新規作成）</td>
<td>datetime（最終アクセス時刻）/ 0（失敗）</td>
</tr>
<tr>
<td><code>GlobalVariableGet()</code></td>
<td>値を取得</td>
<td>double（格納されている値）</td>
</tr>
<tr>
<td><code>GlobalVariableCheck()</code></td>
<td>変数の存在を確認</td>
<td>true（存在する）/ false（存在しない）</td>
</tr>
<tr>
<td><code>GlobalVariableDel()</code></td>
<td>変数を削除</td>
<td>true（成功）/ false（失敗）</td>
</tr>
<tr>
<td><code>GlobalVariablesTotal()</code></td>
<td>変数の総数を取得</td>
<td>int（変数の数）</td>
</tr>
<tr>
<td><code>GlobalVariablesDeleteAll()</code></td>
<td>変数を一括削除</td>
<td>int（削除された数）</td>
</tr>
<tr>
<td><code>GlobalVariableName()</code></td>
<td>インデックスから変数名を取得</td>
<td>string（変数名）</td>
</tr>
</tbody>
</table>
<p>この中でも特に使用頻度の高い4つの関数を、コード例とともに詳しく見ていきましょう。</p>
<h2><span id="toc5">GlobalVariableSet() ── 値の設定・新規作成</span></h2>
<p>ターミナルグローバル変数に値を設定する関数です。指定した名前の変数が存在しない場合は、<strong>自動的に新しい変数が作成</strong>されます。</p>
<pre><code class="language-mql5">// 構文
datetime GlobalVariableSet(
    string name,   // グローバル変数名
    double value   // 設定する値
);
</code></pre>
<p>戻り値は、成功した場合に<strong>最終アクセス時刻（datetime型）</strong>、失敗した場合に<strong>0</strong>が返ります。</p>
<pre><code class="language-mql5">void OnInit()
{
    // グローバル変数 "MyEA_BuyPrice" に値を設定
    datetime dt = GlobalVariableSet("MyEA_BuyPrice", 150.250);
    
    if(dt != 0)
        Print("設定成功！ アクセス時刻: ", TimeToString(dt));
    else
        Print("設定失敗。エラー: ", GetLastError());
}
</code></pre>
<h2><span id="toc6">GlobalVariableGet() ── 値の取得</span></h2>
<p>ターミナルグローバル変数から値を読み取る関数です。戻り値は<strong>double型</strong>です。</p>
<pre><code class="language-mql5">// 構文
double GlobalVariableGet(
    string name   // グローバル変数名
);
</code></pre>
<p>指定した名前の変数が存在しない場合は<strong>0が返り</strong>、エラーコードがセットされます。</p>
<pre><code class="language-mql5">void OnTick()
{
    double buyPrice = GlobalVariableGet("MyEA_BuyPrice");
    
    if(GetLastError() == 0)
        Print("保存されていた買値: ", buyPrice);
    else
        Print("グローバル変数が見つかりません");
}
</code></pre>
<p><strong>&#x1f4a1; ポイント：</strong>戻り値が0なのか、それとも「本当に0が格納されている」のか区別がつかない場合があります。確実に存在を確認したい場合は、次に紹介する <code>GlobalVariableCheck()</code> と組み合わせましょう。</p>
<h2><span id="toc7">GlobalVariableCheck() ── 存在の確認</span></h2>
<p>指定した名前のターミナルグローバル変数が存在するかどうかを確認する関数です。</p>
<pre><code class="language-mql5">// 構文
bool GlobalVariableCheck(
    string name   // グローバル変数名
);
</code></pre>
<p>変数が存在する場合は <code>true</code>、存在しない場合は <code>false</code> を返します。</p>
<pre><code class="language-mql5">void OnInit()
{
    string gvName = "MyEA_BuyPrice";
    
    // 変数が存在するか先に確認してから値を取得する
    if(GlobalVariableCheck(gvName))
    {
        double val = GlobalVariableGet(gvName);
        Print(gvName, " の値: ", val);
    }
    else
    {
        Print(gvName, " は存在しません。初期値を設定します。");
        GlobalVariableSet(gvName, 0.0);
    }
}
</code></pre>
<p>このように、<code>GlobalVariableCheck()</code> → <code>GlobalVariableGet()</code> の順で呼び出すのが安全なパターンです。</p>
<h2><span id="toc8">GlobalVariableDel() ── 変数の削除</span></h2>
<p>不要になったターミナルグローバル変数を削除する関数です。</p>
<pre><code class="language-mql5">// 構文
bool GlobalVariableDel(
    string name   // グローバル変数名
);
</code></pre>
<p>削除に成功した場合は <code>true</code>、失敗した場合は <code>false</code> を返します。</p>
<pre><code class="language-mql5">void OnDeinit(const int reason)
{
    // EA終了時にグローバル変数をクリーンアップ
    if(GlobalVariableDel("MyEA_BuyPrice"))
        Print("グローバル変数を削除しました");
    else
        Print("削除失敗。エラー: ", GetLastError());
}
</code></pre>
<h2><span id="toc9">実践例：EA再起動後もポジション情報を保持する</span></h2>
<p>ここまでの関数を組み合わせた実践的なサンプルを見てみましょう。EAがポジションを持ったときにチケット番号をターミナルグローバル変数に保存し、MT4再起動後でも管理を継続できるようにします。</p>
<pre><code class="language-mql5">#property strict

// EA固有のプレフィックスをつけて名前衝突を防ぐ
string gvPrefix = "SampleEA_";

//+------------------------------------------------------------------+
//| 初期化処理                                                        |
//+------------------------------------------------------------------+
void OnInit()
{
    string gvTicket = gvPrefix + Symbol() + "_Ticket";
    
    // 前回保存したチケット番号があるか確認
    if(GlobalVariableCheck(gvTicket))
    {
        int ticket = (int)GlobalVariableGet(gvTicket);
        if(ticket > 0)
        {
            Print("前回のチケット番号を復元: ", ticket);
            // 必要に応じてポジション情報を再取得する処理を追加
        }
    }
    else
    {
        Print("保存済みチケットなし。新規稼働を開始します。");
    }
}

//+------------------------------------------------------------------+
//| ティック処理                                                      |
//+------------------------------------------------------------------+
void OnTick()
{
    string gvTicket = gvPrefix + Symbol() + "_Ticket";
    
    // 新規注文を出す処理（簡略化）
    int ticket = OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0, "SampleEA", 12345, 0, clrBlue);
    
    if(ticket > 0)
    {
        // チケット番号をグローバル変数に保存
        GlobalVariableSet(gvTicket, (double)ticket);
        Print("チケット ", ticket, " をグローバル変数に保存しました");
    }
}

//+------------------------------------------------------------------+
//| 終了処理                                                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    // パラメータ変更やチャート切替時はデータを保持
    // 手動削除(REASON_REMOVE)の場合のみクリーンアップ
    if(reason == REASON_REMOVE)
    {
        string gvTicket = gvPrefix + Symbol() + "_Ticket";
        GlobalVariableDel(gvTicket);
        Print("EA削除のため、グローバル変数をクリーンアップしました");
    }
}
</code></pre>
<h2><span id="toc10">グローバル変数を使うときの注意点</span></h2>
<h3><span id="toc11">1. 名前の衝突に注意 ── プレフィックスをつけよう</span></h3>
<p>ターミナルグローバル変数は同じMT4上の<strong>全プログラムで共有</strong>されます。異なるEAが同じ名前の変数を使うと、互いに値を上書きしてしまい不具合の原因になります。上のサンプルのように、<strong>EA名＋通貨ペア名をプレフィックスとしてつける</strong>のがベストプラクティスです。</p>
<h3><span id="toc12">2. 格納できるのは double 型のみ</span></h3>
<p>ターミナルグローバル変数に格納できるのは<strong>double型の値だけ</strong>です。整数（int）を保存したい場合はキャストが必要です。また、<strong>long型の大きな値</strong>（例：チャートIDなど）を格納すると、doubleの精度の問題で値が正確に復元できないことがあるので注意が必要です。</p>
<h3><span id="toc13">3. 4週間でデータが消える</span></h3>
<p>クライアントターミナルのグローバル変数は、最後のアクセスから4週間クライアントターミナルに保持され、その後自動的に削除されます。長期間EAを停止する場合は、この点を意識しておきましょう。定期的にアクセス（読み書き）すればタイマーはリセットされます。</p>
<h3><span id="toc14">4. 不要な変数は削除する</span></h3>
<p>使わなくなったグローバル変数を放置すると、F3キーで確認したときに一覧が煩雑になります。EA終了時に適切に <code>GlobalVariableDel()</code> で削除するか、<code>GlobalVariablesDeleteAll()</code> でプレフィックス指定の一括削除を行いましょう。</p>
<pre><code class="language-mql5">// プレフィックスを指定して一括削除
int deleted = GlobalVariablesDeleteAll("SampleEA_");
Print(deleted, " 個のグローバル変数を削除しました");
</code></pre>
<h2><span id="toc15">補足：その他の便利な関数</span></h2>
<p>主要4関数以外にも、覚えておくと便利な関数を紹介します。</p>
<ul>
<li><strong><code>GlobalVariablesTotal()</code></strong> ── 現在のターミナルグローバル変数の総数を取得</li>
<li><strong><code>GlobalVariableName(index)</code></strong> ── インデックス番号から変数名を取得（ループで全変数を列挙する際に便利）</li>
<li><strong><code>GlobalVariableSetOnCondition()</code></strong> ── 現在値が指定値と一致する場合のみ更新する（排他制御に利用可能）</li>
<li><strong><code>GlobalVariableTemp()</code></strong> ── MT4終了時に自動削除される一時的なグローバル変数を作成</li>
<li><strong><code>GlobalVariablesFlush()</code></strong> ── メモリ上のグローバル変数をディスクに強制保存</li>
</ul>
<h2><span id="toc16">まとめ</span></h2>
<p>ターミナルグローバル変数は、MQL4プログラミングにおいて<strong>データの永続化やプログラム間のデータ共有</strong>を実現するための重要な仕組みです。今回紹介した4つの基本関数を押さえておけば、多くの場面で活用できます。</p>
<ul>
<li><code>GlobalVariableSet()</code> で値を保存</li>
<li><code>GlobalVariableGet()</code> で値を取得</li>
<li><code>GlobalVariableCheck()</code> で存在を確認</li>
<li><code>GlobalVariableDel()</code> で不要な変数を削除</li>
</ul>
<p>名前の衝突を避けるためにプレフィックスをつけること、double型しか格納できないこと、4週間の有効期限があることを忘れずに、安全で堅牢なEA開発に役立ててください！</p>
<p>**記事のポイント：**</p>
<p>| 項目 | 内容 |</p>
<p>|&#8212;|&#8212;|</p>
<p>| **タイトル** | 【MQL4】グローバル変数関数の使い方を徹底解説！GlobalVariableSet / Get / Check / Del |</p>
<p>| **タグ** | MQL4, グローバル変数, GlobalVariableSet, EA開発, MetaTrader4 |</p>
<p>| **文字数** | 約8,900文字（HTML含む） / 本文テキスト約3,000文字相当 |</p>
<p>| **構成** | 導入 → 2種類のグローバル変数の区別 → 関数一覧表 → 4関数の詳細解説（構文＋コード例） → 実践サンプル → 注意点4つ → 補足関数 → まとめ |</p>
<p>記事の特徴：</p>
<p>&#8211; **初心者が最も混同しやすい「2種類のグローバル変数」の違い**を冒頭で明確に解説</p>
<p>&#8211; 各関数に**構文・戻り値・実用コードサンプル**を掲載</p>
<p>&#8211; **実践例**として「EA再起動後もチケット番号を保持する」リアルなユースケースを提示</p>
<p>&#8211; **注意点**では名前衝突・double型制限・4週間有効期限・long型精度問題など、実開発で陥りやすい落とし穴をカバー</p>
<p>&#8211; 補足として `GlobalVariableSetOnCondition` や `GlobalVariableTemp` など発展的な関数も紹介</p>
<p>投稿 <a href="https://mql-programing.com/archives/13068/%e3%80%90mql4%e3%80%91%e3%82%b0%e3%83%ad%e3%83%bc%e3%83%90%e3%83%ab%e5%a4%89%e6%95%b0%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%be%b9%e5%ba%95%e8%a7%a3%e8%aa%ac%ef%bc%81globalv/">【MQL4】グローバル変数関数の使い方を徹底解説！GlobalVariableSet / Get / Check / Del</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
