Chiến lược giao cắt đường trung bình động nhiều khung thời gian


Ngày tạo: 2024-02-19 15:41:29 sửa đổi lần cuối: 2024-02-19 15:41:29
sao chép: 0 Số nhấp chuột: 654
1
tập trung vào
1617
Người theo dõi

Chiến lược giao cắt đường trung bình động nhiều khung thời gian

Tổng quan

Chiến lược chéo đường trung bình di chuyển nhiều khung thời gian (Multi Timeframe Moving Average Crossover Strategy) là một chiến lược giao dịch thuật toán sử dụng tín hiệu chéo giữa các trung bình di chuyển trong các chu kỳ thời gian khác nhau để xác định hướng xu hướng. Chiến lược này sử dụng kết hợp các chỉ số xu hướng, chỉ số động lực và chỉ số dao động, làm cho tín hiệu chiến lược đáng tin cậy hơn.

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

Chiến lược này xác định xu hướng thị trường bằng cách tính toán các chỉ số CCI trong các chu kỳ khác nhau, sau đó kết hợp với chỉ số MACD để tìm tín hiệu giao dịch vàng, và cuối cùng sử dụng chỉ số ATR để thiết lập vị trí dừng lỗ để mua thấp và bán cao.

Cụ thể, đầu tiên tính toán chỉ số CCI 20 chu kỳ, để đánh giá xu hướng thị trường dựa trên tích cực và tiêu cực của nó; sau đó tính toán đường trung bình MACD của chỉ số MACD có xảy ra giao nhau hay không, để xác định liệu có tín hiệu mua bán được tạo ra hay không; sau đó sử dụng chỉ số ATR để tạo ra cơ chế theo dõi dừng lỗ, để khóa lợi nhuận hơn nữa; và cuối cùng, tổng hợp các tín hiệu của nhiều chỉ số trên để tạo ra tín hiệu chiến lược mua bán cuối cùng.

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

  1. Kết hợp nhiều chỉ số để tăng độ chính xác tín hiệu

Chiến lược này sử dụng sự kết hợp của ba chỉ số CCI, MACD và ATR để đánh giá tổng hợp xu hướng, động lực và độ biến động của thị trường, làm cho tín hiệu chiến lược chính xác và đáng tin cậy hơn.

  1. Phân tích khung thời gian đa dạng, nắm bắt nhịp độ thị trường

Sử dụng CCI của các chu kỳ khác nhau để đánh giá xu hướng chung của thị trường, kết hợp với MACD chu kỳ cao để tìm các nút mua và bán thấp, có thể nắm bắt nhịp độ xu hướng lớn của thị trường.

  1. ATR ngăn chặn theo dõi thiệt hại, kiểm soát rủi ro hiệu quả

Sử dụng chỉ số ATR để tạo ra stop loss, bạn có thể đặt mức dừng hợp lý dựa trên biến động của thị trường, đồng thời có chức năng theo dõi dừng lỗ, có thể kiểm soát rủi ro của chiến lược.

Rủi ro chiến lược

  1. Không gian tối ưu hóa tham số giới hạn

Hầu hết các tham số trong chiến lược này không có nhiều điều chỉnh, dễ dàng đạt đến giới hạn hiệu quả, hạn chế việc nâng cao hiệu quả của chiến lược.

  1. Gói đa chỉ số tăng tải tính toán

Vì chiến lược sử dụng nhiều chỉ số để thực hiện các hoạt động kết hợp, nó làm tăng khối lượng tính toán của chiến lược ở một mức độ nhất định. Trong giao dịch tần số cao, có thể có vấn đề về carton.

  1. Tín hiệu thường xuyên, kiểm soát rủi ro hạn chế

Các tín hiệu chiến lược có thể thường xuyên hơn, trong khi kiểm soát rủi ro chủ yếu dựa trên việc theo dõi tổn thất của chỉ số ATR, kiểm soát rủi ro đối với các tình huống cực đoan là không hoàn chỉnh.

