<?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/archives/tag/%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%B1%E3%83%BC%E3%82%BF%E3%83%BC%E9%96%A2%E6%95%B0/feed/" rel="self" type="application/rss+xml" />
	<link>https://mql-programing.com/archives/tag/インジケーター関数/</link>
	<description>MQLプログラミング学習サイト</description>
	<lastBuildDate>Fri, 17 Apr 2026 14:39:30 +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/archives/tag/インジケーター関数/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【MQL4】iSAR関数の使い方を徹底解説！パラボリックSARで売買シグナルを作ろう</title>
		<link>https://mql-programing.com/archives/13031/%e3%80%90mql4%e3%80%91isar%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%81%e3%83%91%e3%83%a9%e3%83%9c%e3%83%aa%e3%83%83%e3%82%afsar%e3%81%a7/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Sun, 12 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[パラボリックSAR]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[EA開発]]></category>
		<category><![CDATA[インジケーター関数]]></category>
		<category><![CDATA[iSAR]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13031</guid>

					<description><![CDATA[<p>MetaTraderのチャートで、価格の上下にドットが表示される「パラボリックSAR」を見たことはありませんか？このインジケーターは、トレンドの方向転換を視覚的に捉えるのに非常に優れたツールです。 MQL4ではiSAR( [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13031/%e3%80%90mql4%e3%80%91isar%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%81%e3%83%91%e3%83%a9%e3%83%9c%e3%83%aa%e3%83%83%e3%82%afsar%e3%81%a7/">【MQL4】iSAR関数の使い方を徹底解説！パラボリックSARで売買シグナルを作ろう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>MetaTraderのチャートで、価格の上下にドットが表示される「パラボリックSAR」を見たことはありませんか？このインジケーターは、トレンドの方向転換を視覚的に捉えるのに非常に優れたツールです。</p>
<p>MQL4では<strong>iSAR()関数</strong>を使うことで、パラボリックSARの値をプログラムから簡単に取得できます。この記事では、iSAR()関数の基本的な使い方から、実際に売買シグナルを出すEAの作成まで、ステップバイステップで解説していきます。</p>
<h2><span id="toc1">パラボリックSARとは？基本的な仕組みを理解しよう</span></h2>
<p>パラボリックSAR（Stop And Reverse）は、J・ウェルズ・ワイルダーが考案したトレンドフォロー型のテクニカル指標です。「SAR」は「Stop And Reverse（ストップ・アンド・リバース）」の略で、<strong>ポジションを決済して反転させるポイント</strong>を示すという意味があります。</p>
<h3><span id="toc2">チャート上での見え方</span></h3>
<p>パラボリックSARはチャート上に小さなドットとして表示されます。</p>
<ul>
<li><strong>ドットが価格の下にある場合</strong> → 上昇トレンド（買いシグナル）</li>
<li><strong>ドットが価格の上にある場合</strong> → 下降トレンド（売りシグナル）</li>
</ul>
<p>ドットが価格の上から下に（または下から上に）切り替わった瞬間が、トレンド転換のシグナルとなります。</p>
<h3><span id="toc3">計算式の概要</span></h3>
<p>パラボリックSARの計算式は次のとおりです。</p>
<p><strong>SAR = 前の期間のSAR + AF ×（EP − 前の期間のSAR）</strong></p>
<p>ここで使われる2つの重要なパラメーターを押さえておきましょう。</p>
<ul>
<li><strong>AF（Acceleration Factor / 加速因数）</strong>：初期値は通常0.02で、トレンドが続くたびに0.02ずつ増加し、最大値（通常0.2）まで上がります。AFが大きくなるほど、SARは価格に素早く近づきます。</li>
<li><strong>EP（Extreme Point / 極値）</strong>：現在のトレンド中の最高値（上昇トレンド時）または最安値（下降トレンド時）です。</li>
</ul>
<p>ただし、MQL4ではiSAR()関数が自動的に計算してくれるので、計算式を自分でコーディングする必要はありません。パラメーターの意味を理解しておくだけで十分です。</p>
<h2><span id="toc4">iSAR()関数のシンタックスとパラメーター</span></h2>
<p>iSAR()関数の定義は以下のとおりです。</p>
<pre><code class="language-mql4">double iSAR(
    string symbol,      // 通貨ペア名
    int    timeframe,   // 時間足
    double step,        // 加速因数のステップ
    double maximum,     // 加速因数の最大値
    int    shift        // バーのシフト
);</code></pre>
<p>各パラメーターの詳細を表で確認しましょう。</p>
<table>
<thead>
<tr>
<th>パラメーター</th>
<th>型</th>
<th>説明</th>
<th>よく使う値</th>
</tr>
</thead>
<tbody>
<tr>
<td>symbol</td>
<td>string</td>
<td>通貨ペア名。NULL で現在のチャートの通貨ペア</td>
<td>NULL, &#8220;USDJPY&#8221; など</td>
</tr>
<tr>
<td>timeframe</td>
<td>int</td>
<td>時間足。0 で現在のチャートの時間足</td>
<td>0, PERIOD_H1, PERIOD_D1 など</td>
</tr>
<tr>
<td>step</td>
<td>double</td>
<td>AFの増加ステップ（初期値にもなる）</td>
<td>0.02</td>
</tr>
<tr>
<td>maximum</td>
<td>double</td>
<td>AFの最大値</td>
<td>0.2</td>
</tr>
<tr>
<td>shift</td>
<td>int</td>
<td>取得するバーの位置（0＝現在のバー）</td>
<td>0, 1, 2</td>
</tr>
</tbody>
</table>
<p><strong>戻り値</strong>はdouble型で、指定したバーにおけるパラボリックSARの値（価格レベル）が返されます。</p>
<h2><span id="toc5">基本的な使い方：SARの値を取得してみよう</span></h2>
<h3><span id="toc6">シンプルな値の取得</span></h3>
<p>まずは、現在のバーのパラボリックSAR値を取得して、エキスパートログに出力するシンプルな例です。</p>
<pre><code class="language-mql4">void OnTick()
{
    // 現在のバー（shift=0）のパラボリックSAR値を取得
    double sarValue = iSAR(NULL, 0, 0.02, 0.2, 0);

    // ログに出力して確認
    Print("現在のSAR値: ", DoubleToString(sarValue, Digits));
}</code></pre>
<p>引数に<code>NULL</code>と<code>0</code>を指定すると、EAが稼働しているチャートの通貨ペアと時間足が自動的に使われます。stepに0.02、maximumに0.2というのがデフォルト設定です。</p>
<h3><span id="toc7">トレンド方向の判定</span></h3>
<p>パラボリックSARで最もよく使うのが、<strong>トレンド方向の判定</strong>です。SARの値と現在の価格を比較するだけで簡単に判定できます。</p>
<pre><code class="language-mql4">void OnTick()
{
    // 1本前の確定バーのSAR値を取得（shift=1）
    double sarValue = iSAR(NULL, 0, 0.02, 0.2, 1);

    // 1本前のバーの終値を取得
    double closePrice = Close[1];

    // トレンド方向を判定
    if(closePrice > sarValue)
    {
        // SARが価格の下にある → 上昇トレンド
        Print("上昇トレンド中 | Close: ", DoubleToString(closePrice, Digits),
              " > SAR: ", DoubleToString(sarValue, Digits));
    }
    else
    {
        // SARが価格の上にある → 下降トレンド
        Print("下降トレンド中 | Close: ", DoubleToString(closePrice, Digits),
              " < SAR: ", DoubleToString(sarValue, Digits));
    }
}</code></pre>
<p>ここでは<strong>shift=1（1本前の確定バー）</strong>を使っている点に注目してください。shift=0の現在のバーはまだ確定していないため、シグナルがコロコロ変わってしまう可能性があります。確定したバーで判定するのが基本です。</p>
<h2><span id="toc8">実践：パラボリックSARで売買するEAを作ろう</span></h2>
<p>ここからが本番です。パラボリックSARのトレンド転換を検出して、実際に売買注文を出すEAを作ってみましょう。</p>
<h3><span id="toc9">売買ロジックの考え方</span></h3>
<p>SARのトレンド転換は、<strong>2本前のバーと1本前のバーのSAR値を比較</strong>して検出します。</p>
<ul>
<li><strong>買いシグナル</strong>：2本前はSARが価格の上（下降トレンド）→ 1本前はSARが価格の下（上昇トレンド）に変わった</li>
<li><strong>売りシグナル</strong>：2本前はSARが価格の下（上昇トレンド）→ 1本前はSARが価格の上（下降トレンド）に変わった</li>
</ul>
<h3><span id="toc10">フルサンプルEA</span></h3>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| パラボリックSAR転換EA                                              |
//+------------------------------------------------------------------+
#property copyright "MQL学習サイト"
#property version   "1.00"
#property strict

// --- 入力パラメーター ---
input double SarStep     = 0.02;   // SAR加速因数ステップ
input double SarMaximum  = 0.2;    // SAR加速因数最大値
input double LotSize     = 0.1;    // 取引ロット数
input int    SlippagePts = 3;      // スリッページ（ポイント）
input int    MagicNumber = 12345;  // マジックナンバー

// --- 新バー判定用のグローバル変数 ---
datetime lastBarTime = 0;

//+------------------------------------------------------------------+
//| 新しいバーが生成されたかを判定する関数                                |
//+------------------------------------------------------------------+
bool IsNewBar()
{
    datetime currentBarTime = Time[0];
    if(currentBarTime != lastBarTime)
    {
        lastBarTime = currentBarTime;
        return true;
    }
    return false;
}

//+------------------------------------------------------------------+
//| 自分のEAが持つポジション数を取得する関数                              |
//+------------------------------------------------------------------+
int CountMyPositions(int type)
{
    int count = 0;
    for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
            {
                if(OrderType() == type)
                    count++;
            }
        }
    }
    return count;
}

//+------------------------------------------------------------------+
//| 指定タイプのポジションを全決済する関数                                |
//+------------------------------------------------------------------+
void ClosePositions(int type)
{
    for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
            {
                if(OrderType() == type)
                {
                    double closePrice;
                    if(type == OP_BUY)
                        closePrice = Bid;
                    else
                        closePrice = Ask;

                    bool result = OrderClose(OrderTicket(), OrderLots(),
                                             closePrice, SlippagePts, clrNONE);
                    if(!result)
                        Print("決済エラー: ", GetLastError());
                }
            }
        }
    }
}

//+------------------------------------------------------------------+
//| OnTick - メイン処理                                                |
//+------------------------------------------------------------------+
void OnTick()
{
    // 新しいバーが確定した時だけ処理する
    if(!IsNewBar())
        return;

    // --- パラボリックSARの値を取得 ---
    double sar1 = iSAR(NULL, 0, SarStep, SarMaximum, 1);  // 1本前のバー
    double sar2 = iSAR(NULL, 0, SarStep, SarMaximum, 2);  // 2本前のバー

    // --- 各バーの終値を取得 ---
    double close1 = Close[1];  // 1本前のバーの終値
    double close2 = Close[2];  // 2本前のバーの終値

    // --- トレンド方向を判定 ---
    bool isUpTrend1 = (close1 > sar1);   // 1本前：上昇トレンド？
    bool isDownTrend1 = (close1 < sar1); // 1本前：下降トレンド？
    bool isUpTrend2 = (close2 > sar2);   // 2本前：上昇トレンド？
    bool isDownTrend2 = (close2 < sar2); // 2本前：下降トレンド？

    // --- 買いシグナル：下降→上昇に転換 ---
    if(isDownTrend2 &#038;&#038; isUpTrend1)
    {
        // 売りポジションがあれば決済
        if(CountMyPositions(OP_SELL) > 0)
            ClosePositions(OP_SELL);

        // 買いポジションがなければ新規エントリー
        if(CountMyPositions(OP_BUY) == 0)
        {
            int ticket = OrderSend(Symbol(), OP_BUY, LotSize,
                                   Ask, SlippagePts, 0, 0,
                                   "SAR Buy Signal", MagicNumber, 0, clrBlue);
            if(ticket < 0)
                Print("買い注文エラー: ", GetLastError());
            else
                Print("買い注文成功 チケット: ", ticket);
        }
    }

    // --- 売りシグナル：上昇→下降に転換 ---
    if(isUpTrend2 &#038;&#038; isDownTrend1)
    {
        // 買いポジションがあれば決済
        if(CountMyPositions(OP_BUY) > 0)
            ClosePositions(OP_BUY);

        // 売りポジションがなければ新規エントリー
        if(CountMyPositions(OP_SELL) == 0)
        {
            int ticket = OrderSend(Symbol(), OP_SELL, LotSize,
                                   Bid, SlippagePts, 0, 0,
                                   "SAR Sell Signal", MagicNumber, 0, clrRed);
            if(ticket < 0)
                Print("売り注文エラー: ", GetLastError());
            else
                Print("売り注文成功 チケット: ", ticket);
        }
    }
}</code></pre>
<p>このEAのポイントを整理しましょう。</p>
<ul>
<li><strong>IsNewBar()関数</strong>で新しいバーが確定したタイミングだけ処理を実行。ティックごとに何度も注文が飛ぶのを防ぎます。</li>
<li><strong>2本前と1本前のSAR値</strong>を比較して転換を検出。確定バーだけを使うので安定したシグナルになります。</li>
<li>転換時に<strong>逆方向のポジションを先に決済</strong>してから新規エントリーする、ドテン（途転）方式です。</li>
<li><strong>MagicNumber</strong>を使って、このEAのポジションだけを管理しています。他のEAのポジションには干渉しません。</li>
</ul>
<h2><span id="toc11">注意点とパフォーマンス向上のTips</span></h2>
<h3><span id="toc12">加速因数パラメーターの調整</span></h3>
<p>デフォルト値の step=0.02 / maximum=0.2 は万能ではありません。</p>
<ul>
<li><strong>stepを小さくする（例：0.01）</strong>→ SARの反応が遅くなり、ダマシが減る反面、エントリーが遅れる</li>
<li><strong>stepを大きくする（例：0.03）</strong>→ SARの反応が速くなり、転換を早く捉えるが、ダマシが増える</li>
<li><strong>maximumを変える</strong>→ AFの上限を制御。小さくするとSARが価格に追いつくスピードが制限される</li>
</ul>
<p>バックテストを繰り返して、対象通貨ペアと時間足に合った値を見つけましょう。</p>
<h3><span id="toc13">レンジ相場に弱い点を理解しよう</span></h3>
<p>パラボリックSARはトレンドフォロー型の指標なので、<strong>レンジ（横ばい）相場では頻繁に転換シグナルが発生</strong>し、連続した損失（いわゆる「ダマシ」）が起きやすくなります。</p>
<p>対策としては、以下の方法があります。</p>
<ul>
<li><strong>ADXなどのトレンド強度指標と組み合わせる</strong>（ADXが25以上のときだけ取引するなど）</li>
<li><strong>移動平均線と併用する</strong>（移動平均線の方向とSARの方向が一致した場合のみエントリー）</li>
<li><strong>より長い時間足でトレンド方向を確認する</strong>（マルチタイムフレーム分析）</li>
</ul>
<h3><span id="toc14">マルチタイムフレームでSARを活用する</span></h3>
<p>異なる時間足のSAR値も、iSAR()関数のtimeframeパラメーターを変えるだけで簡単に取得できます。</p>
<pre><code class="language-mql4">void OnTick()
{
    // 日足のSAR値を取得（大きなトレンド方向の確認用）
    double sarDaily = iSAR(NULL, PERIOD_D1, 0.02, 0.2, 1);
    double closeDaily = iClose(NULL, PERIOD_D1, 1);

    // 1時間足のSAR値を取得（エントリータイミング用）
    double sarH1 = iSAR(NULL, PERIOD_H1, 0.02, 0.2, 1);
    double closeH1 = iClose(NULL, PERIOD_H1, 1);

    // 日足が上昇トレンド かつ 1時間足も上昇トレンドなら買いを検討
    if(closeDaily > sarDaily && closeH1 > sarH1)
    {
        Print("日足・1時間足ともに上昇トレンド → 買い検討");
    }

    // 日足が下降トレンド かつ 1時間足も下降トレンドなら売りを検討
    if(closeDaily < sarDaily &#038;&#038; closeH1 < sarH1)
    {
        Print("日足・1時間足ともに下降トレンド → 売り検討");
    }
}</code></pre>
<p>上位足のトレンド方向に順張りすることで、ダマシを大幅に減らすことができます。</p>
<h2><span id="toc15">まとめ</span></h2>
<p>この記事で学んだポイントを整理しましょう。</p>
<ul>
<li><strong>パラボリックSAR</strong>は、ドットの位置でトレンド方向と転換点を示すインジケーター</li>
<li><strong>iSAR()関数</strong>は、symbol・timeframe・step・maximum・shiftの5つのパラメーターで値を取得できる</li>
<li><strong>トレンド判定</strong>は、SARの値と価格を比較するだけでシンプルに行える</li>
<li><strong>転換シグナル</strong>は、2本前と1本前のバーでトレンド方向が変わったかどうかで検出する</li>
<li><strong>レンジ相場対策</strong>として、ADXや移動平均線、マルチタイムフレーム分析との併用が効果的</li>
</ul>
<p>パラボリックSARは計算ロジックがシンプルなぶん、EA化しやすいインジケーターです。まずは今回のサンプルEAをストラテジーテスターで動かしてみて、パラメーターを調整したり、フィルター条件を追加したりして、自分だけの売買ロジックに育てていきましょう！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13031/%e3%80%90mql4%e3%80%91isar%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%81%e3%83%91%e3%83%a9%e3%83%9c%e3%83%aa%e3%83%83%e3%82%afsar%e3%81%a7/">【MQL4】iSAR関数の使い方を徹底解説！パラボリックSARで売買シグナルを作ろう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4】iATR関数の使い方を徹底解説！ATR（アベレージ・トゥルー・レンジ）でボラティリティを味方につけよう</title>
		<link>https://mql-programing.com/archives/13028/%e3%80%90mql4%e3%80%91iatr%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%81atr%ef%bc%88%e3%82%a2%e3%83%99%e3%83%ac%e3%83%bc%e3%82%b8%e3%83%bb/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Sat, 11 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[EA開発]]></category>
		<category><![CDATA[インジケーター関数]]></category>
		<category><![CDATA[iATR]]></category>
		<category><![CDATA[ATR]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13028</guid>

					<description><![CDATA[<p>「相場の勢いが強いのか弱いのか、数値で判断できたらいいのに…」そんな風に思ったことはありませんか？ MQL4には、ボラティリティ（価格変動の大きさ）を数値化できる便利な関数iATRが用意されています。ATR（Averag [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13028/%e3%80%90mql4%e3%80%91iatr%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%81atr%ef%bc%88%e3%82%a2%e3%83%99%e3%83%ac%e3%83%bc%e3%82%b8%e3%83%bb/">【MQL4】iATR関数の使い方を徹底解説！ATR（アベレージ・トゥルー・レンジ）でボラティリティを味方につけよう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>「相場の勢いが強いのか弱いのか、数値で判断できたらいいのに…」そんな風に思ったことはありませんか？</p>
<p>MQL4には、ボラティリティ（価格変動の大きさ）を数値化できる便利な関数<strong>iATR</strong>が用意されています。ATR（Average True Range：アベレージ・トゥルー・レンジ）は、多くのプロトレーダーも活用している指標で、ストップロスの設定やエントリーフィルターなど、EA開発で大活躍します。</p>
<p>この記事では、iATR関数の基本的な使い方から、実践的なEAへの組み込み方まで、サンプルコード付きで徹底解説します！</p>
<h2><span id="toc1">ATR（アベレージ・トゥルー・レンジ）とは？</span></h2>
<p>ATRを理解するには、まず<strong>TR（トゥルー・レンジ）</strong>を知る必要があります。TRは「そのローソク足の本当の値動き幅」を表すもので、次の3つの値のうち最も大きいものを採用します。</p>
<ul>
<li><strong>当日の高値 − 当日の安値</strong>（通常の値幅）</li>
<li><strong>当日の高値 − 前日の終値</strong>の絶対値（上方向へのギャップを考慮）</li>
<li><strong>当日の安値 − 前日の終値</strong>の絶対値（下方向へのギャップを考慮）</li>
</ul>
<p>ATRは、このTRを指定した期間で<strong>平均化</strong>したものです。一般的には14期間がよく使われます。</p>
<p>ATRの値が大きいほど「ボラティリティが高い（値動きが激しい）」、小さいほど「ボラティリティが低い（値動きが穏やか）」と判断できます。なお、ATRはあくまで値動きの「大きさ」を示すものであり、方向（上昇・下降）は示しません。</p>
<h2><span id="toc2">iATR関数の基本構文</span></h2>
<p>MQL4でATRの値を取得するには、<strong>iATR関数</strong>を使います。基本構文は以下の通りです。</p>
<pre><code class="language-mql4">double iATR(
    string symbol,      // 通貨ペア名
    int    timeframe,   // 時間足
    int    period,      // 平均期間
    int    shift        // シフト（何本前のバーか）
);</code></pre>
<p>各引数の詳細を見ていきましょう。</p>
<table>
<thead>
<tr>
<th>引数</th>
<th>型</th>
<th>説明</th>
<th>例</th>
</tr>
</thead>
<tbody>
<tr>
<td>symbol</td>
<td>string</td>
<td>対象の通貨ペア名。NULL を指定すると現在のチャートの通貨ペアになります。</td>
<td>NULL, &#8220;USDJPY&#8221;</td>
</tr>
<tr>
<td>timeframe</td>
<td>int</td>
<td>時間足を指定します。0 を指定すると現在のチャートの時間足になります。</td>
<td>0, PERIOD_H1, PERIOD_D1</td>
</tr>
<tr>
<td>period</td>
<td>int</td>
<td>ATRを計算する平均期間。一般的には14が使われます。</td>
<td>14, 20</td>
</tr>
<tr>
<td>shift</td>
<td>int</td>
<td>何本前のバーの値を取得するか。0は現在の未確定バー、1は直近の確定バーです。</td>
<td>0, 1</td>
</tr>
</tbody>
</table>
<h2><span id="toc3">基本的な使い方 ― ATR値を取得してみよう</span></h2>
<p>まずは最もシンプルな使い方です。現在のチャートで14期間ATRの値を取得し、エキスパートログに出力してみましょう。</p>
<pre><code class="language-mql4">void OnTick()
{
    // 直近の確定バー（shift=1）のATR値を取得
    double atrValue = iATR(NULL, 0, 14, 1);

    // ログに出力
    Print("現在のATR(14) = ", DoubleToString(atrValue, 5));
}</code></pre>
<p>ここで重要なポイントは<strong>shift=1</strong>を使っていることです。shift=0だと現在形成中のバー（まだ確定していない）の値を参照するため、ティックごとに値が変動してしまいます。EAのロジックでは、基本的にshift=1（直近の確定バー）を使うのが安定した判断につながります。</p>
<h2><span id="toc4">実践サンプル①：ATRベースの動的ストップロス＆テイクプロフィット</span></h2>
<p>ATRの最も人気のある活用法の一つが、<strong>ボラティリティに応じてSL（ストップロス）とTP（テイクプロフィット）を動的に変える</strong>方法です。相場が激しく動いているときは広めに、穏やかなときは狭めに設定できます。</p>
<pre><code class="language-mql4">// --- 入力パラメータ ---
input int    ATR_Period    = 14;      // ATR期間
input double SL_Multiplier = 1.5;    // SLに使うATRの倍率
input double TP_Multiplier = 2.0;    // TPに使うATRの倍率
input double LotSize       = 0.1;    // ロットサイズ

void OnTick()
{
    // 既にポジションがあれば何もしない（簡略化のため）
    if(OrdersTotal() > 0) return;

    // ATR値を取得（確定バーを使用）
    double atr = iATR(NULL, 0, ATR_Period, 1);

    // ATRが0の場合は処理しない
    if(atr <= 0) return;

    // 動的なSL・TPを計算
    double sl_distance = atr * SL_Multiplier;
    double tp_distance = atr * TP_Multiplier;

    // 現在の価格を取得
    double askPrice = Ask;
    double bidPrice = Bid;

    // 買い注文の例
    double sl = askPrice - sl_distance;
    double tp = askPrice + tp_distance;

    // 小数点桁数を通貨ペアに合わせて丸める
    sl = NormalizeDouble(sl, Digits);
    tp = NormalizeDouble(tp, Digits);

    int ticket = OrderSend(
        Symbol(), OP_BUY, LotSize,
        askPrice, 3, sl, tp,
        "ATR-based SL/TP", 0, 0, clrBlue
    );

    if(ticket > 0)
    {
        Print("注文成功！ SL=", DoubleToString(sl, Digits),
              " TP=", DoubleToString(tp, Digits),
              " ATR=", DoubleToString(atr, 5));
    }
    else
    {
        Print("注文失敗: エラーコード=", GetLastError());
    }
}</code></pre>
<p>この例では、ATRの1.5倍をストップロスに、2.0倍をテイクプロフィットに設定しています。こうすることで、ボラティリティが高い相場では自然とSL/TP幅が広がり、低い相場では狭まります。固定pipsのSL/TPと比べて、相場環境に柔軟に対応できるのが大きなメリットです。</p>
<h2><span id="toc5">実践サンプル②：ATRでボラティリティフィルターを作る</span></h2>
<p>もう一つの活用法が、<strong>ボラティリティフィルター</strong>です。「ボラティリティが一定以上あるときだけトレードする」というフィルターを作ることで、値動きが小さすぎるレンジ相場でのムダなエントリーを避けられます。</p>
<pre><code class="language-mql4">// ボラティリティが十分かどうかを判定する関数
bool IsVolatilityEnough(int atrPeriod, int checkBars, double threshold)
{
    // 現在のATR
    double currentATR = iATR(NULL, 0, atrPeriod, 1);

    // 過去のATRの平均を計算
    double sumATR = 0;
    for(int i = 2; i <= checkBars + 1; i++)
    {
        sumATR += iATR(NULL, 0, atrPeriod, i);
    }
    double avgATR = sumATR / checkBars;

    // 平均に対する比率で判定
    if(avgATR <= 0) return false;

    double ratio = currentATR / avgATR;

    // 比率がしきい値以上ならボラティリティ十分と判定
    if(ratio >= threshold)
    {
        Print("ボラティリティOK: 現在ATR=", DoubleToString(currentATR, 5),
              " 平均ATR=", DoubleToString(avgATR, 5),
              " 比率=", DoubleToString(ratio, 2));
        return true;
    }

    return false;
}

// 使用例
void OnTick()
{
    // 過去20本のATR平均と比較して、0.8倍以上なら十分と判定
    if(!IsVolatilityEnough(14, 20, 0.8))
    {
        // ボラティリティが低いのでトレードしない
        return;
    }

    // ここにエントリーロジックを記述
    // ...
}</code></pre>
<p>この関数は、直近のATRが過去の平均ATRに対してどの程度の比率かを計算し、指定したしきい値以上であれば「ボラティリティ十分」と判定します。レンジ相場で無駄にエントリーしてしまう問題を軽減できる、実用的なフィルターです。</p>
<h2><span id="toc6">iATR関数を使う際の注意点</span></h2>
<h3><span id="toc7">① shift=1を基本にしよう</span></h3>
<p>先ほども触れましたが、EA内でATR値をロジック判定に使うときは<strong>shift=1</strong>（直近の確定バー）を使いましょう。shift=0はティックごとに値が変わるため、バックテストとリアルトレードで結果が乖離する原因になります。</p>
<h3><span id="toc8">② ATR値をpipsに換算する方法</span></h3>
<p>ATRの戻り値は「価格の値幅」です。pipsに換算したい場合は、以下のようにします。</p>
<pre><code class="language-mql4">double atr = iATR(NULL, 0, 14, 1);

// pipsに換算（3桁/5桁ブローカー対応）
double atrPips;
if(Digits == 3 || Digits == 5)
    atrPips = atr / (Point * 10);
else
    atrPips = atr / Point;

Print("ATR = ", DoubleToString(atrPips, 1), " pips");</code></pre>
<p>多くのブローカーは5桁（例：USDJPY = 110.123）または3桁（例：USDJPY = 110.12の場合もあり）の価格表示を使っています。Digitsの値を確認してpips換算することで、どのブローカーでも正しく動作するコードになります。</p>
<h3><span id="toc9">③ マルチタイムフレームでの活用</span></h3>
<p>iATR関数のtimeframe引数を使えば、現在のチャートとは異なる時間足のATRを取得できます。</p>
<pre><code class="language-mql4">// 日足のATRを5分足チャート上で取得
double dailyATR = iATR(NULL, PERIOD_D1, 14, 1);

// 4時間足のATRを取得
double h4ATR = iATR(NULL, PERIOD_H4, 14, 1);

Print("日足ATR=", DoubleToString(dailyATR, 5),
      " 4時間足ATR=", DoubleToString(h4ATR, 5));</code></pre>
<p>例えば、5分足でスキャルピングEAを作りつつ、日足のATRでその日全体のボラティリティを確認する、という使い方ができます。上位足のボラティリティ情報を加味することで、より精度の高いトレード判断が可能になります。</p>
<h2><span id="toc10">まとめ</span></h2>
<p>この記事では、MQL4の<strong>iATR関数</strong>を使ってATR（アベレージ・トゥルー・レンジ）を取得・活用する方法を解説しました。最後にポイントを振り返りましょう。</p>
<ul>
<li><strong>ATR</strong>はボラティリティ（値動きの大きさ）を数値化した指標で、方向性は示さない</li>
<li><strong>iATR関数</strong>は4つの引数（symbol, timeframe, period, shift）で手軽にATR値を取得できる</li>
<li>EAのロジックでは<strong>shift=1</strong>（確定バー）を使うのが基本</li>
<li><strong>動的SL/TP</strong>に活用すれば、相場のボラティリティに応じた柔軟なリスク管理が可能</li>
<li><strong>ボラティリティフィルター</strong>として使えば、レンジ相場でのムダなエントリーを回避できる</li>
<li>pips換算やマルチタイムフレーム対応も忘れずに実装しよう</li>
</ul>
<p>ATRは地味に見えるかもしれませんが、EA開発においては非常に汎用性の高い指標です。ストップロス、テイクプロフィット、ロットサイズの計算、エントリーフィルターなど、さまざまな場面で活躍します。ぜひ自分のEAに組み込んで、ボラティリティを味方につけてください！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13028/%e3%80%90mql4%e3%80%91iatr%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%81atr%ef%bc%88%e3%82%a2%e3%83%99%e3%83%ac%e3%83%bc%e3%82%b8%e3%83%bb/">【MQL4】iATR関数の使い方を徹底解説！ATR（アベレージ・トゥルー・レンジ）でボラティリティを味方につけよう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4】iCCI関数の使い方を徹底解説！CCI（商品チャネル指数）でトレンド転換を捉えるEAを作ろう</title>
		<link>https://mql-programing.com/archives/13025/%e3%80%90mql4%e3%80%91icci%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%81cci%ef%bc%88%e5%95%86%e5%93%81%e3%83%81%e3%83%a3%e3%83%8d%e3%83%ab/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Fri, 10 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[iCCI]]></category>
		<category><![CDATA[CCI]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13025</guid>

					<description><![CDATA[<p>CCI（商品チャネル指数）は、相場の「買われすぎ・売られすぎ」を数値で判断できる人気のオシレーター系インジケーターです。MQL4ではiCCI関数を使うことで、EA（自動売買）の中から簡単にCCIの値を取得できます。 この [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13025/%e3%80%90mql4%e3%80%91icci%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%81cci%ef%bc%88%e5%95%86%e5%93%81%e3%83%81%e3%83%a3%e3%83%8d%e3%83%ab/">【MQL4】iCCI関数の使い方を徹底解説！CCI（商品チャネル指数）でトレンド転換を捉えるEAを作ろう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>CCI（商品チャネル指数）は、相場の「買われすぎ・売られすぎ」を数値で判断できる人気のオシレーター系インジケーターです。MQL4では<strong>iCCI関数</strong>を使うことで、EA（自動売買）の中から簡単にCCIの値を取得できます。</p>
<p>この記事では、iCCI関数の基本的な使い方からパラメータの意味、そしてCCIのクロスを利用した実践的なEAの作成方法まで、ステップバイステップで解説していきます。</p>
<h2><span id="toc1">CCI（商品チャネル指数）とは？</span></h2>
<p>CCIは1980年にドナルド・ランバート氏が開発した<strong>モメンタム系オシレーター</strong>です。もともとは商品先物市場向けに作られましたが、現在ではFXや株式など幅広い市場で使われています。</p>
<p>CCIの特徴は、RSIやストキャスティクスのように0〜100の範囲に収まるのではなく、<strong>上下に制限なく動く</strong>点です。一般的には以下の基準で判断します。</p>
<ul>
<li><strong>+100を上回る</strong>：買われすぎ（上昇トレンドが強い）</li>
<li><strong>-100を下回る</strong>：売られすぎ（下降トレンドが強い）</li>
<li><strong>0ライン</strong>：トレンドの方向転換の目安</li>
</ul>
<h3><span id="toc2">CCIの計算式</span></h3>
<p>CCIの計算式は以下の通りです。</p>
<pre><code class="language-mql4">CCI = (TP - MA) / (0.015 × MD)

// TP（ティピカルプライス）= (高値 + 安値 + 終値) / 3
// MA = TPの単純移動平均（期間N）
// MD = TPと移動平均の平均偏差
// 0.015 = CCI値の約70〜80%が±100以内に収まるように設定された定数
</code></pre>
<p>計算式を覚える必要はありませんが、TPをベースにしていることは頭に入れておきましょう。iCCI関数の<code>applied_price</code>パラメータに関わってきます。</p>
<h2><span id="toc3">iCCI関数の構文</span></h2>
<p>MQL4でCCIの値を取得するには、<strong>iCCI関数</strong>を使います。構文は以下の通りです。</p>
<pre><code class="language-mql4">double iCCI(
   string       symbol,          // 通貨ペア名
   int          timeframe,       // 時間足
   int          period,          // 平均期間
   int          applied_price,   // 適用価格
   int          shift            // シフト（何本前の足か）
);
</code></pre>
<h3><span id="toc4">パラメータ一覧</span></h3>
<table>
<thead>
<tr>
<th>パラメータ</th>
<th>型</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>symbol</td>
<td>string</td>
<td>通貨ペア名。現在のチャートなら<code>NULL</code>または<code>Symbol()</code></td>
</tr>
<tr>
<td>timeframe</td>
<td>int</td>
<td>時間足。<code>0</code>で現在のチャートの時間足。<code>PERIOD_H1</code>など定数も使用可能</td>
</tr>
<tr>
<td>period</td>
<td>int</td>
<td>CCIの計算期間。一般的には<strong>14</strong>や<strong>20</strong>がよく使われる</td>
</tr>
<tr>
<td>applied_price</td>
<td>int</td>
<td>計算に使う価格の種類</td>
</tr>
<tr>
<td>shift</td>
<td>int</td>
<td>何本前のローソク足のCCI値を取得するか。0が現在の足、1が1本前の確定足</td>
</tr>
</tbody>
</table>
<h3><span id="toc5">applied_price（適用価格）の定数一覧</span></h3>
<p>CCIの計算に使用する価格タイプを指定します。デフォルトのCCIではティピカルプライスが使われます。</p>
<table>
<thead>
<tr>
<th>定数名</th>
<th>値</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>PRICE_CLOSE</td>
<td>0</td>
<td>終値</td>
</tr>
<tr>
<td>PRICE_OPEN</td>
<td>1</td>
<td>始値</td>
</tr>
<tr>
<td>PRICE_HIGH</td>
<td>2</td>
<td>高値</td>
</tr>
<tr>
<td>PRICE_LOW</td>
<td>3</td>
<td>安値</td>
</tr>
<tr>
<td>PRICE_MEDIAN</td>
<td>4</td>
<td>中央値（高値+安値）/ 2</td>
</tr>
<tr>
<td>PRICE_TYPICAL</td>
<td>5</td>
<td>ティピカルプライス（高値+安値+終値）/ 3</td>
</tr>
<tr>
<td>PRICE_WEIGHTED</td>
<td>6</td>
<td>加重終値（高値+安値+終値×2）/ 4</td>
</tr>
</tbody>
</table>
<p>チャート上にCCIインジケーターを表示して比較する場合は、<strong>applied_priceを同じ設定にしないと値がずれる</strong>ので注意してください。標準のCCIは<code>PRICE_TYPICAL</code>を使用しています。</p>
<h2><span id="toc6">基本的な使い方</span></h2>
<p>まずは最もシンプルな使い方を見てみましょう。1本前の確定足のCCI値を取得してコメントに表示する例です。</p>
<pre><code class="language-mql4">void OnTick()
{
   // 1本前の確定足のCCI（期間14、ティピカルプライス）を取得
   double cciValue = iCCI(NULL, 0, 14, PRICE_TYPICAL, 1);
   
   // チャート上にCCI値を表示
   Comment("CCI(14) = ", DoubleToString(cciValue, 2));
}
</code></pre>
<p><strong>ポイント：</strong>shiftに<code>1</code>を指定して確定足の値を使うのが基本です。<code>0</code>（現在の足）はティックごとに値が変動するため、売買シグナルの判定には向きません。</p>
<h2><span id="toc7">CCIクロスで売買するEAを作ろう</span></h2>
<p>ここからが本番です。CCIが<strong>-100を下から上にクロスしたら買い</strong>、<strong>+100を上から下にクロスしたら売り</strong>、<strong>0ラインクロスで決済</strong>するEAを作成します。</p>
<h3><span id="toc8">トレードロジックの整理</span></h3>
<ul>
<li><strong>買いエントリー</strong>：CCI（1本前）が-100以上 かつ CCI（2本前）が-100未満 → -100を上抜け</li>
<li><strong>売りエントリー</strong>：CCI（1本前）が+100以下 かつ CCI（2本前）が+100超 → +100を下抜け</li>
<li><strong>買いポジション決済</strong>：CCIが0を下回った時</li>
<li><strong>売りポジション決済</strong>：CCIが0を上回った時</li>
</ul>
<h3><span id="toc9">完全なEAコード</span></h3>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| CCI Cross EA                                                       |
//+------------------------------------------------------------------+
#property strict

// 入力パラメータ
input int    CCI_Period      = 14;            // CCI期間
input double LotSize         = 0.1;           // ロットサイズ
input int    StopLoss        = 100;           // ストップロス（pips）
input int    TakeProfit      = 200;           // テイクプロフィット（pips）
input int    MagicNumber     = 20240101;      // マジックナンバー

//+------------------------------------------------------------------+
//| Expert tick function                                               |
//+------------------------------------------------------------------+
void OnTick()
{
   // CCI値を取得（確定足を使用）
   double cci1 = iCCI(NULL, 0, CCI_Period, PRICE_TYPICAL, 1); // 1本前
   double cci2 = iCCI(NULL, 0, CCI_Period, PRICE_TYPICAL, 2); // 2本前
   
   // 現在のポジション状態を確認
   int buyCount  = CountPositions(OP_BUY);
   int sellCount = CountPositions(OP_SELL);
   
   // --- 決済ロジック ---
   // 買いポジション保有中：CCIが0を下回ったら決済
   if(buyCount > 0 && cci1 < 0)
   {
      ClosePositions(OP_BUY);
   }
   
   // 売りポジション保有中：CCIが0を上回ったら決済
   if(sellCount > 0 && cci1 > 0)
   {
      ClosePositions(OP_SELL);
   }
   
   // --- エントリーロジック ---
   // ポジションがない場合のみエントリー
   if(buyCount == 0 && sellCount == 0)
   {
      // 買いシグナル：CCIが-100を下から上にクロス
      if(cci2 < -100 &#038;&#038; cci1 >= -100)
      {
         double sl = (StopLoss > 0)   ? Ask - StopLoss * Point * 10 : 0;
         double tp = (TakeProfit > 0)  ? Ask + TakeProfit * Point * 10 : 0;
         
         int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 30, sl, tp,
                                "CCI Buy", MagicNumber, 0, clrBlue);
         if(ticket < 0)
            Print("Buy OrderSend error: ", GetLastError());
      }
      
      // 売りシグナル：CCIが+100を上から下にクロス
      if(cci2 > 100 && cci1 <= 100)
      {
         double sl = (StopLoss > 0)   ? Bid + StopLoss * Point * 10 : 0;
         double tp = (TakeProfit > 0)  ? Bid - TakeProfit * Point * 10 : 0;
         
         int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 30, sl, tp,
                                "CCI Sell", MagicNumber, 0, clrRed);
         if(ticket < 0)
            Print("Sell OrderSend error: ", GetLastError());
      }
   }
}

//+------------------------------------------------------------------+
//| 指定タイプのポジション数をカウント                                    |
//+------------------------------------------------------------------+
int CountPositions(int type)
{
   int count = 0;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == type)
            count++;
      }
   }
   return count;
}

//+------------------------------------------------------------------+
//| 指定タイプのポジションを全て決済                                      |
//+------------------------------------------------------------------+
void ClosePositions(int type)
{
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == type)
         {
            double closePrice = (type == OP_BUY) ? Bid : Ask;
            if(!OrderClose(OrderTicket(), OrderLots(), closePrice, 30, clrYellow))
               Print("OrderClose error: ", GetLastError());
         }
      }
   }
}
</code></pre>
<h3><span id="toc10">コードのポイント解説</span></h3>
<p><strong>① MagicNumberの活用</strong></p>
<p>MagicNumberを使うことで、このEAが出した注文だけを識別できます。手動注文や他のEAの注文を誤って決済してしまう事故を防げます。</p>
<p><strong>② 確定足（shift=1, 2）でクロスを検出</strong></p>
<p>2本前と1本前の確定足を比較してクロスを検出しています。現在の足（shift=0）を使うと、ティックごとに値が変わるためシグナルが不安定になります。</p>
<p><strong>③ 決済を逆方向ではなく0ラインで行う</strong></p>
<p>CCIが0ラインをクロスした時点で決済することで、利益の取りこぼしを減らす設計になっています。もちろん、SL/TPによる自動決済も併用しています。</p>
<h2><span id="toc11">応用テクニック：マルチタイムフレーム分析</span></h2>
<p>iCCI関数の第2引数（timeframe）を変えるだけで、<strong>上位足のCCIをフィルターとして使う</strong>ことができます。例えば、日足のCCIの方向に合わせてエントリーを絞り込む手法です。</p>
<pre><code class="language-mql4">// 上位足（日足）のCCIでトレンド方向を判定
double cciDaily = iCCI(NULL, PERIOD_D1, 14, PRICE_TYPICAL, 1);

// 現在の時間足のCCIでエントリータイミングを判定
double cciCurrent1 = iCCI(NULL, 0, 14, PRICE_TYPICAL, 1);
double cciCurrent2 = iCCI(NULL, 0, 14, PRICE_TYPICAL, 2);

// 日足CCIが0以上（上昇傾向）の時だけ買いエントリー
if(cciDaily > 0 && cciCurrent2 < -100 &#038;&#038; cciCurrent1 >= -100)
{
   // 買いエントリー処理
}

// 日足CCIが0以下（下降傾向）の時だけ売りエントリー
if(cciDaily < 0 &#038;&#038; cciCurrent2 > 100 && cciCurrent1 <= 100)
{
   // 売りエントリー処理
}
</code></pre>
<p>上位足のトレンド方向に逆らわないことで、ダマシのシグナルを大幅に減らすことが期待できます。</p>
<h2><span id="toc12">iCCI関数を使う際の注意点</span></h2>
<h3><span id="toc13">1. applied_priceの不一致に注意</span></h3>
<p>チャート上に表示しているCCIインジケーターと、iCCI関数で指定した<code>applied_price</code>が異なると、値がずれます。検証時は必ず同じ設定にしましょう。標準のCCIは<code>PRICE_TYPICAL</code>です。</p>
<h3><span id="toc14">2. レンジ相場での連続シグナルに注意</span></h3>
<p>CCIはモメンタム指標なので、レンジ相場では±100ラインを頻繁に行き来し、ダマシが多発します。移動平均線やADXなどのトレンドフィルターを組み合わせることをおすすめします。</p>
<h3><span id="toc15">3. 計算に必要なバー数</span></h3>
<p>CCIの計算には、指定した期間分のローソク足データが必要です。チャートのバー数が少ないと正確な値が得られません。バックテスト時は十分なヒストリカルデータを用意してください。</p>
<h2><span id="toc16">まとめ</span></h2>
<p>今回はMQL4の<strong>iCCI関数</strong>の使い方を、基本から実践的なEA作成まで解説しました。</p>
<ul>
<li><strong>iCCI関数</strong>は5つのパラメータでCCIの値を簡単に取得できる</li>
<li><strong>±100ラインのクロス</strong>をエントリーシグナルに、<strong>0ラインクロス</strong>を決済シグナルに使うのが王道的な手法</li>
<li><strong>確定足（shift=1以上）</strong>を使ってシグナル判定するのが安定した運用のコツ</li>
<li><strong>マルチタイムフレーム分析</strong>で上位足のトレンド方向にフィルターをかけると精度が向上する</li>
<li><strong>applied_price</strong>はチャート上のインジケーターと合わせることを忘れずに</li>
</ul>
<p>CCIはシンプルながら奥が深いインジケーターです。まずはサンプルEAをストラテジーテスターで動かしてみて、パラメータを変えながらCCIの振る舞いを体感してみてください！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13025/%e3%80%90mql4%e3%80%91icci%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%81cci%ef%bc%88%e5%95%86%e5%93%81%e3%83%81%e3%83%a3%e3%83%8d%e3%83%ab/">【MQL4】iCCI関数の使い方を徹底解説！CCI（商品チャネル指数）でトレンド転換を捉えるEAを作ろう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4】iMACD関数の使い方を徹底解説！MACDの値を取得してEAに組み込もう【サンプルコード付き】</title>
		<link>https://mql-programing.com/archives/13019/%e3%80%90mql4%e3%80%91imacd%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%81macd%e3%81%ae%e5%80%a4%e3%82%92%e5%8f%96%e5%be%97%e3%81%97/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Wed, 08 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<category><![CDATA[【辞書】MQLリファレンス]]></category>
		<category><![CDATA[EA開発]]></category>
		<category><![CDATA[インジケーター関数]]></category>
		<category><![CDATA[MACD]]></category>
		<category><![CDATA[iMACD]]></category>
		<category><![CDATA[MQL4]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13019</guid>

					<description><![CDATA[<p>「MACDのクロスで自動売買したい！」──テクニカル分析の定番指標MACDをEAに組み込むなら、まず覚えるべきなのがiMACD関数です。 この記事では、MQL4のiMACD関数の書式・引数の意味から、ゴールデンクロス・デ [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13019/%e3%80%90mql4%e3%80%91imacd%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%81macd%e3%81%ae%e5%80%a4%e3%82%92%e5%8f%96%e5%be%97%e3%81%97/">【MQL4】iMACD関数の使い方を徹底解説！MACDの値を取得してEAに組み込もう【サンプルコード付き】</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>「MACDのクロスで自動売買したい！」──テクニカル分析の定番指標MACDをEAに組み込むなら、まず覚えるべきなのが<strong>iMACD関数</strong>です。</p>
<p>この記事では、MQL4の<strong>iMACD関数</strong>の書式・引数の意味から、ゴールデンクロス・デッドクロスの判定ロジック、そして実際に動くEAのサンプルコードまで、ステップバイステップで解説します。初心者の方でも、この記事を読み終える頃にはMACDを使ったEAの原型が作れるようになるはずです。</p>
<h2><span id="toc1">MACDのおさらい</span></h2>
<p>コードの話に入る前に、MACD（Moving Average Convergence Divergence）の基本をおさらいしておきましょう。MACDは以下の<strong>3つの要素</strong>で構成されます。</p>
<h3><span id="toc2">MACDの3つの構成要素</span></h3>
<ul>
<li><strong>メインライン（MACDライン）</strong>：短期EMA（通常12期間）と長期EMA（通常26期間）の差</li>
<li><strong>シグナルライン</strong>：メインラインのEMA（通常9期間）</li>
<li><strong>ヒストグラム</strong>：メインライン − シグナルラインの差をバーで表示したもの</li>
</ul>
<h3><span id="toc3">基本的な売買シグナル</span></h3>
<ul>
<li><strong>ゴールデンクロス（買いシグナル）</strong>：メインラインがシグナルラインを下から上に抜ける</li>
<li><strong>デッドクロス（売りシグナル）</strong>：メインラインがシグナルラインを上から下に抜ける</li>
</ul>
<p>このクロスをプログラムで検出するのが、MACD系EAの基本中の基本です。</p>
<h2><span id="toc4">iMACD関数の書式と引数</span></h2>
<p>MQL4でMACDの値を取得するには、<strong>iMACD関数</strong>を使います。書式は以下のとおりです。</p>
<pre><code class="language-mql4">double iMACD(
   string       symbol,           // 通貨ペア名
   int          timeframe,        // 時間足
   int          fast_ema_period,  // 短期EMAの期間
   int          slow_ema_period,  // 長期EMAの期間
   int          signal_period,    // シグナルラインの期間
   int          applied_price,    // 適用価格
   int          mode,             // 取得するライン
   int          shift             // シフト（何本前のバーか）
);</code></pre>
<h3><span id="toc5">各引数の詳細</span></h3>
<table>
<thead>
<tr>
<th>引数</th>
<th>説明</th>
<th>よく使う値</th>
</tr>
</thead>
<tbody>
<tr>
<td>symbol</td>
<td>通貨ペア名。現在のチャートならNULL</td>
<td>NULL, Symbol()</td>
</tr>
<tr>
<td>timeframe</td>
<td>時間足。0で現在のチャートの時間足</td>
<td>0, PERIOD_H1 など</td>
</tr>
<tr>
<td>fast_ema_period</td>
<td>短期EMAの期間</td>
<td>12</td>
</tr>
<tr>
<td>slow_ema_period</td>
<td>長期EMAの期間</td>
<td>26</td>
</tr>
<tr>
<td>signal_period</td>
<td>シグナルラインの期間</td>
<td>9</td>
</tr>
<tr>
<td>applied_price</td>
<td>計算に使う価格の種類</td>
<td>PRICE_CLOSE</td>
</tr>
<tr>
<td>mode</td>
<td>取得するライン（後述）</td>
<td>MODE_MAIN, MODE_SIGNAL</td>
</tr>
<tr>
<td>shift</td>
<td>何本前のバーの値を取得するか</td>
<td>0（現在）, 1（1本前）</td>
</tr>
</tbody>
</table>
<h3><span id="toc6">modeパラメータの値</span></h3>
<p><strong>mode</strong>には以下の2つの定数を指定できます。</p>
<ul>
<li><strong>MODE_MAIN（0）</strong>：MACDメインラインの値を返す</li>
<li><strong>MODE_SIGNAL（1）</strong>：シグナルラインの値を返す</li>
</ul>
<p>なお、ヒストグラムの値は直接取得する定数がありません。<strong>メインライン − シグナルライン</strong>を自分で計算して求めます。</p>
<h3><span id="toc7">適用価格（applied_price）の定数一覧</span></h3>
<table>
<thead>
<tr>
<th>定数名</th>
<th>値</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>PRICE_CLOSE</td>
<td>0</td>
<td>終値</td>
</tr>
<tr>
<td>PRICE_OPEN</td>
<td>1</td>
<td>始値</td>
</tr>
<tr>
<td>PRICE_HIGH</td>
<td>2</td>
<td>高値</td>
</tr>
<tr>
<td>PRICE_LOW</td>
<td>3</td>
<td>安値</td>
</tr>
<tr>
<td>PRICE_MEDIAN</td>
<td>4</td>
<td>中央値 (High+Low)/2</td>
</tr>
<tr>
<td>PRICE_TYPICAL</td>
<td>5</td>
<td>代表値 (High+Low+Close)/3</td>
</tr>
<tr>
<td>PRICE_WEIGHTED</td>
<td>6</td>
<td>加重終値 (High+Low+Close+Close)/4</td>
</tr>
</tbody>
</table>
<p>特別な理由がなければ、<strong>PRICE_CLOSE（終値）</strong>を使うのが一般的です。</p>
<h2><span id="toc8">基本的な使い方</span></h2>
<p>まずは最もシンプルな使い方を見てみましょう。現在のチャートでMACDのメインラインとシグナルラインの値を取得するコードです。</p>
<pre><code class="language-mql4">void OnTick()
{
   // 1本前の確定バーからMACDメインラインの値を取得
   double macdMain = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1);
   
   // 1本前の確定バーからシグナルラインの値を取得
   double macdSignal = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 1);
   
   // ヒストグラムの値を計算
   double histogram = macdMain - macdSignal;
   
   // ログに出力して確認
   Print("MACD Main: ", macdMain, " Signal: ", macdSignal, " Histogram: ", histogram);
}</code></pre>
<p><strong>ポイント：</strong>shiftに<strong>1</strong>を指定しているのは、「1本前の確定したバー」の値を取得するためです。shift=0は現在形成中のバーなので値が変動します。売買判定にはshift=1以降の確定した値を使うのが基本です。</p>
<h2><span id="toc9">MACDクロス判定ロジック</span></h2>
<p>MACDのゴールデンクロス・デッドクロスを判定するには、<strong>1本前と2本前</strong>のバーの値を比較します。</p>
<pre><code class="language-mql4">// --- 1本前のバー（直近の確定バー）---
double macdMain1   = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1);
double macdSignal1 = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 1);

// --- 2本前のバー ---
double macdMain2   = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 2);
double macdSignal2 = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 2);

// ゴールデンクロス判定：2本前ではメインがシグナル以下 → 1本前でメインがシグナルを超えた
bool goldenCross = (macdMain2 <= macdSignal2) &#038;&#038; (macdMain1 > macdSignal1);

// デッドクロス判定：2本前ではメインがシグナル以上 → 1本前でメインがシグナルを下回った
bool deadCross = (macdMain2 >= macdSignal2) && (macdMain1 < macdSignal1);</code></pre>
<p>この「2時点を比較してクロスを検出する」パターンは、移動平均線やRSIなど他のインジケーターでも応用できる重要なテクニックです。</p>
<h2><span id="toc10">実践！MACDクロスEAのサンプルコード</span></h2>
<p>ここからは、MACDのゴールデンクロスで買い、デッドクロスで売り（ドテン方式）のEAを作ってみましょう。実際にMT4で動作する完全なコードです。</p>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//|                                              MACD_Cross_EA.mq4   |
//|                        MACDクロスで売買するシンプルなEA            |
//+------------------------------------------------------------------+
#property strict

// --- 入力パラメータ ---
input int    FastEMA        = 12;          // 短期EMA期間
input int    SlowEMA        = 26;          // 長期EMA期間
input int    SignalPeriod    = 9;           // シグナル期間
input double LotSize        = 0.1;         // ロット数
input int    MagicNumber    = 20240101;    // マジックナンバー
input int    Slippage       = 3;           // スリッページ（ポイント）

//+------------------------------------------------------------------+
//| 新しいバーが形成されたか判定する関数                                |
//+------------------------------------------------------------------+
bool IsNewBar()
{
   static datetime lastBarTime = 0;
   datetime currentBarTime = iTime(NULL, 0, 0);
   
   if(lastBarTime != currentBarTime)
   {
      lastBarTime = currentBarTime;
      return true;
   }
   return false;
}

//+------------------------------------------------------------------+
//| 自分のEAが持つポジションの種類を返す関数                           |
//| 戻り値: 1=買いポジあり, -1=売りポジあり, 0=ポジなし                |
//+------------------------------------------------------------------+
int GetMyPosition()
{
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
            if(OrderType() == OP_BUY)  return 1;
            if(OrderType() == OP_SELL) return -1;
         }
      }
   }
   return 0;
}

//+------------------------------------------------------------------+
//| 自分のEAが持つポジションを全決済する関数                           |
//+------------------------------------------------------------------+
void CloseMyPositions(int posType)
{
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
            if(posType == 1 && OrderType() == OP_BUY)
               OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clrNone);
            if(posType == -1 && OrderType() == OP_SELL)
               OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clrNone);
         }
      }
   }
}

