Quy tắc giao dịch hỗn loạn Chiến lược dừng lỗ

Tác giả:ChaoZhang, Ngày: 2023-11-07 16:44:31
Tags:

img

Tổng quan

Ý tưởng cốt lõi của chiến lược này là thêm một số quy tắc quản lý giao dịch chính dựa trên chiến lược RSI, bao gồm dừng lỗ, lấy lợi nhuận, dừng lỗ sau và theo dõi dừng lỗ đòn bẩy. Điều này cho phép chiến lược đạt được lợi nhuận cao hơn trong các thị trường xu hướng và giảm thiểu lỗ trong các thị trường dao động trong backtest.

Chiến lược logic

Chiến lược đầu tiên tính toán chỉ số RSI. Nó đi dài khi RSI dưới mức bán quá mức và đi ngắn khi RSI trên mức mua quá mức.

Sau khi một tín hiệu dài được kích hoạt, giá cao nhất tại thời điểm đó được ghi nhận là điểm tham chiếu dừng lỗ. Nếu giá giảm xuống dưới điểm dừng lỗ trừ khoảng dừng lỗ, vị trí được đóng bằng cách dừng lỗ.

Sau khi một tín hiệu ngắn được kích hoạt, giá thấp nhất tại thời điểm đó được ghi lại như điểm tham chiếu dừng lỗ. Nếu giá tăng trên điểm dừng lỗ cộng với phạm vi dừng lỗ, vị trí được đóng bằng cách dừng lỗ.

Đồng thời, các khoảng cách lấy lợi nhuận cố định và dừng lỗ được thiết lập. Nếu giá đạt đến khoảng cách lấy lợi nhuận, lấy lợi nhuận để đóng vị trí. Nếu nó đạt đến khoảng cách dừng lỗ, đóng vị trí bằng cách dừng lỗ.

Ngoài ra, một đường dừng lỗ theo dõi đòn bẩy được thiết lập dựa trên đòn bẩy. Nếu giá đạt đến đường dừng lỗ theo dõi đòn bẩy, vị trí được đóng bằng cách dừng lỗ.

Bằng cách theo dõi giá cao nhất trong xu hướng tăng và giá thấp nhất trong xu hướng giảm, kết hợp với khoảng cách lấy lợi nhuận cố định và dừng lỗ, lợi nhuận cao hơn có thể đạt được trong các thị trường xu hướng.

Phân tích lợi thế

Ưu điểm lớn nhất của chiến lược này là việc giới thiệu nhiều quy tắc quản lý giao dịch kiểm soát tốt hơn rủi ro trong khi tận dụng điểm mạnh của chiến lược RSI.

Cụ thể, những lợi thế là:

  1. Chế độ dừng lỗ có thể liên tục theo xu hướng để đạt được lợi nhuận cao hơn trong các thị trường xu hướng.

  2. Lợi nhuận cố định và dừng lỗ khóa trong một số lợi nhuận và tránh toàn bộ lợi nhuận bị xóa sổ khi xu hướng đảo ngược.

  3. Theo dõi đòn bẩy dừng lỗ giúp tránh mở rộng tổn thất và kiểm soát rủi ro.

  4. Sự kết hợp của các phương pháp dừng lỗ khác nhau có thể thực hiện điểm mạnh của họ trong các môi trường thị trường khác nhau, cải thiện sự ổn định tổng thể của chiến lược.

  5. Điều chỉnh linh hoạt các tham số chiến lược phù hợp với các công cụ giao dịch và môi trường thị trường khác nhau.

  6. Định nghĩa dễ hiểu tạo điều kiện cho việc xác minh, tối ưu hóa và áp dụng.

Phân tích rủi ro

Những rủi ro chính của chiến lược này xuất phát từ:

  1. Chính chiến lược RSI có một số rủi ro, có thể kích hoạt dừng lỗ.

  2. Sự dao động xung quanh các điểm dừng lỗ có thể thường xuyên kích hoạt dừng lỗ.

  3. Khoảng cách lấy lợi nhuận không thể khóa hoàn toàn lợi nhuận trong các thị trường xu hướng.

  4. Khoảng cách dừng lỗ cố định có thể quá nhỏ để tránh hoàn toàn tổn thất.

  5. Đòn bẩy quá mức dẫn đến việc dừng lỗ quá gần với giá nhập cảnh.

  6. Thời gian kiểm tra lại có thể không thể đại diện đầy đủ cho các điều kiện thị trường trong tương lai.

