Một chiến lược giao dịch đảo ngược RSI

Tác giả:ChaoZhang, Ngày: 2024-01-30 17:06:45
Tags:

img

Tổng quan

Chiến lược này xác định các điều kiện thị trường mua quá nhiều và bán quá nhiều bằng cách sử dụng chỉ số RSI để mua ngắn trên các giao thoa giảm trong các khu vực mua quá nhiều và mua dài trên các giao thoa tăng trong các khu vực bán quá nhiều. Đây là một chiến lược giao dịch đảo ngược dựa trên các chỉ số. Chiến lược này kết hợp các điểm dừng theo xu hướng và cố định lấy lợi nhuận / dừng lỗ để kiểm soát hiệu quả rủi ro giao dịch.

Chiến lược logic

Các tín hiệu giao dịch của chiến lược này được tạo ra dựa trên sự chéo chéo tăng / giảm của chỉ số RSI. Chỉ số RSI thường sử dụng 30 như đường bán quá mức và 70 như đường mua quá mức. Khi đường RSI vượt qua đường bán quá mức, một tín hiệu mua được tạo ra. Khi đường RSI vượt qua dưới đường mua quá mức, một tín hiệu bán được tạo ra. Dựa trên logic này, chiến lược xác định các khu vực mua quá mức và bán quá mức và tạo ra các tín hiệu dài / ngắn tương ứng.

Sau khi nhập vào một vị trí, chiến lược sử dụng tỷ lệ phần trăm dừng lại bằng cách liên tục cập nhật giá cao nhất / thấp nhất đạt được và theo dõi một tỷ lệ phần trăm cố định từ đó như mức dừng lỗ.

Phân tích lợi thế

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

  1. Sử dụng chỉ số RSI để xác định mức mua quá mức / bán quá mức là một kỹ thuật giao dịch trưởng thành để nắm bắt một cách đáng tin cậy các thời điểm chuyển đổi thị trường.

  2. Sử dụng chéo tăng / giảm lọc ra một số tín hiệu sai và làm cho giao dịch đáng tin cậy hơn.

  3. Các điểm dừng theo xu hướng khóa lợi nhuận càng nhiều càng tốt, đồng thời có các điểm dừng nhanh để chứa lỗ cho mỗi giao dịch.

  4. Mức TP / SL cố định cũng kiểm soát rủi ro theo giao dịch một cách hiệu quả.

  5. Nhìn chung logic đơn giản và rõ ràng, dễ hiểu và thực hiện, phù hợp cho người mới bắt đầu.

Phân tích rủi ro

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

  1. Các tín hiệu RSI có thể sai, với khả năng thất bại mô hình cao, dẫn đến kích hoạt dừng lỗ.

  2. TP/SL cố định không thể thích nghi với sự biến động của thị trường, có thể cắt giảm lợi nhuận hoặc giảm lỗ.

  3. Tỷ lệ phần trăm chỉ theo sau giá cao nhất / thấp nhất, có thể quá mạnh mẽ để lại lợi nhuận phía sau.

  4. Nguy cơ quá mức như các tham số có thể được tối ưu hóa chỉ cho dữ liệu lịch sử.

  5. Tần suất giao dịch cao làm tăng chi phí giao dịch và trượt.

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

Các cách cải thiện chiến lược:

  1. Tối ưu hóa các thông số RSI cho kết quả tốt nhất.

  2. Thêm các chỉ số bộ lọc để tăng độ chính xác tín hiệu.

  3. Đặt giá/lợi nhuận thích nghi dựa trên biến động thị trường.

  4. Hạn chế tần suất giao dịch để giảm chi phí giao dịch.

  5. Thêm kích thước vị trí để giới hạn lỗ cho mỗi giao dịch.

  6. Kiểm tra lại trong thời gian dài hơn để kiểm tra sự ổn định.

Kết luận

Tóm lại, đây là một chiến lược đảo ngược điển hình sử dụng chỉ số RSI để xác định quá mua / quá bán, với các dấu hiệu chéo bò / gấu như tín hiệu. Các điểm dừng theo xu hướng và TP / SL cố định quản lý rủi ro. Logic đơn giản và dễ thực hiện, phù hợp cho người mới bắt đầu. Nhưng các rủi ro như tín hiệu sai và phù hợp đường cong cần phải được giải quyết thông qua xác minh và tối ưu hóa thêm trước khi giao dịch trực tiếp.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// LOVE JOY PEACE PATIENCE KINDNESS GOODNESS FAITHFULNESS GENTLENESS SELF-CONTROL 
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// Author: © JoshuaMcGowan
// Taken from https://www.tradingview.com/script/GbZGYi6l-Adding-some-essential-components-to-a-prebuilt-RSI-strategy/
// Just updated to compile in version 4. 

//@version=4

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(2100, "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=input.bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

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

// Replace RSI Component, Long/Short, and Long Signal/Short Signal conditions with your trade setup components.
///////////// 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

// Update this with your setup. 
long = notna and crossover(vrsi, overSold)
short = notna and crossunder(vrsi, overBought)

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

// Update this to reflect your setup. 
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

float last_open_long_signal = 0
float last_open_short_signal = 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
last_short_signal = 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

float last_high = 0
float last_low = 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])

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=color.red)
    // plot(short_call, color=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