Chiến lược giao dịch chéo trung bình động động

Tác giả:ChaoZhang, Ngày: 2023-11-13 10:27:54
Tags:

img

Tổng quan

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

Chiến lược logic

Chiến lược sử dụng hai chỉ số Ratio OCHL Averager với khung thời gian khác nhau như các đường nhanh và chậm.

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

Ở đây b đại diện cho tỷ lệ chuyển động giá trong ngày và c là b bình thường. Ratio OCHL Averager kết hợp giá mở, đóng, cao và thấp để xây dựng mức trung bình động.

Chiến lược này thiết lập một khoảng thời gian ngắn hơn cho đường nhanh và một khoảng thời gian dài hơn cho đường chậm. Một tín hiệu mua được tạo ra khi đường nhanh vượt qua đường chậm, và một tín hiệu bán khi đường nhanh vượt qua dưới. Nó nắm bắt xu hướng bằng logic chéo trung bình động.

Ưu điểm

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

  2. Sự giao thoa giữa hai đường trung bình động kết hợp với các khung thời gian khác nhau có thể phát hiện tốt hơn sự khởi đầu của một xu hướng mới.

  3. Thời gian của đường dây nhanh và chậm có thể được điều chỉnh cho các điều kiện thị trường khác nhau.

  4. Khái niệm chiến lược đơn giản và trực quan, dễ hiểu và thực hiện.

  5. Dừng lỗ và lấy lợi nhuận có thể được thiết lập linh hoạt để kiểm soát rủi ro.

Rủi ro

  1. Crossover trung bình động có thể tạo ra tín hiệu sai quá nhiều.

  2. Thời gian của đường nhanh và đường chậm nên được lựa chọn hợp lý, nếu không nó có thể ảnh hưởng đến hiệu suất chiến lược.

  3. Đây là một chiến lược theo xu hướng không phù hợp với thị trường giới hạn trong phạm vi.

  4. Dừng lỗ và lấy lợi nhuận nên được điều chỉnh đúng cách để giảm lỗ và tối ưu hóa mức lợi nhuận.

Hướng dẫn tối ưu hóa

  1. Xem xét kết hợp các chỉ số động lực như MACD, KDJ để lọc tín hiệu và cải thiện chất lượng.

  2. Kiểm tra các kết hợp thời gian dòng nhanh và chậm khác nhau để tìm các thông số tối ưu.

  3. Tối ưu hóa stop loss và lấy lợi nhuận dựa trên kết quả backtest.

  4. Xem xét điều chỉnh động các tham số trong các điều kiện thị trường nhất định, ví dụ, tăng thời gian trong thị trường giới hạn phạm vi.

Kết luận

Chiến lược này có một logic rõ ràng sử dụng chéo trung bình di chuyển nhanh và chậm để xác định hướng xu hướng. Đây là một chiến lược theo xu hướng năng động phù hợp với giao dịch trung hạn. Vẫn còn nhiều chỗ để tối ưu hóa bằng cách điều chỉnh các tham số, lọc tín hiệu v.v. Nhìn chung, đây là một chiến lược giao dịch xu hướng linh hoạt và thực tế.


/*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

Thêm nữa