Chiến lược ma trận thanh khoản tổ chức


Ngày tạo: 2025-12-22 17:47:03 sửa đổi lần cuối: 2026-01-07 11:20:40
sao chép: 12 Số nhấp chuột: 165
2
tập trung vào
413
Người theo dõi

Chiến lược ma trận thanh khoản tổ chức Chiến lược ma trận thanh khoản tổ chức

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

Đây không phải là một chiến lược đột phá thông thường, mà là một hệ thống săn lùng tính thanh khoản của tổ chức.

Dữ liệu phản hồi trực tiếp đối mặt với phân tích kỹ thuật truyền thống: Mô hình kết hợp 8 yếu tố + nhận dạng cấu trúc thị trường + phát hiện dẫn đến IDM, tối thiểu 68 phút để mở vị trí. Không phải chỉ số nào được gọi là “tâm lý tổ chức”, hệ thống này đặc biệt nhận diện BOS (đã phá vỡ cấu trúc) và CHoCH (đã thay đổi tính chất), hiệu quả hơn 300% so với việc chỉ đơn thuần nhìn vào kháng cự hỗ trợ.

Logic cốt lõi của IDM là tàn nhẫn và thẳng thắn: các cơ quan như vậy sẽ quét sạch các lỗ hổng của các nhà bán lẻ và xây dựng lại. Khi giá giảm xuống một thời gian ngắn và nhanh chóng hồi phục, đó là một cuộc quét sạch thanh khoản điển hình (IDM), và khi các nhà bán lẻ bị rửa sạch, đó là thời điểm để chúng tôi tham gia.

Thiết kế ATR 2 lần có lý, nhưng các tham số điều khiển gió được thiết lập quá mạnh

Giới hạn rủi ro hàng ngày là 6%, giới hạn rủi ro hàng tuần là 12%, rủi ro đơn lẻ là 1.5%. Các toán học rất đơn giản: 4 lỗ lỗ liên tiếp sẽ gây ra độc quyền hàng ngày, 8 lỗ liên tiếp là độc quyền hàng tuần. Vấn đề là thị trường tiền điện tử thường có tỷ lệ biến động gấp 3-5 lần so với tài sản truyền thống, và lỗ hổng rủi ro này sẽ bị tiêu hao nhanh chóng trong tình huống bất ổn.

ATR nhân 2.0 lần dừng lỗ + 2.0 lần chi phí rủi ro là hợp lý về mặt lý thuyết, nhưng thực hiện thực tế cần phải xem xét chi phí trượt …

Hệ thống tập hợp 8 yếu tố tốt hơn chỉ số đơn truyền thống, nhưng có nguy cơ tối ưu hóa quá mức

RSI ((14) + MACD ((12,26,9) + EMA ((200) + khối lượng giao dịch + cấu trúc thị trường + cửa sổ thời gian + tỷ lệ biến động + xác nhận khung thời gian cao. Mỗi yếu tố có trọng lượng tương đương ((1 điểm), tối thiểu 6 điểm để mở vị trí có nghĩa là 75% yếu tố phải được đáp ứng cùng một lúc.

Thiết kế này hoạt động tốt trong các tình huống xu hướng, nhưng tín hiệu rất hiếm trong các biến động ngang. Lịch sử cho thấy chiến lược này phù hợp hơn với thị trường tiền điện tử có tỷ lệ biến động cao, tần số tín hiệu của thị trường chứng khoán truyền thống sẽ giảm đáng kể.

Nhận dạng cấu trúc thị trường là điểm sáng, nhưng IDM cần phải tối ưu hóa logic phát hiện

BOS và CHoCH được nhận diện dựa trên điểm pivot 5 chu kỳ, tham số này hoạt động ổn định trên khung thời gian trên biểu đồ 1 giờ. Tuy nhiên, IDM ((được dẫn dắt) được phát hiện chỉ với 3 dây K, dễ tạo ra tín hiệu giả trong môi trường tiếng ồn tần số cao.

Đề xuất điều chỉnh chu kỳ phát hiện IDM thành 5-7 đường K và thêm điều kiện xác nhận khối lượng giao dịch. Phiên bản hiện tại không được khuyến khích sử dụng trong khung thời gian dưới biểu đồ 15 phút, tỷ lệ tín hiệu tiếng ồn quá thấp.

Hạn chế nghiêm trọng trong quản lý rủi ro: Thiếu kiểm soát liên quan

Chiến lược cho phép sở hữu nhiều giống có liên quan cao cùng một lúc, điều này sẽ làm cho lỗ hổng rủi ro tăng gấp đôi trong các sự kiện rủi ro hệ thống. Thời gian làm mát liên quan của 3 dòng K là hoàn toàn không đủ, nên điều chỉnh đến 20-50 dòng K.

Thiết lập 10% thu hồi tối đa là hợp lý, nhưng thiếu cơ chế điều chỉnh động lực. Trong thị trường bò có thể nới lỏng thích hợp đến 15%, trong thị trường gấu nên thắt chặt đến 5-7%. Thiết kế tham số cố định hiện tại không thể thích ứng với môi trường thị trường khác nhau.

Khá rõ các trường hợp áp dụng: Hoạt động ở cấp cơ quan trong các tình huống xu hướng

Môi trường sử dụng tốt nhất: tiền tệ chính của tiền điện tử ((BTC/ETH), khung thời gian 1-4 giờ, xu hướng rõ ràng. Lợi nhuận hàng năm dự kiến có thể lên đến 30-50% trong thị trường bò, nhưng có thể phải đối mặt với 15-25% trong thị trường gấu.

Không áp dụng cho các tình huống: thị trường biến động, môi trường biến động thấp, giao dịch tần số cao dưới 15 phút. Thị trường chứng khoán truyền thống do biến động thấp, tần số tín hiệu sẽ giảm đáng kể, không nên sử dụng tham số trực tiếp.

Lời khuyên chiến đấu: Giảm các tham số rủi ro, tăng điều kiện lọc

  1. Giảm rủi ro đơn từ 1,5% xuống còn 1,0%, giới hạn rủi ro hàng ngày từ 6% xuống còn 4%
  2. Tăng bộ lọc biến động ATR: chỉ mở lệnh khi ATR > 20 ngày
  3. Thêm bộ lọc xu hướng cấp độ lớn: chỉ giao dịch khi đường Nhật Bản EMA200 đi theo hướng
  4. Tối ưu hóa phát hiện IDM: tăng khối lượng giao dịch tăng điều kiện xác nhận

Lưu ý: Lịch sử không thể hiện lợi nhuận trong tương lai, chiến lược này có thể có hiệu suất khác nhau trong các môi trường thị trường khác nhau, cần quản lý rủi ro nghiêm ngặt và tối ưu hóa các tham số thường xuyên.

Mã nguồn chiến lược
/*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)