//+------------------------------------------------------------------+
//| メインのティック処理                                               |
//+------------------------------------------------------------------+
void OnTick()
{
   // 新しいバーが形成されたときだけ処理する
   if(!IsNewBar()) return;
   
   // --- MACDの値を取得 ---
   double macdMain1   = iMACD(NULL, 0, FastEMA, SlowEMA, SignalPeriod, PRICE_CLOSE, MODE_MAIN, 1);
   double macdSignal1 = iMACD(NULL, 0, FastEMA, SlowEMA, SignalPeriod, PRICE_CLOSE, MODE_SIGNAL, 1);
   double macdMain2   = iMACD(NULL, 0, FastEMA, SlowEMA, SignalPeriod, PRICE_CLOSE, MODE_MAIN, 2);
   double macdSignal2 = iMACD(NULL, 0, FastEMA, SlowEMA, SignalPeriod, PRICE_CLOSE, MODE_SIGNAL, 2);
   
   // --- クロス判定 ---
   bool goldenCross = (macdMain2 <= macdSignal2) &#038;&#038; (macdMain1 > macdSignal1);
   bool deadCross   = (macdMain2 >= macdSignal2) && (macdMain1 < macdSignal1);
   
   // --- 現在のポジション状態を取得 ---
   int myPos = GetMyPosition();
   
   // --- ゴールデンクロス → 買いエントリー ---
   if(goldenCross)
   {
      // 売りポジションがあれば先に決済
      if(myPos == -1) CloseMyPositions(-1);
      
      // 買いポジションがなければ新規注文
      if(GetMyPosition() != 1)
      {
         int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, 0, 0,
                                "MACD GC Buy", MagicNumber, 0, clrBlue);
         if(ticket < 0)
            Print("Buy OrderSend Error: ", GetLastError());
         else
            Print("Buy Order Success! Ticket: ", ticket);
      }
   }
   
   // --- デッドクロス → 売りエントリー ---
   if(deadCross)
   {
      // 買いポジションがあれば先に決済
      if(myPos == 1) CloseMyPositions(1);
      
      // 売りポジションがなければ新規注文
      if(GetMyPosition() != -1)
      {
         int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, 0, 0,
                                "MACD DC Sell", MagicNumber, 0, clrRed);
         if(ticket < 0)
            Print("Sell OrderSend Error: ", GetLastError());
         else
            Print("Sell Order Success! Ticket: ", ticket);
      }
   }
}</code></pre>
<h3><span id="toc11">サンプルEAのポイント解説</span></h3>
<ul>
<li><strong>IsNewBar関数</strong>：新しいバーが形成されたときだけ処理を実行します。これにより無駄な重複注文を防ぎます。</li>
<li><strong>MagicNumber</strong>：このEAが出した注文を識別するための番号です。他のEAや手動注文と区別できます。</li>
<li><strong>ドテン方式</strong>：ゴールデンクロスで買いに転換、デッドクロスで売りに転換する仕組みです。反対ポジションを先に決済してから新規注文を出します。</li>
<li><strong>GetMyPosition関数</strong>：自分のEAが持つポジションの状態を調べる関数です。ポジション管理はEA開発で必須のテクニックです。</li>
</ul>
<h2><span id="toc12">応用：ゼロラインフィルターでダマシを減らす</span></h2>
<p>MACDクロスだけだと「ダマシ」（偽のシグナル）が多くなりがちです。精度を上げるテクニックとして、<strong>ゼロラインフィルター</strong>があります。</p>
<p>考え方はシンプルです。</p>
<ul>
<li><strong>買いシグナル</strong>：ゴールデンクロス かつ MACDメインラインが<strong>ゼロより下</strong>で発生したとき（底からの反転を狙う）</li>
<li><strong>売りシグナル</strong>：デッドクロス かつ MACDメインラインが<strong>ゼロより上</strong>で発生したとき（天井からの反転を狙う）</li>
</ul>
<p>コードに組み込むなら、クロス判定の条件に1行追加するだけです。</p>
<pre><code class="language-mql4">// ゼロラインフィルター付きのゴールデンクロス判定
bool filteredGoldenCross = goldenCross && (macdMain1 < 0);

