既刊のピボットポイント自動描画インジケーターは、

PP・R1・S1・R2・S2のラインを表示するだけで、

発注は行いませんでした。

この記事では、同じ計算ロジックをそのままエントリー条件に転用し、

R1を上に抜けたら買い、S1を下に抜けたら売る、

ブレイクアウト順張りEAの作り方を解説します。

この記事で分かること
・既刊ピボットポイントインジケーターとの役割の違い
・R1/S1ブレイクをエントリー条件にする設計
・損切りをPPラインに置く設計理由
・実際に動くコード全体

設計思想: なぜPP/R1/S1をそのまま発注条件に使えるか

まず、このEAがどんな考え方で作られているかを整理します。

既刊インジケーターとの関係

既刊のピボットポイントインジケーターは、

PP・R1・S1・R2・S2を計算して表示するだけでした。

本記事はその計算ロジックをそのまま使い、

R1・S1のブレイクを発注の判定に変えます。

ブレイクアウト戦略に共通するリスク

先に知っておくべきリスク
・ラインを一度抜けても、すぐに戻ってくる「だまし」が起こりやすい
・だまされた場合は損切りに引っかかり、小さな損失が積み重なる
・このEAは順張り専用で、レンジ相場では不利になりやすい

ブレイクアウト戦略はどの手法でも共通してこのリスクを持つため、

資金管理(ロット数・1日の最大損失上限)と必ずセットで運用してください。

既刊スイングブレイクアウトEAとの判定基準の違い

記事 判定基準 特徴
既刊(スイングブレイクアウトEA) 直近のスイング高値・安値 値動きから後付けで検出したレベル
本記事(ピボットブレイクアウトEA) 前日確定値から計算したR1/S1 その日が始まった時点で決まっている先出しのレベル

どちらも「レベルを抜けたらエントリー」という発注の仕組みは似ていますが、

レベルの決め方が根本的に違います。

R1/S1の計算とブレイク判定

既刊インジケーターと同じ計算式を、EA内で直接計算します。

前日確定値からPP/R1/S1を計算する

double prevHigh  = iHigh(NULL, PERIOD_D1, 1);
double prevLow   = iLow(NULL, PERIOD_D1, 1);
double prevClose = iClose(NULL, PERIOD_D1, 1);

double pp = (prevHigh + prevLow + prevClose) / 3.0;
double r1 = 2 * pp - prevLow;
double s1 = 2 * pp - prevHigh;

既刊インジケーターのDrawPivotLines()と同じ式です。

確定した1本前のバーでブレイクを判定する

bool brokeR1Up = (Close[2] <= r1 && Close[1] > r1);
bool brokeS1Down = (Close[2] >= s1 && Close[1] < s1);

形成中の最新バー(Close[0])ではなく、

確定した1本前(Close[1])とその前(Close[2])を比較することで、

未確定の値による誤判定を避けます。

エントリーと損切りの設計

ブレイクの方向にエントリーし、

損切りはPPラインに置きます。

損切りをPPラインに置く理由

損切りの位置をPPにする理由
・R1を抜けて買った場合、PPまで戻ってくるのは「ブレイク失敗」とみなせる
・固定pipsではなく、その日の相場環境に合わせた損切り幅になる

固定の損切り幅ではなく、

その日ごとに変わるPPラインを基準にすることで、

値動きの大きさに応じた損切りになります。

同一ラインでの重複エントリー防止

static double g_lastEntryR1 = 0;
if(brokeR1Up && r1 != g_lastEntryR1)
  {
   g_lastEntryR1 = r1;
   // エントリー処理
  }

同じR1ラインで何度も買いエントリーしないよう、

直前にエントリーしたラインの値を記録しておきます。

実際に動くコード全体

実際にMetaEditorでコンパイルできる、

R1/S1ブレイクアウトEAです。

//+------------------------------------------------------------------+
//|                                        PivotBreakoutEA.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

input double InpLots         = 0.01;
input int    InpMagicNumber  = 20261030;
input int    InpSlippage     = 3;

double g_lastEntryR1 = 0;
double g_lastEntryS1 = 0;

