FX時間帯バイアス戦略入門:東京・ロンドン・NYの“癖”を使って勝ち筋をつくる

FX

本稿は、FXの「時間帯バイアス(Time-of-Day / Session Bias)」という再現性の高い市場の“癖”に焦点を当て、初心者でも実装できる具体的なエントリールール、検証手順、資金管理までを通しで解説する実践ガイドです。派手なテクニックではなく、特定の時間帯に現れやすい値動きの統計的傾向を利用して淡々と取るアプローチを提示します。

スポンサーリンク

1. 時間帯バイアスとは何か

FX市場は24時間開いていますが、すべての時間が均質ではありません。流動性の厚み、実需フロー、ヘッジの出方、指標発表や株式市場の寄付き/引けなど、時間帯ごとの構造的な違いが値動きの統計的偏り(=バイアス)を生みます。代表的なセッションは「東京(アジア)」「ロンドン(欧州)」「ニューヨーク(米)」の3つです。

  • 東京:実需フロー・仲値関連・レンジ志向が相対的に強くなりやすい時間
  • ロンドン:機関投資家のフローが増え、トレンドの初動/加速が起きやすい時間
  • ニューヨーク:米株寄り付き・指標・ロンドンフィックス・オプションカット前後の変動

本記事では、USD/JPY(ドル円)を対象に、初心者でも扱いやすい3つのミニ戦略を解説します。

2. 使う指標・ツールの最小セット

複雑なインジケーターは不要です。時間帯が主役なので、以下の軽量セットで十分です。

  1. チャートプラットフォーム:TradingView など(無料版でも可)
  2. ボラティリティ指標:ATR(14期間、終値ベース)
  3. セッション分割:時間帯を見やすくする水平ラインや背景着色
  4. 移動平均:SMA 20 / 50(トレンドの向き確認用)

スプレッドの狭さと約定力は収益率に直結します。最初は主要通貨ペア(USD/JPY)で始めるのが堅実です。

3. ミニ戦略A:東京午前「レンジ回帰」

狙い:東京午前(JST 9:00〜11:00)は、実需フローの影響で方向性が出にくく、短いレンジになりやすい局面が発生します。この「落ち着いた時間帯」を逆手に取り、短時間のオーバーシュートを均衡に差し戻す動きを狙います。

3.1 エントリー条件

  • 対象:USD/JPY、時間足:5分または15分
  • 観測ウィンドウ:JST 9:00〜9:45 での高値/安値をレンジと定義
  • ATR(14)が直近5日平均の80%〜120%以内(極端に低/高ボラの回避)
  • 価格がレンジ上限を一時的に0.15〜0.25%超過したのち、直近足終値が上限内に差し戻ったらショート(下限はロング)

3.2 イグジット(損益管理)

  • ストップ:レンジ外 0.12%
  • 利確目安:レンジ中心線またはエントリーから0.10%〜0.15%
  • 時間フィルター:JST 11:15 までに未決済なら成行クローズ

3.3 根拠の考え方

東京午前は極端なトレンドが出づらく、逆張りが比較的機能しやすい時間帯が存在します。過度な粘りは禁物。時間で切ることが勝率の安定に寄与します。

4. ミニ戦略B:ロンドン開始「初動ブレイク」

狙い:ロンドンの参加者が入るタイミングでは、注文フローが厚くなり、短時間のトレンド初動が出やすくなります。東京時間のレンジの「片側決着」を素直に取りに行く発想です。

4.1 時間定義(JST換算)

  • 夏時間(3月下旬〜10月下旬):ロンドン8:00 = JST 16:00
  • 冬時間(10月下旬〜3月下旬):ロンドン8:00 = JST 17:00

4.2 ルール

  • 観測ウィンドウ:開始から30分の高安を「イニシャルレンジ」と定義
  • ブレイクエントリー:レンジ高値+0.05%で買い、安値-0.05%で売りのストップ注文
  • ストップ:反対側レンジ内に0.08%
  • 利確:0.18%〜0.25%またはSMA20を明確に割り込んだ/上抜けたら手仕舞い
  • ボラ調整:ATRが低い日は利幅を一段階縮小し、ATRが高い日は拡張