// ゼロラインフィルター付きのデッドクロス判定
bool filteredDeadCross = deadCross &#038;&#038; (macdMain1 > 0);</code></pre>
<p>たった1行の条件追加ですが、トレンドの初動を捉えやすくなり、レンジ相場でのダマシを軽減できます。バックテストで効果を確認してみてください。</p>
<h2><span id="toc13">注意点・よくあるつまずきポイント</span></h2>
<h3><span id="toc14">1. MT4とMT5でMACDの表示が異なる</span></h3>
<p>MT4のMACDインジケーターでは、<strong>メインラインがヒストグラム（バー）</strong>で表示され、シグナルラインが点線で表示されます。一方MT5では、メインラインもシグナルラインも<strong>ライン</strong>で表示され、別途ヒストグラムが描画されます。見た目は違いますが、iMACD関数で取得できる値の意味は同じです。</p>
<h3><span id="toc15">2. ヒストグラムは自分で計算する</span></h3>
<p>iMACD関数にはヒストグラムを直接取得するモードがありません。ヒストグラムが必要な場合は、以下のように計算してください。</p>
<pre><code class="language-mql4">double histogram = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1)
                 - iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 1);</code></pre>
<h3><span id="toc16">3. マルチタイムフレーム分析に使える</span></h3>
<p>iMACD関数の第2引数（timeframe）を変えれば、現在のチャートと違う時間足のMACDを取得できます。例えば、5分足チャート上で1時間足のMACDを確認してフィルターに使う、といった活用が可能です。</p>
<pre><code class="language-mql4">// 1時間足のMACDメインラインを取得
double macdH1 = iMACD(NULL, PERIOD_H1, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1);</code></pre>
<h3><span id="toc17">4. 引数の順番に注意</span></h3>
<p>iMACD関数は引数が8つもあるため、順番を間違えやすいです。特に<strong>mode</strong>と<strong>shift</strong>を逆にするミスはよくあります。迷ったら公式リファレンスで確認する習慣をつけましょう。</p>
<h2><span id="toc18">まとめ</span></h2>
<p>この記事では、MQL4の<strong>iMACD関数</strong>について以下のポイントを解説しました。</p>
<ul>
<li>iMACD関数は<strong>8つの引数</strong>を持ち、MACDのメインラインとシグナルラインの値を取得できる</li>
<li>クロス判定は<strong>shift=1とshift=2</strong>の値を比較して行う</li>
<li>EA開発では<strong>新規バー判定</strong>・<strong>マジックナンバー管理</strong>・<strong>ポジション管理関数</strong>が重要</li>
<li><strong>ゼロラインフィルター</strong>を追加するだけでダマシを軽減できる</li>
<li>MT4とMT5でMACDの<strong>表示方法が異なる</strong>点に注意</li>
</ul>
<p>今回のサンプルEAはシンプルな構成ですが、ストップロスやテイクプロフィット、トレーリングストップなどを追加していくことで、より実践的なEAに育てていくことができます。まずはバックテストで動作を確認し、少しずつカスタマイズしてみてください！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13019/%e3%80%90mql4%e3%80%91imacd%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%81macd%e3%81%ae%e5%80%a4%e3%82%92%e5%8f%96%e5%be%97%e3%81%97/">【MQL4】iMACD関数の使い方を徹底解説！MACDの値を取得してEAに組み込もう【サンプルコード付き】</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4入門】iBands関数でボリンジャーバンドを使いこなそう！引数・使い方・サンプルコード徹底解説</title>
		<link>https://mql-programing.com/archives/12997/%e3%80%90mql4%e5%85%a5%e9%96%80%e3%80%91ibands%e9%96%a2%e6%95%b0%e3%81%a7%e3%83%9c%e3%83%aa%e3%83%b3%e3%82%b8%e3%83%a3%e3%83%bc%e3%83%90%e3%83%b3%e3%83%89%e3%82%92%e4%bd%bf%e3%81%84%e3%81%93%e3%81%aa/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Fri, 03 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【初級編】MQLプログラミング基礎]]></category>
		<category><![CDATA[iBands]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[EA開発]]></category>
		<category><![CDATA[ボリンジャーバンド]]></category>
		<category><![CDATA[インジケーター関数]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=12997</guid>

					<description><![CDATA[<p>ボリンジャーバンドは、移動平均線を中心に「価格の散らばり具合（標準偏差）」を帯（バンド）として表示するテクニカル指標です。MQL4には、このボリンジャーバンドの値をプログラムから簡単に取得できるiBands関数が用意され [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/12997/%e3%80%90mql4%e5%85%a5%e9%96%80%e3%80%91ibands%e9%96%a2%e6%95%b0%e3%81%a7%e3%83%9c%e3%83%aa%e3%83%b3%e3%82%b8%e3%83%a3%e3%83%bc%e3%83%90%e3%83%b3%e3%83%89%e3%82%92%e4%bd%bf%e3%81%84%e3%81%93%e3%81%aa/">【MQL4入門】iBands関数でボリンジャーバンドを使いこなそう！引数・使い方・サンプルコード徹底解説</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>ボリンジャーバンドは、移動平均線を中心に「価格の散らばり具合（標準偏差）」を帯（バンド）として表示するテクニカル指標です。MQL4には、このボリンジャーバンドの値をプログラムから簡単に取得できる<strong>iBands関数</strong>が用意されています。</p>
<p>この記事では、iBands関数の引数の意味をひとつずつ丁寧に解説し、基本的な使い方から逆張りEAのサンプルコード、さらに応用テクニックやよくある間違いまで、徹底的にまとめました。ボリンジャーバンドをEAやインジケーターで活用したい方は、ぜひ最後まで読んでみてください。</p>
<h2><span id="toc1">ボリンジャーバンドとは？</span></h2>
<p>ボリンジャーバンドは、アメリカの投資家ジョン・ボリンジャー氏が考案したテクニカル指標で、以下の<strong>3本のライン</strong>で構成されます。</p>
<ul>
<li><strong>ミドルバンド（中間線）</strong>：単純移動平均線（SMA）そのもの</li>
<li><strong>アッパーバンド（上方バンド）</strong>：ミドルバンド ＋ 標準偏差 × n</li>
<li><strong>ロワーバンド（下方バンド）</strong>：ミドルバンド − 標準偏差 × n</li>
</ul>
<p>ここで「n」は標準偏差の倍率で、一般的には<strong>2σ（シグマ）</strong>がよく使われます。統計的には、価格が±2σの範囲に収まる確率は約95.4%とされています。この性質を利用して、バンドの上端・下端にタッチしたら逆張りする戦略や、バンドをブレイクした方向に順張りする戦略などに活用されます。</p>
<h2><span id="toc2">iBands関数の基本構文</span></h2>
<p>MQL4でボリンジャーバンドの値を取得するには、組み込み関数<code>iBands</code>を使います。基本構文は以下のとおりです。</p>
<pre><code class="language-mql4">double iBands(
   string       symbol,           // ① 通貨ペア名
   int          timeframe,        // ② 時間足
   int          period,           // ③ 計算期間
   double       deviation,        // ④ 標準偏差の倍率
   int          bands_shift,      // ⑤ インジケーターのシフト数
   int          applied_price,    // ⑥ 適用価格
   int          mode,             // ⑦ ライン種類
   int          shift             // ⑧ シフト数（何本前のバーか）
);</code></pre>
<p>戻り値は<strong>double型</strong>で、指定した条件のボリンジャーバンドの値（価格）が返されます。引数が8つあるため少し多く感じますが、ひとつずつ見ていけば難しくありません。</p>
<h2><span id="toc3">各引数の詳細解説</span></h2>
<h3><span id="toc4">① symbol（通貨ペア名）</span></h3>
<p>計算対象の通貨ペアを文字列で指定します。現在のチャートの通貨ペアを使いたい場合は<code>NULL</code>または<code>Symbol()</code>を指定します。</p>
<pre><code class="language-mql4">// 現在のチャートの通貨ペアを使う場合
iBands(NULL, ...)
iBands(Symbol(), ...)

// 別の通貨ペアを指定する場合
iBands("USDJPY", ...)</code></pre>
<h3><span id="toc5">② timeframe（時間足）</span></h3>
<p>計算に使う時間足を指定します。現在のチャートの時間足を使う場合は<code>0</code>または<code>PERIOD_CURRENT</code>を指定します。</p>
<table>
<thead>
<tr>
<th>定数</th>
<th>値</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td>PERIOD_CURRENT</td>
<td>0</td>
<td>現在のチャートの時間足</td>
</tr>
<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_M15</td>
<td>15</td>
<td>15分足</td>
</tr>
<tr>
<td>PERIOD_M30</td>
<td>30</td>
<td>30分足</td>
</tr>
<tr>
<td>PERIOD_H1</td>
<td>60</td>
<td>1時間足</td>
</tr>
<tr>
<td>PERIOD_H4</td>
<td>240</td>
<td>4時間足</td>
</tr>
<tr>
<td>PERIOD_D1</td>
<td>1440</td>
<td>日足</td>
</tr>
<tr>
<td>PERIOD_W1</td>
<td>10080</td>
<td>週足</td>
</tr>
<tr>
<td>PERIOD_MN1</td>
<td>43200</td>
<td>月足</td>
</tr>
</tbody>
</table>
<h3><span id="toc6">③ period（計算期間）</span></h3>
<p>移動平均線の計算に使うバーの本数を指定します。一般的には<strong>20</strong>がよく使われます。期間を短くするとバンドが価格に敏感に反応し、長くすると滑らかになります。</p>
<h3><span id="toc7">④ deviation（標準偏差の倍率）</span></h3>
<p>バンドの幅を決める標準偏差の倍率です。一般的には<strong>2.0</strong>が使われます。1.0を指定すれば±1σ、3.0なら±3σのバンドが取得できます。</p>
<h3><span id="toc8">⑤ bands_shift（インジケーターのシフト数）</span></h3>
<p>ボリンジャーバンド全体を左右にずらす本数です。通常は<strong>0</strong>を指定します。正の値を指定するとバンドが右（未来方向）にずれます。特殊な用途でない限り0で問題ありません。</p>
<h3><span id="toc9">⑥ applied_price（適用価格）</span></h3>
<p>計算に使う価格の種類を指定します。通常は<strong>PRICE_CLOSE（終値）</strong>を使います。</p>
<table>
<thead>
<tr>
<th>定数</th>
<th>値</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td>PRICE_CLOSE</td>
<td>0</td>
<td>終値</td>
</tr>
<tr>
<td>PRICE_OPEN</td>
<td>1</td>
<td>始値</td>
</tr>
<tr>
<td>PRICE_HIGH</td>
<td>2</td>
<td>高値</td>
</tr>
<tr>
<td>PRICE_LOW</td>
<td>3</td>
<td>安値</td>
</tr>
<tr>
<td>PRICE_MEDIAN</td>
<td>4</td>
<td>中間価格 (High+Low)/2</td>
</tr>
<tr>
<td>PRICE_TYPICAL</td>
<td>5</td>
<td>典型的な価格 (High+Low+Close)/3</td>
</tr>
<tr>
<td>PRICE_WEIGHTED</td>
<td>6</td>
<td>加重終値 (High+Low+Close+Close)/4</td>
</tr>
</tbody>
</table>
<h3><span id="toc10">⑦ mode（ライン種類）</span></h3>
<p>取得したいラインを指定します。<strong>iBands関数は1回の呼び出しで1本のラインの値しか返さない</strong>ため、3本すべてを取得するには3回呼び出す必要があります。</p>
<table>
<thead>
<tr>
<th>定数</th>
<th>値</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td>MODE_MAIN</td>
<td>0</td>
<td>ミドルバンド（中間線・移動平均線）</td>
</tr>
<tr>
<td>MODE_UPPER</td>
<td>1</td>
<td>アッパーバンド（上方バンド）</td>
</tr>
<tr>
<td>MODE_LOWER</td>
<td>2</td>
<td>ロワーバンド（下方バンド）</td>
</tr>
</tbody>
</table>
<h3><span id="toc11">⑧ shift（シフト数）</span></h3>
<p>何本前のバーの値を取得するかを指定します。<strong>0が現在のバー</strong>（まだ確定していないバー）、1が1本前の確定済みバー、2が2本前…という意味です。</p>
<p>EA（自動売買）で売買判断に使う場合は、確定済みの値である<strong>shift=1</strong>を使うのが一般的です。shift=0は現在足の値なのでティックごとに変動し、判断がブレやすくなるためです。</p>
<h2><span id="toc12">基本的な使用例</span></h2>
<p>まずは最もシンプルな例として、現在のチャートで期間20・偏差2.0のボリンジャーバンド3本の値を取得してみましょう。</p>
<pre><code class="language-mql4">void OnTick()
{
   // 1本前の確定足でボリンジャーバンドの値を取得
   double upper = iBands(NULL, 0, 20, 2.0, 0, PRICE_CLOSE, MODE_UPPER, 1);
   double middle = iBands(NULL, 0, 20, 2.0, 0, PRICE_CLOSE, MODE_MAIN,  1);
   double lower = iBands(NULL, 0, 20, 2.0, 0, PRICE_CLOSE, MODE_LOWER, 1);

   // ログに出力して確認
   Print("Upper: ", upper, " | Middle: ", middle, " | Lower: ", lower);
}</code></pre>
<p>このコードでは、3つのiBands呼び出しで<code>mode</code>引数だけを変えて、上方バンド・中間線・下方バンドの3つの値をそれぞれ取得しています。それ以外の引数はすべて同じ値を指定します。</p>
<h2><span id="toc13">実践サンプル：ボリンジャーバンド逆張りEA</span></h2>
<p>ここでは、ボリンジャーバンドの±2σを使ったシンプルな逆張りEAを作ってみましょう。ロジックは以下のとおりです。</p>
<ul>
<li><strong>買いエントリー</strong>：1本前の終値がロワーバンド（-2σ）を下回ったら買い</li>
<li><strong>売りエントリー</strong>：1本前の終値がアッパーバンド（+2σ）を上回ったら売り</li>
<li><strong>決済</strong>：ミドルバンドに到達したら決済</li>
</ul>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| ボリンジャーバンド逆張りEA                                         |
//+------------------------------------------------------------------+
#property strict

// 入力パラメーター
input int    BB_Period    = 20;     // ボリンジャーバンドの期間
input double BB_Deviation = 2.0;    // 標準偏差の倍率
input double Lots         = 0.1;    // ロット数
input int    Slippage     = 3;      // スリッページ
input int    MagicNumber  = 12345;  // マジックナンバー

//+------------------------------------------------------------------+
//| OnTick関数                                                        |
//+------------------------------------------------------------------+
void OnTick()
{
   // ボリンジャーバンドの各ラインを取得（1本前の確定足）
   double upper  = iBands(NULL, 0, BB_Period, BB_Deviation, 0, PRICE_CLOSE, MODE_UPPER, 1);
   double middle = iBands(NULL, 0, BB_Period, BB_Deviation, 0, PRICE_CLOSE, MODE_MAIN,  1);
   double lower  = iBands(NULL, 0, BB_Period, BB_Deviation, 0, PRICE_CLOSE, MODE_LOWER, 1);

   // 1本前の終値
   double prevClose = Close[1];

   // 現在のポジション数を確認
   int buyCount  = CountOrders(OP_BUY);
   int sellCount = CountOrders(OP_SELL);

   // --- エントリーロジック ---
   // 買いエントリー：終値がロワーバンドを下回った
   if(buyCount == 0 && prevClose < lower)
   {
      int ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0,
                             "BB Buy", MagicNumber, 0, clrBlue);
      if(ticket < 0)
         Print("Buy OrderSend Error: ", GetLastError());
   }

   // 売りエントリー：終値がアッパーバンドを上回った
   if(sellCount == 0 &#038;&#038; prevClose > upper)
   {
      int ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0,
                             "BB Sell", MagicNumber, 0, clrRed);
      if(ticket < 0)
         Print("Sell OrderSend Error: ", GetLastError());
   }

   // --- 決済ロジック：ミドルバンドに到達したら決済 ---
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;

      // 現在のバーのミドルバンドを取得（決済判断用）
      double currentMiddle = iBands(NULL, 0, BB_Period, BB_Deviation, 0, PRICE_CLOSE, MODE_MAIN, 0);

      if(OrderType() == OP_BUY && Bid >= currentMiddle)
      {
         if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clrBlue))
            Print("Buy OrderClose Error: ", GetLastError());
      }
      else if(OrderType() == OP_SELL && Ask <= currentMiddle)
      {
         if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clrRed))
            Print("Sell OrderClose Error: ", GetLastError());
      }
   }
}

