東京仲値トレード完全ガイド:USD/JPYの9:55アノマリーを初歩から実装まで

FX

本稿では、東京市場の仲値(9:55)決定前後に発生しやすい需給の偏りを利用する「東京仲値トレード」を、投資初心者でも再現できるレベルまで丁寧に解説します。USD/JPYを中心に、メカニズム、具体的な売買ルール例、口座準備、実行手順、リスク管理、検証方法、そして参考となる自動売買コード(MQL4 EA)と可視化用のPine Scriptまでまとめました。なお、本稿は学習・研究目的での情報提供に徹し、個別の投資判断は各自で行ってください。

1. 東京仲値とは何か:9:55の為替フィクシングの仕組み

東京の主要銀行は、午前9時55分に当日の対顧客レート(いわゆる仲値)を基準として外貨両替を行います。輸入企業のドル買い需要や、銀行のカバー取引が集中しやすく、USD/JPYの上昇圧力(円安方向)が強まりやすい時間帯として知られています。もっとも、毎日必ず上がるわけではなく、地合いや突発ニュース、日銀関連イベント、米金利動向などで逆に振れることもあります。

2. 期待値の源泉:なぜ歪みが生じるのか

市場参加者の中でも、期日までに確実にドルを買わなければならない実需は、価格弾力性が低くなります。需給が偏ると、短時間ながら一定方向へのフローが生まれやすく、これが時間帯アノマリー(統計的な偏り)の根拠となります。特に五・十日(5日、10日、15日、20日、25日、30日)は決済ニーズが重なりやすく、仲値に向けたフローが強まる傾向が観察されます。

3. 用語の基礎整理

  • 仲値(Fixing):9:55に主要行が公表する対顧客基準レート。
  • スプレッド:買値(Ask)と売値(Bid)の差。コストの最重要要素。
  • pips:価格の最小単位。USD/JPYでは通常0.01円=1 pip。
  • スリッページ:発注レートと約定レートの差。流動性や成行の影響で発生。
  • ロールオーバー/スワップ:持ち越し時の金利調整。短時間戦略では通常影響小。
  • ATR:平均的な変動幅(ボラティリティ指標)。フィルターとして有用。

4. 初心者向け基本戦略の全体像

ここではもっとも単純化した仲値トレードのフレームを提示します。

  1. 対象:USD/JPY(他通貨は拡張で検討)。
  2. エントリー時間:東京時間9:20〜9:54の間。
  3. 方向:原則は買い(USD買い/JPY売り)。ただしフィルターにより回避。
  4. イグジット:9:56〜10:10の範囲で時間決済、または利確/損切り到達。
  5. フィルター:重要指標(日銀会合、要人発言、米雇用統計等)の直近時刻は回避。ATRが極端に低い/高い日は見送り。
  6. コスト管理:スプレッドが閾値超過時は実行しない。

5. 具体的ルール例(プロトタイプ)

以下は検証用の参考設計です。運用前に必ず自分でデータに対して検証してください。

  • 時間ウィンドウ:9:25〜9:40の間に成行買いで1回エントリー。
  • 分割実行:0.5ロット×2回に分け、平均建値を作る。
  • 損切り:建値から-12〜-18 pips。
  • 利確:+10〜+20 pips、または10:00に時間決済。
  • スプレッド上限:1.2 pips(12ポイント相当)を超えたら見送り。
  • ATRフィルター:直近14期間のM15 ATRが7〜25 pipsの範囲。
  • イベント回避:日銀関連、重要指標の前後±30分は取引しない。

6. 口座開設と準備:国内FXの一般的な流れ

  1. 本人確認書類とマイナンバーを用意。
  2. 口座申込(PC/スマホ)。取引ツール(MT4/MT5/独自アプリ)の有無を確認。
  3. 審査通過後に入金テスト(少額)。
  4. 取引ツールをインストールし、ログイン、気配値表示にUSDJPYを追加。
  5. チャートの時間表示がブローカー時間である点に注意(東京時間との時差を把握)。
  6. 発注数量の最小単位、スプレッド、約定力、両建可否、追証ルールを確認。

7. ポジションサイズとリスク管理

