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.
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.
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ó.
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)