Một chiến lược kết hợp nhiều yếu tố với trung bình di chuyển thích nghi

Tác giả:ChaoZhang, Ngày: 2023-12-15 11:30:09
Tags:

img

I. Tổng quan chiến lược

Chiến lược kết hợp nhiều yếu tố với trung bình động thích nghi là một chiến lược hợp chất kết hợp việc sử dụng đường HA, trung bình động, chéo stochastic và thanh trong ngày. Nó nhằm mục đích khám phá nhiều cơ hội giao dịch hơn và đạt được lợi nhuận tích lũy cao hơn trong các thị trường tăng.

II. Chiến lược logic

Lý thuyết cốt lõi của chiến lược này là kết hợp nhiều chỉ số kỹ thuật để đánh giá tín hiệu mua và bán và tạo ra các tín hiệu giao dịch có sức mạnh khác nhau dựa trên kết quả phù hợp.

Cụ thể, bốn chỉ số kỹ thuật chính được sử dụng trong chiến lược bao gồm:

  1. Các thanh nội ngày. Chiến lược sử dụng màu sắc của các thanh nội ngày để xác định xu hướng giá. Hai thanh HA màu xanh lá cây liên tiếp cung cấp tín hiệu mua, trong khi hai thanh HA rỗng màu đỏ liên tiếp cung cấp tín hiệu bán.

  2. Đường trung bình chuyển động. Chiến lược sử dụng đường trung bình chuyển động nhanh, chậm và lọc với các thiết lập tham số khác nhau đồng thời. Khi đường nhanh vượt qua trên đường chậm, và đường chậm vượt qua trên đường lọc, nó cung cấp tín hiệu mua. Và ngược lại.

  3. Chỉ số Stochastic. Chỉ số này xác định thời điểm giao thoa tăng và giảm. Khi đường %K phá vỡ đường %D từ dưới, nó cung cấp tín hiệu mua. Và khi %K phá vỡ %D từ trên, nó cung cấp tín hiệu bán.

  4. Cơ chế điểm phù hợp. Theo sự phù hợp của các yếu tố trên, chiến lược áp dụng một cơ chế điểm. Các yếu tố phù hợp càng nhiều, tín hiệu giao dịch tương ứng càng mạnh.

Thông qua đánh giá toàn diện của nhiều yếu tố, chiến lược có thể nắm bắt các cơ hội giao dịch tinh tế hơn trong trung hạn và ngắn hạn, do đó đạt được lợi nhuận vượt quá trong các thị trường tăng.

III. Ưu điểm

Lợi thế lớn nhất của chiến lược đa yếu tố này là nó tăng độ tin cậy của tín hiệu giao dịch. Một chỉ số kỹ thuật duy nhất có xu hướng tạo ra tín hiệu sai. Bằng cách kết hợp nhiều chỉ số, chiến lược này có thể giảm hiệu quả sự can thiệp từ tín hiệu sai.

Ngoài ra, so với chỉ theo dõi một chỉ số duy nhất, sự kết hợp nhiều yếu tố có thể cải thiện tỷ lệ thắng của các giao dịch. Nó có thể đạt được lợi nhuận tích lũy cao hơn trong các thị trường tăng.

IV. Rủi ro

Rủi ro chính của chiến lược này là sự kết hợp nhiều yếu tố làm tăng sự phức tạp của chiến lược.

Ngoài ra, trong thời gian thị trường giảm giá, thời gian giữ có thể quá dài. Ngay cả khi dừng lỗ, vẫn có thể xảy ra tổn thất đáng kể.

Ngoài ra, các chỉ số kỹ thuật như đường Stochastic và HA có thể bị ảnh hưởng bởi các sự kiện thiên nga đen, có xu hướng tạo ra tín hiệu sai và gây ra tổn thất không cần thiết.

V. Ý tưởng cải thiện

Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:

  1. Tối ưu hóa các thiết lập tham số của mỗi chỉ số để tìm ra sự kết hợp tối ưu.

  2. Thêm huấn luyện mô hình và các mô-đun tham số thích nghi để tối ưu hóa tham số thời gian thực.

  3. Thêm các chiến lược dừng lỗ để giảm mức rút tối đa.

  4. Thêm các mô-đun điều khiển vị trí để điều chỉnh vị trí năng động dựa trên điều kiện thị trường.

  5. Kết hợp các thuật toán học máy để xây dựng một mô hình mạng thần kinh cho hệ thống điểm đa yếu tố.

VI. Kết luận

