<?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>iWPR アーカイブ - 自動売買を作ろう！</title>
	<atom:link href="https://mql-programing.com/archives/tag/iwpr/feed/" rel="self" type="application/rss+xml" />
	<link>https://mql-programing.com/archives/tag/iwpr/</link>
	<description>MQLプログラミング学習サイト</description>
	<lastBuildDate>Wed, 01 Apr 2026 03:33:20 +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>iWPR アーカイブ - 自動売買を作ろう！</title>
	<link>https://mql-programing.com/archives/tag/iwpr/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【MQL4】iWPR関数の使い方を徹底解説！ウィリアムズ%Rでエントリーシグナルを作ろう</title>
		<link>https://mql-programing.com/archives/13040/%e3%80%90mql4%e3%80%91iwpr%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%a6%e3%82%a3%e3%83%aa%e3%82%a2%e3%83%a0%e3%82%bar%e3%81%a7/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Wed, 15 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[iWPR]]></category>
		<category><![CDATA[ウィリアムズ%R]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13040</guid>

					<description><![CDATA[<p>「ウィリアムズ%R（Williams&#8217; Percent Range）」というインジケーターをご存知ですか？これはラリー・ウィリアムズ氏が考案したオシレーター系テクニカル指標で、相場の「買われすぎ」「売られすぎ [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13040/%e3%80%90mql4%e3%80%91iwpr%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%a6%e3%82%a3%e3%83%aa%e3%82%a2%e3%83%a0%e3%82%bar%e3%81%a7/">【MQL4】iWPR関数の使い方を徹底解説！ウィリアムズ%Rでエントリーシグナルを作ろう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>「ウィリアムズ%R（Williams&#8217; Percent Range）」というインジケーターをご存知ですか？これはラリー・ウィリアムズ氏が考案した<strong>オシレーター系テクニカル指標</strong>で、相場の「買われすぎ」「売られすぎ」を判断するのにとても便利なツールです。</p>
<p>MQL4では<strong>iWPR関数</strong>を使うことで、このウィリアムズ%Rの値を簡単に取得できます。この記事では、iWPR関数の基本的な使い方から、実践的なEA（自動売買）への応用まで、段階的にわかりやすく解説していきます。</p>
<h2><span id="toc1">ウィリアムズ%Rとは？</span></h2>
<p>ウィリアムズ%Rは、一定期間における最高値と最安値の範囲のなかで、現在の終値がどの位置にあるかをパーセンテージで示す指標です。</p>
<h3><span id="toc2">計算式</span></h3>
<p>ウィリアムズ%Rの計算式は以下のとおりです。</p>
<pre><code class="language-mql4">// ウィリアムズ%Rの計算式（概念）
// %R = (期間内の最高値 - 現在の終値) / (期間内の最高値 - 期間内の最安値) × (-100)
</code></pre>
<p>この計算により、値は常に<strong>0 ～ -100</strong>の範囲で推移します。ここが他のオシレーターと少し違うポイントで、値がマイナスの範囲で動くことを覚えておきましょう。</p>
<h3><span id="toc3">値の見方</span></h3>
<ul>
<li><strong>0 に近い（-20より上）</strong>：買われすぎゾーン → 売りシグナルの候補</li>
<li><strong>-100 に近い（-80より下）</strong>：売られすぎゾーン → 買いシグナルの候補</li>
<li><strong>-50 付近</strong>：中立的な状態</li>
</ul>
<p>ストキャスティクスと非常に似た性質を持っていますが、ウィリアムズ%Rはスケールが反転している点が特徴です。ストキャスティクスでは値が高いほど買われすぎですが、ウィリアムズ%Rでは値が0に近いほど買われすぎとなります。</p>
<h2><span id="toc4">iWPR関数の構文</span></h2>
<p>MQL4でウィリアムズ%Rの値を取得するには、<strong>iWPR関数</strong>を使います。構文は以下のとおりです。</p>
<pre><code class="language-mql4">double iWPR(
    string symbol,      // 通貨ペア名
    int    timeframe,   // 時間足
    int    period,      // 計算期間
    int    shift        // シフト（何本前のバーか）
);
</code></pre>
<h3><span id="toc5">引数の詳細</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, &#8220;USDJPY&#8221;</td>
</tr>
<tr>
<td>timeframe</td>
<td>int</td>
<td>時間足の定数。0で現在の時間足</td>
<td>0, PERIOD_H1</td>
</tr>
<tr>
<td>period</td>
<td>int</td>
<td>計算に使うバーの本数</td>
<td>14</td>
</tr>
<tr>
<td>shift</td>
<td>int</td>
<td>取得するバーの位置（0が最新）</td>
<td>0, 1</td>
</tr>
</tbody>
</table>
<p><strong>戻り値</strong>はdouble型で、0 ～ -100 の範囲の値が返されます。</p>
<h2><span id="toc6">基本的な使い方</span></h2>
<p>まずは、iWPR関数で値を取得してログに出力するシンプルな例を見てみましょう。</p>
<pre><code class="language-mql4">void OnTick()
{
    // 現在のチャート、現在の時間足、期間14、1本前の確定バーのウィリアムズ%Rを取得
    double wpr = iWPR(NULL, 0, 14, 1);

    // エキスパートログに出力
    Print("Williams %%R (1本前) = ", DoubleToString(wpr, 2));

    // 買われすぎ・売られすぎの判定
    if(wpr > -20)
    {
        Print("→ 買われすぎゾーン");
    }
    else if(wpr < -80)
    {
        Print("→ 売られすぎゾーン");
    }
    else
    {
        Print("→ 中立ゾーン");
    }
}
</code></pre>
<p>ここで<strong>shift に 1 を指定</strong>している点がポイントです。shift=0 だと現在まだ形成中のバーの値を取得してしまい、リアルタイムで値が変動します。EA開発では、確定したバー（shift=1）の値を使うのが基本です。</p>
<h2><span id="toc7">サンプル①：買われすぎ・売られすぎの状態をチャートに表示する</span></h2>
<p>次に、ウィリアムズ%Rの状態をチャートのコメントとしてリアルタイム表示するコードを作ってみましょう。</p>
<pre><code class="language-mql4">// ウィリアムズ%Rの状態表示スクリプト
extern int WPR_Period = 14;          // 計算期間
extern double OverBought = -20.0;    // 買われすぎライン
extern double OverSold   = -80.0;    // 売られすぎライン

void OnTick()
{
    double wprCurrent = iWPR(NULL, 0, WPR_Period, 0);
    double wprPrev    = iWPR(NULL, 0, WPR_Period, 1);

    string status = "";

    if(wprPrev > OverBought)
        status = "★ 買われすぎゾーン（売りに注目）";
    else if(wprPrev < OverSold)
        status = "★ 売られすぎゾーン（買いに注目）";
    else
        status = "― 中立ゾーン";

    Comment(
        "===== Williams %R Monitor =====\n",
        "期間: ", WPR_Period, "\n",
        "現在値 (形成中): ", DoubleToString(wprCurrent, 2), "\n",
        "確定値 (1本前) : ", DoubleToString(wprPrev, 2), "\n",
        "状態: ", status, "\n",
        "================================"
    );
}
</code></pre>
<p>このコードをEAとしてチャートにセットすると、左上にウィリアムズ%Rの値と状態がリアルタイムで表示されます。動きを観察しながら指標の特性を学ぶのに最適です。</p>
<h2><span id="toc8">サンプル②：ゾーン脱出型シグナルのシンプルEA</span></h2>
<p>ウィリアムズ%Rを使ったEAを作る際、単純に「-80以下で買い」とするとダマシが多くなります。そこで、<strong>ゾーン脱出型</strong>の考え方を取り入れます。</p>
<p>ゾーン脱出型とは、以下のようなロジックです。</p>
<ul>
<li><strong>買いシグナル</strong>：売られすぎゾーン（-80以下）に入った後、-80を上回って脱出したとき</li>
<li><strong>売りシグナル</strong>：買われすぎゾーン（-20以上）に入った後、-20を下回って脱出したとき</li>
</ul>
<p>これにより、ゾーン内に張り付いたまま反転しないケースのダマシを軽減できます。</p>
<pre><code class="language-mql4">// ゾーン脱出型 ウィリアムズ%R EA
extern int    WPR_Period  = 14;
extern double LotSize     = 0.01;
extern double OverBought  = -20.0;
extern double OverSold    = -80.0;
extern int    StopLoss    = 100;     // ストップロス（pips）
extern int    TakeProfit  = 200;     // テイクプロフィット（pips）
extern int    MagicNumber = 12345;

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

    // 確定バーと、その1つ前のバーのウィリアムズ%Rを取得
    double wpr1 = iWPR(NULL, 0, WPR_Period, 1);  // 直近の確定バー
    double wpr2 = iWPR(NULL, 0, WPR_Period, 2);  // その1つ前

    // 既存ポジションの確認
    int posCount = 0;
    for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
                posCount++;
        }
    }

    // ポジションがない場合のみエントリー判定
    if(posCount > 0) return;

    double sl, tp;

    // 買いシグナル：売られすぎゾーンから脱出
    if(wpr2 < OverSold &#038;&#038; wpr1 >= OverSold)
    {
        sl = Ask - StopLoss * Point * 10;
        tp = Ask + TakeProfit * Point * 10;
        int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, sl, tp,
                               "WPR Buy Signal", MagicNumber, 0, clrBlue);
        if(ticket > 0)
            Print("買いエントリー: WPR=", DoubleToString(wpr1, 2));
        else
            Print("買い注文エラー: ", GetLastError());
    }

    // 売りシグナル：買われすぎゾーンから脱出
    if(wpr2 > OverBought && wpr1 <= OverBought)
    {
        sl = Bid + StopLoss * Point * 10;
        tp = Bid - TakeProfit * Point * 10;
        int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, sl, tp,
                               "WPR Sell Signal", MagicNumber, 0, clrRed);
        if(ticket > 0)
            Print("売りエントリー: WPR=", DoubleToString(wpr1, 2));
        else
            Print("売り注文エラー: ", GetLastError());
    }
}
</code></pre>
<p>このEAのポイントは以下のとおりです。</p>
<ul>
<li><strong>新しいバー確定時のみ判定</strong>：static変数でバーの時刻を管理し、同じバーで何度も判定しない</li>
<li><strong>ゾーン脱出の判定</strong>：2本前がゾーン内、1本前がゾーン外になったことで「脱出」を検知</li>
<li><strong>ポジション制限</strong>：同時に1ポジションのみ持つようにしている</li>
</ul>
<h2><span id="toc9">サンプル③：移動平均線との組み合わせ（トレンドフィルター付きEA）</span></h2>
<p>オシレーター系指標の弱点は、<strong>強いトレンドが発生している局面</strong>では買われすぎ・売られすぎの状態が長く続き、シグナルが機能しにくいことです。</p>
<p>これを改善するために、<strong>移動平均線によるトレンドフィルター</strong>を追加したEAを作ってみましょう。</p>
<pre><code class="language-mql4">// トレンドフィルター付き ウィリアムズ%R EA
extern int    WPR_Period  = 14;
extern int    MA_Period   = 50;      // 移動平均線の期間
extern int    MA_Method   = MODE_SMA; // 移動平均の種類
extern double LotSize     = 0.01;
extern double OverBought  = -20.0;
extern double OverSold    = -80.0;
extern int    StopLoss    = 100;
extern int    TakeProfit  = 200;
extern int    MagicNumber = 12346;

