Chiến lược hỗ trợ và kháng cự CCI động


Ngày tạo: 2024-01-22 16:37:46 sửa đổi lần cuối: 2024-01-22 16:37:46
sao chép: 1 Số nhấp chuột: 725
1
tập trung vào
1617
Người theo dõi

Chiến lược hỗ trợ và kháng cự CCI động

Tổng quan

Chiến lược này sử dụng các điểm trung tâm của chỉ số CCI để tính toán các mức hỗ trợ và kháng cự động, kết hợp với sự phán đoán xu hướng để tìm kiếm tín hiệu mua và bán. Chiến lược này kết hợp các đặc điểm đảo ngược của CCI và khả năng theo dõi xu hướng nhằm nắm bắt các bước ngoặt trong xu hướng trung bình để tạo ra lợi nhuận.

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

Chỉ số CCI có thể cho thấy thị trường có quá yếu hay quá mạnh hay không, 80 và 80 là hai giới hạn có thể được sử dụng để xác định thị trường có quá mua hay quá bán hay không. Chiến lược này sử dụng tính năng này của CCI, bằng cách tính các nút trên và dưới của mỗi đường 50 K ở hai bên trái và phải, để có được các nút trên và dưới, sau đó xây dựng các đường kháng cự và đường hỗ trợ của khu vực giảm bớt động lực dựa trên các nút.

Khi giá đóng cửa cao hơn giá mở và thấp hơn đường hỗ trợ trên, nó sẽ tạo ra tín hiệu mua; khi giá đóng cửa thấp hơn giá mở và cao hơn đường kháng cự dưới, nó sẽ tạo ra tín hiệu bán. Để lọc tín hiệu giao dịch theo hướng xu hướng không chính thống, chiến lược này cũng kết hợp với EMA và chỉ số tỷ lệ lệ lệ để đánh giá hướng xu hướng chính hiện tại.

Hạn và dừng dựa trên tính toán động của chỉ số ATR, làm cho việc kiểm soát rủi ro của chiến lược này cũng hợp lý hơn.

Phân tích lợi thế

  1. Sử dụng tính năng đảo ngược của chỉ số CCI, chọn mua và bán gần điểm đảo ngược để tăng khả năng kiếm lợi nhuận.
  2. Kết hợp với sự phán đoán xu hướng, tránh hoạt động ngược, giảm tổn thất.
  3. Thiết lập Stop Loss Stop để kiểm soát rủi ro hợp lý hơn.
  4. Các tham số có thể tùy chỉnh như chu kỳ CCI, kích thước vùng đệm, v.v. để phù hợp với nhiều môi trường thị trường.

Phân tích rủi ro

  1. Chỉ số CCI dễ tạo ra các tín hiệu sai lệch và cần được kết hợp với bộ lọc xu hướng.
  2. Việc đảo ngược không nhất thiết phải thành công, và có nguy cơ thua lỗ với xác suất nhất định.
  3. Thiết lập tham số không đúng có thể dẫn đến giao dịch quá thường xuyên hoặc bỏ lỡ cơ hội giao dịch.

Có thể giảm rủi ro bằng cách tối ưu hóa các tham số, điều chỉnh mức dừng lỗ và các phương pháp khác. Ngoài ra, chiến lược này cũng có thể hoạt động như một công cụ phụ trợ cho các chỉ số khác mà không phải hoàn toàn phụ thuộc vào tín hiệu giao dịch của nó.

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

  1. Tối ưu hóa kích thước vùng đệm để phù hợp với thị trường biến động khác nhau.
  2. Tối ưu hóa tham số chu kỳ ATR để có được đà dừng động chính xác hơn.
  3. Hãy thử các thiết lập tham số CCI khác nhau.
  4. Kiểm tra hiệu quả của các chỉ số đánh giá xu hướng khác.

Tóm tắt

Chiến lược này tích hợp khả năng lọc nhiều khoảng trống của chỉ số CCI với xác nhận lọc của phán đoán xu hướng, có giá trị thực tế. Động thái dừng lỗ cũng làm cho chiến lược có thể kiểm soát rủi ro trong ứng dụng thực tế.

