Chiến lược đột phá CCI động


Ngày tạo: 2024-02-18 10:13:21 sửa đổi lần cuối: 2024-02-18 10:13:21
sao chép: 1 Số nhấp chuột: 664
1
tập trung vào
1617
Người theo dõi

Chiến lược đột phá CCI động

Tổng quan

Chiến lược phá vỡ CCI động là một chiến lược giao dịch ngắn hạn sử dụng chỉ số CCI để xác định oversold và overbought. Nó kết hợp chỉ số CCI và trung bình WMA, làm nhiều hơn khi chỉ số CCI tăng từ vùng oversold, làm trống khi chỉ số CCI giảm trở lại từ vùng oversold và rút ra sau khi thu lợi nhuận.

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

Chiến lược này sử dụng chỉ số CCI để đánh giá tình trạng quá mua quá bán trên thị trường. Chỉ số CCI có thể xác định hiệu quả các trường hợp bất thường về giá. Khi chỉ số CCI thấp hơn 100, nó được coi là quá bán trên thị trường; Khi cao hơn 100, nó được coi là quá mua trên thị trường.

Trong khi đó, chiến lược này cũng kết hợp với đường trung bình WMA để xác định xu hướng. Chỉ khi giá đóng cửa cao hơn đường trung bình WMA, tín hiệu đa hiệu quả; Chỉ khi giá đóng cửa thấp hơn đường trung bình WMA, tín hiệu bán lẻ có hiệu quả. Điều này có thể lọc một số tín hiệu giao dịch không rõ ràng.

Sau khi vào thị trường, chiến lược sử dụng phương pháp dừng lỗ để kiểm soát rủi ro. Có ba phương thức dừng lỗ có thể lựa chọn: dừng lỗ chiến lược cố định, dừng lỗ phạm vi biến động giá và dừng lỗ ATR. Khi làm nhiều, giá giảm xuống đường dừng lỗ sẽ dừng lỗ thoát; Khi làm trống, giá tăng lên đường dừng lỗ sẽ dừng lỗ thoát.

Phân tích lợi thế

Chiến lược này có một số lợi thế:

  1. Sử dụng chỉ số CCI để xác định cơ hội đảo ngược, bạn có thể bắt kịp thời cơ hội bán quá mức.
  2. Trong khi đó, các nhà đầu tư khác cũng có thể sử dụng các giao dịch theo xu hướng này.
  3. Có nhiều phương thức dừng lỗ có thể lựa chọn, có thể điều chỉnh theo thị trường.
  4. Các tín hiệu chiến lược đơn giản, rõ ràng và dễ thực hiện.

Phân tích rủi ro

Chiến lược này cũng có những rủi ro sau:

  1. Chỉ số CCI dễ gây ra tín hiệu sai và không thể tránh được hoàn toàn.
  2. Phương pháp dừng lỗ không đúng có thể gây ra tổn thất quá mức.
  3. Không thể xác định được xu hướng, tạo ra quá nhiều giao dịch không cần thiết trong một thời điểm chấn động.
  4. Không thể đánh giá được xu hướng của thị trường tổng thể, có thể sẽ bị đảo ngược.

Các biện pháp tối ưu hóa chính cho các rủi ro trên là:

  1. Kết hợp với các chỉ số khác để lọc tín hiệu chỉ số CCI.
  2. Định vị lỗ hổng tối ưu hóa dựa trên phản hồi
  3. Tăng các chỉ số định hướng, tránh các biến động.
  4. Xác định mức hỗ trợ và áp lực lớn, quyết định hướng hoạt động.

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

Chiến lược này có thể được tối ưu hóa từ các khía cạnh sau:

  1. Tối ưu hóa tham số chỉ số CC: điều chỉnh tham số chu kỳ của chỉ số CCI, tối ưu hóa tham số chỉ số.

  2. Tối ưu hóa phương thức dừng lỗ: thử nghiệm các phương thức dừng lỗ khác nhau, chọn phương thức dừng lỗ tối ưu. Có thể thêm phương thức theo dõi dừng lỗ.

  3. Tối ưu hóa các chỉ số lọc: Thêm các chỉ số khác như MACD, RSI, xây dựng hệ thống lọc đa chỉ số, giảm tín hiệu sai.

  4. Tối ưu hóa phán đoán xu hướng: Thêm các chỉ số phán đoán xu hướng như trung bình di chuyển, tránh hoạt động ngược.

  5. Tối ưu hóa dừng tự động: Tạo phương thức dừng động để chiến lược có thể dừng tự động theo biến động của thị trường.

