Hệ thống giao dịch đa chiến lược đột phá-thụt lùi-đảo ngược phạm vi giá động

FVG 5M 1M R:R RANGE TRADING SCALPING
Ngày tạo: 2025-08-22 09:55:06 sửa đổi lần cuối: 2025-08-22 09:55:06
sao chép: 0 Số nhấp chuột: 333
2
tập trung vào
319
Người theo dõi

Hệ thống giao dịch đa chiến lược đột phá-thụt lùi-đảo ngược phạm vi giá động Hệ thống giao dịch đa chiến lược đột phá-thụt lùi-đảo ngược phạm vi giá động

Tổng quan

Hệ thống giao dịch đa chiến lược phá vỡ-trở lại-quay lại khu vực giá động là một chiến lược giao dịch trong ngày được thiết kế dành riêng cho các nhà giao dịch ngắn hạn, hoạt động dựa trên khu vực giá được hình thành trong đường K 5 phút đầu tiên sau khi mở cửa thị trường buổi sáng. Chiến lược này tích hợp ba mô hình nhập cảnh khác nhau: phá vỡ, chui vào và quay lại, giao dịch bằng cách xác định lỗ hổng giá trị công bằng (FVG) và mô hình phá vỡ khu vực giá.

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

Nguyên tắc cốt lõi của chiến lược này được xây dựng trên mô hình hành vi của giá sau khi tạo ra một khoảng ban đầu vào buổi sáng, và hoạt động cụ thể được chia thành ba bước:

  1. Khoảng thời gian đánh dấu (9:30 AM):

    • Chờ 5 phút đầu tiên sau khi mở K-line ((9:30-9:35) đóng cửa
    • Đánh dấu các điểm cao nhất và thấp nhất của đường K như là các vùng giao dịch
    • Chuyển sang biểu đồ 1 phút để giao dịch thực tế
  2. Tìm điểm vào ((chỉ một giờ sau khi giao dịch mở): Chiến lược này cung cấp ba cách nhập cảnh khác nhau:

    • Break Entry (Việc đột nhập):

      • Cần đáp ứng điều kiện khoảng cách giá trị công bằng (FVG)
      • Phạm vi phá vỡ giá đóng cửa của bất kỳ đường K nào trong FVG
      • FVG được định nghĩa là mô hình nhảy vọt hình thành từ ba đường K (wick-gap)
    • Trap Entry (Tạm dịch: Bẫy nhập cảnh):

      • Giá đã vượt qua giới hạn đầu tiên
      • Sau đó, đo lại trong khoảng.
      • Cuối cùng, họ lại đóng cửa bên ngoài khu vực.
    • Reversal Entry (Tạm dịch: Tham gia đảo ngược):

      • Giá sau một thất bại đột phá theo một hướng
      • FVG xuất hiện hướng ngược trở lại trong khoảng
  3. Quản lý giao dịch:

    • Cài đặt Stop Loss:
      • Chiến lược phá vỡ / bẫy: Sử dụng điểm thấp nhất / cao nhất của đường K bên ngoài vòng quay bằng cách đóng cửa đầu tiên
      • Chiến lược đảo ngược: sử dụng điểm thấp nhất / cao nhất của đường K đầu tiên trong mô hình FVG
    • Cài đặt dừng:
      • Luôn luôn áp dụng tỷ lệ lợi nhuận rủi ro 2:1
      • Rủi ro \(100 lợi nhuận \)200

Mã chiến lược thực hiện một khuôn khổ logic hoàn chỉnh, bao gồm tự động phát hiện khoảng thời gian giao dịch, nhận diện các điều kiện nhập cảnh khác nhau, thiết lập mức dừng lỗ và tính toán kích thước vị trí thích hợp. Hệ thống cũng bao gồm bộ lọc thời gian, đảm bảo giao dịch chỉ trong một khoảng thời gian nhất định và có thể bật hoặc tắt các chiến lược nhập cảnh khác nhau một cách chọn lọc.

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

  1. Quy tắc ngắn gọn và rõ ràngQuy tắc chiến lược rõ ràng, trực quan, không cần phán đoán chủ quan, giảm ảnh hưởng của cảm xúc đối với quyết định giao dịch. Chế độ logic và theo dõi trạng thái trong mã đảm bảo thực hiện nghiêm ngặt các quy tắc.

  2. Tính linh hoạt cho nhiều cách nhập họcCung cấp ba chiến lược nhập cảnh khác nhau (tiếp cận, bẫy và đảo ngược), cho phép các nhà giao dịch thích nghi với các môi trường thị trường khác nhau.enableBreakenableTrapenableReversalCác tham số thực hiện sự linh hoạt này.

  3. Tập trung vào những khoảng thời gian có khả năng caoChiến lược: Chỉ giao dịch trong vòng một giờ đầu tiên sau khi mở cửa, tận dụng sự biến động và thanh khoản cao thường tồn tại trong khoảng thời gian này.inWindowĐiều kiện đảm bảo giao dịch chỉ được thực hiện từ 9:30 đến 10:30.

  4. Quản lý rủi ro nghiêm ngặtRatio rủi ro / lợi nhuận cố định 2: 1 và thiết lập dừng lỗ dựa trên hành vi giá cụ thể, cung cấp kiểm soát rủi ro rõ ràng cho mỗi giao dịch.riskPctCác tham số cho phép người dùng điều chỉnh phần trăm rủi ro cho mỗi giao dịch theo sở thích rủi ro của họ.

  5. Không cần chỉ số phức tạpChiến lược này không phụ thuộc vào các chỉ số kỹ thuật phức tạp, mà dựa trên hành vi và cấu trúc giá cả thuần túy, giảm nguy cơ quá phù hợp.

  6. Tránh mùa: Mã có danh sách đen kỳ nghỉ ((từ 1512 đến 151), tránh thời gian thị trường có thể không ổn định hoặc ít lưu động hơn.

  7. Quản lý vị trí linh hoạtHệ thống cung cấp hai cách quản lý vị trí dựa trên tỷ lệ rủi ro hoặc số lượng hợp đồng cố định, phù hợp với các nhu cầu quản lý tiền khác nhau.

Rủi ro chiến lược

  1. Rủi ro đột phá giả: Thị trường có thể tạo ra các đợt phá vỡ giả, dẫn đến việc giá sẽ đảo ngược nhanh chóng sau khi giao dịch được kích hoạt. Để giảm thiểu rủi ro này, chiến lược đã tích hợp các mô hình bẫy và đảo ngược vào thị trường, nhưng vẫn cần được giám sát cẩn thận.

  2. Vấn đề về chiều rộng: Nếu khoảng K-line trong 5 phút đầu tiên sau khi mở màn quá rộng hoặc quá hẹp, có thể ảnh hưởng đến hiệu quả của chiến lược. Khoảng cách quá hẹp có thể dẫn đến tín hiệu kích hoạt thường xuyên, và khoảng cách quá rộng có thể dẫn đến điểm dừng quá xa.

  3. Chi phí cơ hội của giới hạn thời gianTuy nhiên, sự hạn chế này cũng là một hình thức kỷ luật để ngăn chặn việc giao dịch quá mức.

  4. Hạn chế về tỷ lệ lợi nhuận rủi ro cố địnhMặc dù tỷ lệ lợi nhuận rủi ro 2: 1 cung cấp sự nhất quán, nhưng nó có thể không phải là lựa chọn tốt nhất trong một số môi trường thị trường. Trong thị trường có xu hướng mạnh, tỷ lệ lợi nhuận rủi ro cao hơn có thể phù hợp hơn.

  5. Thị trường bất thường trong kỳ nghỉ lễMặc dù chiến lược tránh giao dịch trong khoảng thời gian từ ngày 15 tháng 12 đến ngày 15 tháng 1, nhưng các hoạt động thị trường khác trước và sau kỳ nghỉ cũng có thể bất thường và ảnh hưởng đến hoạt động của chiến lược.

  6. Sự phụ thuộc vào FVGChiến lược dựa trên mô hình FVG trong các bước đột phá và đảo ngược, nhưng trong một số điều kiện thị trường, FVG có thể không dễ hình thành hoặc nhận diện.

  7. Những hạn chế của một khung thời gian duy nhấtTuy nhiên, một số người cho rằng chỉ cần dựa hoàn toàn vào biểu đồ 1 phút có thể khiến các chiến lược bỏ qua cấu trúc thị trường quan trọng trong khung thời gian lớn hơn.

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

  1. Khả năng điều chỉnh chiều rộng: Bạn có thể cân nhắc điều chỉnh chiều rộng của dải theo động thái biến động của thị trường, ví dụ sử dụng dải rộng hơn vào những ngày có biến động cao và sử dụng dải hẹp hơn vào những ngày có biến động thấp. Điều này có thể được thực hiện bằng cách tính toán dải biến động trung bình thực tế gần đây (ATR) hoặc các chỉ số tương tự.

  2. Tối ưu hóa cửa sổ thời gian: Có thể nghiên cứu các cửa sổ thời gian giao dịch tối ưu cho các thị trường khác nhau, thay vì cố định trong 9:30-10:30. Một số thị trường có thể thể hiện các mô hình phá vỡ phân đoạn rõ ràng hơn trong các khoảng thời gian khác nhau.

  3. Cài đặt rủi ro lợi nhuận độngTỷ lệ lợi nhuận rủi ro có thể được điều chỉnh theo tình trạng thị trường và động lực biến động, ví dụ như tăng mục tiêu khi xu hướng mạnh và giảm mục tiêu khi thị trường ổn định.

  4. Tích hợp các chỉ số cảm xúc thị trườngBạn có thể xem xét thêm các chỉ số thị trường hoặc chỉ số biến động như là một bộ lọc để tránh giao dịch khi môi trường thị trường không thuận lợi.

  5. Xác nhận khung thời gian đa dạng: Mặc dù thực hiện giao dịch vẫn còn trên biểu đồ 1 phút, điều kiện xác nhận có thể được thêm vào các khung thời gian cao hơn, chẳng hạn như kiểm tra tính nhất quán về hướng xu hướng trên biểu đồ 15 phút hoặc 1 giờ.

  6. Tối ưu hóa định nghĩa FVGĐịnh nghĩa FVG hiện tại tương đối đơn giản, có thể xem xét các định nghĩa khu vực không cân bằng phức tạp hơn hoặc chính xác hơn, chẳng hạn như xem xét thân hình chứ không chỉ là đường bóng.

  7. Thêm xác nhận giao dịchThêm xác nhận khối lượng giao dịch vào điều kiện nhập cảnh có thể cải thiện chất lượng tín hiệu, đặc biệt đối với nhập cảnh đột phá.

  8. Tự thích nghi với sự mất mátĐiều chỉnh mức dừng lỗ theo biến động của thị trường có thể cải thiện khả năng thích ứng của chiến lược trong các môi trường thị trường khác nhau.

Tóm tắt

Hệ thống giao dịch đa chiến lược đột phá-trở lại-quay lại giá động là một chiến lược giao dịch trong ngày có cấu trúc rõ ràng, có quy tắc rõ ràng, tìm kiếm cơ hội giao dịch bằng cách xác định phạm vi giá hình thành vào buổi sáng và các mô hình đột phá, bẫy hoặc đảo ngược tiếp theo. Ưu điểm chính của chiến lược này là sự đơn giản và linh hoạt của nhiều cách nhập cảnh, trong khi các giới hạn thời gian nghiêm ngặt và các nguyên tắc quản lý rủi ro giúp duy trì kỷ luật giao dịch.

Tuy nhiên, chiến lược này cũng phải đối mặt với các rủi ro như phá vỡ giả, không phù hợp với độ rộng của phân đoạn và phụ thuộc vào mô hình giá cụ thể. Bằng cách tối ưu hóa phương pháp thiết lập phân đoạn, điều chỉnh cửa sổ thời gian, thiết lập tỷ lệ lợi nhuận rủi ro động và tích hợp phân tích nhiều khung thời gian, chiến lược có thể được cải thiện hơn nữa.

Cuối cùng, chiến lược này cung cấp một khuôn khổ có hệ thống cho các nhà giao dịch ngắn hạn, đặc biệt phù hợp với những nhà đầu tư tìm kiếm giao dịch hiệu quả trong thời gian mở cửa hàng ngày. Như tất cả các chiến lược giao dịch, trước khi thực hiện thực tế, cần có đầy đủ phản hồi và quản lý rủi ro thích hợp.

Mã nguồn chiến lược
/*backtest
start: 2025-07-22 00:00:00
end: 2025-08-21 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"ETH_USDT","balance":500000}]
*/

//@version=5
strategy("Three-Step 9:30 Range Scalping (Backtest)", overlay=true, calc_on_every_tick=false, process_orders_on_close=true,
     initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=0)

// -------------------- Inputs
enableBreak    = input.bool(true,  "Enable Break Entry")
enableTrap     = input.bool(false, "Enable Trap Entry")
enableReversal = input.bool(true, "Enable Reversal Entry")
rr             = input.float(2.0,  "Take-Profit R Multiple", step=0.25, minval=0.25)
oneTradePerDay = input.bool(false,  "One Trade Per Day")
showRange      = input.bool(true,  "Show 9:30 5m Range")

// Risk management
riskPct        = input.float(1.0,  "Risk % of Equity per Trade", step=0.1, minval=0.1, maxval=100.0)
sizeMode       = input.string("Risk %", "Position Sizing Mode", options=["Risk %", "Fixed contracts"])
fixedContracts = input.int(1, "Fixed Contracts", minval=1)

// Optional: warn if not on 1-minute chart (execution timeframe per PRD)
onOneMinute = timeframe.isminutes and timeframe.multiplier == 1

// -------------------- Time helpers (chart is assumed New York time)
newDay   = ta.change(time("D")) != 0
// Trade the first hour only: 9:30:00 to 10:29:59
inWindow = (hour == 9 and minute >= 30) or (hour == 10 and minute <= 29)
// Holiday blackout window: Do not trade Dec 15 – Jan 15
inBlackout = (month == 12 and dayofmonth >= 15) or (month == 1 and dayofmonth <= 15)

// -------------------- First 5-min range (use the actual 9:30 5m candle via security())
var float rangeHi = na
var float rangeLo = na
var bool  haveRange = false

// -------------------- State for entries
var bool  breakUpFound           = false
var bool  breakDownFound         = false
var float initBreakUpLow         = na    // for Break/Trap long SL
var float initBreakDownHigh      = na    // for Break/Trap short SL
var bool  trapUpRetestedInside   = false
var bool  trapDownRetestedInside = false
var bool  tradedToday            = false

// Reset daily state at midnight (chart timezone)
if newDay
    rangeHi := na
    rangeLo := na
    haveRange := false
    breakUpFound := false
    breakDownFound := false
    initBreakUpLow := na
    initBreakDownHigh := na
    trapUpRetestedInside := false
    trapDownRetestedInside := false
    tradedToday := false

// Pull the 5-minute bar that STARTS at 9:30 (value available on its close at 9:35)
sess0930Hi = request.security(syminfo.tickerid, "5", (hour == 9 and minute == 30) ? high : na, barmerge.gaps_off, barmerge.lookahead_off)
sess0930Lo = request.security(syminfo.tickerid, "5", (hour == 9 and minute == 30) ? low  : na, barmerge.gaps_off, barmerge.lookahead_off)

// Lock the range when the 9:30 5m candle closes (value appears non-na exactly then)
if not haveRange and not na(sess0930Hi) and not na(sess0930Lo)
    rangeHi := sess0930Hi
    rangeLo := sess0930Lo
    haveRange := true
    // reset session-specific flags at start of trading window
    breakUpFound := false
    breakDownFound := false
    initBreakUpLow := na
    initBreakDownHigh := na
    trapUpRetestedInside := false
    trapDownRetestedInside := false
    tradedToday := false

// -------------------- Visuals
plot(showRange and haveRange ? rangeHi : na, "Range High", color=color.new(color.teal, 0), style=plot.style_linebr, linewidth=2)
plot(showRange and haveRange ? rangeLo : na, "Range Low",  color=color.new(color.orange, 0), style=plot.style_linebr, linewidth=2)

plotchar(not onOneMinute, title="Use 1-minute chart", char="⚠", location=location.top, color=color.new(color.red, 0), size=size.tiny)
plotchar(inBlackout, title="Holiday blackout (Dec 15–Jan 15)", char="⛔", location=location.top, color=color.new(color.red, 0), size=size.tiny)

// -------------------- Convenience conditions
closeAbove  = haveRange and close > rangeHi
closeBelow  = haveRange and close < rangeLo
closeInside = haveRange and close <= rangeHi and close >= rangeLo

// Track first body-close outside the range in each direction (initial break-close)
if haveRange and inWindow and not tradedToday
    if not breakUpFound and closeAbove
        breakUpFound := true
        initBreakUpLow := low
        trapUpRetestedInside := false
    if not breakDownFound and closeBelow
        breakDownFound := true
        initBreakDownHigh := high
        trapDownRetestedInside := false

// Trap retest flags (retest back inside after first break)
if haveRange and inWindow and not tradedToday
    if breakUpFound and not trapUpRetestedInside and closeInside
        trapUpRetestedInside := true
    if breakDownFound and not trapDownRetestedInside and closeInside
        trapDownRetestedInside := true

// -------------------- FVG detectors (three-candle imbalance)
// Simple wick-gap definition, preserved through the third candle
// Bullish: gap exists if Candle C low > Candle A high AND Candle B low > Candle A high
// Bearish: gap exists if Candle C high < Candle A low  AND Candle B high < Candle A low
bullFVG = not na(high[2]) and (low[1] > high[2]) and (low > high[2])
bearFVG = not na(low[2])  and (high[1] < low[2])  and (high < low[2])

// -------------------- Entry gating
allowEntry = haveRange and inWindow and not inBlackout and strategy.position_size == 0 and (not oneTradePerDay or not tradedToday)

// Calculate contracts based on selected sizing mode
calcOrderQty(entryPrice, stopPrice) =>
    qty = 0
    if sizeMode == "Fixed contracts"
        qty := fixedContracts
    else
        riskCash = strategy.equity * riskPct / 100.0
        riskPerContract = math.abs(entryPrice - stopPrice) * syminfo.pointvalue
        qty := riskPerContract > 0 ? math.floor(riskCash / riskPerContract) : 0
    qty

// -------------------- BREAK Entries (needs FVG and ANY of the 3 bars closes outside)
if enableBreak and allowEntry
    // Long BREAK
    breakLongOk  = bullFVG and (close > rangeHi or close[1] > rangeHi or close[2] > rangeHi)
    if breakLongOk
        // Stop at the FIRST candle that closed outside among the 3 FVG candles
        float stopL = na
        stopL := close[2] > rangeHi ? low[2] : stopL
        stopL := na(stopL) and close[1] > rangeHi ? low[1] : stopL
        stopL := na(stopL) and close > rangeHi ? low : stopL
        entryL = close
        if entryL > stopL
            tpL = entryL + rr * (entryL - stopL)
            qtyL = calcOrderQty(entryL, stopL)
            if qtyL > 0
                strategy.entry("LONG_BREAK", strategy.long, qty=qtyL)
                strategy.exit("LONG_BREAK_TP/SL", from_entry="LONG_BREAK", stop=stopL, limit=tpL)
                tradedToday := oneTradePerDay ? true : tradedToday
    // Short BREAK
    breakShortOk = bearFVG and (close < rangeLo or close[1] < rangeLo or close[2] < rangeLo)
    if breakShortOk
        // Stop at the FIRST candle that closed outside among the 3 FVG candles
        float stopS = na
        stopS := close[2] < rangeLo ? high[2] : stopS
        stopS := na(stopS) and close[1] < rangeLo ? high[1] : stopS
        stopS := na(stopS) and close < rangeLo ? high : stopS
        entryS = close
        if entryS < stopS
            tpS = entryS - rr * (stopS - entryS)
            qtyS = calcOrderQty(entryS, stopS)
            if qtyS > 0
                strategy.entry("SHORT_BREAK", strategy.short, qty=qtyS)
                strategy.exit("SHORT_BREAK_TP/SL", from_entry="SHORT_BREAK", stop=stopS, limit=tpS)
                tradedToday := oneTradePerDay ? true : tradedToday

// -------------------- TRAP Entries (Break → Retest inside → Reclose outside; FVG not required)
if enableTrap and allowEntry
    // Long TRAP
    if breakUpFound and trapUpRetestedInside and closeAbove
        stopL  = na(initBreakUpLow) ? low : initBreakUpLow
        entryL = close
        if entryL > stopL
            tpL = entryL + rr * (entryL - stopL)
            qtyL = calcOrderQty(entryL, stopL)
            if qtyL > 0
                strategy.entry("LONG_TRAP", strategy.long, qty=qtyL)
                strategy.exit("LONG_TRAP_TP/SL", from_entry="LONG_TRAP", stop=stopL, limit=tpL)
                tradedToday := oneTradePerDay ? true : tradedToday
    // Short TRAP
    if breakDownFound and trapDownRetestedInside and closeBelow
        stopS  = na(initBreakDownHigh) ? high : initBreakDownHigh
        entryS = close
        if entryS < stopS
            tpS = entryS - rr * (stopS - entryS)
            qtyS = calcOrderQty(entryS, stopS)
            if qtyS > 0
                strategy.entry("SHORT_TRAP", strategy.short, qty=qtyS)
                strategy.exit("SHORT_TRAP_TP/SL", from_entry="SHORT_TRAP", stop=stopS, limit=tpS)
                tradedToday := oneTradePerDay ? true : tradedToday

// -------------------- REVERSAL Entries (Failed break + opposite FVG back into range)
if enableReversal and allowEntry
    // After bearish break, bullish FVG back into range → LONG
    if breakDownFound and bullFVG and closeInside
        stopL  = low[2]  // first candle of the FVG
        entryL = close
        if entryL > stopL
            tpL = entryL + rr * (entryL - stopL)
            qtyL = calcOrderQty(entryL, stopL)
            if qtyL > 0
                strategy.entry("LONG_REV", strategy.long, qty=qtyL)
                strategy.exit("LONG_REV_TP/SL", from_entry="LONG_REV", stop=stopL, limit=tpL)
                tradedToday := oneTradePerDay ? true : tradedToday
    // After bullish break, bearish FVG back into range → SHORT
    if breakUpFound and bearFVG and closeInside
        stopS  = high[2] // first candle of the FVG
        entryS = close
        if entryS < stopS
            tpS = entryS - rr * (stopS - entryS)
            qtyS = calcOrderQty(entryS, stopS)
            if qtyS > 0
                strategy.entry("SHORT_REV", strategy.short, qty=qtyS)
                strategy.exit("SHORT_REV_TP/SL", from_entry="SHORT_REV", stop=stopS, limit=tpS)
                tradedToday := oneTradePerDay ? true : tradedToday

// -------------------- Markers
plotshape(enableBreak and (bullFVG and (close > rangeHi or close[1] > rangeHi or close[2] > rangeHi)) and allowEntry,  title="Break Long",  style=shape.triangleup,   color=color.new(color.teal, 0),   size=size.tiny, location=location.belowbar, text="Break")
plotshape(enableBreak and (bearFVG and (close < rangeLo or close[1] < rangeLo or close[2] < rangeLo)) and allowEntry,  title="Break Short", style=shape.triangledown, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Break")
plotshape(enableTrap  and breakUpFound   and trapUpRetestedInside   and closeAbove and allowEntry,  title="Trap Long",  style=shape.circle, color=color.new(color.teal, 0),   size=size.tiny, location=location.belowbar, text="Trap")
plotshape(enableTrap  and breakDownFound and trapDownRetestedInside and closeBelow and allowEntry,  title="Trap Short", style=shape.circle, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Trap")
plotshape(enableReversal and breakDownFound and bullFVG and closeInside and allowEntry, title="Reversal Long",  style=shape.diamond, color=color.new(color.teal, 0),   size=size.tiny, location=location.belowbar, text="Rev")
plotshape(enableReversal and breakUpFound   and bearFVG and closeInside and allowEntry, title="Reversal Short", style=shape.diamond, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Rev")