4.3 フィルター

  • 重要指標の直前30分は新規仕掛けを見送り
  • 東京時間で既に0.6%超の片方向大相場が出た日は見送り(過走リスク)

5. ミニ戦略C:NY株寄り「最初のプルバック」

狙い:米株の寄り付きは為替にも影響しやすいイベントです。寄り直後の過熱と反動に的を絞り、初動の押し目・戻り目を狙う短時間のトレードです。

5.1 時間定義(JST換算)

  • 夏時間:米株 9:30(EDT)= JST 22:30
  • 冬時間:米株 9:30(EST)= JST 23:30

5.2 ルール

  • 観測:寄り後15分の高安を初動帯とする
  • 方向判定:SMA20 > SMA50 かつ価格がSMA20上 → 上目線(逆は下目線)
  • エントリー:初動帯の38.2%〜50%押し(戻り)に指値(片側のみ)
  • ストップ:初動帯の反対側外へ0.10%
  • 利確:初動高値(安値)再トライで半分、残りは0.20%固定

5.3 注意

米株寄りは変動が急なため、スプレッド拡大やスリッページの管理が重要です。ロットは普段の50〜70%に抑えるのが無難です。

6. どれから始めるべきか(初心者の導線)

  1. まずは東京午前のレンジ回帰(戦略A)で「時間で切る」練習をする
  2. 次にロンドン初動ブレイク(戦略B)で順張り感覚を養う
  3. 最後にNY寄りの最初のプルバック(戦略C)で高速相場の管理を体験

3戦略を同時運用せず、一つを30〜50回ほど練習→勝ち筋が見えたら次に進む手順が効率的です。

7. リスク管理(超重要・最小限で十分に強い)

  • 1トレードの許容損失=口座残高の0.3%〜0.5%
  • 最大同時ポジション:1(初心者は同時進行を避ける)
  • 日次ドローダウン上限:−1.0%で当日終了
  • 週次ドローダウン上限:−2.5%で週内はサイズ半減

この固定ルールがあるだけで、戦略のバラつきに対して口座が長持ちします。勝つための前提条件です。

8. 経済指標・イベント日の扱い

雇用統計、CPI、FOMC、要人発言、四半期GDPなどの高インパクト系は、短期戦略の勝率を大きく変動させます。原則として「直前30分は新規エントリーを見送り」「直後15〜30分はスプレッドの正常化を待つ」運用を推奨します。

9. 口座開設と基本設定(一般的な流れ)

  1. 本人確認:身分証・マイナンバー提出など
  2. 入金方法の確認:即時入金・出金手順の練習(少額で挙動確認)
  3. プラットフォーム設定:チャートのタイムゾーンをJST、気配値表示、ワンクリック注文のオン/オフ
  4. スプレッド監視:主要時間帯の実勢スプレッドを記録(平常/拡大)
  5. ロット計算のテンプレ化:ストップ幅×ロット=許容損失に収まるよう電卓化

最初はデモ口座または極小ロットで、約定速度・スリップ・スプレッド拡大の実感を得ることが大切です。

10. 検証(バックテスト)のやり方:最低限で“使える”手順

TradingView の無料プランでも、ルール化と手動検証で十分な精度を出せます。以下は戦略B(ロンドン初動ブレイク)の例です。

  1. JST 16:00(または17:00)〜16:30(17:30)の高安を手動でライン化
  2. 高値+0.05%、安値−0.05%に水平ラインを追記
  3. その後の価格推移でヒット/未ヒット、ストップ/利確を記録
  4. 勝率、平均損益(pips/%)、連敗の最大長、時間切れ率を集計
  5. 10〜12週間分で最低100トレード程度を目安に傾向を把握

重要なのは、損失側の外れ値(イベント被弾・拡大スプレッドなど)をどれくらいルールで避けられるかの確認です。

11. MQL4(EA)サンプル:ロンドン初動ブレイク(USDJPY)

