初心者でもできる『東京仲値ドリフト』入門:USD/JPYで毎朝5分だけの半自動トレード戦略(MQL4 EA付き)

FX

本記事では、毎営業日の午前9時55分(日本時間)に設定される「東京仲値(Tokyo Fix)」の直前・直後に観測されやすいフローに着目し、USD/JPYで収益機会を狙う時間帯ドリフト戦略を初心者向けにゼロから解説します。難しいインジケーターは使いません。必要なのは時間通貨ペア基本的な発注の3要素だけです。さらに、半自動で回すためのMQL4 EA(完全版)と、TradingViewで挙動を確認できるPine Scriptも掲載します。

重要なポイントは、「勝ちやすい時間帯に勝負を寄せる」という考え方です。24時間のどこでも戦うのではなく、流動性と実需が集中しやすい“朝の数分”に限定することで、初心者でも無理のない運用設計を組み立てやすくなります。

1. 東京仲値とは何か:現象の背景と個人が狙える理由

東京仲値は、多くの邦銀や金融機関が顧客の実需(輸入企業の外貨買い、機関投資家の為替ヘッジ等)を反映して銀行が提示する指標レートです。一般に9:55(JST)に設定され、その前に市場で為替のカバー取引が行われます。結果として仲値の直前に一方向のフロー(例:USD買い/JPY売り)が発生しやすいと観察されることがあります。これを「仲値ドリフト(Fix Drift)」と呼びます。

もちろん、毎回必ず同じ方向に動くわけではありません。しかし、特定の時間帯に特定の参加者の発注が集まりやすいという構造は、初心者でも理解しやすく、再現性の高い運用ルールに落とし込みやすい特長があります。

2. ベースとなる売買ルール(最小構成)

初心者でも実行しやすいよう、裁量判断を排し、時間だけで動く極めてシンプルなルールから始めます。以下はUSD/JPYを対象にした例です。

ルールA(基本):日本時間9:52に成行で買い(ロング)で参入し、9:56に成行決済します。リスク管理として、建玉時点からストップ8pipsテイク12pipsのOCOを同時に置きます。どちらかに到達した時点で決済。到達しない場合は9:56で強制クローズします。

なぜ買いから始めるのか:実需の外貨需要が寄り付きで顕在化することがあり、買いフローが出やすいケースをまず学習目的で想定します。ただし、実際の相場は毎日同じではありません。改良ステップでショート方向やフィルターも扱います。

このルールは、「時間帯×OCO×強制クローズ」という管理が容易な形になっており、スプレッド拡大時や急変時でも損失が限定されます。勝率は日によって変動しますが、想定外に引っ張らないことが初心者の最重要スキルです。

3. 実行フロー:口座準備から当日のチェックまで

口座準備:国内FX会社または海外MT4対応会社のいずれでも運用可能ですが、約定力平均スプレッドロットの最小単位東京時間の約定安定性を重視します。本人確認(eKYC)、入金方法、出金手順を事前に確認しましょう。

当日のチェック:(1)重要指標や要人発言が9:50〜10:00に重なっていないか、(2)スプレッドが平常か、(3)サーバー時刻と日本時刻の時差設定、の3点を確認します。大きなイベントや異常なスプレッドが見える日は見送る判断も有効です。

発注:9:52にロング、OCO同時設定、9:56で強制クローズ。慣れてきたらEAで半自動化しましょう。

4. ロット設計とリスク管理:残すのは「継続可能性」

本戦略は時間帯集中のため、トレード回数は1日1回程度です。ロットは、ストップ距離と口座残高から逆算します。例として、ストップ8pips、1pipsあたり100円の損益換算、1回のリスクを口座残高の0.5%に抑える設計を提示します。損失が先行しても、過大ロットにしないことで回復余地を残せます。

また、週・月単位で「最大連続損失回数」と「ドローダウン許容」を事前に数値化しておくと、精神的なブレを抑えられます。初心者ほど、取らない日(休む)もルール化することを強く推奨します。

5. より実践的な改良ステップ

基本ルールに慣れてきたら、徐々にフィルターや拡張を追加して期待値の安定化を図ります。

5.1 ニュース・イベントフィルター

日本の金融政策関連や米主要イベント(雇用統計等)に接近する日は、スプレッドやボラティリティが変則的になりやすいです。該当日は見送りまたはロット縮小で対応します。

5.2 スプレッド・チェック

9:50〜10:00は通常スプレッドに戻ることが多いですが、異常拡大が続く場合は参入しません。EA側で最大許容スプレッド(例:0.3〜0.5円相当)を条件化すると安全です。

