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

Tác giả:ChaoZhang, Ngày: 2024-01-22 16:37:46
Tags:

img

Tổng quan

Chiến lược này sử dụng các điểm pivot của chỉ số CCI để tính toán mức hỗ trợ và kháng cự năng động và kết hợp đánh giá xu hướng để tìm tín hiệu mua và bán. Chiến lược tích hợp các đặc điểm đảo ngược của CCI và khả năng theo dõi xu hướng để nắm bắt các điểm đảo ngược trong xu hướng trung hạn cho 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. Hai cực 80 và -80 có thể được sử dụng để xác định xem thị trường đã bước vào trạng thái mua quá nhiều hay bán quá nhiều. Chiến lược này sử dụng đặc điểm này của CCI. Bằng cách tính điểm trục của 50 thanh bên trái và bên phải, các điểm trục trên và dưới được thu được. Sau đó các đường hỗ trợ và kháng cự được xây dựng năng động bằng cách thêm hoặc trừ một bộ đệm dựa trên các điểm trục.

Một tín hiệu mua được tạo ra khi kết thúc cao hơn mức mở và thấp hơn mức hỗ trợ trên. Một tín hiệu bán được tạo ra khi kết thúc thấp hơn mức mở và cao hơn mức kháng cự dưới. Để lọc các tín hiệu giao dịch chống lại hướng xu hướng chính, chiến lược cũng kết hợp EMA và chỉ số độ dốc để xác định hướng xu hướng chính hiện tại. Các giao dịch đầu vào dài chỉ được đặt khi xu hướng được xác định là tăng. Các giao dịch đầu vào ngắn chỉ được đặt khi xu hướng được xác định là giảm.

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

Phân tích lợi thế

  1. Trong khi đó, các khoản đầu tư của các công ty có thể được tính như là các khoản đầu tư của các công ty khác, trong khi các khoản đầu tư của các công ty có thể là các khoản đầu tư của các công ty khác.
  2. Kết hợp với phán đoán xu hướng tránh giao dịch chống lại xu hướng và giảm lỗ.
  3. Chế độ dừng lỗ và lấy lợi nhuận động làm cho kiểm soát rủi ro hợp lý hơn.
  4. Các tham số có thể tùy chỉnh như chiều dài CCI, kích thước đệm, vv thích nghi với nhiều môi trường thị trường hơn.

Phân tích rủi ro

  1. Chỉ số CCI có xu hướng tạo ra các tín hiệu sai, cần lọc từ đánh giá xu hướng.
  2. Việc đảo ngược không phải lúc nào cũng thành công, với một nguy cơ mất mát nhất định.
  3. Cài đặt tham số không chính xác có thể dẫn đến giao dịch quá mức hoặc bỏ lỡ cơ hội.

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

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

  1. Tối ưu hóa kích thước đệm để thích nghi với các thị trường có mức độ biến động khác nhau.
  2. Tối ưu hóa các tham số thời gian ATR để chính xác hơn stop loss động và lấy lợi nhuận.
  3. Kiểm tra các thiết lập tham số CCI khác nhau.
  4. Kiểm tra tác động của các loại chỉ số đánh giá xu hướng khác.

Kết luận

Chiến lược này tích hợp khả năng sàng lọc dài / ngắn từ CCI và xác nhận bộ lọc từ phán đoán xu hướng, có một giá trị thực tế nhất định.


/*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)



Thêm nữa