Chiến lược giao dịch trung bình động đột phá động


Ngày tạo: 2023-11-13 10:27:54 sửa đổi lần cuối: 2023-11-13 10:27:54
sao chép: 0 Số nhấp chuột: 644
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch trung bình động đột phá động

Tổng quan

Ý tưởng chính của chiến lược này là sử dụng các chỉ số Ratio OCHL Averager trong các chu kỳ khác nhau để xây dựng nhiều đường trung bình, tạo ra tín hiệu mua và bán dựa trên hình dạng chéo của đường trung bình. Nó có khả năng nắm bắt xu hướng giá động, phù hợp với giao dịch ngắn hạn và trung bình.

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

Chiến lược này sử dụng hai chỉ số Ratio OCHL Averager có chu kỳ khác nhau, tương ứng với đường nhanh và đường chậm. Công thức tính toán cho chỉ số Ratio OCHL Averager như sau:

b = abs(close-open)/(high - low) 
c = min(max(b, 0), 1)
Ratio OCHL Averager = c*close + (1-c)*前一日Ratio OCHL Averager

Trong đó b là tỷ lệ đại diện cho biến động giá trong ngày, c là giá trị của b sau khi xử lý tiêu chuẩn. Chỉ số Ratio OCHL Averager tổng hợp giá mở, giá đóng, giá cao nhất và giá thấp nhất bốn giá để xây dựng đường trung bình.

Chiến lược này thiết lập chu kỳ đường nhanh ngắn, chu kỳ đường chậm dài. Khi đường nhanh đi qua đường chậm, nó tạo ra tín hiệu mua, và ngược lại khi đường nhanh đi qua đường chậm, nó tạo ra tín hiệu bán. Sử dụng nguyên tắc giao thoa ngang nhau để bắt xu hướng.

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

  1. Chỉ số Ratio OCHL Averager có thể làm mịn dữ liệu giá, lọc hiệu quả tiếng ồn thị trường, làm cho tín hiệu giao dịch đáng tin cậy hơn.

  2. Giao chéo hai đường đồng đều kết hợp với các chu kỳ khác nhau để xác định xu hướng, có thể xác định tốt hơn xu hướng mới bắt đầu.

  3. Điều chỉnh các tham số chu kỳ của đường nhanh và đường chậm để phù hợp với môi trường thị trường khác nhau.

  4. Các chiến lược này rất đơn giản, trực quan và dễ hiểu.

  5. Có thể thiết lập các tiêu chuẩn dừng lỗ linh hoạt, kiểm soát rủi ro.

Rủi ro chiến lược

  1. Chiến lược giao nhau đồng đều có thể tạo ra nhiều tín hiệu giả và cần lọc kết hợp với các chỉ số kỹ thuật khác.

  2. Cần lựa chọn hợp lý các tham số chu kỳ của đường nhanh và đường chậm, lựa chọn tham số không đúng có thể ảnh hưởng đến hiệu quả của chiến lược.

  3. Chiến lược giao chéo hai đường bằng nhau thuộc chiến lược theo dõi xu hướng, không phù hợp với hành vi chấn động, nên được sử dụng trong hành vi xu hướng.

  4. Cần điều chỉnh điểm dừng để giảm rủi ro mất mát, và điểm dừng phải được thiết lập hợp lý.

Hướng tối ưu hóa

  1. Có thể xem xét việc lọc tín hiệu kết hợp với các chỉ số động lượng để cải thiện chất lượng tín hiệu. Ví dụ: MACD, KDJ.

  2. Có thể thử nghiệm các kết hợp tham số chu kỳ đường nhanh và đường chậm khác nhau để tìm tham số tối ưu.

  3. Các điểm dừng lỗ có thể được tối ưu hóa dựa trên kết quả phản hồi để tìm các thiết lập tốt nhất.

  4. Các tham số điều chỉnh động có thể được xem xét trong một môi trường thị trường cụ thể, chẳng hạn như tham số chu kỳ tăng lớn khi biến động thị trường lớn.

Tóm tắt

Chiến lược này có ý tưởng tổng thể rõ ràng và dễ hiểu, bằng cách đánh giá xu hướng xu hướng bằng cách nhanh chóng và trung bình. Đây là một chiến lược theo dõi động phù hợp với giao dịch ngắn hạn và trung hạn.

Mã nguồn chiến lược
/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="[XC] Adaptive Strategy V3 - Ratio OCHL Averager no repaint",shorttitle="R_OHCL", overlay=true, currency=currency.EUR,initial_capital=10000,
     default_qty_value=100, default_qty_type=strategy.percent_of_equity , calc_on_every_tick=false, calc_on_order_fills=true)


