パラボリックSARは、点が価格の下側から上側へ、

または上側から下側へ移ることでトレンド転換の候補を示します。

ただし、チャート上のすべての点を追っていると「どこで反転したのか」が分かりにくくなります。

そこで、SARの位置が切り替わった足だけに矢印を表示するインジケーターを作ります。

現在足ではなく確定足に限定し、後から矢印が消えたように見える問題も減らします。

設計思想: SARの数値ではなく価格との位置関係を見る

パラボリックSARは、上昇局面では価格の下側、下降局面では価格の上側に表示されます。

したがって反転判定では、SAR値そのものの大小ではなく「その足の価格より上か下か」

を比較します。

今回は終値を基準に、次の2つを判定します。

  • SARが価格の上から下へ移動した: 上昇転換候補として上向き矢印
  • SARが価格の下から上へ移動した: 下降転換候補として下向き矢印

iSAR関数の書式

double iSAR(
   string symbol,     // 通貨ペア。NULLで現在のチャート
   int    timeframe,  // 時間足。0で現在の時間足
   double step,       // 加速係数の増分
   double maximum,    // 加速係数の最大値
   int    shift       // 何本前の値か
);

標準的な設定は`step=0.02`、`maximum=0.2`です。

stepを大きくすると価格への追従が速くなる一方、

細かな上下動で反転判定が増えやすくなります。

反転だけを矢印表示するコード全文

#property strict
#property indicator_chart_window
#property indicator_buffers 2

input double SarStep = 0.02;
input double SarMaximum = 0.2;
input int ArrowGapPoints = 30;

double BuyArrowBuffer[];
double SellArrowBuffer[];

int OnInit()
{
   SetIndexBuffer(0, BuyArrowBuffer);
   SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID, 1, clrLimeGreen);
   SetIndexArrow(0, 233);
   SetIndexLabel(0, "SAR上昇転換");
   SetIndexEmptyValue(0, EMPTY_VALUE);

   SetIndexBuffer(1, SellArrowBuffer);
   SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID, 1, clrTomato);
   SetIndexArrow(1, 234);
   SetIndexLabel(1, "SAR下降転換");
   SetIndexEmptyValue(1, EMPTY_VALUE);

   return(INIT_SUCCEEDED);
}

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[])
{
   if(rates_total < 3)
      return(0);

   int limit = rates_total - prev_calculated;
   if(prev_calculated > 0)
      limit++;

   if(limit > rates_total - 2)
      limit = rates_total - 2;

   BuyArrowBuffer[0] = EMPTY_VALUE;
   SellArrowBuffer[0] = EMPTY_VALUE;

   for(int i = limit; i >= 1; i--)
   {
      BuyArrowBuffer[i] = EMPTY_VALUE;
      SellArrowBuffer[i] = EMPTY_VALUE;

      double sar_current = iSAR(NULL, 0, SarStep, SarMaximum, i);
      double sar_previous = iSAR(NULL, 0, SarStep, SarMaximum, i + 1);

      bool previous_bearish = (sar_previous > close[i + 1]);
      bool previous_bullish = (sar_previous < close[i + 1]);
      bool current_bullish = (sar_current < close[i]);
      bool current_bearish = (sar_current > close[i]);

      if(previous_bearish && current_bullish)
         BuyArrowBuffer[i] = low[i] - ArrowGapPoints * Point;

      if(previous_bullish && current_bearish)
         SellArrowBuffer[i] = high[i] + ArrowGapPoints * Point;
   }

   return(rates_total);
}

0番の足は形成中なので、常に`EMPTY_VALUE`にしています。

反転判定は1番以降の確定足だけに対して行います。

MetaEditorでの実行手順

MT4のMetaEditorで「カスタムインジケーター」を新規作成し、

生成されたコードを全文置き換えます。

コンパイル後、MT4のナビゲータから任意のチャートへ適用してください。

標準のParabolic SARも同じ`0.02 / 0.2`で重ねると、

点の位置が切り替わった確定足だけに矢印が出ることを確認できます。

矢印がローソク足に重なる場合は、`ArrowGapPoints`を増やします。

なぜ現在足に矢印を出さないのか

現在足では高値・安値・終値が動き続けます。

一時的にSARとの位置関係が切り替わっても、足の確定前に元へ戻る場合があります。

リアルタイム性は少し落ちますが、確定足だけを描画する方が、

過去チャートと実運用の見え方を揃えやすくなります。

SAR反転を単独で売買条件にしない

レンジ相場では、価格の上下にSARが頻繁に移動し、矢印が連続します。

実際にEAへ発展させる場合は、ADXが一定値以上、長期移動平均の方向と一致、

損切り幅をATRで決める、といった条件を追加してください。

また、矢印の出現だけで勝率を断定せず、

銘柄・時間足・スプレッドを含むバックテストが必要です。

よくあるエラー

矢印が過去足に大量表示される

「SARが価格より下」という状態だけを判定すると、上昇中の全足に矢印が出ます。

前の足との位置関係が切り替わった瞬間だけを条件にしてください。

矢印がローソク足の中に埋まる

通貨ペアの桁数によってPointの大きさが異なります。

`ArrowGapPoints`を入力値にして、チャートごとに調整します。

まとめ

パラボリックSARの反転は、SAR値と価格の上下関係が、

前の足から切り替わったかで判定できます。

確定足だけに矢印を出せば、形成中の足でシグナルが出たり消えたりする混乱を減らせます。

ただしレンジではダマシが増えるため、矢印は売買命令ではなく「環境を再確認する合図」

として使うのが安全です。

SAR関数そのものの基礎は、

iSARの解説記事もあわせて確認してください。