Chiến lược CCI theo dõi động lực

Tác giả:ChaoZhang, Ngày: 2023-10-25 17:37:39
Tags:

img

Tổng quan

Chiến lược này dựa trên chỉ số kênh hàng hóa (CCI), nhằm mục đích mua dài trong điều kiện bán quá mức và mua ngắn trong điều kiện mua quá mức. Nó cũng tùy chọn sử dụng bộ lọc Moving Average (EMA) để chỉ giao dịch theo hướng xu hướng. Chiến lược cũng cung cấp mức dừng lỗ dựa trên tỷ lệ phần trăm cố định hoặc Average True Range (ATR) và lấy lợi nhuận.

Chiến lược logic

  1. Sử dụng chỉ số CCI để xác định xu hướng thị trường

    • CCI đo đạc động lượng bằng cách so sánh giá hiện tại với giá trung bình trong một khoảng thời gian.

    • CCI trên 150 là quá mua, dưới -100 là quá bán

  2. Tùy chọn sử dụng bộ lọc EMA

    • Chỉ mua dài khi giá trên EMA, và ngắn khi dưới EMA

    • Sử dụng EMA để xác định hướng xu hướng, tránh giao dịch ngược xu hướng

  3. Cung cấp hai loại dừng lỗ và lấy lợi nhuận

    • Số lượng cổ phiếu được tính theo các loại cổ phiếu khác nhau.

    • Stop loss và take profit dựa trên ATR: Sử dụng nhân ATR cho stop loss, tính toán take profit dựa trên tỷ lệ phần thưởng rủi ro

  4. Điều kiện nhập cảnh

    • Đi dài khi CCI vượt trên -100

    • Đi ngắn khi CCI vượt dưới 150

    • Nếu EMA được kích hoạt, chỉ nhập khi giá nằm ở bên phải của EMA

  5. Điều kiện xuất cảnh

    • Khóa vị trí khi dừng lỗ hoặc lấy lợi nhuận

    • Định vị đóng cửa khi CCI quay trở lại khu vực mua/bán quá mức

  6. Chuyện âm mưu

    • Biểu đồ chỉ số CCI, vùng mã màu

Phân tích lợi thế

  1. Sử dụng CCI mua quá mức/bán quá mức để vào, một cách sử dụng cổ điển của CCI

  2. EMA tùy chọn đảm bảo giao dịch theo xu hướng, tránh đảo ngược

  3. Cung cấp hai loại dừng lỗ / lấy lợi nhuận để linh hoạt

  4. Đóng trên tín hiệu CCI một lần nữa khóa lợi nhuận đảo ngược

  5. Biểu đồ làm nổi bật các tín hiệu CCI rõ ràng

  6. Logic đơn giản và rõ ràng, dễ hiểu và tối ưu hóa

Phân tích rủi ro

  1. CCI có hiệu quả chậm, có thể bỏ lỡ sự đảo ngược hoặc đưa ra tín hiệu sai

  2. Các thông số EMA sai có thể bỏ lỡ xu hướng hoặc làm cho chiến lược không hiệu quả

  3. Phân phần cố định dừng lỗ/lấy lợi nhuận ít thích nghi hơn với những thay đổi trên thị trường

  4. ATR dừng lỗ / lấy lợi nhuận nhạy cảm với thời gian ATR, nên tối ưu hóa

  5. Rủi ro rút vốn lớn hơn, nên điều chỉnh kích thước vị trí

  6. Hiệu suất khác nhau trong các điều kiện thị trường, đánh giá lại các thông số

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

  1. Đánh giá thời gian CCI để tìm kết hợp các tham số tối ưu

  2. Kiểm tra các giai đoạn EMA khác nhau để ước tính xu hướng tốt nhất

  3. Điều chỉnh stop loss/take profit cho tỷ lệ rủi ro/lợi nhuận tối ưu

  4. Thêm các bộ lọc khác như âm lượng để tránh thêm tín hiệu sai

  5. Kết hợp với đường xu hướng / mô hình biểu đồ để xác nhận mô hình

  6. Thêm các quy tắc định kích thước vị trí như kích thước cố định để kiểm soát rút tiền

  7. Kiểm tra ngược trên các điều kiện thị trường khác nhau, điều chỉnh năng động

Tóm lại

