Thanh khoản năng động thúc đẩy các chiến lược giao dịch thích ứng với cấu trúc thị trường

LZ MSS SL TP ISL
Ngày tạo: 2025-03-28 17:13:02 sửa đổi lần cuối: 2025-03-28 17:13:02
sao chép: 2 Số nhấp chuột: 350
2
tập trung vào
319
Người theo dõi

Thanh khoản năng động thúc đẩy các chiến lược giao dịch thích ứng với cấu trúc thị trường Thanh khoản năng động thúc đẩy các chiến lược giao dịch thích ứng với cấu trúc thị trường

Tổng quan

Đây là một chiến lược giao dịch sáng tạo, kết hợp phân tích khu vực thanh khoản và động lực cấu trúc thị trường nội bộ nhằm xác định các điểm nhập cảnh có xác suất cao. Chiến lược này cung cấp cho các nhà giao dịch một phương pháp tham gia thị trường linh hoạt và chính xác bằng cách theo dõi sự tương tác của giá với các mức thị trường quan trọng và kích hoạt giao dịch bằng cách sử dụng chuyển đổi thị trường nội bộ.

Nguyên tắc chiến lược

Logic cốt lõi của chiến lược dựa trên hai thành phần quan trọng: nhận diện khu vực thanh khoản và chuyển đổi thị trường nội bộ. Khu vực thanh khoản được xác định động bằng cách phân tích các điểm cao và thấp tại địa phương, trong khi chuyển đổi thị trường nội bộ dựa trên giá phá vỡ mức tăng hoặc giảm trước đó để đánh giá sự thay đổi hướng thị trường.

Chiến lược này có các đặc điểm cốt lõi như sau:

  1. Logic chuyển đổi thị trường nội bộ: không phụ thuộc vào hình dạng biểu đồ truyền thống, mà dựa trên mức giá vượt qua mức quan trọng
  2. Theo dõi khu vực thanh khoản: Động thái xác định các khu vực thanh khoản quan trọng để ngăn chặn giao dịch trong điều kiện thị trường yếu
  3. Tính linh hoạt của mô hình: cung cấp ba mô hình giao dịch “Both”, “Bullish Only” và “Bearish Only”
  4. Quản lý rủi ro: có thể tùy chỉnh mức dừng lỗ và dừng lại
  5. Kiểm soát phạm vi thời gian: có thể kiểm soát chính xác khoảng thời gian giao dịch

Lợi thế chiến lược

  1. Tính thích ứng năng động: Chiến lược đáp ứng nhanh chóng với sự thay đổi cấu trúc thị trường
  2. Định vị chính xác: Tăng cường định vị chính xác bằng cách kết hợp vùng thanh khoản và chuyển đổi thị trường nội bộ
  3. Rủi ro có thể kiểm soát được: Cấu trúc dừng và ngăn chặn tích hợp
  4. Tính linh hoạt: có thể lựa chọn mô hình giao dịch theo các điều kiện thị trường khác nhau
  5. Phân tích đa chiều: xem xét hành vi giá cả, tính thanh khoản và cấu trúc thị trường

Rủi ro chiến lược

  1. Sự biến động mạnh mẽ của thị trường có thể dẫn đến việc dừng lỗ được kích hoạt
  2. Các tín hiệu thường xuyên có thể làm tăng chi phí giao dịch trong thị trường bất ổn
  3. Cài đặt tham số không phù hợp có thể ảnh hưởng đến hiệu suất chiến lược
  4. Các kết quả có thể khác với các kết quả trên đĩa.

Hướng tối ưu hóa chiến lược

  1. Tiếp theo, bạn có thể sử dụng các thuật toán học máy để tối ưu hóa các tham số thích ứng.
  2. Thêm thêm các điều kiện lọc như khối lượng giao dịch, chỉ số biến động
  3. Phát triển cơ chế xác minh nhiều khung thời gian
  4. Tối ưu hóa các thuật toán dừng lỗ và dừng lại, tính đến sự thay đổi động của tỷ lệ biến động thị trường

Tóm tắt

Đây là một chiến lược giao dịch sáng tạo kết hợp phân tích thanh khoản và động lực cấu trúc thị trường. Nó cung cấp cho các nhà giao dịch một công cụ giao dịch mạnh mẽ thông qua logic chuyển đổi thị trường nội bộ linh hoạt và theo dõi vùng thanh khoản chính xác. Điều then chốt của chiến lược là khả năng thích ứng và phân tích đa chiều, có thể duy trì hiệu quả thực hiện cao trong các điều kiện thị trường khác nhau.

