注文フローと板情報の実践入門:テープリーディングで短期優位性を作る方法

投資

本記事では、短期売買で最も実務寄りの武器である「注文フロー(Order Flow)」と「板情報(Depth/DOM)」の読み方を、初心者でも再現できる手順に落とし込みます。テクニカル指標の後追いではなく、約定の流れ・板の厚み・出来高の推移という市場の一次情報に近いシグナルを組み合わせ、数分〜数十分のスキャルピング/デイトレードに活用する方法を解説します。抽象論は避け、数式・具体例・チェックリストまで提示します。

スポンサーリンク
【DMM FX】入金

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. 実装と運用フローのテンプレート

  1. 取引時間帯・対象市場を固定(例:寄り付き〜前場前半)。
  2. 板インバランスI、テープ速度v、VWAP乖離z、スプレッドcを記録。
  3. 合成スコアSの閾値を暫定設定(例:ロング0.6、ショート-0.6)。
  4. 2週間のペーパートレードでKPIを把握→閾値・RR・時間帯を調整。
  5. サイズは徐々に増やし、1日勝ち負けに一喜一憂しない。

15. まとめ

注文フローと板情報は、価格の動きの前提条件(流動性と約定の連続)を直接観察できるため、短期では汎用インジケータよりも即効性が高い場合があります。インバランスIとテープ速度v、VWAP乖離z、スプレッドcを組み合わせた合成スコアSを用いれば、ルール化・検証・改善のサイクルを回しやすくなります。重要なのは、再現可能な手順・KPIの記録・サイズ管理です。小さく試し、データで改善し、習熟度とともに期待値の高い場面に集中しましょう。

p-nuts

お金稼ぎの現場で役立つ「投資の地図」を描くブログを運営しているサラリーマン兼業個人投資家の”p-nuts”と申します。株式・FX・暗号資産からデリバティブやオルタナティブ投資まで、複雑な理論をわかりやすく噛み砕き、再現性のある戦略と“なぜそうなるか”を丁寧に解説します。読んだらすぐ実践できること、そして迷った投資家が次の一歩を踏み出せることを大切にしています。

p-nutsをフォローする
投資
スポンサーリンク
【DMM FX】入金
p-nutsをフォローする

コメント

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