<?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>EA自動売買 アーカイブ - 自動売買を作ろう！</title>
	<atom:link href="https://mql-programing.com/archives/tag/ea%E8%87%AA%E5%8B%95%E5%A3%B2%E8%B2%B7/feed/" rel="self" type="application/rss+xml" />
	<link>https://mql-programing.com/archives/tag/ea自動売買/</link>
	<description>MQLプログラミング学習サイト</description>
	<lastBuildDate>Wed, 01 Apr 2026 03:43:44 +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>EA自動売買 アーカイブ - 自動売買を作ろう！</title>
	<link>https://mql-programing.com/archives/tag/ea自動売買/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【MQL4】iCustom関数の使い方を徹底解説！カスタムインジケーターをEAから呼び出す方法とサンプルコード</title>
		<link>https://mql-programing.com/archives/13043/%e3%80%90mql4%e3%80%91icustom%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%82%ab%e3%82%b9%e3%82%bf%e3%83%a0%e3%82%a4%e3%83%b3%e3%82%b8/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Thu, 16 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[注文関係]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[EA自動売買]]></category>
		<category><![CDATA[iCustom]]></category>
		<category><![CDATA[カスタムインジケーター]]></category>
		<category><![CDATA[サンプルコード]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13043</guid>

					<description><![CDATA[<p>「お気に入りのインジケーターを使って自動売買したい！」——そんな夢を叶えてくれるのが、MQL4のiCustom関数です。 iCustom関数を使えば、MT4のIndicatorsフォルダにあるカスタムインジケーターの値を [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13043/%e3%80%90mql4%e3%80%91icustom%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%82%ab%e3%82%b9%e3%82%bf%e3%83%a0%e3%82%a4%e3%83%b3%e3%82%b8/">【MQL4】iCustom関数の使い方を徹底解説！カスタムインジケーターをEAから呼び出す方法とサンプルコード</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>「お気に入りのインジケーターを使って自動売買したい！」——そんな夢を叶えてくれるのが、MQL4の<strong>iCustom関数</strong>です。</p>
<p>iCustom関数を使えば、MT4の<strong>Indicatorsフォルダにあるカスタムインジケーターの値をEA（エキスパートアドバイザー）から自由に取得</strong>できます。つまり、チャート上で矢印やラインを表示するインジケーターのシグナルを、そのまま自動売買のロジックに組み込めるのです。</p>
<p>この記事では、iCustom関数の基本的な構文から、実践的なサンプルコードまで、初心者にもわかりやすく解説していきます。</p>
<h2><span id="toc1">iCustom関数とは？</span></h2>
<p>iCustom関数は、<strong>指定したカスタムインジケーターの計算結果（バッファの値）を取得する</strong>MQL4の組み込み関数です。</p>
<p>MT4にはiMA（移動平均線）やiRSI（RSI）など、標準インジケーター用の関数が用意されていますが、自作のインジケーターやネットで配布されているインジケーターにはこうした専用関数がありません。そこで活躍するのがiCustom関数です。</p>
<p>iCustom関数を利用すると、Indicatorsフォルダに保存されているあらゆるカスタムインジケーターの値を取得できます。これにより、インジケーターのシグナルをEAのエントリー条件・決済条件として使うことが可能になります。</p>
<h2><span id="toc2">iCustom関数の構文（シンタックス）</span></h2>
<p>iCustom関数の基本構文は以下の通りです。</p>
<pre><code class="language-mql4">double iCustom(
    string symbol,      // 通貨ペア（NULLで現在のチャート）
    int    timeframe,    // 時間足（0で現在の時間足）
    string name,         // カスタムインジケーター名
    ...                  // インジケーターの入力パラメーター（可変）
    int    mode,         // バッファ番号（0〜7）
    int    shift         // 取得するバーの位置（0が最新）
);
</code></pre>
<p>各パラメーターの意味を詳しく見ていきましょう。</p>
<h3><span id="toc3">① symbol（通貨ペア）</span></h3>
<p>値を取得したい通貨ペアを文字列で指定します。現在のチャートの通貨ペアを指定する場合は <code>NULL</code> または <code>_Symbol</code> を使います。別の通貨ペアを指定したい場合は <code>"USDJPY"</code> のように気配値表示ウィンドウの表記通りに記述します。</p>
<h3><span id="toc4">② timeframe（時間足）</span></h3>
<p>時間軸の種類を指定します。現在のチャートの時間足を使う場合は <code>0</code> または <code>PERIOD_CURRENT</code> を指定します。別の時間足を指定する場合は、以下の定数を使います。</p>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse: collapse; margin: 16px 0;">
<tr style="background-color: #f0f0f0;">
<th>定数</th>
<th>値</th>
<th>意味</th>
</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>
</table>
<h3><span id="toc5">③ name（インジケーター名）</span></h3>
<p>カスタムインジケーター名を文字列で指定します。指定するカスタムインジケーターの.ex4ファイルが、MQL4\Indicatorsフォルダまたはそのサブフォルダに保存されている必要があります。</p>
<p>サブディレクトリに配置されている場合は、&#8221;サブディレクトリ名\\カスタムインジケータ名&#8221;で指定します。</p>
<pre><code class="language-mql4">// Indicatorsフォルダ直下の場合
iCustom(NULL, 0, "MyIndicator", ...);

// サブフォルダ「Examples」内の場合
iCustom(NULL, 0, "Examples\\MyIndicator", ...);
</code></pre>
<h3><span id="toc6">④ &#8230;（インジケーターの入力パラメーター）</span></h3>
<p>カスタムインジケータの入力パラメータです。渡された入力パラメータの順序は、カスタムインジケータの宣言順に対応する必要があります。ここが一番混乱しやすいポイントです。</p>
<p>パラメーターを省略した場合は、インジケーター側のデフォルト値が使用されます。ただし、<strong>途中のパラメーターだけを省略することはできません</strong>。変更したいパラメーターより前のパラメーターは、すべてデフォルト値であっても記述する必要があります。</p>
<h3><span id="toc7">⑤ mode（バッファ番号）</span></h3>
<p>取得したいインジケーターバッファのインデックス番号（0〜7）を指定します。最初のバッファはmode=0です。</p>
<p>例えば、ボリンジャーバンドのようなインジケーターなら：</p>
<ul>
<li>バッファ0：ミドルバンド</li>
<li>バッファ1：アッパーバンド</li>
<li>バッファ2：ロワーバンド</li>
</ul>
<p>のように対応します。バッファ番号の確認方法は後述します。</p>
<h3><span id="toc8">⑥ shift（バーの位置）</span></h3>
<p>カスタムインジケーターの値を取得したいバーの位置を指定します。現在のバーであれば「0」、1本前のバーであれば「1」、2本前のバーであれば「2」と記述します。</p>
<p>EA内では、確定した値を使うため <code>shift=1</code>（1本前の確定バー）を指定するのが一般的です。</p>
<h2><span id="toc9">バッファ番号の調べ方</span></h2>
<p>iCustom関数を使ううえで最も重要なのが、<strong>正しいバッファ番号を知ること</strong>です。バッファ番号を間違えると、まったく違う値を取得してしまいます。</p>
<h3><span id="toc10">方法1：チャート上でマウスカーソルを合わせる</span></h3>
<p>チャート上にセットしたインジケーターのラインや矢印にマウスカーソルをのせて、Value1やValue2などという表示がでれば、iCustomでEA化できます。</p>
<h3><span id="toc11">方法2：データウィンドウで確認する</span></h3>
<p>MT4の<strong>「表示」→「データウィンドウ」</strong>を開くと、各インジケーターのバッファ値が一覧で表示されます。上から順に0, 1, 2&#8230;のバッファ番号に対応しています。</p>
<h3><span id="toc12">方法3：ソースコードを確認する</span></h3>
<p>インジケーターの.mq4ファイルがある場合は、<code>SetIndexBuffer()</code> や <code>SetIndexLabel()</code> の記述からバッファ番号を確認できます。</p>
<pre><code class="language-mql4">// ソースコードの例
SetIndexBuffer(0, UpperBuffer);  // バッファ0 → アッパーライン
SetIndexBuffer(1, LowerBuffer);  // バッファ1 → ロワーライン
SetIndexBuffer(2, BuySignal);    // バッファ2 → 買いシグナル
SetIndexBuffer(3, SellSignal);   // バッファ3 → 売りシグナル
</code></pre>
<h2><span id="toc13">基本的な使い方：サンプルコード</span></h2>
<p>ここからは、実際のサンプルコードを使って使い方を解説します。</p>
<h3><span id="toc14">サンプル1：移動平均線カスタムインジケーターの値を取得</span></h3>
<p>まずは、最もシンプルな例です。カスタムインジケーター「MyMA」の値を取得してチャートにコメント表示します。</p>
<pre><code class="language-mql4">void OnTick()
{
    // MyMAインジケーターの値を取得（期間20、バッファ0、1本前のバー）
    double ma_value = iCustom(NULL, 0, "MyMA", 20, 0, 1);
    
    // チャートにコメント表示
    Comment("MyMA(20)の値: ", DoubleToString(ma_value, Digits));
}
</code></pre>
<h3><span id="toc15">サンプル2：ボリンジャーバンドカスタムインジケーターの複数バッファを取得</span></h3>
<p>iCustom関数でボリンジャーバンドの値を取得する例です。</p>
<pre><code class="language-mql4">void OnTick()
{
    // Bandsインジケーターの各バンドを取得
    int period = 20;
    double deviation = 2.0;
    
    double upper = iCustom(NULL, 0, "Bands", period, 0, deviation, 1, 0);  // アッパーバンド（バッファ1）
    double lower = iCustom(NULL, 0, "Bands", period, 0, deviation, 2, 0);  // ロワーバンド（バッファ2）
    
    Comment("Upper: ", upper, "\nLower: ", lower);
}
</code></pre>
<h3><span id="toc16">サンプル3：矢印シグナルインジケーターでEA化する</span></h3>
<p>これが最も実践的な使い方です。買い矢印・売り矢印を表示するインジケーターのシグナルを使って自動売買するEAのサンプルです。</p>
<pre><code class="language-mql4">#property strict

// --- 入力パラメーター ---
input double Lots       = 0.01;    // ロット数
input int    MagicNumber = 12345;  // マジックナンバー
input int    StopLoss    = 50;     // ストップロス（pips）
input int    TakeProfit  = 100;    // テイクプロフィット（pips）

void OnTick()
{
    // --- カスタムインジケーターのシグナル取得 ---
    // 買いシグナル（バッファ0）と売りシグナル（バッファ1）を1本前のバーから取得
    double buySignal  = iCustom(NULL, 0, "MySignalIndicator", 0, 1);
    double sellSignal = iCustom(NULL, 0, "MySignalIndicator", 1, 1);
    
    // --- 現在のポジション数をカウント ---
    int buyCount = 0, sellCount = 0;
    for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
        if(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
        if(OrderType() == OP_BUY)  buyCount++;
        if(OrderType() == OP_SELL) sellCount++;
    }
    
    // --- 買いエントリー ---
    // シグナルが EMPTY_VALUE でなければ矢印が出現している
    if(buySignal != EMPTY_VALUE && buySignal != 0 && buyCount == 0)
    {
        double sl = Ask - StopLoss * Point * 10;
        double tp = Ask + TakeProfit * Point * 10;
        int ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, sl, tp,
                               "iCustom Buy", MagicNumber, 0, clrBlue);
        if(ticket < 0)
            Print("買い注文エラー: ", GetLastError());
    }
    
    // --- 売りエントリー ---
    if(sellSignal != EMPTY_VALUE &#038;&#038; sellSignal != 0 &#038;&#038; sellCount == 0)
    {
        double sl = Bid + StopLoss * Point * 10;
        double tp = Bid - TakeProfit * Point * 10;
        int ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, sl, tp,
                               "iCustom Sell", MagicNumber, 0, clrRed);
        if(ticket < 0)
            Print("売り注文エラー: ", GetLastError());
    }
}
</code></pre>
<p>ポイントは、<strong>矢印が表示されていないバーでは <code>EMPTY_VALUE</code>（空の値）が返される</strong>という点です。矢印系のシグナルインジケーターをEA化する場合、この <code>EMPTY_VALUE</code> との比較がエントリー判定の基本パターンになります。</p>
<h2><span id="toc17">iCustom関数を使う際の注意点</span></h2>
<h3><span id="toc18">1. .ex4ファイルが必要</span></h3>
<p>iCustom関数が参照するのは、コンパイル済みの<strong>.ex4ファイル</strong>です。ソースコード（.mq4）だけではなく、必ずコンパイルして.ex4ファイルを生成しておきましょう。</p>
<h3><span id="toc19">2. バッファレスインジケーターには使えない</span></h3>
<p>オシレーター系のインジケーターの場合はバッファが不可欠なので問題ないのですが、メインチャートに表示される矢印系のインジケーターの場合にはバッファで処理していないことがあります。「バッファでシグナルを処理するようにプログラミングしていないこと」、これがiCustomでインジケーターをEA化できない原因です。バッファレスインジケーターはiCustomではEA化できません。</p>
<h3><span id="toc20">3. パラメーターの順序と型に注意</span></h3>
<p>入力パラメーターは<strong>インジケーターのソースコードで宣言された順番通り</strong>に指定する必要があります。順番を間違えたり、型が合わないと正しい値が返りません。</p>
<h3><span id="toc21">4. パフォーマンスを意識する</span></h3>
<p>iCustom関数は呼び出すたびに計算が実行されるため、ティックごとに何度も呼び出すとパフォーマンスが低下します。新しいバーが確定したタイミングでのみ呼び出し、データをキャッシュすると処理速度を改善できます。</p>
<pre><code class="language-mql4">// 新しいバーの判定例
static datetime lastBarTime = 0;
if(Time[0] != lastBarTime)
{
    lastBarTime = Time[0];
    // ここでiCustomを呼び出す
    double signal = iCustom(NULL, 0, "MyIndicator", 0, 1);
}
</code></pre>
<h3><span id="toc22">5. バッファ番号は0〜7の範囲</span></h3>
<p>MT4ではインジケーターバッファのインデックスは<strong>0〜7</strong>の8個までです。バッファが8個を超えるインジケーターの場合、すべての値をiCustomで取得できるとは限りません。</p>
<h2><span id="toc23">まとめ</span></h2>
<p>iCustom関数は、カスタムインジケーターのシグナルをEAに組み込むための必須関数です。この記事のポイントをまとめます。</p>
<ul>
<li><strong>iCustom関数</strong>を使えば、Indicatorsフォルダにあるカスタムインジケーターの値をEAから取得できる</li>
<li>パラメーターは「通貨ペア → 時間足 → インジケーター名 → <strong>入力パラメーター</strong> → バッファ番号 → バー位置」の順に指定する</li>
<li><strong>バッファ番号</strong>の確認は、データウィンドウやソースコードから行う</li>
<li>矢印シグナル系のインジケーターは <code>EMPTY_VALUE</code> との比較でシグナル判定する</li>
<li><strong>バッファレスインジケーター</strong>（バッファを使わずオブジェクトで描画するもの）には使えない</li>
<li>パフォーマンスのため、新しいバー確定時にのみ呼び出す工夫をすると良い</li>
</ul>
<p>まずは簡単なインジケーターから試して、iCustom関数の使い方に慣れていきましょう。シグナルインジケーターをEA化できるようになれば、自動売買の幅が大きく広がりますよ！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13043/%e3%80%90mql4%e3%80%91icustom%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%82%ab%e3%82%b9%e3%82%bf%e3%83%a0%e3%82%a4%e3%83%b3%e3%82%b8/">【MQL4】iCustom関数の使い方を徹底解説！カスタムインジケーターをEAから呼び出す方法とサンプルコード</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4入門】iMomentum関数の使い方を徹底解説！モメンタムで相場の勢いを判定するEAを作ろう</title>
		<link>https://mql-programing.com/archives/13037/%e3%80%90mql4%e5%85%a5%e9%96%80%e3%80%91imomentum%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%a2%e3%83%a1%e3%83%b3%e3%82%bf/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Tue, 14 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【初級編】MQLプログラミング基礎]]></category>
		<category><![CDATA[EA自動売買]]></category>
		<category><![CDATA[iMomentum]]></category>
		<category><![CDATA[モメンタム]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[テクニカル指標]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13037</guid>

					<description><![CDATA[<p>「相場の勢いが強いのか弱いのか、数値で判断できたらいいのに…」と思ったことはありませんか？そんなときに役立つのがモメンタム（Momentum）というテクニカル指標です。 MQL4には、モメンタムの値を簡単に取得できるiM [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13037/%e3%80%90mql4%e5%85%a5%e9%96%80%e3%80%91imomentum%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%a2%e3%83%a1%e3%83%b3%e3%82%bf/">【MQL4入門】iMomentum関数の使い方を徹底解説！モメンタムで相場の勢いを判定するEAを作ろう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>「相場の勢いが強いのか弱いのか、数値で判断できたらいいのに…」と思ったことはありませんか？そんなときに役立つのが<strong>モメンタム（Momentum）</strong>というテクニカル指標です。</p>
<p>MQL4には、モメンタムの値を簡単に取得できる<strong>iMomentum関数</strong>が用意されています。この記事では、iMomentum関数の基本的な使い方から、実際にコピペで動くEAサンプルまで、初心者の方にもわかりやすく徹底解説します。</p>
<h2><span id="toc1">モメンタムとは？相場の「勢い」を測る指標</span></h2>
<p>モメンタム（Momentum）は、現在の価格と過去の価格の差を見ることで、<strong>相場の勢い（速度）</strong>を測るテクニカル指標です。MetaTraderのモメンタムは、差ではなく比率（パーセンテージ）で表現されます。</p>
<h3><span id="toc2">計算式</span></h3>
<p>MetaTraderにおけるモメンタムの計算式は以下のとおりです。</p>
<pre><code class="language-mql5">Momentum = (現在の終値 ÷ N期間前の終値) × 100
</code></pre>
<p>たとえば期間を14に設定した場合、現在の終値と14本前の終値を比較します。</p>
<h3><span id="toc3">100ラインの見方</span></h3>
<p>モメンタムの基準値は<strong>100</strong>です。以下のように判断します。</p>
<ul>
<li><strong>100より上</strong>：現在の価格がN期間前より高い → 上昇の勢いがある</li>
<li><strong>100より下</strong>：現在の価格がN期間前より低い → 下降の勢いがある</li>
<li><strong>100ちょうど</strong>：N期間前と同じ価格 → 勢いがない</li>
</ul>
<p>つまり、モメンタムが100ラインを上抜けたら「上昇の勢いが出てきた」、下抜けたら「下降の勢いが出てきた」と判断できるわけです。</p>
<h2><span id="toc4">iMomentum関数の構文と引数</span></h2>
<p>MQL4でモメンタムの値を取得するには、<strong>iMomentum関数</strong>を使います。構文は以下のとおりです。</p>
<pre><code class="language-mql4">double iMomentum(
   string       symbol,          // 通貨ペア名
   int          timeframe,       // 時間軸
   int          mom_period,      // モメンタムの期間
   int          applied_price,   // 適用価格
   int          shift            // シフト（何本前のバーか）
);
</code></pre>
<p>それぞれの引数を詳しく見ていきましょう。</p>
<h3><span id="toc5">第1引数：symbol（通貨ペア名）</span></h3>
<p>モメンタムを計算する通貨ペアを文字列で指定します。現在のチャートの通貨ペアを使う場合は、<code>NULL</code> または <code>Symbol()</code> を指定します。</p>
<h3><span id="toc6">第2引数：timeframe（時間軸）</span></h3>
<p>どの時間軸のデータを使うかを指定します。現在のチャートの時間軸を使う場合は <code>0</code> または <code>PERIOD_CURRENT</code> を指定します。主な定数は以下のとおりです。</p>
<ul>
<li><code>PERIOD_M1</code>：1分足</li>
<li><code>PERIOD_M5</code>：5分足</li>
<li><code>PERIOD_M15</code>：15分足</li>
<li><code>PERIOD_M30</code>：30分足</li>
<li><code>PERIOD_H1</code>：1時間足</li>
<li><code>PERIOD_H4</code>：4時間足</li>
<li><code>PERIOD_D1</code>：日足</li>
<li><code>PERIOD_W1</code>：週足</li>
</ul>
<h3><span id="toc7">第3引数：mom_period（期間）</span></h3>
<p>モメンタムの計算期間です。一般的には<strong>14</strong>がよく使われます。値を小さくすると敏感に反応し、大きくすると滑らかになります。</p>
<h3><span id="toc8">第4引数：applied_price（適用価格）</span></h3>
<p>計算に使う価格の種類を指定します。通常は終値（<code>PRICE_CLOSE</code>）を使います。</p>
<ul>
<li><code>PRICE_CLOSE</code>（0）：終値</li>
<li><code>PRICE_OPEN</code>（1）：始値</li>
<li><code>PRICE_HIGH</code>（2）：高値</li>
<li><code>PRICE_LOW</code>（3）：安値</li>
<li><code>PRICE_MEDIAN</code>（4）：中央値（(高値+安値)÷2）</li>
<li><code>PRICE_TYPICAL</code>（5）：典型価格（(高値+安値+終値)÷3）</li>
<li><code>PRICE_WEIGHTED</code>（6）：加重終値（(高値+安値+終値+終値)÷4）</li>
</ul>
<h3><span id="toc9">第5引数：shift（シフト）</span></h3>
<p>何本前のバーの値を取得するかを指定します。<code>0</code>で現在のバー、<code>1</code>で1本前のバーです。<strong>確定した値を使いたい場合は1以上を指定</strong>するのが基本です。</p>
<h2><span id="toc10">基本的な使い方 ― 値を取得してログに出力する</span></h2>
<p>まずは最もシンプルな例として、モメンタムの値を取得してエキスパートログに出力するコードを見てみましょう。</p>
<pre><code class="language-mql4">void OnTick()
{
   // 現在のバーのモメンタム値を取得（期間14、終値ベース）
   double mom_current = iMomentum(NULL, 0, 14, PRICE_CLOSE, 0);

   // 1本前のバーのモメンタム値を取得
   double mom_prev = iMomentum(NULL, 0, 14, PRICE_CLOSE, 1);

   // ログに出力
   Print("現在のモメンタム: ", mom_current, " | 1本前: ", mom_prev);

   // 100ラインとの比較
   if(mom_current > 100.0)
   {
      Print("上昇の勢いあり");
   }
   else if(mom_current < 100.0)
   {
      Print("下降の勢いあり");
   }
   else
   {
      Print("勢いなし（ニュートラル）");
   }
}
</code></pre>
<p>このコードをEAとしてコンパイルしてチャートにセットすれば、ティックごとにモメンタムの値がログに表示されます。まずはこの基本形を理解しておきましょう。</p>
<h2><span id="toc11">実践サンプル①：100ラインクロスでエントリーするEA</span></h2>
<p>ここからが本番です。モメンタムが100ラインを上抜けたら買い、下抜けたら売りという、シンプルなEAを作ってみましょう。</p>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| Momentum Cross EA                                                 |
//+------------------------------------------------------------------+
#property strict

// 入力パラメータ
input int    MomPeriod   = 14;       // モメンタム期間
input double LotSize     = 0.01;     // ロットサイズ
input int    Slippage    = 3;        // スリッページ
input int    StopLoss    = 100;      // ストップロス（ポイント）
input int    TakeProfit  = 200;      // テイクプロフィット（ポイント）
input int    MagicNumber = 12345;    // マジックナンバー

//+------------------------------------------------------------------+
//| Expert tick function                                              |
//+------------------------------------------------------------------+
void OnTick()
{
   // 新しいバーが確定したときだけ処理する
   static datetime lastBarTime = 0;
   if(Time[0] == lastBarTime) return;
   lastBarTime = Time[0];

   // モメンタム値を取得（確定バーを使うためshift=1と2）
   double mom1 = iMomentum(NULL, 0, MomPeriod, PRICE_CLOSE, 1);
   double mom2 = iMomentum(NULL, 0, MomPeriod, PRICE_CLOSE, 2);

   // 現在のポジション数を確認
   int buyCount  = 0;
   int sellCount = 0;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderSymbol() != Symbol()) continue;
      if(OrderMagicNumber() != MagicNumber) continue;

      if(OrderType() == OP_BUY)  buyCount++;
      if(OrderType() == OP_SELL) sellCount++;
   }

   // SLとTPの価格を計算するための変数
   double sl = 0, tp = 0;

   // 買いシグナル：モメンタムが100を下から上にクロス
   if(mom2 <= 100.0 &#038;&#038; mom1 > 100.0)
   {
      // 売りポジションがあれば決済
      ClosePositions(OP_SELL);

      // 買いポジションがなければエントリー
      if(buyCount == 0)
      {
         sl = (StopLoss  > 0) ? Ask - StopLoss  * Point : 0;
         tp = (TakeProfit > 0) ? Ask + TakeProfit * Point : 0;
         int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, sl, tp, "Mom Buy", MagicNumber, 0, clrBlue);
         if(ticket < 0)
            Print("Buy OrderSend error: ", GetLastError());
      }
   }

   // 売りシグナル：モメンタムが100を上から下にクロス
   if(mom2 >= 100.0 && mom1 < 100.0)
   {
      // 買いポジションがあれば決済
      ClosePositions(OP_BUY);

      // 売りポジションがなければエントリー
      if(sellCount == 0)
      {
         sl = (StopLoss  > 0) ? Bid + StopLoss  * Point : 0;
         tp = (TakeProfit > 0) ? Bid - TakeProfit * Point : 0;
         int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, sl, tp, "Mom Sell", MagicNumber, 0, clrRed);
         if(ticket < 0)
            Print("Sell OrderSend error: ", GetLastError());
      }
   }
}

//+------------------------------------------------------------------+
//| 指定タイプのポジションを全決済する関数                            |
//+------------------------------------------------------------------+
void ClosePositions(int type)
{
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderSymbol() != Symbol()) continue;
      if(OrderMagicNumber() != MagicNumber) continue;
      if(OrderType() != type) continue;

      double closePrice = (type == OP_BUY) ? Bid : Ask;
      if(!OrderClose(OrderTicket(), OrderLots(), closePrice, Slippage, clrWhite))
         Print("OrderClose error: ", GetLastError());
   }
}
</code></pre>
<h3><span id="toc12">コードのポイント解説</span></h3>
<ul>
<li><strong>新しいバー判定</strong>：<code>Time[0]</code>を使って、バーが確定したタイミングだけ処理を実行します。これにより無駄な注文の重複を防ぎます。</li>
<li><strong>shift=1と2を使用</strong>：確定済みのバーを使ってクロス判定を行います。shift=0は未確定バーなので、シグナルがチラつく原因になります。</li>
<li><strong>マジックナンバー</strong>：このEAのポジションだけを管理するための識別番号です。他のEAとの干渉を防ぎます。</li>
<li><strong>決済処理</strong>：反対シグナルが出たら既存ポジションを決済してからエントリーする、ドテン売買のロジックです。</li>
</ul>
<h2><span id="toc13">実践サンプル②：移動平均線と組み合わせたフィルター関数</span></h2>
<p>モメンタム単体だとダマシが多くなりがちです。そこで、<strong>移動平均線（MA）をトレンドフィルター</strong>として組み合わせる方法を紹介します。</p>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//| モメンタム＋移動平均線のシグナル判定関数                          |
//+------------------------------------------------------------------+
int GetFilteredSignal(int momPeriod, int maPeriod)
{
   // モメンタム値（確定バー）
   double mom1 = iMomentum(NULL, 0, momPeriod, PRICE_CLOSE, 1);
   double mom2 = iMomentum(NULL, 0, momPeriod, PRICE_CLOSE, 2);

   // 移動平均線の値（確定バー）
   double ma = iMA(NULL, 0, maPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);

   // 現在の終値（確定バー）
   double closePrice = Close[1];

   // 買いシグナル：MA より上 かつ モメンタム100上抜け
   if(closePrice > ma && mom2 <= 100.0 &#038;&#038; mom1 > 100.0)
   {
      return 1;  // 買い
   }

   // 売りシグナル：MA より下 かつ モメンタム100下抜け
   if(closePrice < ma &#038;&#038; mom2 >= 100.0 && mom1 < 100.0)
   {
      return -1;  // 売り
   }

   return 0;  // シグナルなし
}
</code></pre>
<p>この関数の使い方はシンプルです。OnTick内で以下のように呼び出します。</p>
<pre><code class="language-mql4">void OnTick()
{
   int signal = GetFilteredSignal(14, 50);

   if(signal == 1)
   {
      // 買い処理
      Print("フィルター通過：買いシグナル発生！");
   }
   else if(signal == -1)
   {
      // 売り処理
      Print("フィルター通過：売りシグナル発生！");
   }
}
</code></pre>
<p>ポイントは、<strong>価格がMAより上のときだけ買いシグナルを採用し、MAより下のときだけ売りシグナルを採用する</strong>という点です。これにより、トレンドに逆らったエントリーを減らすことができます。</p>
<h2><span id="toc14">iMomentum関数を使う際の注意点</span></h2>
<h3><span id="toc15">1. shift値は1以上を使おう</span></h3>
<p>shift=0は現在形成中のバーの値です。ティックごとに値が変わるため、<strong>シグナル判定には確定済みのshift=1以降を使う</strong>のが鉄則です。shift=0は参考表示用として使いましょう。</p>
<h3><span id="toc16">2. マルチタイムフレーム使用時の注意</span></h3>
<p>第2引数で現在のチャートと異なる時間軸を指定すると、マルチタイムフレーム分析ができます。ただし、上位足のデータが読み込まれていない場合は正しい値が返りません。必要に応じて事前にチャートを開くか、<code>iMomentum</code>の戻り値が<code>0</code>でないかチェックしましょう。</p>
<pre><code class="language-mql4">// 日足のモメンタムを取得
double momDaily = iMomentum(NULL, PERIOD_D1, 14, PRICE_CLOSE, 1);
if(momDaily == 0)
{
   Print("日足データが取得できません");
   return;
}
</code></pre>
<h3><span id="toc17">3. ブローカーによる桁数の違いに注意</span></h3>
<p>StopLossやTakeProfitをポイント単位で指定する場合、3桁/5桁ブローカーでは値の調整が必要です。モメンタム自体の値は比率（パーセンテージ）なので桁数の影響は受けませんが、EA全体のロジックでは注意しましょう。</p>
<h2><span id="toc18">まとめ</span></h2>
<p>今回は、MQL4の<strong>iMomentum関数</strong>について基礎から実践まで解説しました。最後に要点を整理しておきます。</p>
<ul>
<li><strong>モメンタム</strong>は相場の勢いを数値化する指標で、基準値は<strong>100</strong></li>
<li><strong>iMomentum関数</strong>は5つの引数（symbol, timeframe, period, applied_price, shift）で値を取得できる</li>
<li>シグナル判定には<strong>確定バー（shift=1以降）</strong>を使うのが基本</li>
<li><strong>100ラインのクロス</strong>でエントリータイミングを判断するEAが作れる</li>
<li><strong>移動平均線などと組み合わせる</strong>ことで、ダマシを減らしてシグナルの精度を高められる</li>
</ul>
<p>モメンタムはシンプルながら奥が深い指標です。まずは今回のサンプルEAをストラテジーテスターで動かして、パラメータを変えながら挙動を確認してみてください。実際に手を動かすことで、理解が一気に深まりますよ！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13037/%e3%80%90mql4%e5%85%a5%e9%96%80%e3%80%91imomentum%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%a2%e3%83%a1%e3%83%b3%e3%82%bf/">【MQL4入門】iMomentum関数の使い方を徹底解説！モメンタムで相場の勢いを判定するEAを作ろう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【MQL4】iStochastic関数の使い方を完全解説！ストキャスティクスを使ったEAサンプル付き</title>
		<link>https://mql-programing.com/archives/13022/%e3%80%90mql4%e3%80%91istochastic%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%ae%8c%e5%85%a8%e8%a7%a3%e8%aa%ac%ef%bc%81%e3%82%b9%e3%83%88%e3%82%ad%e3%83%a3%e3%82%b9%e3%83%86/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Thu, 09 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[注文関係]]></category>
		<category><![CDATA[iStochastic]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[ストキャスティクス]]></category>
		<category><![CDATA[EA自動売買]]></category>
		<category><![CDATA[テクニカルインジケーター]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13022</guid>

					<description><![CDATA[<p>ストキャスティクスは、相場の「買われすぎ」「売られすぎ」を判断するための代表的なオシレーター系インジケーターです。MQL4ではiStochastic関数を使うことで、EA（自動売買プログラム）やカスタムインジケーターの中 [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13022/%e3%80%90mql4%e3%80%91istochastic%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%ae%8c%e5%85%a8%e8%a7%a3%e8%aa%ac%ef%bc%81%e3%82%b9%e3%83%88%e3%82%ad%e3%83%a3%e3%82%b9%e3%83%86/">【MQL4】iStochastic関数の使い方を完全解説！ストキャスティクスを使ったEAサンプル付き</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>ストキャスティクスは、相場の「買われすぎ」「売られすぎ」を判断するための代表的なオシレーター系インジケーターです。MQL4では<strong>iStochastic関数</strong>を使うことで、EA（自動売買プログラム）やカスタムインジケーターの中からストキャスティクスの値を簡単に取得できます。</p>
<p>この記事では、iStochastic関数の書式・引数をひとつずつ丁寧に解説し、最後にストキャスティクスのクロスで売買する実践的なEAサンプルを紹介します。</p>
<h2><span id="toc1">ストキャスティクスとは？</span></h2>
<p>ストキャスティクス（Stochastic Oscillator）は、一定期間の価格レンジの中で現在の価格がどの位置にあるかを0〜100の数値で示すテクニカル指標です。</p>
<h3><span id="toc2">3本のラインを理解しよう</span></h3>
<p>ストキャスティクスには以下の3種類のラインがあります。</p>
<ul>
<li><strong>%K（Fast %K）</strong>：直近の価格が一定期間の高値・安値レンジのどこに位置するかを示す、最も感度の高いライン</li>
<li><strong>%D（Fast %D / Slow %K）</strong>：%Kを移動平均で平滑化したライン。MetaTrader4のストキャスティクスではこれがメインラインになります</li>
<li><strong>Slow %D（シグナルライン）</strong>：%Dをさらに移動平均で平滑化したライン</li>
</ul>
<h3><span id="toc3">80と20のレベルライン</span></h3>
<p>一般的に、ストキャスティクスの値が<strong>80以上</strong>になると「買われすぎ」、<strong>20以下</strong>になると「売られすぎ」と判断します。この水準でのラインのクロスが売買シグナルとしてよく使われます。</p>
<h2><span id="toc4">iStochastic関数の書式と引数を完全解説</span></h2>
<p>iStochastic関数の書式は以下のとおりです。</p>
<pre><code class="language-mql4">double iStochastic(
   string       symbol,        // ① 通貨ペア
   int          timeframe,     // ② 時間足
   int          Kperiod,       // ③ %K期間
   int          Dperiod,       // ④ %D期間
   int          slowing,       // ⑤ スローイング
   int          method,        // ⑥ 移動平均の種類
   int          price_field,   // ⑦ 価格フィールド
   int          mode,          // ⑧ 取得するライン
   int          shift          // ⑨ シフト（何本前のバーか）
);</code></pre>
<p>引数が9つもあるので少し多く感じますが、一つずつ見ていきましょう。</p>
<h3><span id="toc5">① symbol（通貨ペア）</span></h3>
<p>値を取得したい通貨ペアを文字列で指定します。現在のチャートの通貨ペアを使う場合は<code>NULL</code>または<code>Symbol()</code>と書きます。</p>
<h3><span id="toc6">② timeframe（時間足）</span></h3>
<p>時間足を定数で指定します。現在のチャートの時間足を使う場合は<code>0</code>または<code>PERIOD_CURRENT</code>と書きます。主な定数は以下のとおりです。</p>
<table>
<thead>
<tr>
<th>定数</th>
<th>時間足</th>
</tr>
</thead>
<tbody>
<tr>
<td>PERIOD_M1</td>
<td>1分足</td>
</tr>
<tr>
<td>PERIOD_M5</td>
<td>5分足</td>
</tr>
<tr>
<td>PERIOD_M15</td>
<td>15分足</td>
</tr>
<tr>
<td>PERIOD_M30</td>
<td>30分足</td>
</tr>
<tr>
<td>PERIOD_H1</td>
<td>1時間足</td>
</tr>
<tr>
<td>PERIOD_H4</td>
<td>4時間足</td>
</tr>
<tr>
<td>PERIOD_D1</td>
<td>日足</td>
</tr>
<tr>
<td>PERIOD_W1</td>
<td>週足</td>
</tr>
</tbody>
</table>
<h3><span id="toc7">③ Kperiod（%K期間）</span></h3>
<p>%Kラインの計算に使う期間です。一般的には<strong>5</strong>や<strong>14</strong>がよく使われます。</p>
<h3><span id="toc8">④ Dperiod（%D期間）</span></h3>
<p>%Kを平滑化して%Dを求める際の移動平均の期間です。一般的には<strong>3</strong>がよく使われます。</p>
<h3><span id="toc9">⑤ slowing（スローイング）</span></h3>
<p>スローストキャスティクスのスローイング値です。<strong>1</strong>にするとファスト、<strong>3</strong>にするとスローストキャスティクスになります。通常は<strong>3</strong>を指定します。</p>
<h3><span id="toc10">⑥ method（移動平均の種類）</span></h3>
<p>%Dラインの平滑化に使用する移動平均の種類を指定します。</p>
<table>
<thead>
<tr>
<th>定数</th>
<th>種類</th>
</tr>
</thead>
<tbody>
<tr>
<td>MODE_SMA</td>
<td>単純移動平均（最も一般的）</td>
</tr>
<tr>
<td>MODE_EMA</td>
<td>指数移動平均</td>
</tr>
<tr>
<td>MODE_SMMA</td>
<td>平滑移動平均</td>
</tr>
<tr>
<td>MODE_LWMA</td>
<td>線形加重移動平均</td>
</tr>
</tbody>
</table>
<h3><span id="toc11">⑦ price_field（価格フィールド）</span></h3>
<p>ストキャスティクスの計算に使う価格の種類です。</p>
<table>
<thead>
<tr>
<th>値</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>高値/安値（Low/High）を使用 ※一般的</td>
</tr>
<tr>
<td>1</td>
<td>終値（Close/Close）を使用</td>
</tr>
</tbody>
</table>
<p>通常は<strong>0（高値/安値）</strong>を使います。</p>
<h3><span id="toc12">⑧ mode（取得するライン）</span></h3>
<p>どのラインの値を取得するかを指定します。</p>
<table>
<thead>
<tr>
<th>定数</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>MODE_MAIN（= 0）</td>
<td>メインライン（%D）</td>
</tr>
<tr>
<td>MODE_SIGNAL（= 1）</td>
<td>シグナルライン（Slow %D）</td>
</tr>
</tbody>
</table>
<h3><span id="toc13">⑨ shift（シフト）</span></h3>
<p>何本前のバーの値を取得するかを指定します。<strong>0</strong>で現在のバー、<strong>1</strong>で1本前のバー（確定済み）です。</p>
<h2><span id="toc14">基本的な使い方</span></h2>
<p>まずはストキャスティクスの値を取得してチャートに表示するシンプルなコードを見てみましょう。</p>
<pre><code class="language-mql4">#property strict

void OnTick()
{
   // メインライン（%D）を取得 - 1本前の確定バー
   double stochMain = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 1);

   // シグナルライン（Slow %D）を取得 - 1本前の確定バー
   double stochSignal = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 1);

   // チャートに表示
   Comment("Stochastic Main: ", DoubleToString(stochMain, 2),
           "\nStochastic Signal: ", DoubleToString(stochSignal, 2));
}</code></pre>
<p>このコードでは、期間5・3・3のスローストキャスティクス（SMA）のメインラインとシグナルラインの値を取得し、Comment関数でチャート左上に表示しています。shift=1を指定しているので、確定済みの1本前のバーの値を取得しています。</p>
<h2><span id="toc15">実践サンプルEA ― ストキャスティクスのクロスで売買</span></h2>
<p>ここからは、ストキャスティクスのゴールデンクロス（買いシグナル）とデッドクロス（売りシグナル）で売買する実践的なEAを作ってみましょう。</p>
<h3><span id="toc16">売買ルール</span></h3>
<ul>
<li><strong>買いエントリー</strong>：ストキャスティクスが20以下のゾーンで、メインラインがシグナルラインを下から上にクロス（ゴールデンクロス）</li>
<li><strong>売りエントリー</strong>：ストキャスティクスが80以上のゾーンで、メインラインがシグナルラインを上から下にクロス（デッドクロス）</li>
<li>既にポジションがある場合は新規エントリーしない</li>
</ul>
<h3><span id="toc17">EAの完全なコード</span></h3>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//|                                          StochasticCrossEA.mq4   |
//|                         ストキャスティクス クロスEA サンプル        |
//+------------------------------------------------------------------+
#property strict

// --- 入力パラメータ ---
input int    KPeriod      = 5;       // %K期間
input int    DPeriod      = 3;       // %D期間
input int    Slowing      = 3;       // スローイング
input double UpperLevel   = 80.0;    // 上限レベル（売られすぎ判定）
input double LowerLevel   = 20.0;    // 下限レベル（買われすぎ判定）
input double LotSize      = 0.1;     // ロットサイズ
input int    StopLoss     = 100;     // ストップロス（pips）
input int    TakeProfit   = 200;     // テイクプロフィット（pips）
input int    MagicNumber  = 12345;   // マジックナンバー

// --- 新バー判定用変数 ---
datetime lastBarTime = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                     |
//+------------------------------------------------------------------+
int OnInit()
{
   Print("StochasticCrossEA が初期化されました");
   return(INIT_SUCCEEDED);
}

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

//+------------------------------------------------------------------+
//| 現在のポジション数を取得する関数                                     |
//+------------------------------------------------------------------+
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)
         {
            if(OrderType() == type)
               count++;
         }
      }
   }
   return count;
}

//+------------------------------------------------------------------+
//| Expert tick function                                               |
//+------------------------------------------------------------------+
void OnTick()
{
   // 新しいバーが確定したときだけ処理
   if(!IsNewBar())
      return;

   // --- ストキャスティクスの値を取得 ---
   // 1本前（確定済み）のメインライン
   double mainCurr   = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing,
                                    MODE_SMA, 0, MODE_MAIN, 1);
   // 1本前（確定済み）のシグナルライン
   double signalCurr = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing,
                                    MODE_SMA, 0, MODE_SIGNAL, 1);
   // 2本前のメインライン
   double mainPrev   = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing,
                                    MODE_SMA, 0, MODE_MAIN, 2);
   // 2本前のシグナルライン
   double signalPrev = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing,
                                    MODE_SMA, 0, MODE_SIGNAL, 2);

   // --- ゴールデンクロス判定（買いシグナル） ---
   bool goldenCross = (mainPrev < signalPrev) &#038;&#038; (mainCurr > signalCurr);

   // --- デッドクロス判定（売りシグナル） ---
   bool deadCross = (mainPrev > signalPrev) && (mainCurr < signalCurr);

   // --- 買いエントリー ---
   if(goldenCross &#038;&#038; mainCurr < LowerLevel &#038;&#038; CountPositions(OP_BUY) == 0)
   {
      double sl = NormalizeDouble(Ask - StopLoss * Point, Digits);
      double tp = NormalizeDouble(Ask + TakeProfit * Point, Digits);

      int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, sl, tp,
                              "Stoch GoldenCross", MagicNumber, 0, clrBlue);
      if(ticket > 0)
         Print("買い注文成功: チケット=", ticket);
      else
         Print("買い注文失敗: エラー=", GetLastError());
   }

   // --- 売りエントリー ---
   if(deadCross && mainCurr > UpperLevel && CountPositions(OP_SELL) == 0)
   {
      double sl = NormalizeDouble(Bid + StopLoss * Point, Digits);
      double tp = NormalizeDouble(Bid - TakeProfit * Point, Digits);

      int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, sl, tp,
                              "Stoch DeadCross", MagicNumber, 0, clrRed);
      if(ticket > 0)
         Print("売り注文成功: チケット=", ticket);
      else
         Print("売り注文失敗: エラー=", GetLastError());
   }

   // --- チャート表示 ---
   Comment("Main[1]: ", DoubleToString(mainCurr, 2),
           "  Signal[1]: ", DoubleToString(signalCurr, 2),
           "\nMain[2]: ", DoubleToString(mainPrev, 2),
           "  Signal[2]: ", DoubleToString(signalPrev, 2));
}</code></pre>
<h2><span id="toc18">サンプルコードのポイント解説</span></h2>
<h3><span id="toc19">ポイント1：新バー判定で無駄な処理を防ぐ</span></h3>
<p><code>IsNewBar()</code>関数を使い、新しいバーが確定したタイミングでのみ売買判定を行っています。OnTick()はティックごとに呼ばれるため、そのまま処理すると同じバーで何度もシグナルを検出してしまいます。新バー判定を入れることで、確定した値に基づく安定したシグナル検出ができます。</p>
<h3><span id="toc20">ポイント2：2本のバーでクロスを検出する</span></h3>
<p>クロスの判定には、<strong>1本前（shift=1）</strong>と<strong>2本前（shift=2）</strong>の値を比較しています。</p>
<pre><code class="language-mql4">// ゴールデンクロス：2本前は「メイン ＜ シグナル」→ 1本前は「メイン ＞ シグナル」
bool goldenCross = (mainPrev < signalPrev) &#038;&#038; (mainCurr > signalCurr);