口座残高に対して1回の損失許容割合を1%以下に抑える初学者向けルールを推奨します。

許容損失額 = 口座残高 × 1%
必要ロット = 許容損失額 ÷ (損切りpips × 1pipsあたりの価値)
例:口座100,000円、損切り15pips、1pips=100円なら、
必要ロット ≈ 100,000 × 1% ÷ (15 × 100) = 0.066ロット

連敗時はロットを下げ、最大ドローダウン(例:口座の-10%)に達したら停止・検証に戻るなど、資金曲線を守る設計が最重要です。

8. 検証の考え方:バックテストとフォワードテスト

時間帯戦略はスプレッドとスリッページの影響を強く受けます。過去チャートでの理想約定ではなく、バックテストでは現実的なコストを上乗せするのが肝要です。さらに数ヶ月のフォワードテストで再現性を確認し、モンテカルロ・シミュレーションで損益のばらつきを把握します。

9. MQL4 EA(完全自動売買)の参考実装

以下は最小限のプロトタイプです。ブローカー時間と東京時間のズレはパラメータで調整してください。実運用前にストラテジーテスター等で検証が必須です。

#property strict

input string   SymbolToTrade       = "USDJPY";
input int      EntryStartHour      = 3;    // ブローカー時間(例:東京09:25に相当)
input int      EntryStartMinute    = 25;
input int      EntryEndHour        = 3;    // 〜東京09:40に相当
input int      EntryEndMinute      = 40;
input int      ExitHour            = 4;    // 東京10:00に相当
input int      ExitMinute          = 0;
input double   RiskPercent         = 1.0;
input int      StopPips            = 15;
input int      TakePips            = 15;
input int      MaxSpreadPoints     = 12;   // 1.2pips相当(ブローカー仕様に合わせる)
input int      Magic               = 95509;
input int      ATRPeriod           = 14;
input double   ATRMinPips          = 7.0;
input double   ATRMaxPips          = 25.0;
input bool     UseTwoEntries       = true;

datetime lastTradeDay = 0;

double PipSize() {
   if(Digits == 3 || Digits == 5) return 10 * Point;
   return Point;
}

double PipsToPrice(int pips){ return pips * PipSize(); }

double AtrPips(){
   double atr = iATR(SymbolToTrade, PERIOD_M15, ATRPeriod, 0);
   return atr / PipSize();
}

bool InEntryWindow(datetime t){
   int h = TimeHour(t);
   int m = TimeMinute(t);
   int start = EntryStartHour*60 + EntryStartMinute;
   int end   = EntryEndHour*60 + EntryEndMinute;
   int nowm  = h*60 + m;
   return (nowm >= start && nowm <= end);
}

bool IsExitTime(datetime t){
   int h = TimeHour(t);
   int m = TimeMinute(t);
   return (h == ExitHour && m >= ExitMinute);
}

bool AlreadyTradedToday(datetime t){
   if(lastTradeDay == 0) return false;
   return (TimeDay(lastTradeDay) == TimeDay(t) && TimeMonth(lastTradeDay) == TimeMonth(t) && TimeYear(lastTradeDay) == TimeYear(t));
}

double CalcLotByRisk(int stopPips){
   double acc = AccountBalance();
   double riskMoney = acc * RiskPercent / 100.0;
   // USDJPY想定の簡易計算:1pips ≒ 100円/1ロット(ブローカーにより差異あり)
   double yenPerPipPerLot = 100.0;
   double lots = riskMoney / (stopPips * yenPerPipPerLot);
   // 最小・ステップに合わせて調整
   double minLot = MarketInfo(SymbolToTrade, MODE_MINLOT);
   double lotStep = MarketInfo(SymbolToTrade, MODE_LOTSTEP);
   if(lots < minLot) lots = minLot;
   // ステップ丸め
   lots = MathFloor(lots / lotStep) * lotStep;
   return lots;
}

