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


Ngày tạo: 2023-11-02 16:28:55 sửa đổi lần cuối: 2023-11-02 16:28:55
sao chép: 0 Số nhấp chuột: 562
1
tập trung vào
1617
Người theo dõi

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

Tổng quan

Chiến lược này sử dụng Stochastic RSI và chỉ số tỷ lệ biến động giá để xác định hướng xu hướng vào nhiều đơn và quản lý rủi ro bằng phương pháp dừng trượt phối hợp.

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

Đầu tiên, chiến lược sử dụng chỉ số RSI dài 5 và chỉ số Stochastic dài 7 để tính Stochastic RSI. K giá trị của Stochastic RSI là tín hiệu đi lên khi nó cao hơn D giá trị và K giá trị thấp hơn D giá trị là tín hiệu đi xuống.

Thứ hai, chiến lược tính toán EMA ROC, chỉ số biến động của giá. Khi EMA ROC cao hơn một nửa so với mức giảm giá hoặc thấp hơn một nửa so với mức giảm giá, giá được coi là đang hoạt động.

Sau đó, kết hợp với tín hiệu đa luồng của Stochastic RSI và chỉ số tỷ lệ biến động giá, hướng xu hướng có thể được xác định. Khi Stochastic RSI là bullish và giá chuyển động tích cực, hãy làm nhiều hơn; Khi Stochastic RSI là bearish và giá chuyển động tích cực, hãy tháo lỗ.

Cuối cùng, chiến lược này quản lý rủi ro bằng cách dừng trượt tọa độ. Sau khi mở vị trí, tiếp tục cập nhật giá cao nhất hoặc giá thấp nhất và dừng lại ở một tỷ lệ nhất định từ giá cao nhất hoặc giá thấp nhất.

Phân tích lợi thế

Chiến lược này có những ưu điểm sau:

  1. Sử dụng Stochastic RSI có thể xác định hiệu quả xu hướng và quá mua quá bán.

  2. Các chỉ số biến động giá có thể lọc ra các thị trường đang có biến động và tránh các tín hiệu sai.

  3. Phương pháp dừng lỗ trượt tọa độ có thể khóa lợi nhuận tối đa, đồng thời cũng có thể kiểm soát rủi ro.

  4. Các tham số chiến lược có thể được tối ưu hóa và điều chỉnh cho các giống khác nhau.

  5. Chiến lược này đơn giản, rõ ràng và dễ hiểu.

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro:

  1. Stochastic RSI có thể tạo ra tín hiệu sai và cần được xác nhận kết hợp với các yếu tố khác.

  2. Hạn chế trượt tọa độ có thể quá mạnh, bị các khoảng cách qua đêm đánh đập.

  3. Sự đảo ngược trong thời gian ngắn có thể dẫn đến việc kích hoạt dừng lỗ.

  4. Các tham số chiến lược cần được tối ưu hóa cho các giống khác nhau, nếu không có thể không hiệu quả.

  5. Chi phí giao dịch có thể ảnh hưởng đến lợi nhuận của chiến lược và cần phải xem xét tần suất giao dịch hợp lý.

Hướng tối ưu hóa

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

  1. Tối ưu hóa các tham số Stochastic RSI, giảm tỷ lệ tín hiệu giả. Các tham số có giá trị K và giá trị D khác nhau có thể được thử nghiệm.

  2. Tối ưu hóa các tham số chỉ số biến động giá để cải thiện hiệu quả lọc. Có thể thử nghiệm các giai đoạn cửa sổ khác nhau và ngưỡng biến động.

  3. Kết hợp các chỉ số đánh giá xu hướng để tránh bị đảo ngược. Ví dụ: thêm các chỉ số như trung bình di chuyển.

  4. Tối ưu hóa tỷ lệ dừng lỗ, giảm rủi ro bị che đậy. Có thể thử nghiệm các mức dừng lỗ khác nhau.

  5. Thêm quản lý số vị trí, kiểm soát rủi ro đơn lẻ. Ví dụ: cố định số tiền dừng lỗ, hoặc điều chỉnh vị trí động theo số dư tài khoản.

  6. Kiểm tra các thông số của các giống khác nhau để cải thiện khả năng thích ứng.

Tóm tắt

Chiến lược tổng thể của chiến lược này rất rõ ràng và đơn giản, sử dụng Stochastic RSI để xác định hướng xu hướng và kết hợp với các tín hiệu lọc chỉ số biến động giá, có thể nắm bắt hiệu quả các cơ hội xu hướng đường dài và đường dài. Phương pháp dừng trượt tọa độ có thể khóa lợi nhuận trong khi kiểm soát rủi ro. Bằng cách tối ưu hóa hơn nữa, chiến lược này có thể trở thành một chiến lược theo dõi xu hướng rất thực tế.

Mã nguồn 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)