Strategi ini adalah berdasarkan kepada penunjuk RSI (Relative Strength Index) untuk menentukan keadaan overbought dan oversold. Ia mengambil kedudukan kontra trend apabila RSI mencapai tahap overbought atau oversold untuk membeli rendah dan menjual tinggi. Strategi ini mudah dan berkesan, mendapat keuntungan dari senario overbought dan oversold jangka pendek di pasaran.
Strategi ini menggunakan penunjuk RSI semata-mata sebagai isyarat kemasukan. Ia pergi lama apabila RSI melintasi di bawah titik rendah (patuhan 20), dan pergi pendek apabila RSI melintasi di atas titik tinggi (patuhan 80). Ia berdagang jumlah tetap setiap kali (patuhan $ 100) dan bertujuan untuk keuntungan 1% tanpa mengira keadaan pasaran. Jika kerugian mencapai 3%, ia berhenti. Untuk mengawal kekerapan perdagangan, strategi berhenti berdagang selama 24 bar selepas perdagangan yang kalah.
Logiknya ialah:
Seperti yang dapat kita lihat, strategi ini sangat mudah dan mekanikal. Hampir tidak ada ruang untuk pengoptimuman parameter. Ia semata-mata mengeksploitasi sifat matematik RSI untuk mengambil kedudukan kontra trend di sekitar kawasan overbought / oversold.
Kelebihan terbesar strategi ini adalah kesederhanaan dan kecekapan.
Ia juga melaksanakan nisbah stop loss / mengambil keuntungan untuk mengunci keuntungan dan mengawal risiko, serta penangguhan perdagangan untuk mengurangkan kekerapan.
Risiko utama strategi ini berasal dari:
Tidak dapat memperoleh keuntungan dalam pasaran yang kuat. RSI boleh kekal di zon overbought / oversold untuk tempoh yang panjang apabila trend berterusan.
Stop loss yang terlalu luas boleh membawa kepada kerugian yang berlebihan.
Frekuensi perdagangan yang tinggi boleh menyebabkan perdagangan berlebihan selepas kemenangan.
Fokus risiko $ 100 yang tetap, perlu dioptimumkan kepada peratus modal.
Berdasarkan analisis, strategi ini boleh ditingkatkan dengan cara berikut:
Tambah penapis trend seperti MA untuk menghentikan perdagangan apabila trend tidak jelas.
Mengoptimumkan nisbah stop loss / mengambil keuntungan. mengurangkan stop loss kepada 1-2% dan menggunakan mengambil keuntungan dinamik.
Batasi kekerapan perdagangan, seperti maksimum 2 dagangan setiap tempoh masa.
Saiz dagangan berdasarkan peratusan modal dan bukannya $ 100 tetap.
Mengoptimumkan parameter RSI seperti tempoh, overbought/sold level.
Tambah saiz kedudukan untuk tidak meningkatkan saiz apabila modal meningkat.
Dengan pengoptimuman ini, risiko dapat dikurangkan dan kestabilan dapat ditingkatkan dengan ketara.
Ringkasnya, ini adalah strategi yang mudah dan mudah menggunakan RSI untuk berdagang keadaan overbought / oversold untuk pembalikan purata jangka pendek. Kelebihan adalah kesederhanaan, kecekapan, tidak perlu ramalan, logik yang jelas, mudah diuji. Kelemahannya adalah ketidakupayaan untuk mendapat keuntungan dalam trend yang kuat dan potensi kerugian. Dengan penambahan seperti penapis trend, parameter yang dioptimumkan, saiz kedudukan dll, ia boleh ditingkatkan lagi untuk kestabilan dan keuntungan. Logiknya inovatif dan berharga untuk perdagangan praktikal jika digunakan dengan betul.
/*backtest start: 2023-11-02 00:00:00 end: 2023-11-09 00:00:00 period: 3m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("rsi超买超卖_回测用", overlay=false, initial_capital=50000, currency=currency.USD, default_qty_type=strategy.cash) open_pos = input.int(50000, title = "每次开单资金(usdt)") rsi_period = input.int(14, title = "rsi周期") rsi_line = input.float(20.0, title='RSI触发线', step=0.05) stop_rsi_top_line = input.float(70, title = "顶部rsi止损线") stop_rsi_bottom_line = input.float(30, title = "底部rsi止损线") stop_loss_perc = input.float(0.03, title = "止损线") stop_profit = input.float(0.01, title = "止盈") loss_stop_trade_k = input.int(24, title = "亏损后x根K线不做交易") rsiParam = ta.rsi(close, rsi_period) var int failedTimes = 0 var bool stopTrade = false // plot(rsiParam) if stopTrade failedTimes += 1 if failedTimes == loss_stop_trade_k failedTimes := 0 stopTrade := false // 获取当前持仓方向 checkCurrentPosition() => strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0 curPosition = checkCurrentPosition() // 当前持仓成本价 position_avg_price = strategy.position_avg_price // 当前持单, 触达反向的rsi线,清仓 if curPosition > 0 and rsiParam >= stop_rsi_top_line strategy.close_all(comment = "closebuy") if curPosition < 0 and rsiParam <= stop_rsi_bottom_line strategy.close_all(comment = "closesell") // 止盈止损清仓 if curPosition > 0 // if (position_avg_price - close) / close >= stop_loss_perc // // 止损 // strategy.close_all(comment = "closebuy") // stopTrade := true if (close - position_avg_price) / position_avg_price >= stop_profit // 止盈 strategy.close_all(comment = "closebuy") if curPosition < 0 // if (close - position_avg_price) / position_avg_price >= stop_loss_perc // // 止损 // strategy.close_all(comment = "closesell") // stopTrade := true if (position_avg_price - close) / close >= stop_profit // 止盈 strategy.close_all(comment = "closesell") a = strategy.closedtrades.exit_bar_index(strategy.closedtrades - 1) if bar_index == a and strategy.closedtrades.profit(strategy.closedtrades - 1) < 0 stopTrade := true var float openPrice = 0.0 if rsiParam <= rsi_line and stopTrade == false strategy.entry("long", strategy.long, open_pos / close, comment = "long") if curPosition == 0 openPrice := close strategy.exit("long_stop", "long", limit = openPrice * (1+stop_profit), stop=openPrice * (1-stop_loss_perc), comment = "closebuy") if rsiParam >= 100 - rsi_line and stopTrade == false strategy.entry("short", strategy.short, open_pos / close, comment = "short") if curPosition == 0 openPrice := close strategy.exit("short_stop", "short", limit = openPrice * (1-stop_profit), stop=openPrice * (1+stop_loss_perc), comment = "closesell") plot(failedTimes)