本記事では、短期売買で最も実務寄りの武器である「注文フロー(Order Flow)」と「板情報(Depth/DOM)」の読み方を、初心者でも再現できる手順に落とし込みます。テクニカル指標の後追いではなく、約定の流れ・板の厚み・出来高の推移という市場の一次情報に近いシグナルを組み合わせ、数分〜数十分のスキャルピング/デイトレードに活用する方法を解説します。抽象論は避け、数式・具体例・チェックリストまで提示します。
1. 注文フローとは何か
注文フローとは、実際に約定した売買の連続(テープ)と、その時点の板(気配)やスプレッドの変化を時系列で観察する分析手法です。終値や移動平均のような加工済みデータではなく、約定サイズ・連続性・速度(単位時間あたりの約定件数/出来高)といったプロの意思決定に直結しやすい情報を使うため、反応が速いのが特徴です。
2. 板情報・歩み値・出来高の基礎
- 板情報(DOM):各価格帯の買い気配数量(Bid)と売り気配数量(Ask)。直近3ティック(Bid1〜Bid3、Ask1〜Ask3)の厚みを合計して偏りを評価します。
- 歩み値(テープ):実際に約定した価格・数量・時刻のログ。連続約定や大口連発は勢いの手掛かりです。
- 出来高:期間あたりの約定数量。板は「予定」、出来高は「事実」です。
- スプレッド:最良売気配と最良買気配の差。スプレッドが狭いほど短期売買のコストは低くなります。
- VWAP:出来高加重平均価格。短期では「参加者の平均コスト」に近い考え方で、乖離が拡大すると巻き戻しや利食いが出やすいです。
3. 優位性の源泉
価格は「薄い方向に動きやすい」です。例えば直近3ティックの厚み(Bid合計 vs Ask合計)に偏りがあるとき、薄い側に素早く伸び、厚い側で失速しやすい傾向があります。また、連続約定(テープの加速)が板の薄い方向に集中すると、短いトレンドが出やすくなります。さらに、ストップ注文の集中帯を一気に掃除(ストップラン)すると、瞬間的な拡張の後に反転するパターンも頻出します。
4. 定量指標の設計
以下は初心者が自作しやすい簡易スコアです。直近3ティック合計の厚みとテープ速度、VWAP乖離、コスト(スプレッド)を統合します。
I = (Bid3合計 - Ask3合計) / (Bid3合計 + Ask3合計) (板インバランス, -1〜+1)
v = 単位時間あたりの約定件数または出来高(テープ速度)
z = (価格 - VWAP) / (VWAPの標準偏差) (VWAP乖離のzスコア)
c = スプレッド(ティック)
S = w1*I + w2*v - w3*|z| - w4*c
(w1..w4は0〜1の範囲で調整)
基本方針は、板が買いに偏る(I>0)、テープが加速(v増)、VWAP付近で過度な乖離がない(|z|が小さい)、スプレッドが狭い(c小)時にロングの期待値が上がる、という構造です。逆にI<0ならショート優位です。
5. 具体例シナリオ(数値)
例1:日本株・寄り付き5分
Bid合計=120,000株、Ask合計=80,000株 → I=+0.2。テープは1秒あたり約定5件から8件へ加速、スプレッド1ティック。VWAP乖離z=+0.3。合成Sが閾値0.6を超過。押し目買いでエントリー→直近高値ブレイクで分割利確、VWAP割れで撤退という定型が機能しやすい場面です。
例2:USD/JPY・ロンドン開始
流動性が増える時間帯。Ask側が薄く、ニュース無しでも欧州勢の買い上げでvが急増。I>0かつcが0.1pips程度に縮小。短時間の順張り、ただし米指標前は撤退条件を厳格に。
例3:BTCUSDT・深夜帯
板は薄く、スプレッドは狭いが流動性が分散。ストップ狩り発生時は急伸→即反転の繰り返し。Iが急反転、テープ速度vピークアウト、|z|>2で逆張りスキャルのチャンス。ただし滑りやすいのでサイズは抑制します。
6. エントリー/エグジットのルール
- トリガー:Sが上限閾値を超過(ロング)または下限閾値を下回る(ショート)こと。
- フィルター:直近高安のブレイク方向と一致、主要時間帯、重要指標の30分前後は回避など。
- 無効化:Sが瞬時に反転、またはスプレッド拡大、板の厚みが逆転。
- 利確:リスクリワード比≥1.5で分割利確、VWAPタッチや流動性壁接近で削減。
- 損切り:直近スイング高安を数ティック超え、またはSの符号反転。
- トレーリング:高値/安値の更新幅×0.5〜0.7倍で追随。
7. リスク管理とコスト
短期売買では、手数料・スプレッド・滑りがP/L を決定します。以下を固定手順化しましょう。
- 1トレードあたりの最大損失は口座の0.5〜1.0%に制限。
- 1日の最大ドローダウンで強制停止(例:-2R)。
- 滑りの平均と標準偏差を記録し、閾値超えの環境では新規エントリー停止。
- 出来高急減・板消失時は様子見に切替。
8. 市場別の実務差
- 日本株:寄り付き/引け/指標時に流動性が集中。約定単価の刻みが大きい銘柄はスリップが出やすいです。
- 先物・為替:ほぼ24時間。時間帯(東京/ロンドン/NY)で板の質が大きく変わります。
- 暗号資産:流動性が薄い時間帯のストップランが頻発。リミット主体、成行はサイズを抑える運用が無難です。
9. チェックリスト(毎トレード)
- I(板インバランス)の符号と大きさはどうか。
- テープ速度vは加速/減速しているか。
- VWAPからの乖離zは極端ではないか。
- スプレッドは許容範囲か、拡大していないか。
- 直近高安の位置、ストップ集合帯、厚いアイスバーグの存在。
- 撤退条件(無効化/損切り/時間切れ)は明文化されているか。
10. 失敗パターンと対策
- 板の見た目に惑わされる:スプーフィング等の疑い。歩み値(約定事実)の確認を優先。
- ニュース/指標直撃:ルールで時間帯フィルター。想定外の拡散時は中立に戻る。
- 連敗の深追い:2RのDDで停止、日次レビューへ。
11. KPIとレビュー手順
各トレードで以下を収集し、週次でレビューします。
- 勝率、平均損益R、期待値(E=勝率×平均利幅−(1−勝率)×平均損失)。
- エントリー時Sの分布とP/Lの相関。
- 滑りの分布(平均・標準偏差・裾)とP/Lへの寄与。
- 時間帯別の成績と連続約定の有無。
12. 例示EA(MQL4):簡易テープ×VWAP×インバランスでのスカルプ
以下は、ティック方向と出来高から簡易テープ速度を算出し、短時間の順張りと逆張りを切り替える教育用のEAです(主要指標時は停止などの判定はコメント内参照)。実運用ではスプレッド/滑り制御や約定リトライ処理を強化してください。
//+------------------------------------------------------------------+
//| OrderFlow_Scalp_Edu.mq4 (Educational Sample) |
//+------------------------------------------------------------------+
#property strict
input int LookbackSec = 20; // テープ速度の観測窓(秒)
input int VwapLenMin = 30; // VWAP計算の最小分
input double RiskR = 1.0; // 1トレードのリスク(R)
input double RR = 1.5; // 目標リスクリワード
input double SpreadMax = 20; // 許容スプレッド(ポイント)
input double Zmax = 2.0; // VWAP乖離の上限
input int Magic = 24680;
datetime lastCalc=0;
double v_speed=0, z_vwap=0;
double entryPrice=0;
int ticket=-1;
double VwapValue() {
// 1分足バーのOHLCVから簡易VWAP(Close*Volumeの加重平均)
int bars = MathMax(1, VwapLenMin);
double pv=0, v=0;
for(int i=0;i<bars && i<Bars;i++){
double vol = iVolume(Symbol(), PERIOD_M1, i);
double price = iClose(Symbol(), PERIOD_M1, i);
pv += price * vol;
v += vol;
}
return (v>0) ? pv/v : iClose(Symbol(), PERIOD_M1, 0);
}
double VwapSigma() {
int bars = MathMax(2, VwapLenMin);
double vwap = VwapValue();
double s2=0, v=0;
for(int i=0;i<bars && i<Bars;i++){
double vol = iVolume(Symbol(), PERIOD_M1, i);
double price = iClose(Symbol(), PERIOD_M1, i);
s2 += (price - vwap)*(price - vwap) * vol;
v += vol;
}
return (v>1) ? MathSqrt(s2/(v-1)) : 0;
}
int OnInit(){ return(INIT_SUCCEEDED); }
void OnTick(){
// スプレッド・時間帯フィルタ
if(MarketInfo(Symbol(), MODE_SPREAD) > SpreadMax) return;
// テープ速度(LookbackSec内のティック数/秒)
if(TimeCurrent() != lastCalc){
static int tickCount=0;
static datetime head=TimeCurrent();
tickCount++;
if(TimeCurrent() - head >= LookbackSec){
v_speed = (double)tickCount / LookbackSec;
tickCount=0; head=TimeCurrent();
}
lastCalc = TimeCurrent();
}
// VWAP乖離のzスコア
double vwap = VwapValue();
double sigma = MathMax( Point*10, VwapSigma() );
z_vwap = (sigma>0) ? (Bid - vwap)/sigma : 0;
// 簡易シグナル:トレンド(順張り)と乖離(逆張り)をハイブリッド
bool longSignal = (v_speed >= 0.8) && (MathAbs(z_vwap) <= Zmax) && (Bid > vwap);
bool shortSignal = (v_speed >= 0.8) && (MathAbs(z_vwap) <= Zmax) && (Ask < vwap);
// 既存ポジの管理
ManagePosition();
// 新規エントリー(同時保有1つ)
if(PositionsTotal()==0){
double sl, tp, lots = CalcLots(RiskR);
if(longSignal){
entryPrice = Ask;
sl = entryPrice - (RR>0 ? (MarketInfo(Symbol(), MODE_POINT)*100) : 0);
tp = entryPrice + (entryPrice - sl)*RR;
ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 5, sl, tp, "OF_Long", Magic, 0, clrGreen);
} else if(shortSignal){
entryPrice = Bid;
sl = entryPrice + (MarketInfo(Symbol(), MODE_POINT)*100);
tp = entryPrice - (sl - entryPrice)*RR;
ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 5, sl, tp, "OF_Short", Magic, 0, clrRed);
}
}
}
double CalcLots(double riskR){
// 口座残高と想定SL幅(100ポイント)からロット計算(教育用の簡易版)
double balance = AccountBalance();
double perRisk = balance * (0.01 * riskR); // 1% * R
double slPts = 100;
double tickval = MarketInfo(Symbol(), MODE_TICKVALUE);
double lot = perRisk / (slPts * tickval);
return NormalizeDouble(MathMax(MarketInfo(Symbol(), MODE_MINLOT), lot), 2);
}
void ManagePosition(){
for(int i=0;i<OrdersTotal();i++){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
// トレーリング:利益の50%幅で追随
double prof = (OrderType()==OP_BUY) ? Bid - OrderOpenPrice() : OrderOpenPrice() - Ask;
double trail = prof * 0.5;
if(OrderType()==OP_BUY && trail > 0){
double newSL = MathMax(OrderStopLoss(), Bid - trail);
OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0);
}
if(OrderType()==OP_SELL && trail > 0){
double newSL = MathMin(OrderStopLoss(), Ask + trail);
OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0);
}
}
}
}
//+------------------------------------------------------------------+
13. 補足インジケータ(Pine Script, 任意)
板情報が見られない環境では、足ごとの買い/売りティック推定とテープ速度を可視化するだけでも有用です。ここでは概念のみ示します。
// コンセプト:close>open を+1、close<open を-1とし、
// unit time内の合計と変化率を描画。VWAPからの乖離も併記。
14. 実装と運用フローのテンプレート
- 取引時間帯・対象市場を固定(例:寄り付き〜前場前半)。
- 板インバランスI、テープ速度v、VWAP乖離z、スプレッドcを記録。
- 合成スコアSの閾値を暫定設定(例:ロング0.6、ショート-0.6)。
- 2週間のペーパートレードでKPIを把握→閾値・RR・時間帯を調整。
- サイズは徐々に増やし、1日勝ち負けに一喜一憂しない。
15. まとめ
注文フローと板情報は、価格の動きの前提条件(流動性と約定の連続)を直接観察できるため、短期では汎用インジケータよりも即効性が高い場合があります。インバランスIとテープ速度v、VWAP乖離z、スプレッドcを組み合わせた合成スコアSを用いれば、ルール化・検証・改善のサイクルを回しやすくなります。重要なのは、再現可能な手順・KPIの記録・サイズ管理です。小さく試し、データで改善し、習熟度とともに期待値の高い場面に集中しましょう。
コメント