本記事では、日本時間9:55の「仲値(Tokyo Fixing)」前後でUSD/JPYに発生しやすい需給偏りを、初学者でも実践しやすい形に落とし込みます。仲値は銀行が顧客(輸入企業・輸出企業・機関投資家など)に当日適用する為替レートを決定する社内業務プロセスに由来します。この時間帯は、実需フローのヘッジやポジション調整が一時的に集中しやすく、短い時間ウィンドウに価格の歪みが生じることがあります。
重要な前提として、本稿は特定の利益を保証するものではありません。短時間のイベントを狙う戦略は、スプレッド拡大・滑り(スリッページ)・約定拒否・サーバー遅延などの実務的リスクに敏感です。再現性は執行品質に依存しやすく、取引コストを含めた検証が不可欠です。本記事は、初心者でも段階的に検証・改善できる「実装ベース」のガイドとして構成しています。
仲値(Tokyo Fixing)とは何か
仲値は一般に日本時間9:55頃に各行が提示・確定する対顧客レートを指します。銀行は顧客注文の片側に立つため、顧客フローの偏りが大きい日は自らの市場リスクを調整する必要があり、9:30〜9:55の過程でスポット市場にヘッジフローが出ることがあります。結果的に、特定方向へ短期的な需給の歪みが出現し、9:55直前〜直後に一時的なトレンド・反転が観測されることがあります。
戦略コンセプト:時間×簡易トレンドフィルター
本稿の戦略は極めてシンプルです。時間条件(東京9:40〜9:58)と、簡易トレンドフィルター(移動平均)を組み合わせ、価格に追随するモメンタム型のエントリーを行い、9:55〜9:58で手仕舞う設計です。方向は「直近30分のモメンタムに追随」を基本とし、レンジ日はエントリーを見送る頻度を上げます。
推奨する基本ルール(手動運用)
- 監視時間:日本時間9:35からチャート監視を開始します。5分足または1分足を利用します。
- フィルター:EMA20とEMA60を5分足に適用。EMA20がEMA60を上回り、かつ価格が両者の上にあれば「上昇モメンタム」、逆は「下降モメンタム」とみなします。
- エントリー:9:45〜9:52の間、直近高値/安値のブレイクで成行または指値で片側のみエントリー(多ポジ禁止)。
- 手仕舞い:時間決済を優先し、9:56:30までに全決済。利確/損切りと併用します。
- 損切り:エントリーから8〜15 pipsの固定SL。過度に広げないこと。
- 利確:時間決済が優先ですが、10〜25 pipsのTPを入れておき、急変に備えます。
- 見送り条件:重要イベント(日本のGDP、雇用統計、CPIなど)が9:30〜10:00に近接する日、スプレッドが通常の2倍以上、主要祝日・月末最終営業日で流動性やフローが極端に偏りやすい日。
なぜ「時間条件」が効きやすいのか
多くの戦略が価格情報のみを用いるのに対し、仲値戦略は時間という独立変数を使います。ヘッジフローや社内決定プロセスは人為的なスケジュールに依存し、市場が完全に効率的でない限り、時間帯固定の需給偏りが断続的に現れます。このため、価格×時間の2軸で条件を定義すると優位性が生まれる可能性があります。
口座・ツール準備(初心者向け)
- 口座:USD/JPYが取引でき、東京時間帯のスプレッドが安定している口座を選びます。デモ口座で先に練習します。
- プラットフォーム:MT4/MT5またはTradingView。今回はMT4を前提にEAも付属します。
- 時間設定:ブローカーサーバー時間とJSTの差を必ず把握します(EAのパラメータで補正)。
- データ:過去の1分足・5分足の品質が検証の成否を左右します。欠落データや異常ヒゲの有無を確認します。
資金管理:ロット計算と最大ドローダウン想定
短時間戦略は「勝率」と「平均損益比」の微小な差でエッジを作ります。1トレードの許容損失額を資金の0.5〜1.0%に制限し、SL(pips)と1pipsあたりの価値からロットを逆算します。連敗を前提とし、最大ドローダウン=(連敗数×1トレード損失)を常時モニター。連敗時にロットを上げるマーチン系は採用しません。
実践オペレーション:分単位の行動表
時刻(JST) | やること |
---|---|
09:35 | チャート準備(5分足・1分足、EMA20/60)。経済指標カレンダー確認。 |
09:40 | モメンタム判定(EMA20≷EMA60、価格の位置)。 |
09:45 | 直近高値/安値を更新し始めたらブレイク指値準備。スプレッド監視。 |
09:50 | 過度な乱高下なら見送り判断。建玉は1ポジのみ。 |
09:55 | 時間経過とともに決済方針を固定。突発変動に備えSL/TP確認。 |
09:56〜09:58 | 時間決済でクローズ。再エントリーしない。 |
回避・調整ルール
- 月末営業日:実需フローが通常と異なる挙動を示しやすく、ギャップや急反転が増える傾向。経験を積むまでは回避。
- 主要指標・要人発言:仲値前に日本のマクロ指標発表がある日は、イベント主導のボラでルールが無効化されやすい。
- 急なスプレッド拡大:スプレッドが一時的に3桁(0.3→1.0pipsなど)へ拡大したら成行は避け、指値活用か見送り。
- 通信遅延:VPS未使用で家庭回線の場合、遅延・約定品質の不安定さが増す。裁量は成行でなくブレイク指値を中心に。
検証(バックテスト)手順
- 期間:直近2〜3年を最低ラインに、可能なら5年。
- データ品質:1分足の欠損や異常スパイクを手修正(または高品質データを再取得)。
- ロジック固定:時間条件・EMA条件・SL/TPを固定。パラメータの過剰最適化は禁止。
- コスト反映:平均スプレッド、想定スリッページ(例:±0.2〜0.5pips)を加味。
- 評価:勝率、平均損益比、PF、最大DD、連敗数、年次ごとの安定性。
MQL4 EA(完全自動売買)サンプル
以下は本戦略の最小構成EAです。教育目的で提供しており、実運用前に必ずデモ検証を行ってください。ブローカーサーバー時間とJSTの差をBrokerToJSTHoursで補正します。
//+------------------------------------------------------------------+
//| TokyoFix_955_MomentumEA.mq4 |
//| Simple educational EA for USDJPY Tokyo Fix (9:55 JST) |
//+------------------------------------------------------------------+
#property strict
extern string __SECTION1 = "=== Time Settings ===";
extern int TokyoFixHourJST = 9; // 9:55 JST
extern int TokyoFixMinuteJST = 55;
extern int PreEntryStartMin = 45; // enter window start (minutes) JST
extern int PreEntryEndMin = 52; // enter window end (minutes) JST
extern int BrokerToJSTHours = 7; // Example: if broker is 2:55 when JST is 9:55 -> 7
extern string __SECTION2 = "=== Filters ===";
extern int EMAfast = 20;
extern int EMAslow = 60;
extern int TimeframeFilter = PERIOD_M5;
extern double MinRangePips = 5; // avoid dead-flat
extern string __SECTION3 = "=== Risk Settings ===";
extern double RiskPerTradePct = 0.7;
extern double StopLossPips = 12;
extern double TakeProfitPips = 18;
extern bool UseTimeExit = true; // force exit before 9:58 JST
extern int ExitMinuteJST = 58;
extern string __SECTION4 = "=== Misc ===";
extern int Magic = 955001;
extern bool OnePositionOnly = true;
extern double SlipPips = 2;
int ticket;
//--- Convert broker time to JST
datetime ToJST(datetime bt) {
return bt + (BrokerToJSTHours*3600);
}
datetime ToBroker(datetime jt) {
return jt - (BrokerToJSTHours*3600);
}
bool IsWithinPreEntryWindow(datetime jt) {
int h = TimeHour(jt);
int m = TimeMinute(jt);
if(h!=TokyoFixHourJST) return false;
return (m>=PreEntryStartMin && m<=PreEntryEndMin);
}
bool IsTimeToForceExit(datetime jt) {
int h = TimeHour(jt);
int m = TimeMinute(jt);
return (UseTimeExit && h==TokyoFixHourJST && m>=ExitMinuteJST);
}
bool HasOpenPosition() {
for(int i=OrdersTotal()-1;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol()) return true;
}
return false;
}
//--- Pips value helper
double PipValue(){ return (MarketInfo(Symbol(), MODE_POINT) * (Digits==3 || Digits==5 ? 10 : 1)); }
double ToPoints(double pips){ return pips * (1.0 / PipValue()); }
//--- Position sizing (fixed % risk)
double CalcLots(double stop_pips) {
double acc = AccountBalance();
double risk = MathMax(0.01, RiskPerTradePct/100.0) * acc;
double tickvalue = MarketInfo(Symbol(), MODE_TICKVALUE);
double pip_value_per_lot = tickvalue * (ToPoints(1.0)); // rough
if(pip_value_per_lot<=0) return 0.01;
double lots = risk / (stop_pips * pip_value_per_lot);
// normalize
double step = MarketInfo(Symbol(), MODE_LOTSTEP);
double minl = MarketInfo(Symbol(), MODE_MINLOT);
double maxl = MarketInfo(Symbol(), MODE_MAXLOT);
lots = MathFloor(lots/step)*step;
lots = MathMax(minl, MathMin(maxl, lots));
return lots;
}
//--- Trend filter on M5 EMA20/60
int TrendSignal() {
int tf = TimeframeFilter;
int fast = iMA(Symbol(), tf, EMAfast, 0, MODE_EMA, PRICE_CLOSE, 0);
int slow = iMA(Symbol(), tf, EMAslow, 0, MODE_EMA, PRICE_CLOSE, 0);
double emaFast0 = iMA(Symbol(), tf, EMAfast, 0, MODE_EMA, PRICE_CLOSE, 0);
double emaSlow0 = iMA(Symbol(), tf, EMAslow, 0, MODE_EMA, PRICE_CLOSE, 0);
double emaFast1 = iMA(Symbol(), tf, EMAfast, 0, MODE_EMA, PRICE_CLOSE, 1);
double emaSlow1 = iMA(Symbol(), tf, EMAslow, 0, MODE_EMA, PRICE_CLOSE, 1);
// basic direction by position of price vs EMAs
double close0 = iClose(Symbol(), tf, 0);
double rangePips = (iHigh(Symbol(), PERIOD_M5, 0) - iLow(Symbol(), PERIOD_M5, 0))/PipValue();
if(rangePips < MinRangePips) return 0; // flat
if(close0>emaFast0 && emaFast0>emaSlow0) return 1; // long bias
if(close00) {
t = OrderSend(Symbol(), OP_BUY, lots, priceAsk, slip, priceAsk - sl*Point, priceAsk + tp*Point, "TF955 Buy", Magic, 0, clrNONE);
} else if(dir<0) {
t = OrderSend(Symbol(), OP_SELL, lots, priceBid, slip, priceBid + sl*Point, priceBid - tp*Point, "TF955 Sell", Magic, 0, clrNONE);
}
}
//--- Time exit
void ForceExitAll(){
for(int i=OrdersTotal()-1;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
if(OrderType()==OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, (int)ToPoints(SlipPips), clrNONE);
if(OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, (int)ToPoints(SlipPips), clrNONE);
}
}
int OnInit(){ return(INIT_SUCCEEDED); }
int OnDeinit(){ return(0); }
int start(){
datetime bt = TimeCurrent();
datetime jt = ToJST(bt);
// Force exit window
if(IsTimeToForceExit(jt)) {
ForceExitAll();
return(0);
}
// Pre-entry window
if(IsWithinPreEntryWindow(jt)) {
int dir = TrendSignal();
if(dir!=0) TryEnter(dir);
}
return(0);
}
//+------------------------------------------------------------------+
EAの使い方(超要約)
- USDJPYのM5チャートに適用します。
- BrokerToJSTHoursをブローカーのサーバー時間に合わせて調整します。
- デモ口座で2〜4週間検証し、約定品質・スリッページ・スプレッドの癖を把握します。
- 連敗やDDが資金管理許容内かを必ず確認します。
発展:改良アイデア
- ボラティリティフィルター:ATRベースで「閾値未満は見送り」。
- イベントフィルター:カレンダーフィードから回避日を自動判定。
- 時間分散:9:44・9:48・9:52の3回に分割して小口で仕掛ける。
- 決済強化:部分利確+残り時間決済、もしくは急変時の非常決済(トレイリング)。
よくある失敗
- 一発勝負のフルレバ:短期イベントで最大ロットは厳禁です。
- スプレッド非監視:通常の2倍以上に拡大しているのに成行で突撃しない。
- 時間誤認:ブローカー時間とJSTの変換ミスで全てが崩れます。まずここを固定。
まとめ
仲値アノマリーは「時間に縛られた需給」という構造を利用するシンプルな戦略です。時間条件+簡易モメンタム+厳格なリスク上限の組み合わせを守れば、初心者でも検証・運用の土台を築けます。過度な期待は禁物ですが、学習コストに対して得られる示唆は大きく、裁量・自動売買の双方に展開しやすいテーマです。
コメント