<?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%83%86%E3%82%AF%E3%83%8B%E3%82%AB%E3%83%AB%E6%8C%87%E6%A8%99/feed/" rel="self" type="application/rss+xml" />
	<link>https://mql-programing.com/archives/tag/テクニカル指標/</link>
	<description>MQLプログラミング学習サイト</description>
	<lastBuildDate>Wed, 01 Apr 2026 03:28:01 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://mql-programing.com/main29/wp-content/uploads/2021/02/cropped-ブログアイコン-32x32.jpg</url>
	<title>テクニカル指標 アーカイブ - 自動売買を作ろう！</title>
	<link>https://mql-programing.com/archives/tag/テクニカル指標/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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[iMomentum]]></category>
		<category><![CDATA[モメンタム]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[テクニカル指標]]></category>
		<category><![CDATA[EA自動売買]]></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入門】iRSI関数の使い方を徹底解説！RSIを使ったEA開発の基本とサンプルコード</title>
		<link>https://mql-programing.com/archives/12999/%e3%80%90mql4%e5%85%a5%e9%96%80%e3%80%91irsi%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%81rsi%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9fea/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Sat, 04 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【初級編】MQLプログラミング基礎]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[EA開発]]></category>
		<category><![CDATA[iRSI]]></category>
		<category><![CDATA[RSI]]></category>
		<category><![CDATA[テクニカル指標]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=12999</guid>

					<description><![CDATA[<p>RSI（Relative Strength Index）は、FXトレーダーなら一度は使ったことがあるほど人気のテクニカル指標です。「買われすぎ」「売られすぎ」を数値で判断できるため、逆張りトレードの根拠として非常に重宝し [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/12999/%e3%80%90mql4%e5%85%a5%e9%96%80%e3%80%91irsi%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%81rsi%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9fea/">【MQL4入門】iRSI関数の使い方を徹底解説！RSIを使ったEA開発の基本とサンプルコード</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>RSI（Relative Strength Index）は、FXトレーダーなら一度は使ったことがあるほど人気のテクニカル指標です。「買われすぎ」「売られすぎ」を数値で判断できるため、逆張りトレードの根拠として非常に重宝します。</p>
<p>MQL4では、<strong>iRSI関数</strong>を使うことで、たった1行のコードでRSIの値を取得できます。この記事では、iRSI関数のパラメータの意味から、実際に動作する逆張りEAのサンプルコードまで、初心者にもわかりやすく徹底解説します！</p>
<h2><span id="toc1">RSIとは？基本をおさらい</span></h2>
<p>RSI（相対力指数）は、一定期間の値動きにおける「上昇幅」と「下降幅」の比率から、相場の過熱感を0〜100の数値で表すオシレーター系指標です。</p>
<h3><span id="toc2">RSIの一般的な判断基準</span></h3>
<ul>
<li><strong>RSI ≧ 70</strong>：買われすぎ → 売りシグナルの候補</li>
<li><strong>RSI ≦ 30</strong>：売られすぎ → 買いシグナルの候補</li>
<li><strong>RSI = 50</strong>付近：方向感なし（中立）</li>
</ul>
<p>計算に使う期間は<strong>14</strong>が最も一般的で、MetaTraderのデフォルト設定でも14が使われています。期間を短くすると感度が高くなりダマシも増え、長くすると滑らかになりますがシグナルが遅れる傾向があります。</p>
<h2><span id="toc3">iRSI関数の書式とパラメータ</span></h2>
<p>MQL4でRSIの値を取得するには、<strong>iRSI関数</strong>を使います。書式は以下のとおりです。</p>
<pre><code class="language-mql4">double iRSI(
    string symbol,        // 通貨ペア名
    int    timeframe,     // 時間足
    int    period,        // RSIの計算期間
    int    applied_price, // 適用価格
    int    shift          // シフト（何本前の足か）
);
</code></pre>
<h3><span id="toc4">各パラメータの詳細</span></h3>
<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, Symbol()</td>
</tr>
<tr>
<td>timeframe</td>
<td>int</td>
<td>時間足を指定する定数</td>
<td>0（現在の時間足）</td>
</tr>
<tr>
<td>period</td>
<td>int</td>
<td>RSIの計算期間</td>
<td>14</td>
</tr>
<tr>
<td>applied_price</td>
<td>int</td>
<td>計算に使う価格の種類</td>
<td>PRICE_CLOSE</td>
</tr>
<tr>
<td>shift</td>
<td>int</td>
<td>何本前の足のRSI値を取得するか</td>
<td>0, 1</td>
</tr>
</tbody>
</table>
<h3><span id="toc5">時間足定数の一覧</span></h3>
<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">適用価格定数の一覧</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>中央値（(高値+安値)/2）</td>
</tr>
<tr>
<td>PRICE_TYPICAL</td>
<td>5</td>
<td>典型価格（(高値+安値+終値)/3）</td>
</tr>
<tr>
<td>PRICE_WEIGHTED</td>
<td>6</td>
<td>加重終値（(高値+安値+終値+終値)/4）</td>
</tr>
</tbody>
</table>
<h2><span id="toc7">基本的な使い方</span></h2>
<p>まずは最もシンプルなiRSI関数の呼び出し方を見てみましょう。</p>
<pre><code class="language-mql4">void OnTick()
{
    // 現在の足（確定前）のRSI値を取得
    double rsi_current = iRSI(NULL, 0, 14, PRICE_CLOSE, 0);

    // 1本前の足（確定済み）のRSI値を取得
    double rsi_prev = iRSI(NULL, 0, 14, PRICE_CLOSE, 1);

    // ログに出力して確認
    Print("RSI(現在): ", rsi_current, " / RSI(1本前): ", rsi_prev);
}
</code></pre>
<p>ここで重要なのが<strong>shiftパラメータ</strong>の使い分けです。</p>
<ul>
<li><strong>shift=0</strong>：現在形成中のローソク足のRSI値。ティックごとに値が変わる（<strong>未確定値</strong>）</li>
<li><strong>shift=1</strong>：1本前の確定済みローソク足のRSI値。その足が閉じた後は変化しない（<strong>確定値</strong>）</li>
</ul>
<p>EAのエントリー判断では、<strong>shift=1（確定値）を基準に使う</strong>のが一般的です。未確定の値で判断すると、ローソク足が確定する前にシグナルが出たり消えたりして、誤ったエントリーにつながる可能性があります。</p>
<h2><span id="toc8">実践！RSI逆張りEAのサンプルコード</span></h2>
<p>ここからは、RSIの「売られすぎ→反転上昇」で買い、「買われすぎ→反転下降」で売るという逆張りロジックのEAを作ってみましょう。単にRSIが閾値を超えているかどうかだけでなく、<strong>「閾値を下から上に（または上から下に）抜けた瞬間」</strong>を検知するテクニックを使います。</p>
<pre><code class="language-mql4">//+------------------------------------------------------------------+
//|                                              RSI_Reversal_EA.mq4 |
//|                        RSI逆張りEAサンプル                         |
//+------------------------------------------------------------------+
#property strict

// === 入力パラメータ ===
input int    RSI_Period      = 14;           // RSI計算期間
input double RSI_UpperLevel  = 70.0;         // 買われすぎライン
input double RSI_LowerLevel  = 30.0;         // 売られすぎライン
input double LotSize         = 0.01;         // ロットサイズ
input int    StopLoss_Pips   = 50;           // ストップロス（pips）
input int    TakeProfit_Pips = 100;          // テイクプロフィット（pips）
input int    MagicNumber     = 12345;        // マジックナンバー

// === グローバル変数 ===
datetime lastBarTime = 0; // 新しい足の検出用

//+------------------------------------------------------------------+
//| Expert initialization function                                     |
//+------------------------------------------------------------------+
int OnInit()
{
    Print("RSI逆張りEA 起動 - Period:", RSI_Period,
          " Upper:", RSI_UpperLevel, " Lower:", RSI_LowerLevel);
    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert tick function                                               |
//+------------------------------------------------------------------+
void OnTick()
{
    // --- 新しい足が確定したときだけ処理を行う ---
    if(Time[0] == lastBarTime)
        return;
    lastBarTime = Time[0];

    // --- 既にポジションを持っていたらエントリーしない ---
    if(CountMyOrders() > 0)
        return;

    // --- RSI値を取得 ---
    double rsi1 = iRSI(NULL, 0, RSI_Period, PRICE_CLOSE, 1); // 1本前（確定）
    double rsi2 = iRSI(NULL, 0, RSI_Period, PRICE_CLOSE, 2); // 2本前（確定）

    // --- pipsをポイントに変換（5桁/3桁ブローカー対応）---
    double point = Point;
    if(Digits == 3 || Digits == 5)
        point = Point * 10;

    double sl, tp;

    // === 買いエントリー条件 ===
    // RSIが「売られすぎライン」を下から上に抜けた瞬間
    if(rsi2 < RSI_LowerLevel &#038;&#038; rsi1 >= RSI_LowerLevel)
    {
        sl = Ask - StopLoss_Pips * point;
        tp = Ask + TakeProfit_Pips * point;

        int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, sl, tp,
                               "RSI Buy", MagicNumber, 0, clrBlue);
        if(ticket > 0)
            Print("買いエントリー成功 RSI(2本前):", rsi2, " RSI(1本前):", rsi1);
        else
            Print("買いエントリー失敗 Error:", GetLastError());
    }

    // === 売りエントリー条件 ===
    // RSIが「買われすぎライン」を上から下に抜けた瞬間
    if(rsi2 > RSI_UpperLevel && rsi1 <= RSI_UpperLevel)
    {
        sl = Bid + StopLoss_Pips * point;
        tp = Bid - TakeProfit_Pips * point;

        int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, sl, tp,
                               "RSI Sell", MagicNumber, 0, clrRed);
        if(ticket > 0)
            Print("売りエントリー成功 RSI(2本前):", rsi2, " RSI(1本前):", rsi1);
        else
            Print("売りエントリー失敗 Error:", GetLastError());
    }
}

//+------------------------------------------------------------------+
//| 自分のEAのポジション数をカウント                                     |
//+------------------------------------------------------------------+
int CountMyOrders()
{
    int count = 0;
    for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
                count++;
        }
    }
    return count;
}
</code></pre>
<h3><span id="toc9">サンプルコードの4つのポイント</span></h3>
<h3><span id="toc10">① 新しい足の検出で無駄な処理を防止</span></h3>
<p><code>Time[0] == lastBarTime</code> のチェックにより、新しいローソク足が確定したタイミングでのみエントリー判断を行います。ティックごとに何度もオーダーを送るのを防ぎ、安定した動作を実現します。</p>
<h3><span id="toc11">② RSIの「クロス」で瞬間を捉える</span></h3>
<p>単に「RSIが30以下」だけでエントリーすると、RSIが30以下にいる間ずっとシグナルが出続けてしまいます。そこで、<strong>2本前のRSI（rsi2）と1本前のRSI（rsi1）を比較</strong>し、閾値を「抜けた瞬間」だけを検知しています。</p>
<pre><code class="language-mql4">// 例：売られすぎラインを下から上に抜けた瞬間
if(rsi2 < RSI_LowerLevel &#038;&#038; rsi1 >= RSI_LowerLevel)
</code></pre>
<p>この条件は「2本前はまだ30未満だったが、1本前で30以上に回復した」ことを意味します。つまり、売られすぎの状態から反転し始めた瞬間にエントリーできるわけです。</p>
<h3><span id="toc12">③ MagicNumberでEAを識別</span></h3>
<p>MagicNumberを設定することで、複数のEAを同時に稼働させてもポジションの管理が混乱しません。<code>CountMyOrders()</code>関数では、通貨ペアとMagicNumberの両方が一致するポジションだけをカウントしています。</p>
<h3><span id="toc13">④ 5桁ブローカー対応のpips変換</span></h3>
<p>近年のFXブローカーの多くは5桁（3桁）の価格表示を採用しています。<code>Digits == 5</code>の場合は<code>Point * 10</code>として、pips単位の指定が正しく反映されるようにしています。</p>
<h2><span id="toc14">iRSI関数を使うときの注意点</span></h2>
<h3><span id="toc15">shift=0の値は未確定</span></h3>
<p>先ほども触れましたが、shift=0で取得できるRSIの値はティックごとに変化します。エントリー判断に使う場合は、基本的に<strong>shift=1以上の確定値</strong>を使いましょう。</p>
<h3><span id="toc16">マルチタイムフレーム分析への応用</span></h3>
<p>iRSI関数の第2引数（timeframe）を変えることで、現在のチャートとは異なる時間足のRSI値も取得できます。</p>
<pre><code class="language-mql4">// 現在のチャートが5分足でも、日足のRSIを取得できる
double rsi_daily = iRSI(NULL, PERIOD_D1, 14, PRICE_CLOSE, 1);

// 4時間足のRSI
double rsi_h4 = iRSI(NULL, PERIOD_H4, 14, PRICE_CLOSE, 1);
</code></pre>
<p>例えば「日足のRSIが50以上のときだけ、短期足で買いエントリーする」といったフィルターとして活用できます。</p>
<h3><span id="toc17">チャート上のRSIインジケーターとの値一致</span></h3>
<p>iRSI関数で取得した値は、MetaTrader上でRSIインジケーターを表示したときの値と<strong>同じパラメータを指定すれば一致</strong>します。値がずれる場合は、計算期間や適用価格の設定が異なっていないか確認してみてください。</p>
<h2><span id="toc18">まとめ</span></h2>
<p>この記事では、MQL4の<strong>iRSI関数</strong>について、基本から実践まで解説しました。ポイントを振り返りましょう。</p>
<ul>
<li><strong>iRSI関数</strong>は5つの引数（通貨ペア、時間足、期間、適用価格、シフト）を指定してRSI値を取得する</li>
<li>エントリー判断には<strong>shift=1（確定値）</strong>を使うのが基本</li>
<li>RSIの閾値を<strong>「抜けた瞬間」</strong>を検知するには、2本分のRSI値を比較する</li>
<li>timeframeパラメータを活用すれば<strong>マルチタイムフレーム分析</strong>も簡単</li>
<li>MagicNumber管理や5桁ブローカー対応など、<strong>実運用を意識した実装</strong>が大切</li>
</ul>
<p>RSIは非常にシンプルな指標ですが、移動平均線やボリンジャーバンドなど他のインジケーターと組み合わせることで、より精度の高いEAに発展させることができます。まずは今回のサンプルコードをベースに、ストラテジーテスターで動作を確認するところから始めてみてください！</p>
<p>投稿 <a href="https://mql-programing.com/archives/12999/%e3%80%90mql4%e5%85%a5%e9%96%80%e3%80%91irsi%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%81rsi%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9fea/">【MQL4入門】iRSI関数の使い方を徹底解説！RSIを使ったEA開発の基本とサンプルコード</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
