Chiến lược đảo ngược kết hợp chỉ số RSI trung bình di chuyển kép

Tác giả:ChaoZhang, Ngày: 2023-11-10 18:01:09
Tags:

img

Tổng quan

Chiến lược này kết hợp hai đường trung bình động, chỉ số sức mạnh tương đối (RSI) và SAR parabolic (PSAR) để xác định các điểm đảo ngược giá và đưa ra quyết định mua và bán phù hợp.

Nguyên tắc

Chiến lược chủ yếu sử dụng các chỉ số kỹ thuật sau đây để xác định các điểm đảo ngược giá:

  1. Đường trung bình di chuyển kép: Tính toán đường trung bình di chuyển nhanh (MA đường nhanh) và đường trung bình di chuyển chậm (MA đường chậm). Khi đường nhanh vượt qua đường chậm, nó cho thấy thị trường tăng và đi dài. Khi đường nhanh vượt qua dưới đường chậm, nó cho thấy thị trường gấu và đi ngắn.

  2. Chỉ số RSI: Chỉ số RSI đánh giá các điều kiện mua quá mức và bán quá mức bằng cách tính toán lợi nhuận đóng cửa trung bình và lỗ đóng cửa trung bình trong một khoảng thời gian.

  3. Chỉ số PSAR: SAR Parabolic chỉ ra hướng xu hướng. Các điểm SAR dưới giá cho thấy thị trường tăng và trên giá cho thấy thị trường gấu.

  4. Chỉ số ADX: ADX đo sức mạnh của xu hướng bằng cách tính toán chuyển động theo hướng. ADX trên 20 báo hiệu thị trường xu hướng và dưới 20 báo hiệu củng cố.

Lý thuyết cho tín hiệu mua và bán là như sau:

Tín hiệu mua: MA nhanh vượt trên MA chậm, RSI dưới 30 (đã bán quá), điểm SAR trên giá, ADX trên 20.

Tín hiệu bán: MA nhanh vượt qua dưới MA chậm, RSI trên 70 (đã mua quá mức), điểm SAR dưới giá, ADX trên 20.

Khi tín hiệu mua hoặc bán xảy ra, hãy có một vị trí với 10% vốn chủ sở hữu tương ứng. đóng vị trí kịp thời khi tín hiệu đảo ngược thất bại.

Ưu điểm

  • Các MA kép xác định hướng xu hướng chính, với RSI và SAR lọc các tín hiệu sai, có thể xác định chính xác các điểm đảo ngược.

  • Kết hợp nhiều chỉ số ngăn chặn các tín hiệu sai từ một chỉ số duy nhất.

  • Stop loss tránh rủi ro quá mức.

  • Logic đơn giản và rõ ràng làm cho nó dễ dàng thực hiện.

  • Nó hoạt động cho cả xu hướng tăng và giảm.

Rủi ro và giải pháp

  • Các MAs kép có thể có breakout sai. Hãy xem xét các khoảng thời gian MA dài hơn hoặc thêm Bollinger Bands để xác nhận breakout thực sự.

  • RSI có thể tạo ra các tín hiệu sai nếu không được đặt đúng cách.

  • Dừng giao dịch khi ADX dưới 20 để tránh giao dịch đảo ngược trong thị trường không hướng.

  • SetStringry stop loss có thể gây ra lỗ không cần thiết. Đặt stop loss hợp lý dựa trên biến động thị trường.

  • Tần suất giao dịch cao. Điều chỉnh thời gian MA để giảm tần suất giao dịch.

Cải thiện

  • Kiểm tra các khoảng thời gian MA khác nhau để tìm ra sự kết hợp tối ưu.

  • Kiểm tra các thông số RSI khác nhau để đánh giá mua quá mức / bán quá mức tốt hơn.

  • Thêm các chỉ số khác như Bollinger Bands, KDJ để làm phong phú logic.

  • Thiết lập stop loss năng động dựa trên các sản phẩm và thị trường khác nhau.

  • Thêm kích thước vị trí để theo dõi xu hướng tốt hơn.

  • Kiểm tra các thông số ADX khác nhau để tìm ra giá trị tốt nhất để xác định sức mạnh xu hướng.

  • Thêm chức năng mất mát dừng tự động.