void GetPivot(double &pp, double &r1, double &s1)
  {
   double prevHigh  = iHigh(NULL, PERIOD_D1, 1);
   double prevLow   = iLow(NULL, PERIOD_D1, 1);
   double prevClose = iClose(NULL, PERIOD_D1, 1);

   pp = (prevHigh + prevLow + prevClose) / 3.0;
   r1 = 2 * pp - prevLow;
   s1 = 2 * pp - prevHigh;
  }

bool HasOpenPosition()
  {
   for(int i = 0; i < OrdersTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == _Symbol && OrderMagicNumber() == InpMagicNumber)
            return(true);
        }
     }
   return(false);
  }

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }

void OnTick()
  {
   if(HasOpenPosition())
      return;

   double pp, r1, s1;
   GetPivot(pp, r1, s1);

   bool brokeR1Up   = (Close[2] <= r1 && Close[1] > r1);
   bool brokeS1Down = (Close[2] >= s1 && Close[1] < s1);

   if(brokeR1Up && r1 != g_lastEntryR1)
     {
      g_lastEntryR1 = r1;
      OrderSend(_Symbol, OP_BUY, InpLots, Ask, InpSlippage, pp, 0,
                "PivotBreakoutEA", InpMagicNumber, 0, clrBlue);
     }
   else if(brokeS1Down && s1 != g_lastEntryS1)
     {
      g_lastEntryS1 = s1;
      OrderSend(_Symbol, OP_SELL, InpLots, Bid, InpSlippage, pp, 0,
                "PivotBreakoutEA", InpMagicNumber, 0, clrRed);
     }
  }

MetaEditorでのコンパイル・実行手順

実際にMT4で動かすまでの手順です。

  1. MetaEditorで新規EA「PivotBreakoutEA」を作成し、上のコードを貼り付けてコンパイルする
  2. エラー・警告が0件であることを確認する
  3. デモ口座のチャートに適用し、自動売買を有効にする
  4. 既刊のピボットポイントインジケーターも同じチャートに適用し、R1/S1のラインと発注タイミングが一致することを目視で確認する
  5. InpLotsを最小単位にしたまま、数日間デモで動作を観察する

よくあるエラーと注意点

実装・運用でつまずきやすいポイントをまとめます。

ブレイク後の「戻り」でだまされる

R1を一瞬だけ上に抜けてすぐ戻ってくる動きは珍しくありません。

このコードはCloseの確定値だけで判定するため、

ヒゲだけで一瞬抜けたケースは誤判定しにくい一方、

確定後に戻る「だまし」そのものは避けられません。

レンジ相場では不利になりやすい

このEAは順張り専用のため、

R1とS1の間を往復するレンジ相場では、

エントリーが少ないか、だまされて損切りが続くことがあります。

既刊のトレンド/レンジ判定インジケーターと組み合わせて、

レンジ相場のときは停止する工夫も検討してください。

週明けはR1/S1の幅が広くなりやすい

週末を挟んだ月曜は、

前日(金曜)の値幅がそのまま使われるため、

R2/S2まで含めた幅が平日より広くなることがあります。

よくある質問

ピボットブレイクアウトEAについて、よくある疑問に回答します。

既刊のスイングブレイクアウトEAと同時に使えますか?

マジックナンバーを分ければ同時に使えます。

ただし判定基準が異なるため、

どちらのエントリーが機能しているかを分けて記録することをおすすめします。

損切りを固定pipsにできますか?

できます。

OrderSendの損切り価格をppの代わりに、

Ask-固定pips×Pointのような計算に変えれば、

固定pips方式に変更できます。

R2/S2のブレイクも判定に使えますか?

使えます。

GetPivot関数にr2・s2の計算を追加し、

R1/S1を抜けたあとの次の目標として、

利確ラインに使う設計にも拡張できます。

【MQL4】ピボットポイントのR1/S1ブレイクをエントリー条件にするEAの作り方:まとめ

既刊のピボットポイントインジケーターの計算ロジックをそのまま使い、

R1を上に抜けたら買い、S1を下に抜けたら売るブレイクアウトEAとして実装しました。

損切りをPPラインに置くことで、

固定pipsではなくその日の相場環境に合わせた損切りになります。

ブレイクアウト戦略共通のリスク(だまし・レンジ相場での不利)を理解した上で、

デモ口座での検証から始めてください。

関連記事