Mã nguồn chiến lược
/*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 Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © AliSignals


//@version=5
strategy("CCI based support and resistance strategy", overlay=true  )


cci_length = input.int(50, "cci length")
right_pivot = input.int(50, "right pivot")
left_pivot = input.int(50, "left pivot")
buffer = input.float(10.0, "buffer")
trend_matter = input.bool(true, "trend matter?")
showmid = input.bool ( false , "show mid?")
trend_type = input.string("cross","trend type" ,options = ["cross","slope"])
slowma_l = input.int(100, "slow ma length")
fastma_l = input.int(50, "fast ma length")
slope_l = input.int(5,  "slope's length for trend detection")
ksl = input.float(1.1)
ktp = input.float(2.2)
restf = input.timeframe(title="Time Frame of Last Period for Calculating max" , defval="D")



// Calculating Upper and Lower CCI
cci = ta.cci(hlc3,cci_length)

uppercci = 0.0
lowercci = 0.0

uppercci := fixnan(ta.pivothigh(cci, left_pivot, right_pivot)) - buffer
lowercci := fixnan(ta.pivotlow (cci, left_pivot, right_pivot)) + buffer
midccci  = math.avg(uppercci,lowercci)


// Support and Resistance based on CCI
res = uppercci*(0.015*ta.dev(hlc3,cci_length))+ ta.sma(hlc3,cci_length)
sup = lowercci*(0.015*ta.dev(hlc3,cci_length))+ ta.sma(hlc3,cci_length)
mid =  midccci*(0.015*ta.dev(hlc3,cci_length))+ ta.sma(hlc3,cci_length)



// Calculating trend
t_cross  = 0
t_cross := ta.ema(close,fastma_l) > ta.ema(close,slowma_l) ? 1 : ta.ema(close,fastma_l) < ta.ema(close,slowma_l) ? -1 : t_cross[1] 

t_slope  = 0
t_slope := ta.ema(close,slowma_l) > ta.ema(close,slowma_l)[slope_l] ? 1 : ta.ema(close,slowma_l) < ta.ema(close,slowma_l)[slope_l]  ? -1 : t_slope[1] 

t  = 0
t := trend_type == "cross" ? t_cross : trend_type == "slope" ? t_slope : na

colort =  trend_matter == false ? color.rgb(201, 251, 0) : t == 1 ? color.rgb(14, 243, 132) :  t == -1 ? color.rgb(255, 34, 34) : na
bull_t = trend_matter == false or t ==  1
bear_t = trend_matter == false or t == -1

plot(res, color = colort)
plot(sup, color = colort)
plot(showmid == true ? mid : na)


// Long and Short enter condition
buy  = bull_t == 1 and ta.lowest (2) < sup and close > open and close > sup
sell = bear_t == 1 and ta.highest(2) > res and close < open and close < res

plotshape( buy , color=color.rgb(6, 255, 23) , location = location.belowbar, style = shape.triangleup  , size = size.normal)
plotshape( sell, color=color.rgb(234, 4, 4) ,  location = location.abovebar, style = shape.triangledown, size = size.normal)





atr = ta.atr(100)



CLOSE=request.security(syminfo.tickerid, restf, close)
max = 0.0
max := CLOSE == CLOSE[1] ? math.max(max[1], atr) : atr
act_atr = 0.0
act_atr := CLOSE == CLOSE[1] ? act_atr[1] : max[1]

atr1 =  math.max(act_atr, atr) 

dis_sl = atr1 * ksl
dis_tp = atr1 * ktp


var float longsl  = open[1] - dis_sl
var float shortsl = open[1] + dis_sl
var float longtp =   open[1] + dis_tp
var float shorttp =  open[1] - dis_tp


longCondition = buy
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = sell
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)


longsl  := strategy.position_size > 0  ? longsl[1]  : close - dis_sl
shortsl := strategy.position_size < 0 ? shortsl[1] : close + dis_sl
longtp  := strategy.position_size > 0  ? longtp[1]  : close + dis_tp
shorttp := strategy.position_size < 0 ? shorttp[1] : close - dis_tp




if strategy.position_size > 0 
    strategy.exit(id="My Long close Id", from_entry ="My Long Entry Id" , stop=longsl, limit=longtp)
if strategy.position_size < 0 
    strategy.exit(id="My Short close Id", from_entry ="My Short Entry Id" , stop=shortsl, limit=shorttp)