DeMarkerは、直近の高値と安値の変化から、

買われすぎ・売られすぎを測るオシレーターです。

MT4では`iDeMarker()`を使えば値を1行で取得できます。

しかし、現在の足を表す`shift=0`だけを見て「0.7を超えたから売り」

と判断すると、足が確定する前に値が戻り、シグナルが消えることがあります。

この記事では、iDeMarker関数の引数と、

確定足で0.7・0.3の境界をまたいだ瞬間だけを検知する方法を解説します。

DeMarkerとは

DeMarkerは0から1の範囲で推移する指標です。

一般に0.7より上は買われすぎ、0.3より下は売られすぎの目安として使われます。

ただし、0.7を超えたら必ず下落し、0.3を下回ったら必ず上昇するわけではありません。

強いトレンドでは過熱圏に長く張り付くため、境界への到達を単独の売買理由にせず、

クロスやトレンド条件と組み合わせます。

iDeMarker関数の書式

double iDeMarker(
   string symbol,     // 通貨ペア。NULLで現在のチャート
   int    timeframe,  // 時間足。0で現在の時間足
   int    period,     // 平均期間
   int    shift       // 何本前の値か
);

戻り値はDeMarkerの数値です。

公式リファレンスの例は`iDeMarker(NULL,0,13,1)`で、

現在の通貨ペア・時間足における期間13、1本前の値を取得します。

shift=0ではなく確定足を使う理由

`shift=0`は形成中のローソク足です。

新しい高値・安値が更新されるたびにDeMarkerも動くため、

一度0.7を超えても終値確定時には0.7未満へ戻る可能性があります。

EAの判定を再現しやすくするなら、直近の確定足`shift=1`と、

その1本前`shift=2`を比較します。

たとえば上から0.7を下抜けた瞬間は、次の条件です。

2本前のDeMarker >= 0.7
1本前のDeMarker <  0.7

単に「0.7より上」を判定するより、同じ過熱状態で毎ティック通知する問題も防げます。

0.7・0.3のクロスを判定するEAコード

#property strict

input int DeMarkerPeriod = 13;
input double Overbought = 0.7;
input double Oversold = 0.3;

datetime last_bar_time = 0;

void OnTick()
{
   if(Time[0] == last_bar_time)
      return;

   last_bar_time = Time[0];

   double demarker_1 = iDeMarker(NULL, 0, DeMarkerPeriod, 1);
   double demarker_2 = iDeMarker(NULL, 0, DeMarkerPeriod, 2);

   bool sell_signal = (demarker_2 >= Overbought &&
                       demarker_1 <  Overbought);

   bool buy_signal = (demarker_2 <= Oversold &&
                      demarker_1 >  Oversold);

   if(sell_signal)
      Alert(Symbol(), " DeMarkerが買われすぎ圏から下抜け: ",
            DoubleToString(demarker_1, 3));

   if(buy_signal)
      Alert(Symbol(), " DeMarkerが売られすぎ圏から上抜け: ",
            DoubleToString(demarker_1, 3));
}

このコードは新しい足が始まったときだけ判定するため、

確定足1本につき最大1回しか通知しません。

売買注文はあえて入れていません。

指標単独で自動発注する前に、アラートでシグナルの出方を観察し、

時間足や銘柄ごとに検証するためです。

MetaEditorでの実行手順

MT4のMetaEditorで新しいEAを作成し、コード全体を貼り付けてコンパイルします。

MT4へ戻り、ナビゲータから任意のチャートへEAを適用してください。

視覚的に照合するには、同じチャートへ標準のDeMarkerも追加し、

期間をEAと同じ13にします。

DeMarkerが0.7を上から下へ、または0.3を下から上へ抜けた、

次の足でアラートが出ることを確認します。

よくある間違い

0.7より上なら毎回売る

過熱圏に滞在している間、何度も売り条件が成立します。

境界クロスとして判定するか、ポジションの有無を確認してください。

現在足shift=0でバックテスト結果を評価する

形成中の値は変動します。

確定足判定と現在足判定を混ぜると、実運用で再現しにくい結果になります。

過熱圏を反転保証と考える

DeMarkerは相場の状態を測る材料であり、未来を保証する信号ではありません。

移動平均の方向や損切りルールを別に用意してください。

まとめ

iDeMarkerは4つの引数で値を取得できるシンプルな関数です。

実務で重要なのは、関数の呼び方よりも、

形成中の`shift=0`を避けて確定足のクロスを判定することです。

まずは注文を出さないアラートEAで挙動を確認し、

その後に環境認識・資金管理・損切りを加えてください。

オシレーターを使った別の例として、

iCCI関数のapplied_priceの注意点も参考になります。