Phối hợp chiến lược dừng lỗ trượt

Tác giả:ChaoZhang, Ngày: 2023-11-02 16:28:55
Tags:

img

Tổng quan

Chiến lược này sử dụng chỉ số RSI Stochastic và chỉ số tỷ lệ thay đổi giá để xác định hướng xu hướng để nhập và phối hợp dừng lỗ trượt để quản lý rủi ro.

Chiến lược logic

Đầu tiên, chiến lược tính toán chỉ số RSI Stochastic bằng cách sử dụng chỉ số RSI với chiều dài 5 và chỉ số Stochastic với chiều dài 7. Khi giá trị Stochastic RSI K trên giá trị D, đó là tín hiệu tăng. Khi K dưới D, đó là tín hiệu giảm.

Thứ hai, chiến lược tính toán tỷ lệ thay đổi giá chỉ số EMA ROC. Khi EMA ROC trên một nửa ngưỡng hoặc dưới một nửa âm của ngưỡng, nó xác định chuyển động giá hoạt động.

Sau đó, kết hợp các tín hiệu Stochastic RSI và tỷ lệ thay đổi giá, nó xác định hướng xu hướng. Khi Stochastic RSI tăng và giá hoạt động tích cực, đi dài. Khi Stochastic RSI giảm và giá hoạt động tích cực, đi ngắn.

Cuối cùng, chiến lược sử dụng stop loss trượt phối hợp để quản lý rủi ro. Sau khi mở vị trí, nó tiếp tục làm mới giá cao nhất / thấp nhất và sử dụng khoảng cách tỷ lệ phần trăm nhất định từ giá cao nhất / thấp nhất như mức stop loss.

Phân tích lợi thế

Những lợi thế của chiến lược này:

  1. Chỉ số RSI Stochastic xác định hiệu quả xu hướng và tình huống mua quá mức / bán quá mức.

  2. Tỷ lệ thay đổi giá lọc ra khỏi thị trường giới hạn phạm vi để tránh tín hiệu sai.

  3. Đánh lỗ dừng trượt phối hợp có thể khóa lợi nhuận ở mức độ lớn nhất trong khi kiểm soát rủi ro.

  4. Chiến lược có không gian tối ưu hóa lớn cho các thông số điều chỉnh dựa trên các sản phẩm khác nhau.

  5. Logic chiến lược đơn giản và rõ ràng, dễ hiểu và thực hiện.

Phân tích rủi ro

Những rủi ro của chiến lược này:

  1. Stochastic RSI có thể tạo ra tín hiệu sai, cần xác nhận với các yếu tố khác.

  2. Điều phối trượt dừng mất mát có thể quá hung hăng, có thể được dừng lại bởi khoảng trống qua đêm.

  3. Sự đảo ngược ngắn hạn có thể kích hoạt dừng lỗ.

  4. Các thông số cần tối ưu hóa cho các sản phẩm khác nhau, nếu không hiệu suất có thể kém.

  5. Chi phí giao dịch ảnh hưởng đến lợi nhuận chiến lược, tần suất giao dịch hợp lý cần thiết.

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

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

  1. Tối ưu hóa các thông số RSI Stochastic để giảm tín hiệu sai. Có thể kiểm tra các giá trị K và D khác nhau.

  2. Tối ưu hóa tỷ lệ thay đổi giá của các thông số để cải thiện hiệu ứng lọc. Có thể kiểm tra các giá trị chiều dài và ngưỡng khác nhau.

  3. Thêm chỉ số xu hướng để tránh bị dừng lại bởi sự đảo ngược.

  4. Tối ưu hóa tỷ lệ stop loss để giảm nguy cơ bị mắc kẹt. Có thể kiểm tra chiều rộng stop loss khác nhau.

  5. Thêm quản lý kích thước vị trí để kiểm soát rủi ro giao dịch duy nhất, chẳng hạn như số tiền dừng lỗ cố định hoặc điều chỉnh kích thước vị trí dựa trên vốn hóa tài khoản.

  6. Kiểm tra các thông số trên các sản phẩm khác nhau để cải thiện khả năng thích nghi.

Tóm lại

Tóm lại, chiến lược này có logic rõ ràng và đơn giản, xác định hướng xu hướng với chỉ số RSI Stochastic và lọc tín hiệu với tỷ lệ thay đổi giá, có thể nắm bắt hiệu quả xu hướng trung dài hạn. Điều phối khóa dừng lỗ trượt trong lợi nhuận và kiểm soát rủi ro. Với tối ưu hóa hơn nữa, chiến lược này có thể trở thành một xu hướng rất thực tế sau chiến lược.


/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Sto2", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true
    
///////////// Stochastic calc /////////////
smoothK = input(1, minval=1)
smoothD = input(7, minval=1)
lengthRSI = input(5, minval=1)
lengthStoch = input(7, minval=1)
src = input(close, title="RSI Source")

up = sma(max(change(src), 0), lengthRSI) 
down = sma(-min(change(src), 0), lengthRSI)
rsi1 = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))

k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)

///////////// Rate Of Change ///////////// 
source = close, roclength = input(14, minval=1), pcntChange = input(2, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// STRATEGY ///////////////
long = k > d and isMoving()
short = k < d and isMoving()

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(9.0, title='Take Profit %') / 100 
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp) 

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) // LONG SL
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) // SHORT SL

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

// Strategy
if testPeriod()
    strategy.entry("Long Entry",  strategy.long, when=long)
    strategy.entry("Short Entry", strategy.short, when=short)
    strategy.exit("Long Ex", "Long Entry", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("Short Ex", "Short Entry", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
    
///////////// Plotting /////////////
bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80)
p1 = plot(k, color=color.gray, linewidth=0)
p2 = plot(d, color=color.gray, linewidth=0)
h0 = hline(100)
h1 = hline(50)
h3 = hline(0)
fill(p1, p2, color = k > d ? color.lime : color.red, transp=70)

Thêm nữa