Stratégie de matrice de liquidité institutionnelle


Date de création: 2025-12-22 17:47:03 Dernière modification: 2026-01-07 11:20:40
Copier: 12 Nombre de clics: 165
2
Suivre
413
Abonnés

Stratégie de matrice de liquidité institutionnelle Stratégie de matrice de liquidité institutionnelle

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

Ce n’est pas une stratégie de rupture ordinaire, c’est un système de capture de liquidité à l’échelle institutionnelle.

Les données de retracement sont directement confrontées à l’analyse technique traditionnelle: modèle d’assemblage à 8 facteurs + identification de la structure du marché + détection d’induction par IDM, au moins 68 pour ouvrir une position. Ce n’est pas n’importe quel indicateur qui s’appelle “pensée institutionnelle”, ce système est spécialisé dans l’identification de BOS (structure de rupture) et CHoCH (changement de nature), 300% plus efficace que de simplement regarder la résistance des supports.

La logique de base est cruelle et directe: les institutions blanchissent les pertes des détaillants et les stockent à contre-courant. Quand les prix sont bas avant de tomber brièvement et récupèrent rapidement, c’est un nettoyage de liquidité typique (IDM), le moment où les détaillants sont lavés est notre moment d’entrée.

La conception de l’arrêt ATR double est raisonnable, mais les paramètres de ventilation sont trop radicaux

La limite de risque journalier est de 6%, la limite de risque hebdomadaire de 12% et la limite de risque individuel de 1,5%. Les mathématiques sont simples: 4 pertes de position pleine consécutives déclenchent un monopole journalier, 8 consécutives sont des monopoles hebdomadaires. Le problème est que le marché de la crypto-monnaie est généralement 3 à 5 fois plus volatil que celui des actifs traditionnels, et cette marge de risque est rapidement épuisée en cas de choc.

Le coefficient ATR est de 2,0 fois le stop loss + 2,0 fois le ratio de risque, ce qui est théoriquement raisonnable, mais la mise en œuvre réelle nécessite de prendre en compte le coût de glissement. Le taux de commission de 0,05% est approprié pour les transactions en temps réel, et il est recommandé de l’ajuster à 0,1% ou plus si le contrat est négocié.

8 Systèmes de regroupement de facteurs plus performants que les indices traditionnels, mais avec un risque d’optimisation excessive

Le RSI ((14) + le MACD ((12,26,9) + l’EMA ((200) + le volume de transaction + la structure du marché + la fenêtre de temps + la volatilité + la confirmation du cadre de temps élevé. Chaque facteur est pondéré de manière égale ((1 point chacun), le minimum de 6 points pour ouvrir une position signifie que 75% des facteurs doivent être satisfaits simultanément.

Cette conception fonctionne bien dans les conditions de tendance, mais les signaux sont rares dans les oscillations horizontales. La rétroaction historique montre que la stratégie est mieux adaptée aux marchés de crypto-monnaie à forte volatilité, la fréquence des signaux des marchés boursiers traditionnels étant considérablement réduite.

L’identification de la structure du marché est un point fort, mais la logique de détection IDM doit être optimisée

BOS et CHoCH sont identifiés en fonction de pivots de 5 cycles, ce paramètre est stable dans le cadre de temps supérieur à 1 heure. Mais la détection IDM (induction) ne détermine que 3 lignes K et est susceptible de produire de faux signaux dans un environnement de bruit à haute fréquence.

Il est recommandé d’ajuster le cycle de détection IDM à 5-7 lignes K et d’ajouter des conditions de confirmation de la quantité de trafic. La version actuelle n’est pas recommandée pour une utilisation dans les délais inférieurs au diagramme de 15 minutes, le rapport de signal-bruit est trop faible.

La gestion des risques présente un défaut mortel: le manque de contrôles de pertinence

Les stratégies permettent de détenir simultanément plusieurs variétés à forte affinité, ce qui augmente considérablement l’ouverture de risque lors d’événements de risque systémique. La période de refroidissement de l’association de 3 lignes K est totalement insuffisante et il est recommandé de l’ajuster à 20 à 50 lignes K.

Le placement du maximum de retraite monopolistique à 10% est raisonnable, mais il manque un mécanisme d’ajustement dynamique. Un relâchement approprié peut être de 15% dans un marché haussier et de 5-7% dans un marché baissier. La conception des paramètres fixes actuels ne peut pas s’adapter aux différentes conditions du marché.

Clarification des scénarios applicables: les opérations au niveau de l’institution dans une situation de tendance

Environnement idéal: crypto-monnaie dominante ((BTC/ETH), 1 à 4 heures de temps, tendance claire. Les rendements annuels sont attendus pour atteindre 30 à 50% en période haussière, mais un retrait de 15 à 25% est possible en période baissière.

Ne convient pas pour les scénarios suivants: marché instable, environnement de faible volatilité, transactions à haute fréquence de moins de 15 minutes. Les marchés boursiers traditionnels, avec leur faible volatilité, réduisent considérablement la fréquence des signaux. Il n’est pas recommandé d’utiliser directement les paramètres.

Recommandations de combat: réduire les paramètres de risque et augmenter les conditions de filtrage

  1. Réduction du risque unique de 1,5% à 1,0% et du risque journalier de 6% à 4%
  2. Augmentation du filtrage de la volatilité ATR: ouvrir une position uniquement si l’ATR est supérieur à la moyenne sur 20 jours
  3. Ajout d’un filtre de tendance à grande échelle: négociez uniquement lorsque le cours de l’indice japonais EMA200 est aligné
  4. Optimisation de la détection IDM: augmentation du volume des transactions et amplification des conditions de confirmation

N’oubliez pas que la rétrospective historique ne représente pas les gains futurs. La stratégie varie considérablement selon les conditions du marché et nécessite une gestion rigoureuse des risques et une optimisation périodique des paramètres.

Code source de la stratégie
/*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)