Tóm tắt

Chiến lược phá vỡ CCI động nói chung là một chiến lược giao dịch đường ngắn rất thực tế. Nó sử dụng chỉ số CCI để xác định quá mua quá bán và tham gia vào thị trường bằng cách xác định hướng cân bằng. Kiểm soát rủi ro sử dụng phương pháp dừng lỗ.

Mã nguồn chiến lược
/*backtest
start: 2023-02-11 00:00:00
end: 2023-09-20 00:00:00
period: 1d
basePeriod: 1h
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/
// © tweakerID

// ---From the "Bitcoin Trading Strategies" book, by David Hanson---

// After testing, works better with an ATR stop instead of the Strategy Stop. This paramater
// can be changed from the strategy Inputs panel.

// "CCI Scalping Strategy
// Recommended Timeframe: 5 minutes
// Indicators: 20 Period CCI, 20 WMA
// Long when: Price closes above 20 WMA and CCI is below -100, enter when CCI crosses above -100.
// Stop: Above 20 WMA"

//@version=4
strategy("CCI Scalping Strat", 
     overlay=true, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=10000, 
     commission_value=0.04, 
     calc_on_every_tick=false, 
     slippage=0)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")  

i_Stop = input(0, step=.05, title="Strategy Stop Mult")*.01
i_CCI=input(16, title="CCI Length")
i_WMA=input(5, title="WMA Length")

/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")  

// Backtester General Inputs
i_SL=input(true, title="Use Stop Loss and Take Profit")
i_SLType=input(defval="ATR Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"])
i_SPL=input(defval=10, title="Swing Point Lookback")
i_PercIncrement=input(defval=2, step=.1, title="Swing Point SL Perc Increment")*0.01
i_ATR = input(14, title="ATR Length")
i_ATRMult = input(10, step=.1, title="ATR Multiple")
i_TPRRR = input(1.5, step=.1, title="Take Profit Risk Reward Ratio")

// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1] 
 or strategy.position_size < strategy.position_size[1]

// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na 
entry_HH_price = strategy.position_size < 0 ? HH_price : na 
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR

// ATR Stop
ATR=atr(i_ATR)*i_ATRMult
ATRLong = ohlc4 - ATR
ATRShort = ohlc4 + ATR
ATRLongStop = valuewhen(bought, ATRLong, 0)
ATRShortStop = valuewhen(bought, ATRShort, 0)
LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na 
ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na 
ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR
ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR

/////////////////////// STRATEGY LOGIC /////////////////////////////////////////

//CCI
CCI=cci(close, i_CCI)
//WMA
WMA=wma(close, i_WMA)

//Stops
LongStop=valuewhen(bought, WMA, 0)*(1-i_Stop)
ShortStop=valuewhen(bought, WMA, 0)*(1+i_Stop)
StratTP=strategy.position_avg_price + (strategy.position_avg_price - LongStop)*i_TPRRR
StratSTP=strategy.position_avg_price - (ShortStop - strategy.position_avg_price)*i_TPRRR

BUY = (close > WMA) and crossover(CCI , -100)
SELL = (close < WMA) and crossunder(CCI , 100)

//Trading Inputs
DPR=input(true, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")

// Entries
if reverse
    if not DPR
        strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
    else     
        strategy.entry("long", strategy.long, when=SELL)
        strategy.entry("short", strategy.short, when=BUY)
else
    if not DPR 
        strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
    else
        strategy.entry("long", strategy.long, when=BUY)
        strategy.entry("short", strategy.short, when=SELL)


SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop
SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop
TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP
STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP

strategy.exit("TP & SL", "long", limit=TP, stop=SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=SSL, when=i_SL)

/////////////////////// PLOTS //////////////////////////////////////////////////


plot(WMA)
plot(i_SL and strategy.position_size > 0 ? SL : na , title='SL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size < 0 ? SSL : na , title='SSL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(i_SL and strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, 
 color=color.green, title="Bullish Setup", size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, 
 color=color.red, title="Bearish Setup", size=size.auto)