RSI nhiều khung thời gian và chiến lược giao dịch trung bình động

Tác giả:ChaoZhang, Ngày: 2024-01-22 11:00:20
Tags:

img

Tổng quan

Chiến lược này kết hợp chỉ số RSI, trung bình di chuyển đơn giản (SMA) và trung bình di chuyển cân nhắc (WMA) để xác định tín hiệu giao dịch. Nó đánh giá hướng xu hướng đồng thời trên khung thời gian 5 phút và 1 giờ.

Chiến lược logic

Chiến lược đầu tiên tính toán WMA 144 giai đoạn và SMA 5 giai đoạn trên cả khung thời gian 1 giờ và 5 phút. Một thị trường tăng chỉ được xác định khi SMA 5 phút trên WMA. Chiến lược sau đó tính toán dao động RSI và các đường K và D tương ứng. Các tín hiệu bán được tạo ra khi đường K vượt qua dưới đường D từ khu vực mua quá mức. Các tín hiệu mua được tạo ra khi đường K vượt qua đường D từ khu vực bán quá mức.

Phân tích lợi thế

Đây là một chiến lược theo dõi xu hướng rất hiệu quả. Bằng cách kết hợp hai khung thời gian để xác định xu hướng, nó làm giảm đáng kể các tín hiệu sai. Ngoài ra, nó kết hợp nhiều bộ lọc bao gồm RSI, SMA và WMA để làm cho các tín hiệu đáng tin cậy hơn. Bằng cách điều khiển KDJ với RSI, nó cũng tránh một số tín hiệu sai vốn có trong chiến lược KDJ bình thường. Hơn nữa, cài đặt stop loss và take profit thích hợp giúp khóa lợi nhuận và kiểm soát rủi ro.

Phân tích rủi ro

Nguy cơ lớn nhất của chiến lược này nằm ở việc đánh giá xu hướng sai. Tại các điểm chuyển đổi, các đường trung bình động ngắn hạn và dài hạn có thể xoay ngược lên hoặc xuống cùng nhau, dẫn đến các tín hiệu sai. Ngoài ra, RSI có thể tạo ra các tín hiệu ồn ào hơn trong các thị trường dao động. Tuy nhiên, những rủi ro này có thể được giảm bằng cách điều chỉnh đúng thời gian của các tham số SMA, WMA và RSI.

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

Chiến lược có thể được cải thiện từ các khía cạnh sau:

  1. Kiểm tra chiều dài khác nhau của SMA, WMA và RSI để tìm sự kết hợp tối ưu
  2. Kết hợp các chỉ số khác như MACD, Bollinger Bands để xác minh độ tin cậy của tín hiệu
  3. Tối ưu hóa cơ chế dừng lỗ và lấy lợi nhuận bằng cách thử nghiệm dừng tỷ lệ cố định, dừng kéo theo v.v.
  4. Thêm các mô-đun quản lý vốn để kiểm soát kích thước giao dịch và rủi ro tổng thể
  5. giới thiệu các mô hình học máy để tìm các thông số hiệu suất tốt nhất thông qua backtesting quy mô lớn

Tóm lại

Chiến lược này sử dụng đầy đủ các điểm mạnh của các đường trung bình động và dao động để thiết lập một hệ thống theo xu hướng tương đối vững chắc. Bằng cách xác nhận tín hiệu trên nhiều khung thời gian và chỉ số, nó có thể dễ dàng nắm bắt các xu hướng trung và dài hạn. Cài đặt dừng lỗ và lấy lợi nhuận cũng giúp nó chịu được biến động thị trường bình thường ở một mức độ nhất định. Tuy nhiên, vẫn còn chỗ để cải thiện, chẳng hạn như thử nghiệm nhiều kết hợp chỉ số hơn, tận dụng máy học để tối ưu hóa tham số. Nhìn chung, đây là một chiến lược giao dịch rất hứa hẹn.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © bufirolas

// Works well with a wide stop with 20 bars lookback
// for the SL level and a 2:1 reward ratio Take Profit .
// These parameters can be modified in the Inputs section of the strategy panel.

// "an entry signal it's a cross down or up on
// the stochastics. if you're in a downtrend
// on the hourly time frame you
// must also be in a downtrend on the five
// minute so the five period has to be below the 144
// as long as the five period is still trading below
// the 144 period on both the hourly and the five minutes
// we are looking for these short signals crosses down
// in the overbought region of the stochastic. Viceversa for longs"