初心者向けに機能を絞ったシンプルなEA例です。時間帯・レンジ計測・ブレイクエントリー・固定SL/TP・時間切りを実装しています。


//+------------------------------------------------------------------+
//| London Open Breakout (Simple) - USDJPY, M5                       |
//| 教育目的のサンプル。実運用前に必ずデモ検証してください。           |
//+------------------------------------------------------------------+
#property strict

input int    StartHourSummerJST = 16;   // ロンドン夏時間の開始(JST)
input int    StartHourWinterJST = 17;   // ロンドン冬時間の開始(JST)
input int    RangeMinutes       = 30;   // イニシャルレンジ計測分
input double BreakBufferPct     = 0.0005; // 0.05%(=0.0005)
input double StopBufferPct      = 0.0008; // 0.08%
input double TakeProfitPctMin   = 0.0018; // 0.18%
input double TakeProfitPctMax   = 0.0025; // 0.25%
input int    CloseAfterMinutes  = 120;  // エントリー後の時間切り(分)
input double RiskPerTradePct    = 0.4;  // 口座残高に対するリスク%

datetime lastTradeTime = 0;
bool     tradePlaced   = false;

double PctToPrice(double pct, double price){ return price * pct; }

int OnInit(){ return(INIT_SUCCEEDED); }
void OnDeinit(const int reason){}