//+------------------------------------------------------------------+
//| 指定タイプのポジション数をカウントする関数                          |
//+------------------------------------------------------------------+
int CountOrders(int orderType)
{
   int count = 0;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == orderType)
         count++;
   }
   return count;
}</code></pre>
<p>このEAのポイントをまとめます。</p>
<ul>
<li><strong>エントリー判断はshift=1</strong>（確定足）を使い、値がブレないようにしています</li>
<li><strong>決済判断はshift=0</strong>（現在足）を使い、リアルタイムの価格とミドルバンドを比較しています</li>
<li><strong>CountOrders関数</strong>でポジション数を確認し、同方向に重複エントリーしないようにしています</li>
<li><strong>MagicNumber</strong>を使うことで、他のEAのポジションと区別しています</li>
</ul>
<h2><span id="toc14">応用テクニック</span></h2>
<h3><span id="toc15">複数のσを同時に使う</span></h3>
<p>ボリンジャーバンドの±1σ、±2σ、±3σを同時に取得すれば、より細かい分析が可能です。deviation引数を変えるだけで実現できます。</p>
<pre><code class="language-mql4">// ±1σ
double upper1 = iBands(NULL, 0, 20, 1.0, 0, PRICE_CLOSE, MODE_UPPER, 1);
double lower1 = iBands(NULL, 0, 20, 1.0, 0, PRICE_CLOSE, MODE_LOWER, 1);

