Chiến lược giao dịch đột phá mở cửa động tần số cao

ORB RANGE BREAKOUT HFT EST OHLC SL TP
Ngày tạo: 2025-02-21 14:02:59 sửa đổi lần cuối: 2025-02-21 14:02:59
sao chép: 2 Số nhấp chuột: 519
2
tập trung vào
319
Người theo dõi

Chiến lược giao dịch đột phá mở cửa động tần số cao Chiến lược giao dịch đột phá mở cửa động tần số cao

Tổng quan

Chiến lược này là một hệ thống giao dịch tần số cao dựa trên phá vỡ khoảng mở, tập trung vào khoảng giá hình thành trong khoảng 9:30-9:45 sáng ngày giao dịch. Chiến lược đưa ra quyết định giao dịch bằng cách xem liệu giá có phá vỡ khoảng 15 phút này hay không, đồng thời kết hợp các thiết lập dừng lỗ và lợi nhuận động để đạt được sự kết hợp tối ưu giữa rủi ro và lợi nhuận. Hệ thống cũng bao gồm chức năng lọc ngày giao dịch, có thể giao dịch một cách chọn lọc dựa trên đặc điểm thị trường trong các khoảng thời gian khác nhau.

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

Lập luận cốt lõi của chiến lược là tạo ra một phạm vi giá trong vòng 15 phút sau khi mở cửa mỗi ngày giao dịch (9:30-9:45 EST) và ghi lại mức giá cao nhất và thấp nhất trong khoảng thời gian này. Một khi phạm vi được tạo ra, chiến lược sẽ theo dõi mức giá vượt qua trước 12 giờ trong ngày:

  • Khi giá phá vỡ phạm vi trên đường ray, mở thêm, dừng lỗ được thiết lập là 0,5 lần kích thước phạm vi, dừng lỗ được thiết lập là 3 lần
  • Khi giá phá vỡ phạm vi xuống đường, các nguyên tắc thiết lập để mở lỗ, dừng lỗ và dừng lại là giống nhau Chiến lược cũng bao gồm các cơ chế để ngăn chặn giao dịch lặp lại, đảm bảo chỉ thực hiện một giao dịch mỗi ngày và xóa tất cả các vị trí nắm giữ khi đóng cửa.

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

  1. Hiệu quả thời gian: Chiến lược tập trung vào thời gian giao dịch hoạt động nhất sau khi mở cửa, có thể nắm bắt cơ hội biến động lớn trong phiên mở cửa
  2. Kiểm soát rủi ro: sử dụng thiết lập dừng lỗ động để xác định các tham số quản lý rủi ro dựa trên độ dao động thực tế
  3. Tính linh hoạt giao dịch: cung cấp khả năng chọn ngày giao dịch theo tuần, tránh các ngày giao dịch bất lợi trong một môi trường thị trường cụ thể
  4. Thực hiện rõ ràng: tín hiệu giao dịch rõ ràng, điều kiện nhập và xuất rõ ràng, không bị ảnh hưởng bởi phán đoán chủ quan
  5. Mức độ tự động hóa cao: thực hiện tự động hóa toàn bộ quá trình, giảm tác động cảm xúc của can thiệp của con người

Rủi ro chiến lược

  1. Rủi ro phá vỡ giả: Sự phá vỡ đầu tiên sau khi tạo ra khoảng trống mở có thể là phá vỡ giả, dẫn đến dừng lỗ
  2. Thời gian suy giảm: Chiến lược chỉ giao dịch vào giờ sáng, có thể bỏ lỡ cơ hội tốt trong các thời gian khác
  3. Tùy thuộc vào biến động: Chiến lược có thể khó có đủ chỗ để kiếm lợi nhuận vào những ngày thị trường ít biến động
  4. Tác động điểm trượt: Là một chiến lược giao dịch tần số cao, có thể phải đối mặt với tổn thất điểm trượt lớn trong quá trình thực hiện
  5. Tùy thuộc vào môi trường thị trường: hiệu suất chiến lược có thể bị ảnh hưởng đáng kể bởi môi trường thị trường tổng thể

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

  1. Tiến hành số lượng giao dịch: có thể lọc tín hiệu đột phá giả bằng cách quan sát số lượng giao dịch khi đột phá
  2. Hoạt động điều chỉnh thời gian giao dịch: tối ưu hóa cửa sổ thời gian giao dịch theo đặc điểm thời gian hoạt động của các giống khác nhau
  3. Tăng bộ lọc xu hướng: kết hợp với định hướng xu hướng trong khoảng thời gian lớn hơn, tăng độ chính xác của hướng giao dịch
  4. Tối ưu hóa thiết lập dừng lỗ: Bạn có thể xem xét sử dụng chỉ số ATR động để thiết lập khoảng cách dừng lỗ
  5. Thêm bộ lọc biến động: đánh giá mức biến động trước khi mở cửa và quyết định thực hiện giao dịch trong ngày

Tóm tắt