Mã nguồn chiến lược
/*backtest
start: 2024-03-28 00:00:00
end: 2025-03-27 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("Liquidity + Internal Market Shift Strategy", overlay=true)

// ======== Mode Selection ========
mode = input.string("Both", title="Mode", options=["Both", "Bullish Only", "Bearish Only"])

// ======== Stop-Loss and Take-Profit Input (in pips) ========
enableTakeProfit = input.bool(true, title="Enable Custom Take Profit")  // Option to enable/disable take profit
stopLossPips = input.int(10, title="Stop Loss (in pips)", minval=1)  // Stop loss in pips
takeProfitPips = input.int(20, title="Take Profit (in pips)", minval=1)  // Take profit in pips

// ======== Internal Shift Logic ========

// Fixed number of consecutive candles to track (set to 1)
consecutiveBullishCount = 1
consecutiveBearishCount = 1

// Function to check for bullish and bearish candles
isBullish = close > open
isBearish = close < open

// Variables to track consecutive candles and mark lowest/highest
var int bullishCount = 0
var int bearishCount = 0
var float lowestBullishPrice = na
var float highestBearishPrice = na
var float previousBullishPrice = na // For the previous bullish lowest price
var float previousBearishPrice = na // For the previous bearish highest price

// Variables to track last internal shift type (1 = Bullish, -1 = Bearish, 0 = None)
var int lastInternalShift = 0

// Counting consecutive bullish and bearish candles
if isBullish
    bullishCount := bullishCount + 1
    bearishCount := 0
    if bullishCount == 1 or low < lowestBullishPrice
        lowestBullishPrice := low
else if isBearish
    bearishCount := bearishCount + 1
    bullishCount := 0
    if bearishCount == 1 or high > highestBearishPrice
        highestBearishPrice := high
else
    bullishCount := 0
    bearishCount := 0
    lowestBullishPrice := na
    highestBearishPrice := na

// Internal shift conditions
internalShiftBearish = close < previousBullishPrice and close < lowestBullishPrice
internalShiftBullish = close > previousBearishPrice and close > highestBearishPrice

// Condition to alternate internal shifts
allowInternalShiftBearish = internalShiftBearish and lastInternalShift != -1
allowInternalShiftBullish = internalShiftBullish and lastInternalShift != 1

// Tracking shifts
if bullishCount >= consecutiveBullishCount
    previousBullishPrice := lowestBullishPrice

if bearishCount >= consecutiveBearishCount
    previousBearishPrice := highestBearishPrice

// ======== Liquidity Seal-Off Points Logic ========
upperLiquidityLookback = input.int(10, title="Lookback Period for Upper Liquidity Line")
lowerLiquidityLookback = input.int(10, title="Lookback Period for Lower Liquidity Line")

isLocalHigh = high == ta.highest(high, upperLiquidityLookback)
isLocalLow = low == ta.lowest(low, lowerLiquidityLookback)

var bool touchedLowerLiquidityLine = false
var bool touchedUpperLiquidityLine = false

if (low <= ta.lowest(low, lowerLiquidityLookback))
    touchedLowerLiquidityLine := true

if (high >= ta.highest(high, upperLiquidityLookback))
    touchedUpperLiquidityLine := true

var bool lockedBullish = false
var bool lockedBearish = false
var int barSinceLiquidityTouch = na

// ======== Combined Signals ========
bullishSignal = allowInternalShiftBullish and touchedLowerLiquidityLine and not lockedBullish
bearishSignal = allowInternalShiftBearish and touchedUpperLiquidityLine and not lockedBearish

if bullishSignal
    lockedBullish := true
    touchedLowerLiquidityLine := false
    barSinceLiquidityTouch := 0

if bearishSignal
    lockedBearish := true
    touchedUpperLiquidityLine := false
    barSinceLiquidityTouch := 0

if not na(barSinceLiquidityTouch)
    barSinceLiquidityTouch := barSinceLiquidityTouch + 1

if barSinceLiquidityTouch >= 3
    lockedBullish := false
    lockedBearish := false

if touchedLowerLiquidityLine
    lockedBullish := false

if touchedUpperLiquidityLine
    lockedBearish := false

// ======== Plot Combined Signals ========
plotshape(bullishSignal, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.tiny, title="Bullish Signal")
plotshape(bearishSignal, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.tiny, title="Bearish Signal")

plot(isLocalHigh ? high : na, color=color.red, linewidth=2, style=plot.style_stepline, title="Local High Line")
plot(isLocalLow ? low : na, color=color.green, linewidth=2, style=plot.style_stepline, title="Local Low Line")

// ======== Track Entry and Opposing Signals ========
var float entryPrice = na
var int entryTime = na
var string positionSide = ""

// ======== Strategy Execution (Mode Logic) ========
if (mode == "Both")
    // Short Entry Logic (Bearish Signal)
    if (bearishSignal and na(entryPrice))
        strategy.entry("Short", strategy.short)
        entryPrice := close
        entryTime := time
        positionSide := "short"
    
    // Long Entry Logic (Bullish Signal)
    if (bullishSignal and na(entryPrice))
        strategy.entry("Long", strategy.long)
        entryPrice := close
        entryTime := time
        positionSide := "long"

    // Exit Logic: Close on Opposing Signal (after the current signal is triggered)
    if (positionSide == "short" and bullishSignal )
        strategy.close("Short")
        entryPrice := na
        positionSide := ""
    
    if (positionSide == "long" and bearishSignal)
        strategy.close("Long")
        entryPrice := na
        positionSide := ""
    
    // Stop-Loss and Take-Profit Logic (in pips)
    stopLossPriceLong = entryPrice - stopLossPips * syminfo.mintick
    takeProfitPriceLong = entryPrice + takeProfitPips * syminfo.mintick
    stopLossPriceShort = entryPrice + stopLossPips * syminfo.mintick
    takeProfitPriceShort = entryPrice - takeProfitPips * syminfo.mintick
    
    // Long Stop-Loss and Take-Profit Conditions
    if (positionSide == "long" and close <= stopLossPriceLong)
        strategy.close("Long", comment="Stop Loss Triggered")
        entryPrice := na
        positionSide := ""

    if (positionSide == "long" and enableTakeProfit and close >= takeProfitPriceLong)
        strategy.close("Long", comment="Take Profit Triggered")
        entryPrice := na
        positionSide := ""

    // Short Stop-Loss and Take-Profit Conditions
    if (positionSide == "short" and close >= stopLossPriceShort)
        strategy.close("Short", comment="Stop Loss Triggered")
        entryPrice := na
        positionSide := ""

    if (positionSide == "short" and enableTakeProfit and close <= takeProfitPriceShort)
        strategy.close("Short", comment="Take Profit Triggered")
        entryPrice := na
        positionSide := ""

if (mode == "Bullish Only")
    if (bullishSignal and na(entryPrice))
        strategy.entry("Long", strategy.long)
        entryPrice := close
        entryTime := time
        positionSide := "long"
    
    if (positionSide == "long" and bearishSignal)
        strategy.close("Long")
        entryPrice := na
        positionSide := ""

    // Stop-Loss and Take-Profit Logic (in pips)
    stopLossPriceLong = entryPrice - stopLossPips * syminfo.mintick
    takeProfitPriceLong = entryPrice + takeProfitPips * syminfo.mintick
    
    if (positionSide == "long" and close <= stopLossPriceLong)
        strategy.close("Long", comment="Stop Loss Triggered")
        entryPrice := na
        positionSide := ""

    if (positionSide == "long" and enableTakeProfit and close >= takeProfitPriceLong)
        strategy.close("Long", comment="Take Profit Triggered")
        entryPrice := na
        positionSide := ""

if (mode == "Bearish Only")
    if (bearishSignal and na(entryPrice))
        strategy.entry("Short", strategy.short)
        entryPrice := close
        entryTime := time
        positionSide := "short"
    
    if (positionSide == "short" and bullishSignal)
        strategy.close("Short")
        entryPrice := na
        positionSide := ""

    // Stop-Loss and Take-Profit Logic (in pips)
    stopLossPriceShort = entryPrice + stopLossPips * syminfo.mintick
    takeProfitPriceShort = entryPrice - takeProfitPips * syminfo.mintick
    
    if (positionSide == "short" and close >= stopLossPriceShort)
        strategy.close("Short", comment="Stop Loss Triggered")
        entryPrice := na
        positionSide := ""

    if (positionSide == "short" and enableTakeProfit and close <= takeProfitPriceShort)
        strategy.close("Short", comment="Take Profit Triggered")
        entryPrice := na
        positionSide := ""