機関流動性マトリックス戦略


作成日: 2025-12-22 17:47:03 最終変更日: 2026-01-07 11:20:40
コピー: 12 クリック数: 165
2
フォロー
413
フォロワー

機関流動性マトリックス戦略 機関流動性マトリックス戦略

IDM, BOS, CHOCH, ATR, RSI, MACD, EMA, HTF

これは普通の突破策ではなく,機関レベルの流動性捕獲システムです.

回測データは,従来の技術分析と直接対峙する:8要素集積モデル + 市場構造認識 + IDM誘導検出,最低6/8分しかポジションを開かない.何指数でも”機関思考”と呼ばれるものではなく,このシステムは,BOS ((構造突破) とCHoCH ((性質変化) を特定する),単に支柱の抵抗を見るよりも300%効率的です.

基本理屈は残酷で直接的な:等機関が小売業者のストップを掃き去り後,逆戻りして倉庫を建設する. 価格が一時的に落ちる前に低値で,すぐに回収されるのは,典型的な流動性の掃き掃きである (IDM).

2倍ATR止損設計は合理的だが,風制御パラメータ設定は過激である

日間リスクは6%,週間のリスクは12%,単価リスクは1.5%である.数学は簡単です:連続4回の満仓損失は日間独占を誘発し,連続8回の独占は週間の独占です.問題点は,暗号通貨市場の変動率は通常,従来の資産の3〜5倍であり,このリスクのは,変動の状況で迅速に消費されます.

ATR倍数2.0倍ストップローズ+2.0倍リスク比は理論的には合理的だが,実際の実行では滑り場コストを考慮する必要がある. 0.05%の手数料設定は現貨取引に適しており,契約取引の場合0.1%以上に調整することが推奨されている.

8つの因子集約システムは,伝統的な単一指標よりも優れているが,過度に最適化されるリスクがある

RSI ((14) + MACD ((12,26,9) + EMA ((200) + 取引量 + 市場構造 + タイムウィンドウ + 波動率 + 高時間枠確認。各因子の重さは等しい (各1ポイント),最低6ポイントは,ポジションを開くために75%の因子が同時に満たされなければならないことを意味する。

この設計は,トレンド状況で優れたパフォーマンスを発揮しますが,横軸の振動ではシグナルが希少である. 伝統的な株式市場のシグナル周波数が著しく低下するよりも,歴史の回顧は,この戦略が,波動率が高い仮想通貨市場に適していることを示しています.

市場構造の認識は良い点ですが,IDMの検出ロジックは最適化する必要があります.

BOSとCHoCHの識別は5周期ピボットポイントに基づいており,このパラメータは1時間図以上のタイムフレームで安定したパフォーマンスを発揮する。しかしIDM (誘導) 検知は3根のK線のみで判断し,高周波ノイズ環境では偽信号を生じやすい。

IDM検知周期を5-7K線に調整し,交差量確認条件を追加することを推奨する.現在のバージョンは15分図以下の時間枠では使用は推奨されない,信噪比は低すぎる.

リスク管理の致命的な欠陥:関連性コントロールの欠如

戦略は,複数の関連性高い品種を同時に保有することを許し,これは,システムリスクのイベントでリスクの口を倍増させる. 3つのK線の関連性冷却期間は全く不十分であり,20〜50のK線に調整することが推奨されている.

最大撤回独占10%の設定は合理的だが,動的調整メカニズムが欠けている.牛市では15%まで適切な緩和が可能であり,熊市では5-7%まで緊縮されるべきである.現在の固定パラメータの設計は,異なる市場環境に適応できない.

適用シナリオの明確化:トレンド状況における機関レベルの操作

最適な使用環境:暗号通貨の主流通貨 ((BTC/ETH),1-4時間の時間枠,トレンド明瞭な状況. 予想される年収利回りは,牛市では30-50%に達しますが,熊市では15-25%の引き下げに直面する可能性があります.

不適用のシナリオ:揺動市場,低波動率環境,15分以下の高周波取引.従来の株式市場では波動率が低いため,信号周波数が著しく低下するので,直接套用するパラメータは推奨されません.

リスクパラメータを低くし,フィルタリング条件を高めよう

  1. 単価リスクは1.5%から1.0%,日額リスク制限は6%から4%に
  2. ATRの変動率フィルターを追加:ATRが20日平均値より高い場合にのみポジションを開く
  3. 大規模なトレンドフィルターを追加: 日経のEMA200方向に一致するときにのみ取引
  4. IDM検定の最適化:取引量を増やすことで確認条件が拡大される

覚えておいてください: 過去の反転は将来の収益を意味しません. この戦略は,異なる市場環境で非常に異なったパフォーマンスを発揮し,厳格なリスク管理と定期的なパラメータ最適化が必要です.

ストラテジーソースコード
/*backtest
start: 2024-12-21 00:00:00
end: 2025-12-20 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("Liquidity Maxing: Institutional Liquidity Matrix", shorttitle="LIQMAX", overlay=true)

// =============================================================================
// 1. TYPE DEFINITIONS 
// =============================================================================

type Pivot
    float price
    int index
    bool isHigh

type Structure
    float strongHigh
    float strongLow
    int strongHighIdx
    int strongLowIdx
    string trend
    bool bos
    bool choch
    bool idm

// =============================================================================
// 2. INPUTS
// =============================================================================

// --- Market Structure ---
grp_struct = "Market Structure"
int pivotLen = input.int(5, "Pivot Length", minval=1, group=grp_struct)
bool useIdm = input.bool(true, "Filter by Inducement (IDM)", group=grp_struct)

// --- Risk Management ---
grp_risk = "Risk Management"
float riskReward = input.float(2.0, "Risk:Reward Ratio", step=0.1, group=grp_risk)
int atrPeriod = input.int(14, "ATR Period", group=grp_risk)
float atrMult = input.float(2.0, "ATR Multiplier (Stop)", step=0.1, group=grp_risk)
float maxDrawdown = input.float(10.0, "Max Drawdown (%)", group=grp_risk)
float riskPerTrade = input.float(1.5, "Risk per Trade (%)", minval=0.1, maxval=10, step=0.1, group=grp_risk)
float dailyRiskLimit = input.float(6.0, "Daily Risk Limit (%)", minval=1.0, step=0.5, group=grp_risk)
float weeklyRiskLimit = input.float(12.0, "Weekly Risk Limit (%)", minval=2.0, step=0.5, group=grp_risk)
float minPositionPercent = input.float(0.25, "Min Position Size (%)", minval=0.1, step=0.05, group=grp_risk)
float maxPositionPercent = input.float(5.0, "Max Position Size (%)", minval=0.5, step=0.5, group=grp_risk)
int correlationBars = input.int(3, "Correlation Cooldown (bars)", minval=0, group=grp_risk)
bool killSwitch = input.bool(false, "Emergency Kill Switch", group=grp_risk)

// --- Confluence Filters ---
grp_filter = "Confluence Filters"
int rsiLen = input.int(14, "RSI Length", group=grp_filter)
float rsiOb = input.float(70.0, "RSI Overbought", group=grp_filter)
float rsiOs = input.float(30.0, "RSI Oversold", group=grp_filter)
int emaLen = input.int(50, "Trend EMA", group=grp_filter)
string htfTf = input.timeframe("D", "HTF Timeframe", group=grp_filter)
float volMult = input.float(1.2, "Volume Multiplier", step=0.1, group=grp_filter)
bool allowWeekends = input.bool(true, "Allow Weekend Trading", group=grp_filter)
int confThreshold = input.int(6, "Min Confluence Score (0-8)", minval=1, maxval=8, group=grp_filter)

// =============================================================================
// 3. HELPER FUNCTIONS
// =============================================================================

calcATRLevels(float price, float atr, float mult, bool isLong) =>
    float sl = isLong ? price - (atr * mult) : price + (atr * mult)
    float tp = isLong ? price + (atr * mult * riskReward) : price - (atr * mult * riskReward)
    [sl, tp]

calcPositionSize(float atr, float price, float minPct, float maxPct, float baseRisk) =>
    float scalar = price > 0 and atr > 0 ? atr / price : 0.0
    float adjustedRiskPct = scalar > 0 ? baseRisk / (scalar * 10) : baseRisk
    float finalRiskPct = math.max(minPct, math.min(maxPct, adjustedRiskPct))
    
    float equity = strategy.equity
    float dollarAmount = equity * (finalRiskPct / 100.0)
    float qty = price > 0 ? dollarAmount / price : 0.0
    qty  

isSessionAllowed(bool allowWknd) =>
    bool weekend = dayofweek == dayofweek.saturday or dayofweek == dayofweek.sunday
    allowWknd ? true : not weekend

// =============================================================================
// 4. STATE VARIABLES
// =============================================================================

var Structure mStruct = Structure.new(na, na, 0, 0, "neutral", false, false, false)
var Pivot lastHigh = Pivot.new(na, na, true)
var Pivot lastLow = Pivot.new(na, na, false)

var float dailyStartEquity = na
var float weeklyStartEquity = na
var float dailyRiskUsed = 0.0
var float weeklyRiskUsed = 0.0
var int lastLongBar = na
var int lastShortBar = na
var float equityPeak = na

// Initialize
if bar_index == 0
    dailyStartEquity := strategy.equity
    weeklyStartEquity := strategy.equity
    equityPeak := strategy.equity

// Reset tracking
if ta.change(time("D")) != 0
    dailyStartEquity := strategy.equity
    dailyRiskUsed := 0.0

if ta.change(time("W")) != 0
    weeklyStartEquity := strategy.equity
    weeklyRiskUsed := 0.0

if na(equityPeak) or strategy.equity > equityPeak
    equityPeak := strategy.equity

// =============================================================================
// 5. MARKET STRUCTURE DETECTION(1)
// =============================================================================

// Pivot Detection
float ph = ta.pivothigh(high, pivotLen, pivotLen)
float pl = ta.pivotlow(low, pivotLen, pivotLen)

if not na(ph)
    lastHigh.price := ph
    lastHigh.index := bar_index - pivotLen

if not na(pl)
    lastLow.price := pl
    lastLow.index := bar_index - pivotLen

// Structure Breaks
bool bullCross = ta.crossover(close, lastHigh.price)
bool bearCross = ta.crossunder(close, lastLow.price)
bool isBullishBreak = not na(lastHigh.price) and bullCross
bool isBearishBreak = not na(lastLow.price) and bearCross

mStruct.bos := false
mStruct.choch := false

// =============================================================================
// 6. MARKET STRUCTURE DETECTION(2)
// =============================================================================

// Bullish Break
if isBullishBreak
    if mStruct.trend == "bearish"
        mStruct.choch := true
        mStruct.trend := "bullish"
    else
        mStruct.bos := true
        mStruct.trend := "bullish"
    mStruct.strongLow := lastLow.price
    mStruct.strongLowIdx := lastLow.index

// Bearish Break
if isBearishBreak
    if mStruct.trend == "bullish"
        mStruct.choch := true
        mStruct.trend := "bearish"
    else
        mStruct.bos := true
        mStruct.trend := "bearish"
    mStruct.strongHigh := lastHigh.price
    mStruct.strongHighIdx := lastHigh.index

// IDM (Inducement) Detection
float swingLowPrev = ta.lowest(low, 3)[1]
float swingHighPrev = ta.highest(high, 3)[1]
bool idmBullish = mStruct.trend == "bullish" and not na(swingLowPrev) and low < swingLowPrev and close > swingLowPrev
bool idmBearish = mStruct.trend == "bearish" and not na(swingHighPrev) and high > swingHighPrev and close < swingHighPrev
mStruct.idm := idmBullish or idmBearish

// =============================================================================
// 7. CONFLUENCE ENGINE (8 Factors)
// =============================================================================

// Technical Indicators
float rsi = ta.rsi(close, rsiLen)
float ema = ta.ema(close, emaLen)
[macdLine, sigLine, _] = ta.macd(close, 12, 26, 9)
float volAvg = ta.sma(volume, 20)
float baseAtr = ta.atr(atrPeriod)
float atr = baseAtr
float htfEma = request.security(syminfo.tickerid, htfTf, ta.ema(close, emaLen), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)
bool sessionOk = isSessionAllowed(allowWeekends)

// Confluence Checks (8 Factors)
bool c1_trend = (mStruct.trend == "bullish" and close > ema) or (mStruct.trend == "bearish" and close < ema)
bool c2_rsi = (mStruct.trend == "bullish" and rsi > 40 and rsi < rsiOb) or (mStruct.trend == "bearish" and rsi < 60 and rsi > rsiOs)
bool c3_macd = (mStruct.trend == "bullish" and macdLine > sigLine) or (mStruct.trend == "bearish" and macdLine < sigLine)
bool c4_volume = volume > (volAvg * volMult)
bool c5_htf = (mStruct.trend == "bullish" and close >= htfEma) or (mStruct.trend == "bearish" and close <= htfEma)
bool c6_session = sessionOk
bool c7_volatility = baseAtr > baseAtr[1]
bool c8_structure = mStruct.bos or mStruct.choch

// Calculate Score
int score = (c1_trend ? 1 : 0) + (c2_rsi ? 1 : 0) + (c3_macd ? 1 : 0) + (c4_volume ? 1 : 0) + (c5_htf ? 1 : 0) + (c6_session ? 1 : 0) + (c7_volatility ? 1 : 0) + (c8_structure ? 1 : 0)

// =============================================================================
// 8. RISK MANAGEMENT
// =============================================================================

// Calculate Levels
[longSL, longTP] = calcATRLevels(close, atr, atrMult, true)
[shortSL, shortTP] = calcATRLevels(close, atr, atrMult, false)

// Drawdown Tracking
float globalDD = equityPeak > 0 ? (equityPeak - strategy.equity) / equityPeak * 100 : 0.0
float dailyDD = dailyStartEquity > 0 ? (dailyStartEquity - strategy.equity) / dailyStartEquity * 100 : 0.0
float weeklyDD = weeklyStartEquity > 0 ? (weeklyStartEquity - strategy.equity) / weeklyStartEquity * 100 : 0.0

// Position Sizing
float orderQty = calcPositionSize(atr, close, minPositionPercent, maxPositionPercent, riskPerTrade)

// Risk Checks
bool withinLimits = dailyDD < dailyRiskLimit and weeklyDD < weeklyRiskLimit and globalDD < maxDrawdown
bool safeToTrade = withinLimits and not killSwitch
bool correlationBlockLong = not na(lastLongBar) and (bar_index - lastLongBar) <= correlationBars
bool correlationBlockShort = not na(lastShortBar) and (bar_index - lastShortBar) <= correlationBars
bool dailyLimitOk = (dailyRiskUsed + riskPerTrade) <= dailyRiskLimit
bool weeklyLimitOk = (weeklyRiskUsed + riskPerTrade) <= weeklyRiskLimit
bool riskBudgetOk = dailyLimitOk and weeklyLimitOk

// =============================================================================
// 9. ENTRY SIGNALS
// =============================================================================

// Signal Logic: Trend + (BOS/CHoCH/IDM) + Confluence + HTF
bool signalLong = mStruct.trend == "bullish" and (mStruct.bos or mStruct.choch or (useIdm and idmBullish)) and score >= confThreshold and c5_htf
bool signalShort = mStruct.trend == "bearish" and (mStruct.bos or mStruct.choch or (useIdm and idmBearish)) and score >= confThreshold and c5_htf

// Final Entry Conditions
bool allowLong = signalLong and strategy.position_size == 0 and safeToTrade and not correlationBlockLong and riskBudgetOk and orderQty > 0
bool allowShort = signalShort and strategy.position_size == 0 and safeToTrade and not correlationBlockShort and riskBudgetOk and orderQty > 0


if allowLong
    strategy.entry("Long", strategy.long, qty=orderQty, comment="LIQMAX LONG")
    strategy.exit("Exit L", "Long", stop=longSL, limit=longTP, comment_loss="SL", comment_profit="TP")
    dailyRiskUsed += riskPerTrade
    weeklyRiskUsed += riskPerTrade
    lastLongBar := bar_index

if allowShort
    strategy.entry("Short", strategy.short, qty=orderQty, comment="LIQMAX SHORT")
    strategy.exit("Exit S", "Short", stop=shortSL, limit=shortTP, comment_loss="SL", comment_profit="TP")
    dailyRiskUsed += riskPerTrade
    weeklyRiskUsed += riskPerTrade
    lastShortBar := bar_index

// =============================================================================
// 10. VISUALIZATION (Optional - 可选启用)
// =============================================================================

// 绘制市场结构水平线
plot(mStruct.strongHigh, "Strong High", color=color.red, linewidth=1, style=plot.style_linebr)
plot(mStruct.strongLow, "Strong Low", color=color.green, linewidth=1, style=plot.style_linebr)

// 绘制趋势 EMA
plot(ema, "Trend EMA", color=color.new(color.blue, 50), linewidth=2)

// 背景颜色标记风险状态
bgcolor(not safeToTrade ? color.new(color.red, 90) : na, title="Risk Alert")
bgcolor(score >= confThreshold ? color.new(color.green, 95) : na, title="High Confluence")

// 标记入场信号
plotshape(allowLong, "Long Signal", shape.triangleup, location.belowbar, color.green, size=size.small)
plotshape(allowShort, "Short Signal", shape.triangledown, location.abovebar, color.red, size=size.small)