アジア時間ATRスクイーズ・ブレイク:USD/JPYで始める低リスク・高再現性の短期戦略

FX

この記事では、アジア時間の低ボラティリティ(スクイーズ)を起点に、直後のブレイクアウトだけを選別して狙うUSD/JPYの短期戦略を、投資初心者でも再現できるレベルまで分解して解説します。エントリー/エグジットの明確なルール、取引時間帯のフィルタ、資金管理、実際の検証手順、そしてそのまま動作するMQL4 EAのフルコードまで掲載します。裁量の余地を極力排除し、低リスク・高再現性を目指します。

スポンサーリンク
【DMM FX】入金

戦略の狙いと全体像

アジア時間(東京早朝〜午後)は、欧米時間に比べて平均的に値動きが穏やかになりやすい時間帯です。この時間帯に一定時間レンジが圧縮(スクイーズ)される局面を定量的に検出し、その後に発生する閾値超えの価格ブレイクだけを取引します。無秩序にブレイクを追いかけるのではなく、事前に「十分に圧縮していた」という前提条件で質の悪いブレイクをカットします。

使用マーケットと時間軸

  • 銘柄:USD/JPY
  • 足種:M5(5分足)
  • 主時間帯:ブローカーサーバー時刻で東京時間帯に相当する数時間(具体設定はEA入力で調整)

ブローカーのサーバー時刻と日本時間はズレるため、EAの開始・終了時刻は各社のサーバータイムに合わせて調整します。初期設定では大枠の東京時間に近い帯にしておき、約定ログとチャート照合で微調整してください。

エッジの根拠(なぜ機能し得るのか)

  1. 流動性の偏在:東京時間は実需フロー中心で、短時間に強いトレンドが出づらい反面、圧縮が溜まると一方向に素早く抜けやすい。
  2. 参加者の交代:仲値・昼休み・欧州勢参入など時間帯イベントで微小な需給ショックが起こり、スクイーズ後のブレイクが走りやすい。
  3. ノイズ削減:スクイーズ条件で不要なノイズ相場を除外でき、取引回数は減るが平均品質は上がる

エントリー条件(定量化)

以下の「レンジ圧縮(スクイーズ)」「ブレイク」「時間フィルタ」をすべて満たしたときにエントリーします。

1) レンジ圧縮の定義

  • 直近 N本(例:24本=約2時間)の最高値−最安値(ドンチャンレンジ幅)が、しきい値Pips以下(例:8pips)
  • 補助指標としてATR(M)(例:ATR=14)が、直近M本の平均ATR×係数(例:0.8)より低い場合は信頼度↑(任意)

2) ブレイク条件

  • 上抜け:直近N本の最高値+バッファ(例:+0.5〜1.0pips)を終値が上回る
  • 下抜け:直近N本の最安値−バッファ終値が下回る

3) 時間フィルタ

  • ブローカーサーバー時刻で、StartHour ≤ 現在時刻 < EndHour のときのみ取引
  • 重要指標直前は回避(例:±15〜30分、EAでは手動停止で対応可能)

ポジション管理(損切り・利確・保有時間)

  • 初期SL:ブレイク方向の逆側ドンチャン帯の外側(例:OppositeBand −/+ バッファ
  • 初期TPRR=1.2〜1.5 を目安(初心者は固定比率で十分)
  • 建値ストップ:含み益が0.6Rに達したらSLを建値へ繰上げ(損失の早期遮断)
  • タイムアウト:最大保有時間(例:90〜120分)を過ぎたら成行クローズ

必要な準備

  1. MT4(MetaTrader 4)が使える口座を用意
  2. USD/JPYのM5チャートを表示、過去データを十分に取得
  3. 本記事のEAを導入し、デモ口座で最初に検証(いきなり実弾は不可)

取引シナリオの具体例

例:午前中にN=24本(約2時間)のレンジ幅が7.6pipsまで圧縮。最高値は151.250、最安値は151.174。11:05に終値151.261で最高値+0.9pipsを上抜け。SLは反対側レンジ外の151.164、TPはRR=1.5で151.397。含み益0.6R到達で建値繰り上げ、12:25にTP到達。

バックテスト手順(初心者向け)

  1. MT4の「ストラテジーテスター」を開き、銘柄「USDJPY」、モデルは「毎ティック」
  2. 期間は直近1〜3年、足はM5、スプレッドはブローカー実勢に合わせる
  3. EAパラメータ(N・SqueezePips・Buffer・Start/EndHour)を初期値のまま走らせる
  4. 資金管理は固定ロットから開始、次に固定リスク(口座残高の1%など)を検証
  5. 過剰最適化を避けるため、前半で最適化→後半で検証(ウォークフォワード)を行う

MQL4 EA(完全版・学習用途)

以下は学習・検証用途のサンプルEAです。ブローカー仕様差や約定・スリッページ・禁止事項等は各自で確認し、必ずデモで挙動を検証してください。

//+------------------------------------------------------------------+
//|  Asia ATR Squeeze Breakout (USDJPY M5)                           |
//|  Beginner-friendly sample EA                                      |
//+------------------------------------------------------------------+
#property strict

input double  Lots              = 0.10;
input double  RiskPercent       = 0.0;    // 0なら固定ロット、>0なら口座残高の%で計算
input int     DonchianPeriod    = 24;     // 直近N本(M5×N)
input double  SqueezePips       = 8.0;    // レンジ幅しきい値[pips]
input double  EntryBufferPips   = 0.8;    // ブレイクのバッファ[pips]
input double  RR                = 1.5;    // 目標RR
input int     StartHour         = 1;      // ブローカーサーバー時刻の開始(例)
input int     EndHour           = 9;      // 同・終了(Start <= now < End)
input int     MaxHoldMinutes    = 120;    // 最大保有時間
input bool    UseBreakeven      = true;
input double  BE_Trigger_R      = 0.6;    // 建値繰上げのトリガー[R]

datetime g_entryTime=0;

double PointsPerPip()
{ 
   if(Digits==3 || Digits==5) return(10.0);
   return(1.0);
}

double PipToPoints(double pips){ return pips*PointsPerPip(); }

bool InSession()
{
   int h = TimeHour(TimeCurrent());
   if(StartHour < EndHour) return (h >= StartHour && h < EndHour);
   // 日またぎ対応
   return (h >= StartHour || h < EndHour);
}

void Donchian(double &hi, double &lo, int period)
{
   hi = iHigh(Symbol(), PERIOD_M5, iHighest(Symbol(), PERIOD_M5, MODE_HIGH, period, 1));
   lo = iLow(Symbol(),  PERIOD_M5, iLowest( Symbol(), PERIOD_M5, MODE_LOW,  period, 1));
}

bool IsSqueezed(double hi, double lo)
{
   double width = (hi - lo)/Point; // points
   double th = PipToPoints(SqueezePips);
   return (width <= th);
}

bool HasPosition()
{
   for(int i=0;i= be_trigger && sl < entry)
               OrderModify(OrderTicket(), entry, entry, tp, 0, clrNONE);
         }
         else if(OrderType()==OP_SELL)
         {
            double profit_points = (entry - Ask)/Point;
            if(profit_points >= be_trigger && sl > entry)
               OrderModify(OrderTicket(), entry, entry, tp, 0, clrNONE);
         }
      }
   }
}