Tối ưu hóa chiến lược

  1. Tăng hiệu quả tối ưu hóa tham số bằng thuật toán học máy

Bạn có thể thử sử dụng một số thuật toán tối ưu hóa siêu tham số của học máy, chẳng hạn như tối ưu hóa Bayesian, thuật toán di truyền, để điều chỉnh tham số thông minh hơn và hiệu quả hơn.

  1. Tăng các chỉ số chức năng, tăng tính linh hoạt của chiến lược

Có thể xem xét thêm một số chỉ số chức năng khác, chẳng hạn như chỉ số tỷ lệ biến động, chỉ số năng lượng, chỉ số cảm xúc, để nâng cao khả năng thích ứng và tính mạnh mẽ của chiến lược.

  1. Tăng cường mô-đun quản lý rủi ro, kiểm soát rủi ro chiến lược

Có thể thiết kế nguyên tắc dừng lỗ khoa học hơn, hoặc có thể thêm một số mô-đun kiểm soát vị trí hoặc quản lý tiền để bảo vệ tốt hơn rủi ro của tình huống cực đoan và đảm bảo sự ổn định của chiến lược.

Tóm tắt

Các chiến lược đa khung thời gian vượt qua các chiến lược đường bằng bằng cách sử dụng sự kết hợp của ba chỉ số lớn CCI, MACD và ATR, để đạt được sự phán đoán xu hướng đáng tin cậy hơn và kiểm soát rủi ro hiệu quả hơn. Chiến lược tổng hợp xem xét xu hướng, động lực và dao động ba chiều, có độ chính xác tín hiệu cao, nắm bắt nhịp độ thị trường và kiểm soát rủi ro hiệu quả. Tất nhiên, chiến lược cũng có một không gian tối ưu hóa tham số nhất định, khối lượng tính toán hạn chế và kiểm soát rủi ro có thể nâng cao. Bằng cách giới thiệu nhiều chỉ số hơn, sử dụng các phương tiện tối ưu hóa tham số tốt hơn và thiết kế mô-đun kiểm soát rủi ro mạnh mẽ hơn, chiến lược có thể được nâng cao và tối ưu hóa hơn nữa.

Mã nguồn chiến lược
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('smplondonclinic Strategy', shorttitle='SMPLC Strategy', overlay=true, pyramiding = 0, process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

direction   = input.string(title='Entry Direction', defval='Long', options=['Long', 'Short', 'Both'],group = "Strategy Entry Direction")

TPPerc = input.float(title='Take Profit (%)', minval=0.0, step=0.1, defval=0.5, group='Strategy TP & SL')
SLPerc = input.float(title='Stop Loss (%)', minval=0.0, step=0.1, defval=0.5, group='Strategy TP & SL')

period = input(20, 'CCI period',group = "TREND MAGIC")
coeff = input(1, 'ATR Multiplier',group = "TREND MAGIC")
AP = input(5, 'ATR Period',group = "TREND MAGIC")
ATR = ta.sma(ta.tr, AP)
srctm = close
upT = low - ATR * coeff
downT = high + ATR * coeff
MagicTrend = 0.0
MagicTrend := ta.cci(srctm, period) >= 0 ? upT < nz(MagicTrend[1]) ? nz(MagicTrend[1]) : upT : downT > nz(MagicTrend[1]) ? nz(MagicTrend[1]) : downT
color1 = ta.cci(srctm, period) >= 0 ? #0022FC : #FC0400
plot(MagicTrend, color=color1, linewidth=3)
tmb = ta.cci(srctm, period) >= 0 and close>MagicTrend
tms = ta.cci(srctm, period) <= 0 and close<MagicTrend

//MACD

res           = input.timeframe("",  "Indicator TimeFrame", group = "MACD")
fast_length   = input.int(title="Fast Length", defval=12, group = "MACD")
slow_length   = input.int(title="Slow Length", defval=26, group = "MACD")
src           = input.source(title="Source", defval=close, group = "MACD")
signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 999, defval = 9, group = "MACD")
sma_source    = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"], group = "MACD")
sma_signal    = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group = "MACD")

