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でのコンパイル・表示手順
実際にチャートへ適用するまでの手順です。
- MT4のMetaEditorで「ファイル」→「新規作成」→「カスタムインディケータ」を選ぶ
- 「WprZoneEntryArrow」という名前で作成し、テンプレートの中身をすべて削除して上のコードを貼り付ける
- F7キーでコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
- チャートへ適用し、サブウィンドウにWilliams%Rのラインと矢印が表示されることを確認する
- -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記事の「戻りを確認してからエントリーする」設計と組み合わせることで、
早期の注意喚起と、ダマシを減らした発注判断を分担できます。
コメント