// デッドクロス：2本前は「メイン ＞ シグナル」→ 1本前は「メイン ＜ シグナル」
bool deadCross = (mainPrev > signalPrev) && (mainCurr < signalCurr);</code></pre>
<p>shift=0（現在のバー）を使うと、バーが確定するまで値が変動し続けるため、誤ったシグナルが出る可能性があります。確定済みのshift=1とshift=2を使うのが安全です。</p>
<h3><span id="toc21">ポイント3：ゾーンフィルタでダマシを減らす</span></h3>
<p>単純なクロスだけではダマシ（偽シグナル）が多くなります。そこで、<strong>買いはLowerLevel（20）以下のゾーン</strong>、<strong>売りはUpperLevel（80）以上のゾーン</strong>でのみエントリーするフィルタを入れています。売られすぎ・買われすぎの極端な領域でのクロスに絞ることで、シグナルの精度を高めています。</p>
<h2><span id="toc22">カスタマイズのヒント</span></h2>
<h3><span id="toc23">マルチタイムフレーム分析</span></h3>
<p>iStochastic関数の第2引数（timeframe）を変えることで、異なる時間足のストキャスティクスを取得できます。例えば、日足のトレンド方向を確認してからエントリーするといった使い方が可能です。</p>
<pre><code class="language-mql4">// 日足のストキャスティクスを取得
double dailyMain = iStochastic(NULL, PERIOD_D1, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 1);