Chiến lược kết hợp nhiều yếu tố với trung bình động thích nghi kết hợp các điểm mạnh của nhiều chỉ số kỹ thuật. Nó có thể cải thiện hiệu quả chất lượng tín hiệu và đạt được lợi nhuận vượt quá trong các thị trường tăng. Nhưng đồng thời, nó cũng làm tăng sự phức tạp của chiến lược, đòi hỏi phải thử nghiệm và tối ưu hóa thêm.


/*backtest
start: 2022-12-08 00:00:00
end: 2023-12-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © cyrule
//@version=4
strategy("2nd Grade Strategy", overlay=true, shorttitle="2GTS", max_lines_count = 500, max_labels_count = 500, calc_on_every_tick = true, calc_on_order_fills = true, pyramiding = 1, default_qty_type = strategy.percent_of_equity, default_qty_value = 10)

source = input(close, title = "Source")

// **********************
// * Heikin-Ahshi       *
// * kudos to garethyeo *
// **********************
showHA   = input(true, title = "Show Heikin Ashi?", group = "Heikin Ashi")
ha_open  = security(heikinashi(syminfo.tickerid), timeframe.period, open)
ha_high  = security(heikinashi(syminfo.tickerid), timeframe.period, high)
ha_low   = security(heikinashi(syminfo.tickerid), timeframe.period, low)
ha_close = security(heikinashi(syminfo.tickerid), timeframe.period, close)

bgcolor(iff(showHA and ha_open < ha_close , color.new(#53b987, transp = 92.5), na), title = 'Green HA')
bgcolor(iff(showHA and ha_open >= ha_close, color.new(#eb4d5c, transp = 92.5), na), title = 'Red HA'  )


// ******************
// * Moving Average *
// ******************
// MA Settings
showMA         = input(true, title = "Show Moving Averages?", group = "Moving Averages")
fastMALength   = input(title = "Fast MA Length", minval = 1, step = 1, defval = 20, group = "Moving Averages")
slowMALength   = input(title = "Slow MA Length", minval = 1, step = 1, defval = 50, group = "Moving Averages")
maType         = input(title = "Moving Average Type", defval = "SMA", options = ["SMA", "EMA", "RMA", "WMA", "VWMA"], group = "Moving Averages")
filterMALength = input(title = "Filter MA Length", minval = 1, step = 1, defval = 200, group = "Moving Averages")
filterMAType   = input(title = "Filter MA Type", defval = "EMA", options = ["SMA", "EMA", "RMA", "WMA", "VWMA"], group = "Moving Averages")

// Calculate MA
var float maFast   = na
var float maSlow   = na
var float maFilter = na

if (maType   == "SMA")
    maFast   := sma(source, fastMALength)
    maSlow   := sma(source, slowMALength)
if (maType   == "EMA")
    maFast   := ema(source, fastMALength)
    maSlow   := ema(source, slowMALength)
if (maType   == "RMA")
    maFast   := rma(source, fastMALength)
    maSlow   := rma(source, slowMALength)
    maFilter := rma(source, filterMALength)
if (maType   == "WMA")
    maFast   := wma(source, fastMALength)
    maSlow   := wma(source, slowMALength)
if (maType   == "VWMA")
    maFast   := vwma(source, fastMALength)
    maSlow   := vwma(source, slowMALength)

if (filterMAType == "SMA")
    maFilter     := sma(source, filterMALength)
if (filterMAType == "EMA")
    maFilter     := ema(source, filterMALength)
if (filterMAType == "RMA")
    maFilter     := rma(source, filterMALength)
if (filterMAType == "WMA")
    maFilter     := wma(source, filterMALength)
if (filterMAType == "VWMA")
    maFilter     := vwma(source, filterMALength)

BiruAtasMerah = (maFast >= maSlow) and (maSlow >= maFilter)
MerahAtasBiru = (maFast <= maSlow) and (maSlow <= maFilter)

// Lukis MA
plot(series = showMA ? maFast   : na, color = color.blue, title = "MA Fast")
plot(series = showMA ? maSlow   : na, color = color.red,  title = "MA Slow")
plot(series = showMA ? maFilter : na, color = #FFCC00,    title = "MA Filter")


// **************
// * Stochastic *
// **************
// Stochastic Settings
showSSC = input(true, title = "Show Stochastic Crossovers?", group = "Stochastic")
Length = input (10, minval = 1, title = "%K Length", group = "Stochastic")
SmoothK = input (3, minval = 1, title = "%K Smoothing", group = "Stochastic")
SmoothD = input (3, minval = 1, title = "%D Smoothing", group = "Stochastic")

// Calculate Stochastic
var float K = na
var float D = na

if (maType ==  "SMA")
	K      := sma(stoch(source, high, low, Length), SmoothK)
	D      := sma(K, SmoothD)
if (maType ==  "EMA")
	K      := ema(stoch(source, high, low, Length), SmoothK)
	D      := ema(K, SmoothD)
if (maType ==  "RMA")
	K      := rma(stoch(source, high, low, Length), SmoothK)
	D      := rma(K, SmoothD)
if (maType ==  "WMA")
	K      := wma(stoch(source, high, low, Length), SmoothK)
	D      := wma(K, SmoothD)
if (maType ==  "VWMA")
	K      := vwma(stoch(source, high, low, Length), SmoothK)
	D      := vwma(K, SmoothD)

StochasticCrossOver  = crossover(K, D)
StochasticCrossUnder = crossunder(K, D)

// Lukis SS
plotshape(showSSC and StochasticCrossOver  and K <=  20            ? K : na, text = "Golden\nCrossover",  color = color.new(color.green, transp = 25), location = location.belowbar, size = size.tiny, title = "Golden Crossover" )
plotshape(showSSC and StochasticCrossUnder and K >=  80            ? D : na, text = "Deadly\nCrossover",  color = color.new(color.red, transp = 25),   location = location.belowbar, size = size.tiny, title = "Deadly Crossover" )
plotshape(showSSC and StochasticCrossOver  and K <=  80 and K > 20 ? K : na, text = "Bullish\nCrossover", color = color.new(color.green, transp = 50), location = location.belowbar, size = size.tiny, title = "Bullish Crossover")
plotshape(showSSC and StochasticCrossUnder and K >=  20 and K < 80 ? D : na, text = "Bearish\nCrossover", color = color.new(color.red, transp = 50),   location = location.belowbar, size = size.tiny, title = "Bearish Crossover")

showBull = input(true, title = "Show Bullish Signal?", group = "Signal")
showBear = input(false, title = "Show Bearish Signal?", group = "Signal")

bullishCriteria = 0
if (ha_open < ha_close) and (ha_open[1] < ha_close[1]) and (ha_open[2] >= ha_close[2])
    bullishCriteria := bullishCriteria + 1
if (maFast > maSlow) and (maSlow > maFilter)
    bullishCriteria := bullishCriteria + 1
if (K > D) and (K > K[1]) and (D > D[1])
    bullishCriteria := bullishCriteria + 1

bearishCriteria = 0
if (ha_open >= ha_close) and (ha_open[1] >= ha_close[1]) and (ha_open[2] < ha_close[2])
    bearishCriteria := bearishCriteria + 1
if (maFast < maSlow) and (maSlow < maFilter)
    bearishCriteria := bearishCriteria + 1
if (K < D) and (K < K[1]) and (D < D[1])
    bearishCriteria := bearishCriteria + 1

signal = color.new(color.white, transp = 0)
if bearishCriteria == 2
    signal := color.new(color.orange, transp = 50)
if bearishCriteria == 3
    signal := color.new(color.red, transp = 50)
if bullishCriteria == 2
    signal := color.new(color.aqua, transp = 50)
if bullishCriteria == 3
    signal := color.new(color.green, transp = 50)

bullishCriteria := showBull ? bullishCriteria : 0
bearishCriteria := showBear ? bearishCriteria : 0

bgcolor(iff(bullishCriteria > 1, signal, na), title = 'Bullish Signal')
bgcolor(iff(bearishCriteria > 1, signal, na), title = 'Bearish Signal')

longTPPerc  = input(title = "Take Profit Threshold (%)"            , minval = 0.0, step = 0.5, defval = 2.5, group = "Trading") / 100
profitRatio = input(title = "Profit-to-Loss ratio (risk tolerance)", minval = 1.0, step = 0.1, defval = 1.4, group = "Trading")
longSLPerc  = longTPPerc / profitRatio
takeProfit  = strategy.position_avg_price * (1 + longTPPerc)
stopLoss    = strategy.position_avg_price * (1 - longSLPerc)
strategy.initial_capital = 50000
strategy.entry("Long" , strategy.long , floor(strategy.initial_capital*.1/close), stop = strategy.position_avg_price * 1.25, when = bullishCriteria > 1)
strategy.entry("Short", strategy.short, floor(strategy.initial_capital*.1/close), stop = strategy.position_avg_price * 1.25, when = bearishCriteria > 1)
strategy.close("Long" , when = (open >= takeProfit) or (open <= stopLoss) or (high >= takeProfit) or (low <= stopLoss))
strategy.close("Short", when = (open >= takeProfit) or (open <= stopLoss) or (high >= takeProfit) or (low <= stopLoss))

plotshape(bullishCriteria, location = location.belowbar, color = color.new(color.black, transp = 100))
plotshape(bearishCriteria, location = location.belowbar, color = color.new(color.black, transp = 100))

Thêm nữa