Kết luận

Chiến lược này xác định hướng xu hướng chính bằng cách sử dụng hai MAs và sử dụng RSI, SAR để lọc tín hiệu bổ sung. Nó có thể xác định hiệu quả các điểm đảo ngược sau khi tối ưu hóa tham số và bắt được xu hướng xung quanh sự đảo ngược. Trong thực tế, quản lý rủi ro bằng cách dừng lỗ đúng cách và tối ưu hóa tham số liên tục là quan trọng. Nhìn chung, chiến lược kết hợp các chỉ số với logic rõ ràng và hoạt động dễ dàng, làm cho nó trở thành một chiến lược giao dịch đảo ngược đáng tin cậy.


/*backtest
start: 2023-10-10 00:00:00
end: 2023-11-09 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
//Based on Senpai BO 3
strategy(title="Senpai_Strat_3", shorttitle="Senpai_Strat_3", overlay=false, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
src = close

//psar
start = input(0.02)
increment = input(0.02)
maximum = input(0.2)
psar = sar(start, increment, maximum)


//ADX Init
adxlen = input(30, title="ADX Smoothing")	
dilen = input(30, title="DI Length")	
dirmov(len) =>	
	up = change(high)
	down = -change(low)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange)
	minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, len) / truerange)
	[plus, minus]
	
adx(dilen, adxlen) => 	
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
	[adx, plus, minus]
	
[sig, up, down] = adx(dilen, adxlen)	


// BB Init
source = close
length = input(50, minval=1)
mult = input(0.5, title="Mult Factor", minval=0.001, maxval=50)
alertLevel=input(0.1)
impulseLevel=input(0.75)
showRange = input(false, type=bool)


//RSI CODE
up1 = rma(max(change(src), 0), 14)
down1 = rma(-min(change(src), 0), 14)
rsi = down1 == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up1 / down1))


//BB CODE
basis = sma(source, length)
dev = mult * stdev(source, length)
upper = basis + dev
lower = basis - dev
bbr = source>upper?(((source-upper)/(upper-lower))/10): source<lower?(((source-lower)/(upper-lower))/10) : 0.05
bbi = bbr - nz(bbr[1]) 

//////////////////// Algo

//if (rsi>50 and n1>n2)
   //strategy.exit("Close", "Short")
  // strategy.entry("Long", strategy.long)
//if (rsi<50 and n2>n1)
   //strategy.exit("Close", "Long")
//   strategy.entry("Short", strategy.short)

//col = ma30 > ma50 > ma200 and rsi <=53?lime: ma50 < ma200  and rsi >= 60?red : silver
//short1 =  sig<18.5 and high>=upper and rsi>=70 and psar<close = 100%
//long1 = sig<18.5 and low<=lower and rsi<=30 and psar>close = 100%
short1 =  sig<18.5 and high>=upper and rsi>=70 and psar<close
long1 = sig<18.5 and low<=lower and rsi<=30 and psar>close

//Entry

long = long1[1] == 0 and long1 == 1
short = short1[1] == 0 and short1 == 1
longclose = long[3] == 1
shortclose = short[3] == 1
strategy.entry("short", strategy.short,qty = 10, when=short)
strategy.entry("long", strategy.long,qty=10, when=long)
strategy.close("long",when=longclose)
strategy.close("short",when=shortclose)



/////////////////////
///PLOT

plot(long,"long",color=green,linewidth=1)
plot(short,"short",color=red,linewidth=1)
plot(longclose,"close",color=blue,linewidth=1)
plot(shortclose,"close",color=orange,linewidth=1)


//plot(short,"short",color=red,linewidth=1)
//

//strategy.exit(id="long",qty = 100000,when=longclose)
//strategy.exit(id="short",qty = 100000,when=shortclose)

//strategy.exit(id="Stop", profit = 20, loss = 100)

Thêm nữa