Chiến lược sử dụng các nguyên tắc mua quá mức / bán quá mức CCI cổ điển để vào. Bộ lọc EMA kiểm soát giao dịch xu hướng. Hai loại dừng lỗ / lấy lợi nhuận được cung cấp cho sự linh hoạt. Chế hoạch hóa làm nổi bật các tín hiệu rõ ràng. Logic đơn giản và rõ ràng, dễ hiểu và tối ưu hóa. Có thể cải thiện thêm thông qua điều chỉnh tham số, thêm bộ lọc, kiểm soát rủi ro vv.


/*backtest
start: 2023-09-24 00:00:00
end: 2023-10-24 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © alifer123

//@version=5
// strategy("CCI+EMA Strategy with Percentage or ATR TP/SL [Alifer]", shorttitle = "CCI_EMA_%/ATR_TP/SL", overlay=false,
//      initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, commission_type=strategy.commission.percent, commission_value=0.045)

length = input(14, "CCI Length")
overbought = input.int(150, step = 10, title = "Overbought")
oversold = input.int(-140, step = 10, title = "Oversold")
src = hlc3
ma = ta.sma(src, length)
cci = (src - ma) / (0.015 * ta.dev(src, length))

// EMA
useEMA = input(true, "Use EMA", tooltip = "Only enters long when price is above the EMA, only enters short when price is below the EMA")
emaLength = input(55, "EMA Length")
var float ema = na
if useEMA
    ema := ta.ema(src, emaLength)

// Take Profit and Stop Loss Method
tpSlMethod_percentage = input(true, "Percentage TP/SL", group="TP/SL Method")
tpSlMethod_atr = input(false, "ATR TP/SL", group="TP/SL Method")

// Percentage-based Take Profit and Stop Loss
tp_percentage = input.float(10.0, title="Take Profit (%)", step=0.1, group="TP/SL Method")
sl_percentage = input.float(10.0, title="Stop Loss (%)", step=0.1, group="TP/SL Method")

// ATR-based Take Profit and Stop Loss
atrLength = input(20, title="ATR Length", group="TP/SL Method")
atrMultiplier = input(4, title="ATR SL Multiplier", group="TP/SL Method")
riskRewardRatio = input(2, title="Risk Reward Ratio", group="TP/SL Method")

// Calculate TP/SL levels based on the selected method, or leave them undefined if neither method is selected
longTP = tpSlMethod_percentage ? strategy.position_avg_price * (1 + tp_percentage / 100) : na
longSL = tpSlMethod_percentage ? strategy.position_avg_price * (1 - sl_percentage / 100) : na
shortTP = tpSlMethod_percentage ? strategy.position_avg_price * (1 - tp_percentage / 100) : na
shortSL = tpSlMethod_percentage ? strategy.position_avg_price * (1 + sl_percentage / 100) : na

if tpSlMethod_atr
    longSL := strategy.position_avg_price - ta.atr(atrLength) * atrMultiplier
    longTP := ((strategy.position_avg_price - longSL) * riskRewardRatio) + strategy.position_avg_price
    shortSL := strategy.position_avg_price + ta.atr(atrLength) * atrMultiplier
    shortTP := ((strategy.position_avg_price - shortSL) * riskRewardRatio) - strategy.position_avg_price

// Enter long position when CCI crosses below oversold level and price is above EMA
longCondition = ta.crossover(cci, oversold) and (not useEMA or close > ema)
if longCondition
    strategy.entry("Buy", strategy.long)

// Enter short position when CCI crosses above overbought level and price is below EMA
shortCondition = ta.crossunder(cci, overbought) and (not useEMA or close < ema)
if shortCondition
    strategy.entry("Sell", strategy.short)

// Close long positions with Take Profit or Stop Loss
if strategy.position_size > 0
    strategy.exit("Long Exit", "Buy", limit=longTP, stop=longSL)

// Close short positions with Take Profit or Stop Loss
if strategy.position_size < 0
    strategy.exit("Short Exit", "Sell", limit=shortTP, stop=shortSL)

// Close positions when CCI crosses back above oversold level in long positions or below overbought level in short positions
if ta.crossover(cci, overbought)
    strategy.close("Buy")
if ta.crossunder(cci, oversold)
    strategy.close("Sell")

// Plotting
color_c = cci > overbought ? color.red : (cci < oversold ? color.green : color.white)
plot(cci, "CCI", color=color_c)
hline(0, "Middle Band", color=color.new(#787B86, 50))
obband = hline(overbought, "OB Band", color=color.new(#78867a, 50))
osband = hline(oversold, "OS Band", color=color.new(#867878, 50))
fill(obband, osband, color=color.new(#787B86, 90))


Thêm nữa