5.3 方向フィルター

9:40〜9:50の短期トレンド(移動平均や高安更新)で方向を判定し、買いと売りを切り替える手法もあります。最初は買い固定で十分ですが、検証しながら徐々に拡張するとよいでしょう。

5.4 ボラティリティ連動のストップ・テイク幅

平均真の変動幅(ATR)で当日のボラに合わせてストップやテイクを微調整するのも有効です。静かな日は狭く、荒い日は広く、といった調整で無駄な刈り取りを減らします。

6. 成果の測り方:期待値と分散を両にらみ

「勝率」や「平均損益(pips)」だけでなく、RR(リスクリワード比)最大ドローダウンプロフィットファクターなどを併せて評価します。時間帯戦略は「1回の値幅が小さい→コスト影響が大きい」という構造があるため、手数料・スリッページを必ず織り込むことが肝要です。

また、曜日別の偏り(例:月末・月初の特殊フロー)や、月間の稼働日数のばらつきも成績に影響します。月次での振れ幅をあらかじめ想定し、資金管理を設計しましょう。

7. 実践ケーススタディ(シナリオ別)

7.1 平常時(小さな上昇ドリフト)

9:52ロング→9:54に+6pips到達、テイク未到達のまま9:56クローズで+4pips着地。小さく勝ちながら損失を限定できる典型例です。

7.2 逆行(すぐにストップ)

参入直後に-8pipsでストップ。躊躇なく終了。次の機会まで何もしないのが最善です。引っ張らないことが最大の防御です。

7.3 スプレッド拡大(見送り)

9:50時点でスプレッドが通常の数倍に拡大。EAの条件により発注せず終了。ルールにより「ノートレード」も成果と捉えます。

8. 初心者のつまずきポイントと対処

(1)サーバー時刻と日本時間のズレ:ブローカーのサーバーは多くがGMT+2/+3です。EAにはTokyoOffsetHoursを用意し、サマータイムも含めて調整可能にします。(2)OCOを置かない:必ず同時設定。(3)ロット過多:最初は極小ロットで十分です。(4)イベント日に無理して参入:見送りも戦略の一部です。

9. 用語ミニ解説

仲値(Fix):銀行が提示する当日の指標レート。9:55前にカバー取引が出ることがある。

OCO:同時に置いた利益確定と損切りのどちらかが成立すると、もう一方を自動で取消す注文方式。

pips:為替の最小単位。USD/JPYでは通常0.01円を1pipsとする。

スリッページ:発注価格と約定価格のズレ。時間帯戦略では小幅でも影響が大きい。

ATR:平均的な変動幅の指標。ボラティリティ調整に利用。

10. 半自動化:MQL4 EA(完全版)

以下は、MT4で動作するシンプルなEAです。ブローカーのサーバー時間と日本時間のギャップをTokyoOffsetHoursで調整でき、最大スプレッドの条件やOCOの自動設定、9:56の強制クローズに対応しています。USD/JPYのM1チャートに適用し、テスト環境で十分に動作確認を行ってください。


//+------------------------------------------------------------------+
//| Tokyo Fix Drift Simple EA (Beginner Edition)                     |
//| Parameters: set for USDJPY on M1                                 |
//+------------------------------------------------------------------+
#property strict
input double   Lots                = 0.10;
input int      StopLossPips        = 8;
input int      TakeProfitPips      = 12;
input int      MaxSpreadPips       = 5;     // 0.05円相当(ブローカーの桁に合わせて調整)
input int      EntryHourTokyo      = 9;     // 9:52 JST entry
input int      EntryMinuteTokyo    = 52;
input int      ExitHourTokyo       = 9;     // 9:56 JST exit
input int      ExitMinuteTokyo     = 56;
input int      TokyoOffsetHours    = 0;     // ブローカーサーバー時間 = JST + TokyoOffsetHours
input bool     EnableTimeFilter    = true;