void OnTick(){
   if(Symbol() != SymbolToTrade) return;
   if(!IsTradeAllowed()) return;
   datetime now = TimeCurrent();

   // 平日判定
   int dow = TimeDayOfWeek(now);
   if(dow == 0 || dow == 6) return; // 日曜・土曜は取引しない

   // ATRフィルター
   double atrP = AtrPips();
   if(atrP < ATRMinPips || atrP > ATRMaxPips) return;

   // スプレッドフィルター
   double spread = MarketInfo(SymbolToTrade, MODE_SPREAD);
   if(spread > MaxSpreadPoints) return;

   // 時間決済
   for(int i=OrdersTotal()-1; i>=0; i--){
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderSymbol()!=SymbolToTrade || OrderMagicNumber()!=Magic) continue;
      if(IsExitTime(now)){
         OrderClose(OrderTicket(), OrderLots(), Bid, 5);
      }
   }

   // エントリー(1日1回)
   if(AlreadyTradedToday(now)) return;
   if(InEntryWindow(now)){
      // ポジションがなければ新規BUY
      bool hasPos = false;
      for(int j=OrdersTotal()-1; j>=0; j--){
         if(!OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) continue;
         if(OrderSymbol()==SymbolToTrade && OrderMagicNumber()==Magic) { hasPos = true; break; }
      }
      if(!hasPos){
         double lot = CalcLotByRisk(StopPips);
         double sl = 0, tp = 0;
         double ask = Ask;
         sl = ask - PipsToPrice(StopPips);
         tp = ask + PipsToPrice(TakePips);
         int ticket = OrderSend(SymbolToTrade, OP_BUY, lot, ask, 5, sl, tp, "TokyoFix", Magic, 0, clrGreen);
         if(ticket > 0){
            lastTradeDay = now;
            if(UseTwoEntries){
               // 数秒遅れて0.5ロット追加
               double lot2 = MathMax(MarketInfo(SymbolToTrade, MODE_MINLOT), lot/2.0);
               double ask2 = Ask;
               double sl2  = ask2 - PipsToPrice(StopPips);
               double tp2  = ask2 + PipsToPrice(TakePips);
               OrderSend(SymbolToTrade, OP_BUY, lot2, ask2, 5, sl2, tp2, "TokyoFix2", Magic, 0, clrBlue);
            }
         }
      }
   }
}

10. Pine Script(補足)での可視化・検証

//@version=5
strategy("Tokyo Fixing Prototype", overlay=true, initial_capital=100000)
inSession = time(timeframe.period, "Asia/Tokyo:0930-0954")
buyCond = inSession
if (buyCond and strategy.position_size == 0)
    strategy.entry("BUY", strategy.long)
exitTime = time(timeframe.period, "Asia/Tokyo:0956-1010")
if (exitTime and strategy.position_size > 0)
    strategy.close("BUY")
plot(vwap, title="VWAP")

11. 実行フロー(初心者向けチェックリスト)

  1. 取引停止条件(重要イベント、広スプレッド、急変時)を先に定義。
  2. 口座・プラットフォームを準備し、東京時間とブローカー時間のオフセットを把握。
  3. 最小ロットでフォワードテストを2〜4週間。
  4. 損益のばらつきを記録し、パラメータ調整(損切り/利確/時間)。
  5. 許容ドローダウンと再開基準をドキュメント化。

12. よくある失敗と対処

  • 毎日必ず勝てると思い込み → イベント日・地合いで勝率が崩れる。回避ルールを優先。
  • ロットの入れすぎ → 想定外の逆行で口座毀損。損失1%ルールの徹底。
  • 時差の誤設定 → 予定外の時間帯にエントリー。テストでログ確認。
  • スプレッド拡大時の突入 → コスト超過。閾値を超えたら何もしない勇気。

13. 拡張アイデア

  • 五・十日カレンダーの導入と季節性の確認。
  • トレンド指標(VWAP、前日高安、前場寄付の位置)と併用。
  • 通貨分散:EUR/JPY、GBP/JPYへ横展開。ただしコストと挙動差を検証。
  • 部分利確、ブレークイーブン移動、トレーリングストップの導入。

東京仲値は、実需フローに根ざした代表的な時間帯アノマリーです。コスト管理と回避ルールを徹底し、最小ロットで検証から始めれば、初心者でも体系的に学べます。本稿のフレームとコードを土台に、あなた自身のデータで最適化し、再現性のある自分の戦略を形にしてください。

コメント

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