Chỉ báo TSI Chỉ báo CCI Chiến lược giao dịch đường trung bình động Hall


Ngày tạo: 2023-09-18 17:17:52 sửa đổi lần cuối: 2023-09-18 17:17:52
sao chép: 4 Số nhấp chuột: 847
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược này sử dụng kết hợp của chỉ số TSI, chỉ số CCI và đường trung bình di chuyển của Hall để đánh giá và giao dịch xu hướng. Chỉ số TSI và chỉ số CCI được sử dụng để xác định xu hướng xu hướng, và đường trung bình của Hall hỗ trợ xác nhận xu hướng.

Nguyên tắc chiến lược

Tính toán đường cong và đường tín hiệu của chỉ số TSI, tạo ra tín hiệu tăng khi đường chỉ số vượt qua đường tín hiệu, tín hiệu giảm khi đi xuống. Đồng thời tính toán chỉ số CCI, xác định khu vực quá mua quá bán.

Phân tích lợi thế

  • Chỉ số TSI có khả năng đánh giá xu hướng mạnh mẽ
  • Chỉ số CCI có thể xác định hiệu quả hiện tượng quá mua quá bán
  • Bộ lọc Hall đồng đều phá vỡ giả để cải thiện chất lượng tín hiệu
  • Thiết lập giá dừng, có thể thoát khi lợi nhuận tối đa hóa
  • Tích hợp nhiều chỉ số, tăng cường ổn định chiến lược

Phân tích rủi ro

  • Các chỉ số như TSI, CCI bị chậm phát triển
  • Đường trung bình của Hall không thể xác định được điểm biến
  • Không thể xác định chính xác thời điểm giá sẽ thay đổi
  • Thiết lập trạm dừng sai có thể thu hẹp không gian lợi nhuận

Có thể làm giảm rủi ro bằng cách điều chỉnh các tham số chỉ số, tối ưu hóa các thuật toán dừng.

Hướng tối ưu hóa

  • Kiểm tra sự kết hợp của các tham số TSI, CCI để tăng độ nhạy của chiến lược
  • Cân nhắc tối ưu hóa các thiết bị dừng động, di động
  • Kết hợp các chỉ số khác để đánh giá điểm đảo ngược xu hướng
  • Thử nghiệm trong các giống khác nhau để cải thiện sức khỏe

Tóm tắt

Chiến lược này kết hợp nhiều chỉ số để đánh giá xu hướng, thiết lập chiến lược dừng khóa lợi nhuận, đo lường hiệu suất tốt hơn. Bằng cách điều chỉnh tham số, có thể trở thành hệ thống giao dịch định lượng ổn định.

Mã nguồn chiến lược
/*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)