//@version=4
strategy("Stoch + WMA + SMA strat", overlay=true)

//SL & TP Inputs
i_SL=input(true, title="Use Swing Lo/Hi Stop Loss & Take Profit")
i_SwingLookback=input(20, title="Swing Lo/Hi Lookback")
i_SLExpander=input(defval=10, step=1, title="SL Expander")
i_TPExpander=input(defval=30, step=1, title="TP Expander")
i_reverse=input(false, title="Reverse Trades")
i_TStop =input(false, title="Use Trailing Stop")

//Strategy Inputs
src4 = input(close, title="RSI Source")
stochOS=input(defval=20, step=5, title="Stochastics Oversold Level")
stochOB=input(defval=80, step=5, title="Stochastics Overbought Level")

//Stoch rsi Calculations
smoothK = input(3, minval=1)
smoothD = input(3, minval=1)
lengthRSI = input(14, minval=1)
lengthStoch = input(14, minval=1)
rsi1 = rsi(src4, lengthRSI)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)
h0 = hline(80, linestyle=hline.style_dotted)
h1 = hline(20, linestyle=hline.style_dotted)

//MA
wmalen=input(defval=144, title="WMA Length")
WMA = security(syminfo.tickerid, "60", wma(close, wmalen))
SMA = security(syminfo.tickerid, "60", sma(close, 5))
minWMA = wma(close, wmalen)
minSMA = sma(close, 5)

//Entry Logic
stobuy = crossover(k, d) and k < stochOS
stosell = crossunder(k, d) and k > stochOB
mabuy = minSMA > minWMA
daymabuy = SMA > WMA

//SL & TP Calculations
SwingLow=lowest(i_SwingLookback)
SwingHigh=highest(i_SwingLookback)
bought=strategy.position_size != strategy.position_size[1]
LSL=valuewhen(bought, SwingLow, 0)-((valuewhen(bought, atr(14), 0)/5)*i_SLExpander)
SSL=valuewhen(bought, SwingHigh, 0)+((valuewhen(bought, atr(14), 0)/5)*i_SLExpander)
lTP=(strategy.position_avg_price + (strategy.position_avg_price-(valuewhen(bought, SwingLow, 0)))+((valuewhen(bought, atr(14), 0)/5)*i_TPExpander))
sTP=(strategy.position_avg_price - (valuewhen(bought, SwingHigh, 0) - strategy.position_avg_price))-((valuewhen(bought, atr(14), 0)/5)*i_TPExpander)
islong=strategy.position_size > 0
isshort=strategy.position_size < 0

//TrailingStop
dif=(valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, high,0))
 -strategy.position_avg_price
trailOffset     = strategy.position_avg_price - LSL
var tstop = float(na)
if strategy.position_size > 0
    tstop := high- trailOffset - dif
    if tstop<tstop[1]
        tstop:=tstop[1]
else
    tstop := na
StrailOffset     = SSL - strategy.position_avg_price
var Ststop = float(na)
Sdif=strategy.position_avg_price-(valuewhen(strategy.position_size<0 
 and strategy.position_size[1]>=0, low,0))
if strategy.position_size < 0
    Ststop := low+ StrailOffset + Sdif
    if Ststop>Ststop[1]
        Ststop:=Ststop[1]
else
    Ststop := na
    
//Stop Selector
SL= islong ? LSL : isshort ? SSL : na
if i_TStop 
    SL:= islong ? tstop : isshort ? Ststop : na
TP= islong ? lTP : isshort ? sTP : na


//Entries
if stobuy and mabuy and daymabuy
    strategy.entry("long", long=not i_reverse?true:false)
if stosell and not mabuy and not daymabuy
    strategy.entry("short", long=not i_reverse?false:true)


//Exit
if i_SL
    strategy.exit("longexit", "long", stop=SL, limit=TP)
    strategy.exit("shortexit", "short", stop=SL, limit=TP)

//Plots
plot(i_SL ? SL : na, color=color.red, style=plot.style_cross)
plot(i_SL ? TP : na, color=color.green, style=plot.style_cross)
plot(minWMA)
plot(minSMA, color=color.green)




Thêm nữa