//                  ╔═ SETTINGS                  ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

strategy_1     = input ( defval=true   , type=input.bool    , title="STRATEGY 1? —>"      )
Recursive      = input(false)
RES201         = "Min",RES202= "D",RES203 = "W",RES204 = "M"

//++ Resolution 1 ++
inp_resolution1 = input(600, minval=1, title="Resolution Line 1")
restype1        = input ( defval="Min"  , type=input.string , title= "Resolution Line 1" , options=[ "Min","D","W","M"])
multiplier1     = restype1 == "Min" ? "" : restype1 == "D" ? "D" : restype1 == "W" ? "W" : "M"
resolution1     = tostring(inp_resolution1)+ multiplier1

//++ Resolution 2 ++
inp_resolution2 = input(1440, minval=1, title="Resolution Line 2")
restype2        = input ( defval="Min"  , type=input.string , title= "Resolution Line 2" , options=["Min","D","W","M"])
multiplier2     = restype2 == "Min" ? "" : restype2 == "D" ? "D" : restype2 == "W" ? "W" : "M"
resolution2     = tostring(inp_resolution2)+ multiplier2

StopLoss        = input(defval = 500 , title = "Stop Loss", minval = 0)
TakeProfit      = input(defval = 2500 , title = "Take Profit", minval = 0)
// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = TakeProfit  >= 1 ? TakeProfit  : na
useStopLoss     = StopLoss    >= 1 ? StopLoss    : na


//                  ╔═ BACKTEST RANGE            ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░
line_breakBTR  = input ( defval = true   , type=input.bool   , title="BACKTEST RANGE —"      ) 
FromYear       = input ( defval = 2019, title = "From Year", minval = 2017)
FromMonth      = input ( defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay        = input ( defval = 2, title = "From Day", minval = 1, maxval = 31)
//FromHour     = input ( defval = 1, title = "From Hour", minval = 1, maxval = 24)
ToYear         = input ( defval = 9999, title = "To Year", minval = 2017)
//ToHour       = input ( defval = 0, title = "From Hour", minval = 0, maxval = 24)
ToMonth        = input ( defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay          = input ( defval = 1, title = "To Day", minval = 1, maxval = 31)

// === FUNCTION EXAMPLE ===
start     = timestamp(syminfo.timezone, FromYear, FromMonth, FromDay, 0, 00)  // backtest start window
finish    = timestamp(syminfo.timezone, ToYear  , ToMonth  , ToDay  , 0, 59)  // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"

//                  ╔═ INDICATOR                 ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

// "Ratio OCHL Averager" -> alexgrover / tradingview.com/script/RGAtOI6h-Ratio-OCHL-Averager-An-Alternative-to-VWAP/

rochla( res,Recursive)=>
    //Recursive = false
    H =  security(syminfo.tickerid,res,high[1],gaps = barmerge.gaps_off,  lookahead = barmerge.lookahead_on)
    L =  security(syminfo.tickerid,res,low[1] ,gaps = barmerge.gaps_off,  lookahead = barmerge.lookahead_on)
    d = 0.
    //----
    a = Recursive ? nz(d[1],open) : open
    b = abs(close-a)/(H - L)
    c = b > 1 ? 1 : b
    d := c*close+(1-c)*nz(d[1],close)



strat1_line1=rochla(resolution1,Recursive)
strat1_line2=rochla(resolution2,Recursive)

plot(strat1_line1, title="Ratio OCHL Averager 1", color=#DAA520,linewidth=2,transp=0)
plot(strat1_line2, title="Ratio OCHL Averager 2", color=#B22222,linewidth=2,transp=0)



//                  ╔═ STRATEGY 1                ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

trading_strat1_line1 = strategy_1 == 1    ? strat1_line1   : na
trading_strat1_line2 = strategy_1 == 1    ? strat1_line2   : na

longCross  = crossunder (trading_strat1_line2, trading_strat1_line1) ? true : false
shortCross = crossover  (trading_strat1_line2, trading_strat1_line1) ? true : false

plot( longCross  ? trading_strat1_line1 : na , title = "Long"  , color=color.aqua, style=plot.style_circles, linewidth=5, offset= 0)
plot( shortCross ? trading_strat1_line2 : na , title = "Short" , color=color.red , style=plot.style_circles, linewidth=5, offset= 0)



//                  ╔═ Backtest 1                ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░


strategy.exit("close",loss = useStopLoss, profit = useTakeProfit)

if longCross  and window() and strategy_1 == 1 
    strategy.entry("Go Long", strategy.long)
if shortCross and window() and strategy_1 == 1 
    strategy.entry("Go Short", strategy.short)

//end