Chiến lược thoát khỏi DCCI

Tác giả:ChaoZhang, Ngày: 2024-02-18 10:13:21
Tags:

img

Tổng quan

Chiến lược DCCI Breakout là một chiến lược giao dịch ngắn hạn xác định các tình huống bán quá mức và mua quá mức bằng cách sử dụng chỉ số CCI. Nó kết hợp chỉ số CCI và đường trung bình động WMA.

Chiến lược logic

Chiến lược sử dụng chỉ số CCI để đánh giá các điều kiện mua quá mức / bán quá mức của thị trường. Chỉ số CCI có thể xác định hiệu quả các tình huống giá bất thường. Giá trị dưới -100 cho thấy thị trường đã bán quá mức trong khi giá trị trên 100 cho thấy thị trường đã mua quá mức. Chiến lược sẽ dài khi chỉ số CCI vượt qua -100 từ dưới; và sẽ ngắn khi chỉ số CCI vượt qua dưới 100 từ trên.

Đồng thời, chiến lược cũng kết hợp đường trung bình động WMA để xác định hướng xu hướng. Chỉ khi giá đóng trên đường WMA, tín hiệu dài sẽ có giá trị; chỉ khi giá đóng dưới đường WMA, tín hiệu ngắn sẽ có giá trị. Điều này giúp lọc ra một số tín hiệu giao dịch mơ hồ.

Sau khi nhập vào một vị trí, chiến lược sử dụng stop loss để kiểm soát rủi ro. Có ba phương pháp stop loss tùy chọn: dừng chiến lược cố định, dừng xoay cao / thấp, dừng ATR. Khi dài, vị trí sẽ bị dừng nếu giá giảm xuống mức dừng; khi ngắn, vị trí sẽ bị dừng nếu giá tăng lên mức dừng.

Phân tích lợi thế

Chiến lược có những lợi thế sau:

  1. Nhận các cơ hội bán quá mức và mua quá mức kịp thời bằng cách xác định sự đảo ngược bằng cách sử dụng chỉ số CCI.

  2. Tránh giao dịch chống lại xu hướng bằng cách kết hợp phân tích hướng xu hướng bằng cách sử dụng đường trung bình động.

  3. Cung cấp nhiều phương pháp dừng lỗ tùy chọn có thể được điều chỉnh dựa trên điều kiện thị trường.

  4. Các tín hiệu giao dịch đơn giản và rõ ràng 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 có thể dễ dàng tạo ra các tín hiệu sai mà không thể tránh hoàn toàn.

  2. Việc đặt stop loss không đúng có thể gây ra quá nhiều stop out.

  3. Không thể xác định xu hướng có nghĩa là quá nhiều giao dịch không cần thiết có thể được tạo ra trên các thị trường khác nhau.

  4. Không có khả năng đánh giá hướng thị trường tổng thể có thể dẫn đến giao dịch theo hướng sai.

Để đối phó với những rủi ro này, các phương pháp tối ưu hóa chính là:

  1. Kết hợp các chỉ số khác để lọc tín hiệu CCI.

  2. Tối ưu hóa vị trí dừng thông qua backtesting.

  3. Thêm các chỉ số xác định xu hướng để tránh thị trường hỗn loạn.

  4. Xác định hướng giao dịch dựa trên phân tích các khu vực hỗ trợ và kháng cự chính.

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

Các khía cạnh chính để tối ưu hóa chiến lược này bao gồm:

  1. Tối ưu hóa tham số CCI: Điều chỉnh thời gian truy cập CCI, tối ưu hóa các tham số chỉ số.

  2. Tối ưu hóa Stop Loss: Kiểm tra các phương pháp dừng khác nhau và chọn stop loss tối ưu.

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

  4. Trình lọc xu hướng: Thêm các chỉ số xác định xu hướng như đường trung bình động để tránh giao dịch chống xu hướng.

  5. Lợi nhuận tự động: Xây dựng các cơ chế lấy lợi nhuận năng động để tự động lấy lợi nhuận dựa trên biến động thị trường.

Kết luận

Nhìn chung, Chiến lược DCCI Breakout là một hệ thống giao dịch ngắn hạn rất thực tế. Nó xác định các tình huống mua quá mức / bán quá mức bằng cách sử dụng chỉ số CCI và kết hợp trung bình động cho thiên vị hướng. Rủi ro được quản lý thông qua dừng lỗ. Các tín hiệu đơn giản và rõ ràng làm cho chiến lược này dễ dàng thực hiện cho giao dịch ngắn hạn. Kiểm tra và tối ưu hóa liên tục có thể cải thiện hơn nữa hiệu suất 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)
    

Thêm nữa