datetime TokyoToServer(datetime t){
   return(t - TokyoOffsetHours*3600);
}
bool InTradeWindow(){
   if(!EnableTimeFilter) return true;
   datetime nowServer = TimeCurrent();
   MqlDateTime mt; TimeToStruct(nowServer, mt);
   // 現在がエントリー分のバー内か判定
   datetime entryTokyo = StringToTime(StringFormat("%04d.%02d.%02d %02d:%02d",
                         mt.year, mt.mon, mt.day, EntryHourTokyo, EntryMinuteTokyo));
   datetime exitTokyo  = StringToTime(StringFormat("%04d.%02d.%02d %02d:%02d",
                         mt.year, mt.mon, mt.day, ExitHourTokyo, ExitMinuteTokyo));
   datetime entryServer = TokyoToServer(entryTokyo);
   datetime exitServer  = TokyoToServer(exitTokyo);
   return (nowServer >= entryServer && nowServer <= exitServer);
}
bool IsSpreadOK(){
   double spreadPips = (MarketInfo(Symbol(), MODE_SPREAD))*1.0;
   return(spreadPips <= MaxSpreadPips);
}
int start(){
   if(IsTradeAllowed() == false) return(0);
   // 強制クローズ判定
   datetime nowServer = TimeCurrent();
   MqlDateTime mt; TimeToStruct(nowServer, mt);
   datetime exitTokyo  = StringToTime(StringFormat("%04d.%02d.%02d %02d:%02d",
                         mt.year, mt.mon, mt.day, ExitHourTokyo, ExitMinuteTokyo));
   datetime exitServer  = TokyoToServer(exitTokyo);

   // エグジット時刻到達で全決済
   if(nowServer >= exitServer){
      for(int i=OrdersTotal()-1; i>=0; i--){
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(OrderSymbol()==Symbol()){
               if(OrderType()==OP_BUY || OrderType()==OP_SELL){
                  OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrNONE);
               }
               if(OrderType()==OP_BUYLIMIT || OrderType()==OP_SELLLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP){
                  OrderDelete(OrderTicket());
               }
            }
         }
      }
      return(0);
   }

   // 既存ポジションがある場合は何もしない
   for(int j=0; j<OrdersTotal(); j++){
      if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES)){
         if(OrderSymbol()==Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL)) return(0);
      }
   }

   // エントリー条件
   if(InTradeWindow() && IsSpreadOK()){
      double price   = Ask;
      double sl      = price - StopLossPips * Point;
      double tp      = price + TakeProfitPips * Point;
      int ticket = OrderSend(Symbol(), OP_BUY, Lots, price, 5, sl, tp, "TokyoFixDrift", 0, 0, clrNONE);
      if(ticket<0){
         Print("OrderSend failed: ", GetLastError());
      }else{
         Print("OrderSend success: ", ticket);
      }
   }
   return(0);
}
//+------------------------------------------------------------------+
  

※ ブローカーの桁(小数点位)によりpips計算の調整が必要な場合があります。ストップ/テイクの妥当性とスプレッド条件はテストで確認してください。

11. TradingViewでの検証用(Pine Script)

エントリーとエグジットの時間ロジックを可視化し、方向を買い固定とした簡易版です。Pineのタイムゾーンを「Asia/Tokyo」に設定して検証してください。


//@version=5
strategy("Tokyo Fix Drift (Buy-only Beginner)", overlay=true, initial_capital=100000)
inSession = (timestamptz("Asia/Tokyo", year, month, dayofmonth, 9, 52) <= time) and (time <= timestamptz("Asia/Tokyo", year, month, dayofmonth, 9, 56))
enter = inSession and ta.change(time("1"))
if (enter)
    strategy.entry("BUY", strategy.long)
strategy.close("BUY", when = time >= timestamptz("Asia/Tokyo", year, month, dayofmonth, 9, 56))
  

12. 他通貨・暗号資産への応用

仲値ドリフトはUSD/JPYで語られることが多いですが、「特定の実需が集中する時間帯」という発想は他市場にも応用できます。例えば暗号資産では主要取引所の取引日替わりや特定の清算時間帯、株式ではオープン直後の板寄せや引け間際のリバランスなど、「時間固有のフロー」が局所的に発生しやすい局面があります。まずはUSD/JPYで基礎を固め、徐々に横展開するのが安全です。

13. よくある質問(FAQ)

Q:買い固定で良いですか?
A:学習段階では十分です。慣れたら9:40〜9:50の短期トレンドで方向を切り替える改良版に進みましょう。

Q:どの期間で評価すべきですか?
A:1日1回の戦略なので、最低でも数十〜百回程度のサンプル(数ヶ月〜1年)でブレを観察するのが現実的です。

Q:裁量で引っ張るのはダメですか?
A:初心者は原則NGです。時間で機械的にクローズすることが継続の鍵です。

14. まとめ:短時間・低負荷・ルール化で「まずは勝負所だけ」

時間帯に特化することで、毎朝5分だけのシンプル運用が可能になります。最初は買い固定+OCO+時間クローズという極小リスク・低ストレスの設計で慣れ、テストを通じて自分の数字を積み上げてください。必要なのは、複雑な指標ではなく「守る設計」です。続けられる管理が、結局は最大のエッジになります。

コメント

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