// 日足が50以上なら上昇傾向 → 買いのみエントリーする、など
if(dailyMain > 50.0 && goldenCross && mainCurr < LowerLevel)
{
   // 買いエントリー処理
}</code></pre>
<h3><span id="toc24">他のインジケーターとの併用</span></h3>
<p>ストキャスティクス単体よりも、移動平均線（iMA関数）やRSI（iRSI関数）など他のインジケーターと組み合わせることで、より信頼性の高い売買ルールを構築できます。例えば、移動平均線の上にいるときだけ買いシグナルを採用する、といったフィルタが考えられます。</p>
<h3><span id="toc25">ストラテジーテスターで最適化</span></h3>
<p>KPeriod、DPeriod、Slowing、UpperLevel、LowerLevelなどのパラメータは、MetaTraderのストラテジーテスターで最適化できます。input変数として宣言しているので、テスターの最適化機能でベストな組み合わせを探してみましょう。ただし、過剰最適化（カーブフィッティング）には注意が必要です。</p>
<h2><span id="toc26">まとめ</span></h2>
<p>この記事で学んだポイントを整理します。</p>
<ol>
<li><strong>iStochastic関数</strong>は9つの引数を持ち、MQL4からストキャスティクスの値を取得できる関数です</li>
<li><strong>MODE_MAIN</strong>でメインライン（%D）、<strong>MODE_SIGNAL</strong>でシグナルライン（Slow %D）を取得します</li>
<li><strong>price_field</strong>は通常0（高値/安値ベース）を使い、1（終値ベース）との違いを理解しておきましょう</li>
<li>クロス判定にはshift=1とshift=2の<strong>確定済みバー</strong>を使うのが安全です</li>
<li>80/20のゾーンフィルタやマルチタイムフレーム分析を組み合わせることで、<strong>ダマシを減らして精度を向上</strong>させることができます</li>
</ol>
<p>ストキャスティクスはシンプルながら強力なオシレーター指標です。まずは今回のサンプルEAをストラテジーテスターで動かして、パラメータを変えながら挙動を確認してみてください。実際に手を動かすことで、iStochastic関数の使い方がしっかり身につくはずです！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13022/%e3%80%90mql4%e3%80%91istochastic%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%ae%8c%e5%85%a8%e8%a7%a3%e8%aa%ac%ef%bc%81%e3%82%b9%e3%83%88%e3%82%ad%e3%83%a3%e3%82%b9%e3%83%86/">【MQL4】iStochastic関数の使い方を完全解説！ストキャスティクスを使ったEAサンプル付き</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