// ±2σ
double upper2 = iBands(NULL, 0, 20, 2.0, 0, PRICE_CLOSE, MODE_UPPER, 1);
double lower2 = iBands(NULL, 0, 20, 2.0, 0, PRICE_CLOSE, MODE_LOWER, 1);

// ±3σ
double upper3 = iBands(NULL, 0, 20, 3.0, 0, PRICE_CLOSE, MODE_UPPER, 1);
double lower3 = iBands(NULL, 0, 20, 3.0, 0, PRICE_CLOSE, MODE_LOWER, 1);</code></pre>
<p>たとえば「±1σの範囲内ならレンジ相場と判断し取引を控える」「±3σにタッチしたら強い逆張りシグナル」といった使い方ができます。</p>
<h3><span id="toc16">バンド幅でボラティリティを判定する</span></h3>
<p>アッパーバンドとロワーバンドの差を計算すれば、バンド幅（ボラティリティの目安）が分かります。</p>
<pre><code class="language-mql4">double upper  = iBands(NULL, 0, 20, 2.0, 0, PRICE_CLOSE, MODE_UPPER, 1);
double lower  = iBands(NULL, 0, 20, 2.0, 0, PRICE_CLOSE, MODE_LOWER, 1);

// バンド幅を計算
double bandWidth = upper - lower;