fast_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length))
slow_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length))
macd = fast_ma - slow_ma
signal = request.security(syminfo.tickerid, res, sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length))
hist = macd - signal

trend_up   = macd > signal
trend_dn   = macd < signal
cross_UP   = signal[1] >= macd[1] and signal < macd
cross_DN   = signal[1] <= macd[1] and signal > macd
cross_UP_A = (signal[1] >= macd[1] and signal < macd) and macd > 0
cross_DN_B = (signal[1] <= macd[1] and signal > macd) and macd < 0


//UT Bot

srcut = close
showut = input.bool(false, 'Show UT Bot Labels', group = "UT BOT")
keyvalue = input.float(2, title='Key Vaule. \'This changes the sensitivity\'', step=.5, group = "UT BOT")
atrperiod = input(7, title='ATR Period', group = "UT BOT")
xATR = ta.atr(atrperiod)
nLoss = keyvalue * xATR

xATRTrailingStop = 0.0
iff_1 = srcut > nz(xATRTrailingStop[1], 0) ? srcut - nLoss : srcut + nLoss
iff_2 = srcut < nz(xATRTrailingStop[1], 0) and srcut[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), srcut + nLoss) : iff_1
xATRTrailingStop := srcut > nz(xATRTrailingStop[1], 0) and srcut[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), srcut - nLoss) : iff_2

pos = 0
iff_3 = srcut[1] > nz(xATRTrailingStop[1], 0) and srcut < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := srcut[1] < nz(xATRTrailingStop[1], 0) and srcut > nz(xATRTrailingStop[1], 0) ? 1 : iff_3

xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue

//plot(xATR, color=xcolor, title='Trailing Stop')
buy = ta.crossover(srcut, xATRTrailingStop)
sell = ta.crossunder(srcut, xATRTrailingStop)
barcolor = srcut > xATRTrailingStop

plotshape(showut ? buy:na, title='Buy', text='Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(showut ? sell:na, title='Sell', text='Sell', style=shape.labeldown, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

//barcolor(barcolor ? color.green : color.red)

goLong = buy and tmb and cross_UP
goShort = sell and tms and cross_DN

plotshape(goLong, location=location.bottom, style=shape.triangleup, color=color.lime, size=size.small)
plotshape(goShort, location=location.top, style=shape.triangledown, color=color.red, size=size.small)

percentAsPoints(pcnt) =>
    strategy.position_size != 0 ? math.round(pcnt / 100.0 * strategy.position_avg_price / syminfo.mintick) : float(na)

percentAsPrice(pcnt) =>
    strategy.position_size != 0 ? (pcnt / 100.0 + 1.0) * strategy.position_avg_price : float(na)

current_position_size = math.abs(strategy.position_size)
initial_position_size = math.abs(ta.valuewhen(strategy.position_size[1] == 0.0, strategy.position_size, 0))

TP = strategy.position_avg_price + percentAsPoints(TPPerc) * syminfo.mintick * strategy.position_size / math.abs(strategy.position_size)
SL = strategy.position_avg_price - percentAsPoints(SLPerc) * syminfo.mintick * strategy.position_size / math.abs(strategy.position_size)

var long = false
var short = false

if direction == 'Long' 
    long := goLong
    short := false

if direction == 'Short'
    short := goShort
    long := false

if direction == 'Both' 
    long := goLong
    short := goShort

if long and strategy.opentrades == 0
    strategy.entry(id='Long', direction=strategy.long)

if short and strategy.opentrades == 0
    strategy.entry(id='Short', direction=strategy.short)

if strategy.position_size > 0

    strategy.exit('TPSL', from_entry='Long', qty=initial_position_size, limit=TP, stop=SL)

if strategy.position_size < 0

    strategy.exit('TPSL2', from_entry='Short', qty=initial_position_size, limit=TP, stop=SL)