Chiến lược trung bình động thích ứng kết hợp nhiều yếu tố


Ngày tạo: 2023-12-15 11:30:09 sửa đổi lần cuối: 2023-12-15 11:30:09
sao chép: 0 Số nhấp chuột: 622
1
tập trung vào
1621
Người theo dõi

Chiến lược trung bình động thích ứng kết hợp nhiều yếu tố

1. Ghi chú về chiến lược

Chiến lược trung bình di chuyển tự điều chỉnh đa yếu tố là một chiến lược kết hợp sử dụng đường trong ngày, đường trung bình di chuyển, chéo tích hợp và đường trung bình HA. Chiến lược này được thiết kế để khám phá nhiều cơ hội giao dịch hơn và thu nhập tích lũy cao hơn trong thị trường bò.

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

Lập luận cốt lõi của chiến lược này là kết hợp các chỉ số kỹ thuật khác nhau để đánh giá các tín hiệu mua và bán, cho các tín hiệu giao dịch với cường độ khác nhau dựa trên kết quả của các yếu tố khác nhau.

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

  1. Đường trong ngày. Chiến lược sử dụng màu sắc của đường trong ngày để xác định xu hướng giá, hai đường trung bình liên tiếp của thực thể màu xanh lá cây HA là tín hiệu mua, hai đường trung bình liên tiếp của đường trống màu đỏ HA là tín hiệu đầu không.

  2. Đường trung bình di chuyển. Chiến lược này sử dụng các thiết lập tham số khác nhau của các đường trung bình di chuyển nhanh, chậm và lọc cùng một lúc. Đường trung bình di chuyển là tín hiệu mua khi đường nhanh đi qua đường chậm và đường chậm đi qua đường ngực; ngược lại, là tín hiệu bán.

  3. Chỉ số Stochastic. Chỉ số này đánh giá thời gian giao thoa đa không gian. Khi % K đường từ phía dưới phá vỡ % D đường, là tín hiệu mua; khi từ phía trên phá vỡ, là tín hiệu bán.

  4. Cơ chế xếp hạng phù hợp. Tùy thuộc vào sự phù hợp của nhiều yếu tố trên, chiến lược áp dụng cơ chế xếp hạng. Càng có nhiều yếu tố phù hợp, cường độ tín hiệu tương ứng càng lớn.

Bằng cách đánh giá tổng hợp nhiều yếu tố, chiến lược có thể nắm bắt nhiều cơ hội giao dịch nhỏ hơn trong ngắn hạn và trung hạn, từ đó thu được lợi nhuận vượt trội trong thị trường bò.

Ba, lợi thế chiến lược.

Lợi thế lớn nhất của chiến lược moving average tự điều chỉnh đa yếu tố là tăng độ tin cậy của tín hiệu. Chỉ số kỹ thuật đơn lẻ dễ bị tín hiệu sai, trong khi chiến lược này kết hợp nhiều chỉ số để kết hợp, có thể làm giảm hiệu quả nhiễu tín hiệu sai.

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

Bốn, rủi ro chiến lược

Rủi ro chính của chiến lược này là sự kết hợp nhiều yếu tố tự nó sẽ làm tăng sự phức tạp của chiến lược. Cần thiết lập các tham số cho nhiều chỉ số cùng một lúc, điều chỉnh thường xuyên, v.v.

Ngoài ra, trong thị trường gấu, thời gian giữ chiến lược có thể quá dài. Ngay cả khi thiết lập dừng lỗ, rất khó để tránh tổn thất lớn.

Ngoài ra, các chỉ số kỹ thuật như chỉ số Stochastic và đường trung bình HA dễ bị ảnh hưởng bởi sự kiện bất ngờ, dễ tạo ra tín hiệu sai, dẫn đến tổn thất không cần thiết.

V. Chiến lược tối ưu hóa

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

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

  2. Thêm mô hình đào tạo và tham số tự thích ứng mô-đun, tham số tối ưu hóa trong thời gian thực.

  3. Tăng chiến lược dừng lỗ và giảm chiến lược rút tối đa.

  4. Thêm mô-đun kiểm soát vị trí, điều chỉnh vị trí động theo tình hình thị trường.

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

VI. Kết luận

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

Mã nguồn chiến lược
/*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))