// バンド幅をポイント単位に変換（通貨ペアの桁数に応じて調整）
double bandWidthPoints = bandWidth / Point;

// ボラティリティ判定の例
if(bandWidthPoints < 200)
{
   Print("スクイーズ状態（低ボラティリティ）：バンド幅 = ", bandWidthPoints, " points");
   // → この後のブレイクアウトに備える
}
else if(bandWidthPoints > 500)
{
   Print("エクスパンション状態（高ボラティリティ）：バンド幅 = ", bandWidthPoints, " points");
   // → トレンドフォロー戦略を検討
}</code></pre>
<p>バンドが極端に狭くなった状態（<strong>スクイーズ</strong>）は、その後大きなトレンドが発生する前兆とされています。バンドが急激に広がった状態（<strong>エクスパンション</strong>）はトレンドが発生中であることを示します。</p>
<h2><span id="toc17">よくある間違いと注意点</span></h2>
<h3><span id="toc18">shift=0は未確定の値</span></h3>
<p>最も多い間違いのひとつが、<code>shift=0</code>の値でエントリー判断をしてしまうことです。shift=0は現在のバー（まだローソク足が確定していない状態）の値なので、ティックが来るたびに値が変わります。</p>
<p>エントリー条件にはshift=1（確定済みのバー）を使うようにしましょう。バックテストとリアルトレードの結果が大きくずれる原因にもなります。</p>
<h3><span id="toc19">MODE定数の取り違え</span></h3>
<p>iBands関数のmode引数で使う定数と、iMACD関数などの他のインジケーター関数のmode定数は名前が似ていても意味が異なる場合があります。iBandsでは<code>MODE_MAIN</code>（0）、<code>MODE_UPPER</code>（1）、<code>MODE_LOWER</code>（2）の3つを使います。</p>
<p>特に<code>MODE_MAIN</code>はiMACD関数でも使われる定数ですが、iBandsではミドルバンド（移動平均線）を意味します。関数ごとにどの定数がどのラインを表すか確認しましょう。</p>
<h3><span id="toc20">マルチタイムフレームでの注意</span></h3>
<p>timeframe引数に現在のチャートと異なる時間足を指定すると、上位足のボリンジャーバンドを取得できます。しかし、いくつか注意点があります。</p>
<pre><code class="language-mql4">// 1時間足チャートで日足のボリンジャーバンドを取得
double dailyUpper = iBands(NULL, PERIOD_D1, 20, 2.0, 0, PRICE_CLOSE, MODE_UPPER, 1);</code></pre>
<ul>
<li>上位足のデータが十分にダウンロードされていないとエラーや不正確な値が返されることがあります</li>
<li>上位足のshift=0は上位足の現在のバーを指すため、確定タイミングがチャート時間足とは異なります</li>
<li>バックテストでは「全ティック」モデルを使わないとマルチタイムフレームの値が正しく取得できない場合があります</li>
</ul>
<h2><span id="toc21">まとめ</span></h2>
<p>この記事では、MQL4の<strong>iBands関数</strong>について、基本構文から各引数の詳細、実践的なEAサンプル、応用テクニックまで解説しました。最後にポイントを整理します。</p>
<ul>
<li>iBands関数は<strong>8つの引数</strong>を持ち、ボリンジャーバンドの値をdouble型で返す</li>
<li><strong>mode引数</strong>でMODE_MAIN（中間線）、MODE_UPPER（上方バンド）、MODE_LOWER（下方バンド）を切り替える</li>
<li>3本のラインを取得するには<strong>iBandsを3回呼び出す</strong>必要がある</li>
<li>エントリー判断には<strong>shift=1</strong>（確定足）を使うのが基本</li>
<li>deviation引数を変えることで、±1σ/±2σ/±3σなど複数のバンドを簡単に取得できる</li>
<li>バンド幅の計算で<strong>ボラティリティの判定</strong>（スクイーズ・エクスパンション）にも活用できる</li>
</ul>
<p>iBands関数はシンプルながらも応用範囲が広い関数です。まずは基本的な使い方をマスターし、他のテクニカル指標と組み合わせたり、エントリー条件を工夫したりして、自分だけのEA開発に挑戦してみてください！</p>
<p>投稿 <a href="https://mql-programing.com/archives/12997/%e3%80%90mql4%e5%85%a5%e9%96%80%e3%80%91ibands%e9%96%a2%e6%95%b0%e3%81%a7%e3%83%9c%e3%83%aa%e3%83%b3%e3%82%b8%e3%83%a3%e3%83%bc%e3%83%90%e3%83%b3%e3%83%89%e3%82%92%e4%bd%bf%e3%81%84%e3%81%93%e3%81%aa/">【MQL4入門】iBands関数でボリンジャーバンドを使いこなそう！引数・使い方・サンプルコード徹底解説</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