void OnTick(){
   // JSTでの時間判定(ブローカー時刻からの換算は各社仕様に合わせて調整してください)
   datetime t      = TimeCurrent();
   int      hour   = TimeHour(t);
   int      minute = TimeMinute(t);

   // ここでは単純化のため、夏/冬時間の切替は手動でStartHour*を設定する前提
   int sessionStartHour = StartHourSummerJST; // 必要に応じて切替

   // イニシャルレンジの時刻帯
   bool inRangeWindow = (hour == sessionStartHour && minute <= RangeMinutes);

   static double rangeHigh = 0.0, rangeLow = 0.0;
   if(inRangeWindow){
      double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
      if(rangeHigh==0 || bid>rangeHigh) rangeHigh = bid;
      if(rangeLow==0  || bid0 && rangeLow>0 && !tradePlaced){
      double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

      double buyTrigger  = rangeHigh + PctToPrice(BreakBufferPct, rangeHigh);
      double sellTrigger = rangeLow  - PctToPrice(BreakBufferPct, rangeLow);

      // ブレイク判定
      if(ask >= buyTrigger){
         PlaceOrder(ORDER_TYPE_BUY, ask, rangeLow + PctToPrice(StopBufferPct, rangeLow), ask + PctToPrice(TakeProfitPctMin, ask));
      }else if(ask <= sellTrigger){
         PlaceOrder(ORDER_TYPE_SELL, ask, rangeHigh - PctToPrice(StopBufferPct, rangeHigh), ask - PctToPrice(TakeProfitPctMin, ask));
      }
   }

   // 時間切りの管理
   if(tradePlaced && (TimeCurrent() - lastTradeTime) > CloseAfterMinutes*60){
      CloseAll();
   }
}

void PlaceOrder(ENUM_ORDER_TYPE type, double price, double sl, double tp){
   double balance = AccountInfoDouble(ACCOUNT_BALANCE);
   double stopPts = MathAbs(price - sl);
   if(stopPts<=0) return;

   // USDJPYを前提にロット計算(簡略化)
   double riskAmt = balance * RiskPerTradePct / 100.0;
   double tickVal = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
   double tickSz  = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
   if(tickVal<=0 || tickSz<=0) return;

   double lots = MathMax(0.01, (riskAmt / (stopPts / tickSz * tickVal)));
   lots = NormalizeDouble(lots, 2);

   tradePlaced   = true;
   lastTradeTime = TimeCurrent();

   MqlTradeRequest req;
   MqlTradeResult  res;
   ZeroMemory(req);
   ZeroMemory(res);

   req.action   = TRADE_ACTION_DEAL;
   req.symbol   = _Symbol;
   req.volume   = lots;
   req.type     = type;
   req.price    = (type==ORDER_TYPE_BUY? SymbolInfoDouble(_Symbol, SYMBOL_ASK): SymbolInfoDouble(_Symbol, SYMBOL_BID));
   req.sl       = sl;
   req.tp       = tp;
   req.deviation= 15;

   OrderSend(req, res);
}

void CloseAll(){
   for(int i=PositionsTotal()-1; i>=0; --i){
      ulong ticket = PositionGetTicket(i);
      long  type;
      double volume;
      if(!PositionSelectByTicket(ticket)) continue;
      if(!PositionGetInteger(POSITION_TYPE, type)) continue;
      if(!PositionGetDouble(POSITION_VOLUME, volume)) continue;

      MqlTradeRequest req;
      MqlTradeResult  res;
      ZeroMemory(req);
      ZeroMemory(res);

      req.action = TRADE_ACTION_DEAL;
      req.symbol = _Symbol;
      req.volume = volume;
      req.type   = (type==POSITION_TYPE_BUY? ORDER_TYPE_SELL: ORDER_TYPE_BUY);
      req.price  = (req.type==ORDER_TYPE_BUY? SymbolInfoDouble(_Symbol, SYMBOL_ASK): SymbolInfoDouble(_Symbol, SYMBOL_BID));
      req.deviation=15;
      OrderSend(req, res);
   }
}
    

※ ブローカーのサーバー時刻とJSTのズレは各社で異なります。デモ口座で時間換算・最小ロット・スリッページ・スプレッド拡大の挙動を必ず確認してください。

12. 補足:TradingView(Pine Script v5)の最小検証スニペット


//@version=5
strategy("London Open Breakout (Simple) USDJPY", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=1)

isSummer = true   // 手動切替
startHour = isSummer ? 16 : 17 // JST
inRange = (hour == startHour and minute <= 30)

var float rh = na
var float rl = na
if inRange
    rh := na(rh) ? high : math.max(rh, high)
    rl := na(rl) ? low  : math.min(rl, low)

breakBuf = 0.0005
stopBuf  = 0.0008
tpMin    = 0.0018

buyTrig  = rh * (1 + breakBuf)
sellTrig = rl * (1 - breakBuf)

longCond  = not inRange and close >= buyTrig
shortCond = not inRange and close <= sellTrig

if longCond
    sl = rl * (1 - stopBuf)
    tp = close * (1 + tpMin)
    strategy.entry("L", strategy.long)
    strategy.exit("LX", "L", stop=sl, limit=tp)

if shortCond
    sl = rh * (1 + stopBuf)
    tp = close * (1 - tpMin)
    strategy.entry("S", strategy.short)
    strategy.exit("SX", "S", stop=sl, limit=tp)
    

このスニペットは、時間帯とレンジだけに集中した最低限の検証用です。実戦投入前にサンプル期間を変え、ボラ調整やイベントフィルターの有無で指標を比較してください。

13. よくある落とし穴と回避策

  • イベント直撃:重要指標は事前に回避、被弾時は時間切り/日次上限で即終了
  • 過度な裁量:ルールからの逸脱は収益の分散を拡大。チェックリスト化で機械的に
  • ロット過多:損益の振れが大きいほど継続できない。固定リスク%で粘る
  • 同時運用:初心者は1戦略ずつ。セッション跨ぎの疲労は判断を鈍らせる
  • 過度な最適化:バックテストの“偶然”を拾いすぎない。単純ルール×堅実なRMが王道

14. まとめ:時間帯を味方につける

市場は常に動いているわけではありません。動くべき時間にだけ参加する——これが「時間帯バイアス戦略」の本質です。東京の均衡、ロンドンの初動、NYの寄り。3つの“癖”を状況に応じて一つずつ習得し、サイズを上げずに安定性を上げる。それが初心者が最短で定着させるべき勝ち方です。

本記事は教育的な一般解説であり、特定の投資行動を推奨するものではありません。取引に伴う損失は自己責任となります。必ずデモ検証と小ロットでの試行から始めてください。

コメント

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