TSI CCI Hull Chiến lược giao dịch trung bình động

Tác giả:ChaoZhang, Ngày: 2023-09-18 17:17:52
Tags:

Tổng quan

Chiến lược này kết hợp TSI, chỉ số CCI và trung bình động Hull để xác định và giao dịch xu hướng. TSI và CCI xác định sóng giá trong khi Hull MA xác nhận hướng xu hướng. Mục tiêu lợi nhuận được thiết lập khi có tín hiệu dài / ngắn cho các bước ra khỏi có lợi nhuận.

Chiến lược logic

Các đường cong TSI và đường tín hiệu được tính toán. Tín hiệu dài khi đường cong vượt qua đường, ngắn trên đường chéo xuống. CCI chỉ ra mức mua quá mức / bán quá mức. Giá vượt qua trên Hull MA cho thấy thị trường tăng, và dưới đó cho thị trường gấu. Các giao dịch dài / ngắn được thực hiện khi các điều kiện đột phá TSI, CCI và Hull MA phù hợp. Mục tiêu lợi nhuận được thiết lập để thoát khỏi các vị trí khi đạt được.

Ưu điểm

  • TSI xác định rõ hướng xu hướng
  • CCI phát hiện hiệu quả việc mua quá mức/bán quá mức
  • Hull MA lọc các tín hiệu cải thiện đột phá giả
  • Mục tiêu lợi nhuận cho phép thoát khỏi mức lợi nhuận cao nhất
  • Kết hợp nhiều chỉ số cải thiện độ bền

Rủi ro

  • Có sự chậm trễ trong TSI, CCI và các chỉ số khác
  • Hull MA không thể xác định hoàn hảo các điểm chuyển hướng
  • Thời gian đảo ngược giá không thể được xác định chính xác
  • Đặt mục tiêu lợi nhuận kém có nguy cơ thiếu tiềm năng lợi nhuận

Rủi ro có thể được giảm bằng cách điều chỉnh các chỉ số, tối ưu hóa các thuật toán lợi nhuận v.v.

Những cải tiến

  • Kết hợp TSI thử nghiệm/CCI để cải thiện độ nhạy
  • Xem xét các mục tiêu lợi nhuận động / kéo dài
  • Thêm các chỉ số khác để xác định sự đảo ngược
  • Kiểm tra trên các sản phẩm khác nhau để cải thiện độ bền

Kết luận

Chiến lược nhiều chỉ số này với mục tiêu lợi nhuận cho thấy kết quả backtest tốt.


/*backtest
start: 2023-08-18 00:00:00
end: 2023-09-17 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="TSI CCI Hull", shorttitle="TSICCIHULL", default_qty_type=strategy.percent_of_equity, default_qty_value=100, calc_on_order_fills= false, calc_on_every_tick=true, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.018)
long = input(title="Long Length", type=input.integer, defval=50)
short = input(title="Short Length", type=input.integer, defval=50)
signal = input(title="Signal Length", type=input.integer, defval=25)
price=input(title="Source",type=input.source,defval=close)
Period=input(26, minval=1)
lineupper = input(title="Upper Line", type=input.integer, defval=100)
linelower = input(title="Lower Line", type=input.integer, defval=-100)
p=price
length= Period
double_smooth(src, long, short) =>
    fist_smooth = ema(src, long)
    ema(fist_smooth, short)
pc = change(price)
double_smoothed_pc = double_smooth(pc, long, short)
double_smoothed_abs_pc = double_smooth(abs(pc), long, short)
tsi_value = 100 * (double_smoothed_pc / double_smoothed_abs_pc)
keh = tsi_value*5 > linelower ? color.red : color.lime
teh = ema(tsi_value*5, signal*5) > lineupper ? color.red : color.lime
meh = ema(tsi_value*5, signal*5) > tsi_value*5 ? color.red : color.lime
i1=plot(tsi_value*5, title="TSI Value", color=color.black, linewidth=1,transp=100)
i2=plot(ema(tsi_value*5, signal*5), title="TSI Signal", color=color.black, linewidth=1,transp=100)
fill(i1,i2,color=meh,transp=85)
plot(cross(tsi_value*5, ema(tsi_value*5, signal*5)) ? tsi_value*5 : na, style=plot.style_circles, color=color.black, linewidth=10)
plot(cross(tsi_value*5, ema(tsi_value*5, signal*5)) ? tsi_value*5 : na, style=plot.style_circles, color=color.white, linewidth=8,transp=0)
plot(cross(tsi_value*5, ema(tsi_value*5, signal*5)) ? tsi_value*5 : na, style=plot.style_circles, color=meh, linewidth=5)
n2ma = 2 * wma(p, round(length / 2))
nma = wma(p, length)
diff = n2ma - nma
sqn = round(sqrt(length))
n1 = wma(diff, sqn)
cci = (p - n1) / (0.015 * dev(p, length))
c = cci > 0 ? color.lime : color.red
c1 = cci > 20 ? color.lime : color.silver
c2 = cci < -20 ? color.red : color.silver
cc=plot(cci, color=c, title="CCI Line", linewidth=2)
cc2=plot(cci[1], color=color.gray, linewidth=1,transp=100)
fill(cc,cc2,color=c,transp=85)
plot(cross(20, cci) ? 20 : na, style=plot.style_cross,title="CCI cross UP",  color=c1, linewidth=2,transp=100,offset=-2)
plot(cross(-20, cci) ? -20 : na, style=plot.style_cross,title="CCI cross down",  color=c2, linewidth=2,transp=100,offset=-2)

TSI1=ema(tsi_value*5, signal*5)
TSI2=ema(tsi_value*5, signal*5)[2]

hullma_smoothed = wma(2*wma(n1, Period/2)-wma(n1, Period), round(sqrt(Period)))
//plot(hullma_smoothed*200)

// Make input options that configure backtest date range
startDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
     defval=2018, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer,
     defval=1, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
     defval=7, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
     defval=9999, minval=1800, maxval=2100)
     
// Look if the close time of the current bar
// falls inside the date range
inDateRange = (time >= timestamp(syminfo.timezone, startYear,
         startMonth, startDate, 0, 0)) and
     (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))
     
LongProfitPercent=input(0.5)
ShortProfitPercent=input(0.5)
LP=(LongProfitPercent/100)+1
SP=(ShortProfitPercent/100)+1

LongProfitSource=input(title="profit long source",type=input.source,defval=close)
ShortProfitSource=input(title="profit short source",type=input.source,defval=close)

longCondition = TSI1>TSI2 and hullma_smoothed<price and cci>0
shortCondition = TSI1<TSI2 and hullma_smoothed>price and cci<0

if (longCondition and cci>cci[1] and cci > 0 and n1>n1[1] and inDateRange)
    strategy.entry("buy", strategy.long)
strategy.close("buy", when = shortCondition and cci<cci[1] and cci < 0 and n1<n1[1] or LongProfitSource>strategy.position_avg_price*LP and inDateRange)
if (shortCondition and cci<cci[1] and cci < 0 and n1<n1[1] and inDateRange)
    strategy.entry("sell", strategy.short)
strategy.close("sell", when = longCondition and cci>cci[1] and cci > 0 and n1>n1[1] or ShortProfitSource<strategy.position_avg_price/SP and inDateRange)

Thêm nữa