void OnTick()
{
    // 新しいバー確定時のみ処理
    static datetime lastBarTime = 0;
    if(Time[0] == lastBarTime) return;
    lastBarTime = Time[0];

    // ウィリアムズ%Rの値を取得
    double wpr1 = iWPR(NULL, 0, WPR_Period, 1);
    double wpr2 = iWPR(NULL, 0, WPR_Period, 2);

    // 移動平均線の値を取得
    double ma1 = iMA(NULL, 0, MA_Period, 0, MA_Method, PRICE_CLOSE, 1);

    // 現在の価格と移動平均線の位置関係でトレンドを判定
    double closePrice = Close[1];
    bool isUpTrend   = (closePrice > ma1);  // 上昇トレンド
    bool isDownTrend = (closePrice < ma1);  // 下降トレンド

    // 既存ポジションの確認
    int posCount = 0;
    for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
                posCount++;
        }
    }

    if(posCount > 0) return;

    double sl, tp;

    // 買いシグナル：上昇トレンド中 + 売られすぎゾーンから脱出
    if(isUpTrend && wpr2 < OverSold &#038;&#038; wpr1 >= OverSold)
    {
        sl = Ask - StopLoss * Point * 10;
        tp = Ask + TakeProfit * Point * 10;
        int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, sl, tp,
                               "WPR+MA Buy", MagicNumber, 0, clrBlue);
        if(ticket > 0)
            Print("買いエントリー（トレンドフィルター付き）: WPR=",
                  DoubleToString(wpr1, 2), " MA=", DoubleToString(ma1, 5));
    }

    // 売りシグナル：下降トレンド中 + 買われすぎゾーンから脱出
    if(isDownTrend && wpr2 > OverBought && wpr1 <= OverBought)
    {
        sl = Bid + StopLoss * Point * 10;
        tp = Bid - TakeProfit * Point * 10;
        int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, sl, tp,
                               "WPR+MA Sell", MagicNumber, 0, clrRed);
        if(ticket > 0)
            Print("売りエントリー（トレンドフィルター付き）: WPR=",
                  DoubleToString(wpr1, 2), " MA=", DoubleToString(ma1, 5));
    }
}
</code></pre>
<p>このEAでは、以下のフィルタリングを行っています。</p>
<ul>
<li><strong>買いエントリー</strong>：価格が移動平均線より上（上昇トレンド）のときだけ、売られすぎからの脱出シグナルを採用</li>
<li><strong>売りエントリー</strong>：価格が移動平均線より下（下降トレンド）のときだけ、買われすぎからの脱出シグナルを採用</li>
</ul>
<p>こうすることで、<strong>トレンド方向と逆行するエントリーを防ぎ</strong>、勝率の向上が期待できます。</p>
<h2><span id="toc10">iWPR関数を使う際の注意点</span></h2>
<h3><span id="toc11">1. 値の範囲はマイナスである</span></h3>
<p>ウィリアムズ%Rの値は<strong>0 ～ -100</strong>です。RSIのように0～100ではないので、条件式を書くときに符号を間違えないよう注意してください。例えば「-80以下」は <code>wpr &lt; -80</code> と書きます。</p>
<h3><span id="toc12">2. トレーディングスタイルに合わせた期間設定</span></h3>
<p>ウィリアムズ%Rの計算期間は、トレーディングスタイルに合わせて調整するのがおすすめです。</p>
<table>
<thead>
<tr>
<th>スタイル</th>
<th>推奨期間</th>
<th>特徴</th>
</tr>
</thead>
<tbody>
<tr>
<td>スキャルピング</td>
<td>7</td>
<td>シグナルが敏感、ダマシも多い</td>
</tr>
<tr>
<td>デイトレード</td>
<td>14</td>
<td>バランスが良い（デフォルト）</td>
</tr>
<tr>
<td>スイングトレード</td>
<td>21〜28</td>
<td>シグナルは少ないが信頼性が高い</td>
</tr>
</tbody>
</table>
<h3><span id="toc13">3. 強いトレンド相場には注意</span></h3>
<p>オシレーター系指標全般に言えることですが、強い上昇トレンドや下降トレンドでは、ウィリアムズ%Rが買われすぎ・売られすぎゾーンに張り付いたまま動かないことがあります。このような場合、逆張りシグナルが機能しません。サンプル③のように<strong>トレンドフィルターと組み合わせる</strong>ことを強くおすすめします。</p>
<h3><span id="toc14">4. 確定バーの値を使う</span></h3>
<p>EA開発では、形成中のバー（shift=0）ではなく、<strong>確定したバー（shift=1以上）の値を使う</strong>のが鉄則です。形成中のバーの値はティックごとに変動するため、シグナルがチラつく原因になります。</p>
<h2><span id="toc15">まとめ</span></h2>
<p>この記事では、MQL4のiWPR関数を使ってウィリアムズ%Rの値を取得し、EA開発に活用する方法を解説しました。最後にポイントをおさらいしましょう。</p>
<ul>
<li><strong>iWPR関数</strong>は4つの引数（symbol, timeframe, period, shift）を指定してウィリアムズ%Rの値を取得する</li>
<li>値の範囲は<strong>0 ～ -100</strong>で、-20以上が買われすぎ、-80以下が売られすぎ</li>
<li><strong>ゾーン脱出型</strong>のシグナルにすることで、単純なゾーン判定よりダマシを軽減できる</li>
<li><strong>移動平均線などのトレンドフィルター</strong>と組み合わせることで、さらに精度を高められる</li>
<li>EA開発では必ず<strong>確定バー（shift=1）</strong>の値を使うこと</li>
</ul>
<p>ウィリアムズ%Rはシンプルな指標ですが、正しく使えばエントリーポイントの精度を上げる強力な武器になります。まずはサンプルコードをストラテジーテスターで動かして、動作を確認するところから始めてみてください！</p>
<p>投稿 <a href="https://mql-programing.com/archives/13040/%e3%80%90mql4%e3%80%91iwpr%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%a6%e3%82%a3%e3%83%aa%e3%82%a2%e3%83%a0%e3%82%bar%e3%81%a7/">【MQL4】iWPR関数の使い方を徹底解説！ウィリアムズ%Rでエントリーシグナルを作ろう</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
