
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.
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.
Chiến lược này có một số lợi thế:
Chiến lược này cũng có những rủi ro sau:
Các biện pháp tối ưu hóa chính cho các rủi ro trên là:
Chiến lược này có thể được tối ưu hóa từ các khía cạnh sau:
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ố.
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ỗ.
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.
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.
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.
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ỗ.
/*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)