void CloseTimedOut()
{
   if(!HasPosition()) return;
   if(g_entryTime==0) return;
   int held = (int)((TimeCurrent() - g_entryTime)/60);
   if(held >= MaxHoldMinutes)
   {
      for(int i=0;i upper) // 上抜け
   {
      double sl = lower;
      double sl_points = (close0 - sl)/Point;
      double tp_points = sl_points * RR;
      double lot = CalcLotByRisk(sl_points);
      ticket = OrderSend(Symbol(), OP_BUY, lot, Ask, 3, sl, close0 + tp_points*Point, "ATR Squeeze BUY", 20250907, 0, clrBlue);
      if(ticket>0) g_entryTime = TimeCurrent();
   }
   else if(close1 >= lo && close0 < lower) // 下抜け
   {
      double sl = upper;
      double sl_points = (sl - close0)/Point;
      double tp_points = sl_points * RR;
      double lot = CalcLotByRisk(sl_points);
      ticket = OrderSend(Symbol(), OP_SELL, lot, Bid, 3, sl, close0 - tp_points*Point, "ATR Squeeze SELL", 20250907, 0, clrRed);
      if(ticket>0) g_entryTime = TimeCurrent();
   }
}
//+------------------------------------------------------------------+

パラメータの初期値と調整ガイド

  • DonchianPeriod:24(約2時間)。20〜36で頑健性チェック
  • SqueezePips:8.0(USD/JPY向け)。6.0〜10.0で感度調整
  • EntryBufferPips:0.8。スリッページやスパイク対策で0.5〜1.2
  • StartHour/EndHour:ブローカー時刻に合わせて東京時間に合致する帯へ
  • RR:1.2〜1.5。初心者は固定でOK
  • RiskPercent:0→固定ロット、1.0〜2.0%で固定リスク運用

過剰最適化を避けるチェックリスト

  • 期間分割(前半最適化・後半検証)と未使用年での汎化確認
  • パラメータは小幅にしか動かさない(凸型が壊れる設定は採用しない)
  • 手数料・スリッページを現実的に上乗せしてシミュレーション

よくある失敗と対策

  1. 時間帯ズレ:サーバー時刻と日本時間のズレを放置→ログで約定時刻を確認し調整
  2. 指標突入:指標カレンダー未確認→前後15〜30分はEA停止を徹底
  3. 連続負けでロット上げ:ナンピン厳禁。固定リスクの規律を守る

Pine Script(視覚検証用・任意)

//@version=5
indicator("Asia ATR Squeeze Breakout (USDJPY M5)", overlay=true)
donLen = input.int(24, "Donchian Period")
squeezePips = input.float(8.0, "Squeeze Pips")
bufPips = input.float(0.8, "Entry Buffer Pips")

var float pp = syminfo.pointvalue == 1 ? 0.01 : syminfo.mintick
hi = ta.highest(high, donLen)
lo = ta.lowest(low,  donLen)
widthPips = (hi - lo)/pp
squeezed = widthPips <= squeezePips

upper = hi + bufPips*pp
lower = lo - bufPips*pp

longCond  = squeezed and close[1] <= hi and close > upper
shortCond = squeezed and close[1] >= lo and close < lower

plot(hi, "Donchian High")
plot(lo, "Donchian Low")
plot(longCond ? close : na, "Long", style=plot.style_circles, linewidth=2)
plot(shortCond ? close : na, "Short", style=plot.style_circles, linewidth=2, transp=0)

まとめ

アジア時間のスクイーズ後ブレイクという、条件付きブレイクアウトは初心者にも運用しやすく、再現性を確保しやすい戦略です。時間帯・スクイーズ・ブレイク・リスク管理という4要素を機械的に守り、まずはデモで十分な検証を経てから段階的に実運用へ移行してください。

コメント

タイトルとURLをコピーしました