Đây là một chiến lược phá vỡ khoảng mở được thiết kế hợp lý, logic nghiêm ngặt, để nắm bắt cơ hội giao dịch bằng cách tập trung vào thời điểm thị trường hoạt động nhất. Ưu điểm của chiến lược là logic giao dịch rõ ràng và cơ chế kiểm soát rủi ro tốt, nhưng cũng cần lưu ý đến các rủi ro tiềm ẩn như phá vỡ giả và phụ thuộc vào môi trường thị trường.

Mã nguồn chiến lược
/*backtest
start: 2025-01-21 00:00:00
end: 2025-01-24 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"DOGE_USDT"}]
args: [["MaxCacheLen",580,358374]]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © UKFLIPS69

//@version=6
strategy("ORB", overlay=true, fill_orders_on_standard_ohlc = true)

trade_on_monday = input(false, "Trade on Monday") 
trade_on_tuesday = input(true, "Trade on Tuesday") 
trade_on_wednesday = input(true, "Trade on Wednesday")
trade_on_thursday = input(false, "Trade on Thursday")
trade_on_friday = input(true, "Trade on Friday")
// Get the current day of the week (1=Monday, ..., 6=Saturday, 0=Sunday)
current_day = dayofweek(time) 
current_price = request.security(syminfo.tickerid, "1", close)
// Define trading condition based on the day of the week
is_trading_day = (trade_on_monday and current_day == dayofweek.monday) or
                 (trade_on_tuesday and current_day == dayofweek.tuesday) or
                 (trade_on_wednesday and current_day == dayofweek.wednesday) or
                 (trade_on_thursday and current_day == dayofweek.thursday) or
                 (trade_on_friday and current_day == dayofweek.friday)
// ─── Persistent variables ─────────────────────────
var line  orHighLine       = na   // reference to the drawn line for the OR high
var line  orLowLine        = na   // reference to the drawn line for the OR low
var float orHigh           = na   // stores the open-range high
var float orLow            = na   // stores the open-range low
var int   barIndex930      = na   // remember the bar_index at 9:30
var bool  rangeEstablished = false
var bool  tradeTakenToday  = false  // track if we've opened a trade for the day

// ─── Detect times ────────────────────────────────
is930  = (hour(time, "America/New_York") == 9 and minute(time, "America/New_York") == 30)
is945  = (hour(time, "America/New_York") == 9 and minute(time, "America/New_York") == 45)

// Between 9:30 and 9:44 (inclusive of 9:30 bar, exclusive of 9:45)?
inSession = (hour(time, "America/New_York") == 9 and minute(time, "America/New_York") >= 30 and minute(time, "America/New_York") < 45)

// ─── Reset each day at 9:30 ─────────────────────
if is930
    // Reset orHigh / orLow
    orHigh := na
    orLow  := na
    rangeEstablished := false
    tradeTakenToday  := false
    // Record the bar_index for 9:30
    barIndex930 := bar_index
// ─── ONLY FORM OR / TRADE IF TODAY IS ALLOWED ─────────────────────
if is_trading_day
// ─── Accumulate the OR high/low from 9:30 to 9:44 ─
    if inSession
        orHigh := na(orHigh) ? high : math.max(orHigh, high)
        orLow  := na(orLow)  ? low  : math.min(orLow, low)

// ─── Exactly at 9:45, draw the lines & lock range ─
    if is945 and not na(orHigh) and not na(orLow)

    // Mark that the OR is established
        rangeEstablished := true

// ─── TRADING LOGIC AFTER 9:45, but BEFORE NOON, and if NO trade taken ─
    if rangeEstablished and not na(orHigh) and not na(orLow) 
    // Only trade if it's still BEFORE 12:00 (noon) EST and we haven't taken a trade today
        if hour(time, "America/New_York") < 12 and (not tradeTakenToday)
        // 1) Compute distances for stops & targets
            float stopSize   = 0.5 * (orHigh - orLow)      // half the OR size
            float targetSize = 3 * stopSize      // 3x the stop => 1.5x the entire OR
    
        // 2) Check if price breaks above OR => go long
            if close > orHigh 
            // Only enter a new long if not already in a long position (optional)
                if strategy.position_size <= 0
                    strategy.entry("ORB Long", strategy.long)
                    strategy.exit("Long Exit", from_entry = "ORB Long", stop = orHigh - stopSize, limit  = strategy.position_avg_price + targetSize)
                // Flag that we've taken a trade today
                    tradeTakenToday := true
    
        // 3) Check if price breaks below OR => go short
            if close < orLow 
            // Only enter a new short if not already in a short position (optional)
                if strategy.position_size >= 0
                    strategy.entry("ORB Short", strategy.short)
                    strategy.exit("Short Exit", from_entry = "ORB Short", stop = orLow + stopSize, limit  = strategy.position_avg_price - targetSize)
                // Flag that we've taken a trade today
                    tradeTakenToday := true
if hour(time, "America/New_York") == 16 and minute(time, "America/New_York") == 0
    strategy.close_all()