Các rủi ro trên có thể được giảm thiểu thông qua điều chỉnh tham số, tối ưu hóa các cơ chế dừng lỗ, kiểm soát rủi ro vv Nhưng không có chiến lược nào có thể tránh hoàn toàn rủi ro thị trường. Kiểm soát rủi ro thích hợp là điều bắt buộc.

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 để giảm các giao dịch whipsaw và kiểm tra các thông số tối ưu cho các thị trường khác nhau.

  2. Hãy thử các chỉ số khác như KD, MACD kết hợp với RSI để lọc các mục nhập.

  3. Sử dụng máy học để tối ưu hóa động các thông số dừng lỗ và lấy lợi nhuận.

  4. Kiểm tra các cơ chế dừng lỗ phức tạp hơn như dừng lỗ dao động, dừng lỗ trung bình, dừng lỗ động v.v.

  5. Tối ưu hóa việc thiết lập đòn bẩy và nghiên cứu tác động đến lợi nhuận và kiểm soát rủi ro.

  6. Điều chỉnh tự động các thông số dựa trên thay đổi chế độ thị trường, như α-Dual Thrust.

  7. Bao gồm các yếu tố khác để xác định sự bền vững của xu hướng, ví dụ năng lượng khối lượng.

  8. Sử dụng các mô hình học sâu để phát triển các cách dừng lỗ mạnh mẽ và dễ giải thích hơn.

  9. Kiểm tra dữ liệu từ các công cụ và khoảng thời gian khác nhau để đánh giá tính vững chắc của chiến lược.

Kết luận

Chiến lược này bổ sung cho chiến lược RSI với các phương pháp dừng lỗ khác nhau, cho phép chơi đầy đủ các hiệu ứng kép của dừng lỗ trong việc kiếm lợi từ xu hướng và kiểm soát rủi ro. Vẫn còn nhiều chỗ để tối ưu hóa. Các ý tưởng có thể được mở rộng sang nhiều chiến lược và công cụ giao dịch hơn.


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

//@version=2
strategy("Adding some essential components to a prebuilt RSI strategy", overlay=true)

/////////////// Component Code Start ///////////////
testStartYear = input(2011, "Backtest Start Year") 
testStartMonth = input(8, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2016, "Backtest Stop Year")
testStopMonth = input(9, "Backtest Stop Month")
testStopDay = input(29, "Backtest Stop Day")
// testStopDay = testStartDay + 1
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
/////////////// Component Code Stop ///////////////

///////////// RSI component /////////////
length = input( 14 )
overSold = input( 30 )
overBought = input( 70 )
price = close

vrsi = rsi(price, length)
notna = not na(vrsi)

/////////////// STRATEGY ///////////////
ts = input(99999, "Trailing Stop") / 100
tp = input(99999, "Take Profit") / 100
sl = input(99999, "Stop Loss") / 100

long = notna and crossover(vrsi, overSold)
short = notna and crossunder(vrsi, overBought)

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 = 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 = 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 = 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])

long_ts = not na(last_high) and high <= (last_high - ts) //and high >= last_open_long_signal
short_ts = not na(last_low) and low >= (last_low + ts) //and low <= last_open_short_signal

long_tp = high >= (last_open_long_signal + tp)
short_tp = low <= (last_open_short_signal - tp)

long_sl = low <= (last_open_long_signal - sl)
short_sl = high >= (last_open_short_signal + sl)

leverage = input(200, "Leverage")
long_call = last_open_long_signal - (0.8 + 0.2 * (1/leverage)) / leverage * last_open_long_signal
short_call = last_open_short_signal + (0.78 + 0.2 * (1/leverage)) / leverage * last_open_short_signal
long_call_signal = low <= long_call
short_call_signal = high >= short_call

if testPeriod()
    strategy.entry("Long", strategy.long, when=long_signal)
    strategy.entry("Short", strategy.short, when=short_signal)

    // plot(long_call, color=red)
    // plot(short_call, color=green)
    strategy.close("Long", when=long_call_signal)
    strategy.close("Short", when=short_call_signal)
    strategy.close("Long", when=long_tp)
    strategy.close("Short", when=short_tp)
    strategy.close("Long", when=long_sl)
    strategy.close("Short", when=short_sl)
    strategy.close("Long", when=long_ts)
    strategy.close("Short", when=short_ts)

Thêm nữa