Williams%R(iWPR)が-80ラインまで下がったことには気づいても、

そこから「戻るのを待つ」間に、チャートから目を離してしまったことはないでしょうか。

既刊記事では、ラインから戻った瞬間をEAのエントリー条件にしましたが、

戻りを待つ分だけ、サインが出るタイミングはどうしても遅れます。

この記事では、ラインに「到達した瞬間」だけを矢印で表示するインジケーターを作り、

既刊EAより一歩早い段階で、相場の変化に気づけるようにします。

この記事で分かること
・iWPRの引数と戻り値の見方
・「到達の瞬間」と「戻りの瞬間」、2つのサインの役割分担
・状態ではなく変化を検知するコードの書き方
・実際に動くインジケーターのコード全体

Williams%Rの基本と、既刊EA記事との役割分担

まず、矢印の元になるiWPRの基本と、既刊記事との違いを整理します。

iWPRのシグネチャと戻り値の見方

double iWPR(
   string symbol,
   int    timeframe,
   int    period,
   int    shift
);

戻り値はdouble型で、`-100`(売られすぎの極限)から、

`0`(買われすぎの極限)の範囲で動きます。

-80/-20ラインの意味

一般的に、`-80`を下回ると「売られすぎ」、`-20`を上回ると「買われすぎ」

と判断されます。

マイナス表記のため、数値の大小関係が直感と逆になりやすい点に注意してください。

既刊EA記事(戻り確認)との役割分担

既刊のWilliams%R逆張りEA記事は、「ラインから戻った瞬間」

だけをエントリー条件にすることで、ダマシを減らす設計でした。

本記事のインジケーターは逆に、「ラインに到達した瞬間」だけを検知します。

補足
・到達の瞬間は、戻りの瞬間より早く出る
・ただしダマシも多く、単独でのエントリー判断には向かない
・「そろそろ反転が近いかもしれない」という早期の注意喚起として使う
・実際のエントリーは既刊EAの『戻り確認』ロジックに任せる、という2段構えの使い方を想定

「状態」ではなく「変化」を検知する判定ロジック

到達した瞬間だけを取り出すための考え方を確認します。

単純な条件だけだと矢印が出っぱなしになる

wpr0 <= -80

この条件だけでは、-80以下にある間ずっと矢印が出てしまい、

画面が矢印で埋まってしまいます。

1本前との比較で「ちょうど跨いだ瞬間」を取り出す

//今の足は-80以下(到達している)
wpr0 <= InpOversold

//1本前は-80より上だった(到達していなかった)
wpr1 > InpOversold

この2つを同時に満たす足だけに矢印を出すことで、「ちょうど-80ラインを下に跨いだ瞬間」

だけを取り出せます。

買われすぎ側も同じ考え方で判定する

買われすぎ側(-20ライン)も、同じ「1本前との比較」で判定します。

上に跨いだ瞬間だけを検知するため、跨いだ方向が逆になる以外はロジックは対称です。

実際に動く到達検知インジケーターのコード全体

ここまでの要素をまとめた、インジケーターの全体です。

//+------------------------------------------------------------------+
//|                                 WprZoneEntryArrow.mq4             |
//|                     Copyright 2026, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DeepSkyBlue
#property indicator_color2 OrangeRed
#property indicator_minimum -100
#property indicator_maximum 0

input int    InpPeriod         = 14;    //Williams%Rの計算期間
input double InpOversold       = -80.0; //売られすぎライン
input double InpOverbought     = -20.0; //買われすぎライン
input int    InpArrowGapPoints = 10;    //ラインから矢印を離すポイント数

