
Chiến lược đa yếu tố kết hợp ba loại chiến lược khác nhau: chiến lược xung đột, chiến lược theo xu hướng và chiến lược đột phá, để có được hiệu quả chiến lược tốt hơn bằng cách sử dụng kết hợp.
Chiến lược đa yếu tố được mô hình hóa dựa trên các yếu tố sau:
Một phần của chiến lược chấn động sử dụng các chỉ số ngẫu nhiên để đánh giá thời gian mua và bán. Cụ thể, khi chỉ số ngẫu nhiên% K đường đi qua% D đường từ khu vực bán tháo, nó tạo ra tín hiệu mua; khi% K đường đi qua% D đường từ khu vực mua tháo, nó tạo ra tín hiệu bán.
Một phần của chiến lược xu hướng sử dụng đường chéo vàng của đường trung bình SMA để xác định hướng xu hướng. Nó tạo ra tín hiệu mua khi đường nhanh đi qua đường chậm từ phía dưới; nó tạo ra tín hiệu bán khi đường nhanh đi qua đường chậm từ phía trên xuống.
Một phần của chiến lược phá vỡ là theo dõi liệu giá có phá vỡ mức giá cao nhất hoặc thấp nhất trong chu kỳ được chỉ định. Mua khi giá vượt quá mức giá cao nhất; bán khi giá thấp hơn mức giá thấp nhất.
Kết hợp với chỉ số ADX để đánh giá cường độ của xu hướng, chỉ tham gia giao dịch xu hướng khi xu hướng đủ mạnh.
Thiết lập đường dừng và đường dừng, thiết lập tỷ lệ dừng hợp lý.
Một chiến lược đa yếu tố tổng hợp các thành phần này theo logic sau:
Khi ADX lớn hơn so với ngưỡng thiết lập, cho rằng xu hướng đủ mạnh, thì bắt đầu thực hiện chiến lược xu hướng; khi ADX nhỏ hơn so với ngưỡng, cho rằng nó đang ở mức cân bằng, thì chỉ thực hiện chiến lược xung đột.
Trong một tình huống xu hướng, mua vào khi vàng giao dịch trên đường SMA nhanh hoặc chậm, và bán khi vàng giao dịch trên đường giao dịch chết.
Các tín hiệu giao dịch của các chỉ số ngẫu nhiên được thực hiện trong các tình huống xung đột.
Chiến lược đột phá được sử dụng trong cả hai môi trường thị trường để theo dõi các kênh.
Thiết lập Stop Loss Stop Line để tối ưu hóa lợi nhuận.
Ưu điểm lớn nhất của chiến lược đa yếu tố là kết hợp các loại chiến lược khác nhau, có thể đạt được hiệu quả chiến lược tốt hơn trong cả hai môi trường thị trường. Cụ thể, chiến lược đa yếu tố chủ yếu có những lợi thế sau:
Có thể làm theo xu hướng, có tỷ lệ chiến thắng cao hơn trong các tình huống xu hướng.
Có thể kiếm lợi nhuận trong những tình huống bất ổn và không bị mắc kẹt trong các vị thế.
Có yếu tố lợi nhuận cao, thiết lập dừng lỗ là hợp lý.
Các nhà đầu tư cũng có thể sử dụng các phương tiện truyền thông xã hội như mạng xã hội, truyền thông xã hội và truyền thông xã hội.
Kết hợp nhiều chỉ số có thể tạo ra tín hiệu giao dịch mạnh mẽ hơn.
Bạn có thể có được một sự kết hợp tốt hơn của các tham số thông qua tối ưu hóa tham số.
Các chiến lược đa yếu tố cũng có một số rủi ro, bao gồm:
Sự kết hợp của nhiều yếu tố không phù hợp có thể gây ra sự hỗn loạn tín hiệu giao dịch, cần thử nghiệm nhiều lần để tìm ra sự kết hợp của các yếu tố tối ưu.
Cần tối ưu hóa nhiều tham số, tối ưu hóa khó khăn hơn và cần có đủ dữ liệu lịch sử để hỗ trợ.
Nếu không có thời gian để dừng lỗ, bạn có thể bị mất nhiều tiền hơn khi xu hướng thay đổi.
Chỉ số ADX bị tụt hậu và có thể đã bỏ lỡ một bước ngoặt.
Các giao dịch đột phá dễ bị mắc kẹt và cần thiết phải có chiến lược dừng lỗ hợp lý.
Đối với những rủi ro trên, bạn có thể tối ưu hóa từ:
Kiểm tra tính ổn định của các yếu tố khác nhau trong dữ liệu lịch sử, chọn yếu tố ổn định.
Sử dụng các phương pháp tối ưu hóa thông minh như thuật toán di truyền để tìm các tham số tối ưu.
Thiết lập một đường dừng hợp lý để kiểm soát rút lui tối đa.
Kết hợp các chỉ số bổ sung để đánh giá xu hướng đảo ngược
Tối ưu hóa chiến lược dừng lỗ để phá vỡ giao dịch, tránh thua lỗ quá lớn.
Các chiến lược đa yếu tố còn có thể được tối ưu hóa hơn nữa:
Sử dụng phương pháp học máy để tìm trọng lượng chiến lược tối ưu.
Tối ưu hóa tham số có thể sử dụng thuật toán thông minh, tìm kiếm nhanh chóng.
Có thể kiểm tra lợi nhuận trong các thời gian giữ vị trí khác nhau.
Có thể cân nhắc động điều chỉnh đường dừng lỗ.
Có thể giới thiệu thêm các điều kiện lọc, chẳng hạn như tăng tốc độ giao thông, để cải thiện chất lượng tín hiệu.
Chỉ số ADX có thể được xem xét để tối ưu hóa các tham số hoặc thay thế cho các chỉ số định hướng tiên tiến hơn.
Chiến lược đa yếu tố tổng hợp xem xét nhiều logic giao dịch như xu hướng, chấn động, đột phá, và có thể có hiệu quả tốt hơn trong cả hai môi trường thị trường. So với chiến lược đơn lẻ, chiến lược đa yếu tố có thể đạt được lợi nhuận ổn định cao hơn, có không gian mở rộng nâng cấp tốt.
/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// strategy("Strategy_1", shorttitle="Strategy1",overlay=true ,pyramiding = 12, initial_capital=25000, currency='EUR', commission_type = strategy.commission.cash_per_order, commission_value = 3, default_qty_type = strategy.percent_of_equity, default_qty_value = 20)
// Revision: 1
// Author: Jonas
// === INPUT ===
// > BACKTEST RANGE <
FromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
FromDay = input(defval=1, title="From Day", minval=1, maxval=31)
FromYear = input(defval=2017, title="From Year", minval=2010)
ToMonth = input(defval=1, title="To Month", minval=1, maxval=12)
ToDay = input(defval=1, title="To Day", minval=1, maxval=31)
ToYear = input(defval=9999, title="To Year", minval=2010)
// > STRATEGY SETTINGS <
bolOS = input(defval = false, type=input.bool, title="Oscillating Strategy")
bolTS = input(defval = true, type=input.bool, title="Trend Strategy")
bolBO = input(defval = false, type=input.bool, title="Breakout Strategy")
strStrategy = input(defval = "Long", type=input.string, title="Trade Strategy",options = ["Long", "Short","Long & Short"])
flStopLoss = input(defval = 2.0, title="Stop Loss %", type=input.float)/100
flTakeProfit = input(defval = 4.0, title="Take Profit %", type=input.float)/100
// > SMA <
fastMA = input(defval=8, type=input.integer, title="FastMA length", minval=1, step=1)
slowMA = input(defval=21, type=input.integer, title="SlowMA length", minval=1, step=1)
// > ADX <
adx_len = input(defval=10, type=input.integer, title="ADX length", minval=1, step=1)
adx_trend = input(defval=30, type=input.integer, title="ADX Tr", minval=1, step=1)
adx_choppy = adx_trend
adx_limit = adx_trend
// > TRENDSCORE <
ts_fromIndex = input(title="From", type=input.integer, minval=1, defval=10)
ts_toIndex = input(title="To", type=input.integer, minval=1, defval=14)
ts_src = input(title="Source", type=input.source, defval=close)
// > Oscillator <
stoch_length = 14
stoch_OverBought = 75
stoch_OverSold = 25
stoch_smoothK = 3
stoch_smoothD = 3
// === BACK TEST RANGE FUNCTION ===
window_start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window
window_finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window
window() => // create function "within window of time"
time >= window_start and time <= window_finish ? true : false
//plot(stop_level_Long, title="TEST",color=color.red, style=plot.style_linebr, linewidth=2)
//plot(take_level_Long, color=color.green, style=plot.style_linebr, linewidth=2)
// === ADX ===
adx_up = change(high)
adx_down = -change(low)
adx_trur = rma(tr, adx_len)
adx_plus = fixnan(100 * rma(adx_up > adx_down and adx_up > 0 ? adx_up : 0, adx_len) / adx_trur)
adx_minus = fixnan(100 * rma(adx_down > adx_up and adx_down > 0 ? adx_down : 0, adx_len) / adx_trur)
adx_sum = adx_plus + adx_minus
ADX = 100 * rma(abs(adx_plus - adx_minus) / (adx_sum == 0 ? 1 : adx_sum), adx_len)
//=== TRENDSCORE ===
trendscore(ts_src, ts_fromIndex, ts_toIndex) =>
ts_sum = 0.0
for i = ts_fromIndex to ts_toIndex
ts_sum := ts_sum + (ts_src >= nz(ts_src[i]) ? 1 : -1)
ts_sum
intTS = trendscore(ts_src, ts_fromIndex, ts_toIndex)
// Long if TrendDirection = 1, Short if TrendDirection = -1; Indifferent if TrendDirection = 0
intTrendDirection = (intTS > (ts_toIndex-ts_fromIndex)) ? 1 : (intTS < (ts_fromIndex-ts_toIndex)) ? -1 : 0
// > TREND CONDITION <
adx_growing = ADX > highest(ADX[1],3)
intTrend = ((ADX >= adx_limit) and (ADX[1] >= adx_limit) and adx_growing) ? intTrendDirection : 0
// === ATR ===
ATR = sma(tr,10)
ATR_100 = ATR /abs(high - low)
// === STOCHASTICS ===
stoch_k = sma(stoch(close, high, low, stoch_length), stoch_smoothK)
stoch_d = sma(stoch_k, stoch_smoothD)
// === FILTER & CONDITIONS ===
// > STOCHASTICS <
bolFilter_OS1 = close[1] > hl2[1]
bolSigOsc_long_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossover(stoch_d,stoch_OverSold) and stoch_k > stoch_d) ? true:false
bolSigOsc_short_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossunder(stoch_d,stoch_OverBought) and stoch_k < stoch_d) ? true:false
bolLongOpenOS = bolSigOsc_long_1 and bolFilter_OS1
bolLongCloseOS = bolSigOsc_short_1
bolShortOpenOS = bolSigOsc_short_1 and bolFilter_OS1
bolShortCloseOS = bolSigOsc_long_1
// > TREND <
bolFilter_TS1 = close[1] > hl2[1] and open[1] < hl2[1]
bolFilter_TS2 = sma(close,50)>sma(close,50)[10]
bolFilter_TS3 = close[1] < hl2[1] and open[1] > hl2[1]
bolSigTrendLO1 = sma(close, fastMA) > sma(close, slowMA)
bolSigTrendLO2 = close > sma(close,fastMA)
bolSigTrendLO3 = bolSigTrendLO1 and bolSigTrendLO2
bolSigTrendLC1 = sma(close, fastMA) < sma(close, slowMA)
bolSigTrendLC2 = close < sma(close, fastMA)
bolSigTrendLC3 = bolSigTrendLC1 and bolSigTrendLC2
bolSigTrendSO1 = bolSigTrendLC3
bolSigTrendSC1 = bolSigTrendLO1
bolLongOpenTS = bolSigTrendLO3 and bolFilter_TS1
bolLongCloseTS = bolSigTrendLC3 and bolFilter_TS3
bolShortOpenTS = bolSigTrendSO1 and bolFilter_TS3
bolShortCloseTS = bolLongOpenTS and bolFilter_TS1
plot(sma(close, fastMA), title='FastMA', color=color.green, linewidth=2, style=plot.style_line) // plot FastMA
plot(sma(close, slowMA), title='SlowMA', color=color.red, linewidth=2, style=plot.style_line) // plot SlowMA
// > BREAKOUT <
flFilter_BS1 = 0.5 * stdev(close,slowMA)[1]
bolFilter_BS2 = volume > sma(volume,slowMA)*1.25
bolSigBreakoutLO1 = close > (highestbars(high,slowMA)[1] + flFilter_BS1)
bolSigBreakoutLC1 = barssince(bolSigBreakoutLO1)==5
bolSigBreakoutSO1 = close < lowestbars(low,slowMA)[1] - flFilter_BS1
bolSigBreakoutSC1 = barssince(bolSigBreakoutSO1)==5
bolLongOpenBO = bolSigBreakoutLO1 and bolFilter_BS2
bolLongCloseBO = bolSigBreakoutLC1
bolShortOpenBO = bolSigBreakoutSO1 and bolFilter_BS2
bolShortCloseBO = bolSigBreakoutSC1
//=== STRATEGIES ENTRIES & EXITS ===
// > STOPS & LIMITS <
stop_level_Long = strategy.position_avg_price * (1 - flStopLoss)
take_level_Long = strategy.position_avg_price * (1 + flTakeProfit)
stop_level_Short = strategy.position_avg_price * (1 + flStopLoss)
take_level_Short = strategy.position_avg_price * (1 - flTakeProfit)
// > ENTRIES / CLOSES / EXITS <
if window() //only in backtest-window
if (bolOS == true)
if (intTrend == 0)
if(strStrategy == "Long" or strStrategy == "Long & Short")
strategy.entry("Lng Osc", strategy.long, when=bolLongOpenOS) // buy long when "within window of time" AND crossover
if(strStrategy == "Short" or strStrategy == "Long & Short")
strategy.entry("Short Osc", strategy.short, when=bolShortOpenOS)
strategy.close("Lng Osc", when=(bolLongCloseOS))
//strategy.exit("Exit L OS/STD", "Lng Osc", stop = strategy.position_avg_price - 2*stdev(close,10))
strategy.exit("Exit L OS/%", "Lng Osc", stop=stop_level_Long)
strategy.close("Short Osc", when=(bolShortCloseOS))
//strategy.exit("Exit S OS/STD", "Short Osc", stop = strategy.position_avg_price + 2*stdev(strategy.position_avg_price,10))
strategy.exit("Exit S OS/%", "Short Osc", stop=stop_level_Short)
if (bolTS == true)
if (not(intTrend == 0))
if((strStrategy == "Long") or (strStrategy == "Long & Short"))
strategy.entry("Lng TD", strategy.long, when=bolLongOpenTS) // buy long when "within window of time" AND crossover
if((strStrategy == "Short") or (strStrategy == "Long & Short"))
strategy.entry("Short TD", strategy.short, when=(bolShortOpenTS and bolTS)) // buy long when "within window of time" AND crossover
strategy.exit("Exit L TD", "Lng TD", stop=stop_level_Long)
strategy.close("Lng TD", when=bolLongCloseTS)
strategy.exit("Exit S TD", "Short TD", stop=stop_level_Short)
strategy.close("Short TD", when=bolShortCloseTS)
if (bolBO == true)
if((strStrategy == "Long") or (strStrategy == "Long & Short"))
strategy.entry("Lng BO", strategy.long, when=bolLongOpenBO) // buy long when "within window of time" AND crossover
strategy.close("Lng BO", when=bolLongCloseBO)
//strategy.exit("Exit L BO/STD", "Lng BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10))
strategy.exit("Exit L BO/2.5%", "Lng BO", stop=stop_level_Long)
if((strStrategy == "Short") or (strStrategy == "Long & Short"))
strategy.entry("Short BO", strategy.short, when=bolShortOpenBO) // buy long when "within window of time" AND crossover
strategy.close("Short BO", when=bolShortCloseBO)
//strategy.exit("Exit S BO/STD", "Short BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10))
strategy.exit("Exit S BO/%", "Short BO", stop=stop_level_Short)