double OversoldArrow[];
double OverboughtArrow[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0, OversoldArrow);
   SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID, 2);
   SetIndexArrow(0, 233);
   SetIndexEmptyValue(0, EMPTY_VALUE);

   SetIndexBuffer(1, OverboughtArrow);
   SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID, 2);
   SetIndexArrow(1, 234);
   SetIndexEmptyValue(1, EMPTY_VALUE);

   IndicatorShortName("Williams %R Zone Entry Arrow");
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                               |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int needed = InpPeriod + 2;
   if(rates_total < needed)
      return(0);

   int limit = (prev_calculated == 0) ? rates_total - 2
                                       : rates_total - prev_calculated + 1;
   if(limit > rates_total - 2)
      limit = rates_total - 2;

   for(int i = limit; i >= 0; i--)
     {
      OversoldArrow[i]   = EMPTY_VALUE;
      OverboughtArrow[i] = EMPTY_VALUE;

      double wpr0 = iWPR(NULL, 0, InpPeriod, i);
      double wpr1 = iWPR(NULL, 0, InpPeriod, i + 1);

      if(wpr0 <= InpOversold && wpr1 > InpOversold)
         OversoldArrow[i] = wpr0 - InpArrowGapPoints;
      else if(wpr0 >= InpOverbought && wpr1 < InpOverbought)
         OverboughtArrow[i] = wpr0 + InpArrowGapPoints;
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+

このインジケーターは、既刊のEA記事と違い、

`indicator_separate_window`で、

Williams%R自体の値も一緒にサブウィンドウへ表示する構成にしています。

MetaEditorでのコンパイル・表示手順

実際にチャートへ適用するまでの手順です。

  1. MT4のMetaEditorで「ファイル」→「新規作成」→「カスタムインディケータ」を選ぶ
  2. 「WprZoneEntryArrow」という名前で作成し、テンプレートの中身をすべて削除して上のコードを貼り付ける
  3. F7キーでコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
  4. チャートへ適用し、サブウィンドウにWilliams%Rのラインと矢印が表示されることを確認する
  5. -80ラインを下に跨いだ直後の足に矢印が出ることを目視で確認する

よくあるエラーと注意点

実際に運用する前に、確認しておきたい点です。

矢印が全く表示されない

サブウィンドウの表示範囲

(`indicator_minimum`/`indicator_maximum`)が、

他のテンプレート設定で上書きされていないか確認してください。

既刊EAのサインと矢印の出るタイミングがずれる

注意
・本記事の矢印は『到達の瞬間』、既刊EAは『戻りの瞬間』で、設計上タイミングが違う
・同じ足に両方が出ることはない(到達と戻りは別の足で起きる)
・『ずれている=バグ』ではなく仕様どおりの動作

矢印が頻発してうるさい

強いトレンド中はラインへの到達を繰り返しやすいため、矢印も増えます。

単独の判断材料にせず、既刊の効率比・ADX系インジケーターと組み合わせて、

トレンドの強さも併せて確認することをおすすめします。

このインジケーターの使いどころと限界

得意な場面と、単独では判断しきれない場面を整理します。

早期の注意喚起として使う

「そろそろ反転が近いかもしれない」と気づくための、

早期警戒のサインとして使うのに向いています。

単独でのエントリー判断には向かない

到達した直後にそのまま反転せず、

さらに深く沈み込む(またはさらに高く進む)ケースも多くあります。

実際のエントリーは、既刊EAの「戻り確認」ロジックと組み合わせることを想定しています。

既刊EAと2段構えで使う組み合わせ例

本記事の矢印で早期に相場の変化へ注意を向け、既刊EAの「戻り確認」

シグナルが出た段階で、実際の発注を検討する、という2段構えの使い方が、

ダマシと反応速度のバランスを取りやすい形です。

よくある質問

到達検知インジケーターについて、よく検索される疑問に回答します。

このインジケーターだけでエントリーしてもいいですか?

推奨しません。

到達した瞬間はダマシも多いため、既刊のWilliams%R逆張りEA記事のように「戻り」

を確認する一手間を、エントリーの最終判断には加えることをおすすめします。

-80/-20以外の数値に変えてもよいですか?

はい、`InpOversold`・`InpOverbought`は入力パラメータのため、

通貨ペアや時間足に合わせて自由に調整できます。

サブウィンドウではなくメインチャートに矢印を出したいです

`#property indicator_separate_window`を、

`indicator_chart_window`に変更し、

矢印の値をWilliams%Rの数値ではなく、

既刊記事のように高値・安値からのオフセットに変更すれば、

メインチャートへの表示に切り替えられます。

【MQL4】Williams%R(iWPR)が-80/-20ラインに到達した瞬間だけを矢印表示するインジケーターの作り方(既刊EAの『戻り確認』より早いサインとして使う設計):まとめ

この記事では、Williams%Rが-80/-20ラインに「到達した瞬間」

だけを矢印で表示するインジケーターの作り方を解説しました。

既刊EA記事の「戻りを確認してからエントリーする」設計と組み合わせることで、

早期の注意喚起と、ダマシを減らした発注判断を分担できます。

関連記事