DCCIの脱出戦略

作者: リン・ハーンチャオチャン,日付: 2024-02-18 10:13:21
タグ:

img

概要

DCCIブレイクアウト戦略は,CCI指標を用いて過売りと過買いの状況を特定する短期間の取引戦略である.CCI指標とWMA移動平均線を組み合わせる.CCI指標が過売りゾーンから反発すると長くなって,CCI指標が過買いゾーンから落ちると短くなって,利益を得て終了する.

戦略の論理

この戦略は,CCI指標を使用して市場の過買い/過売り状況を判断する.CCI指標は異常な価格状況を効果的に特定することができます. -100以下の値は市場が過売りであることを示し,100以上の値は市場が過買いであることを示します.CCI指標が下から -100を超えると戦略は長くなり,CCI指標が上から100を超えると戦略は短くなります.

同時,この戦略は,トレンド方向を決定するためにWMA移動平均線も組み込む.閉値がWMA線上にあるときのみ,ロングシグナルが有効である.閉値がWMA線下にあるときのみ,ショートシグナルが有効である.これはいくつかの曖昧な取引信号をフィルタリングするのに役立ちます.

ポジションに入ると,ストップ・ロスはリスクをコントロールするために使用される.オプションのストップ・ロスは3つあります:固定戦略ストップ,スウィング・ハイ・ロースト,ATRストップ.ロングの場合,価格がストップレベルに下がるとポジションがストップされます.ショートの場合,価格がストップレベルに上昇するとポジションがストップされます.

利点分析

この戦略には以下の利点があります.

  1. CCI指標を用いて逆転を特定することで,過剰販売と過剰購入の機会を迅速に把握する.

  2. 移動平均値を用いたトレンド方向分析を組み込むことで,トレンドに反する取引を避けます.

  3. 市場状況に応じて調整できる複数のオプションストップロスの方法を提供します.

  4. シンプルでわかりやすい取引信号です

リスク分析

この戦略には次のリスクもあります

  1. CCIインジケーターは,完全に回避できない偽信号を容易に生成することができる.

  2. 誤ったストップ・ロスの配置が過剰ストップアウトを引き起こす可能性があります.

  3. トレンドを特定できないことは,多岐にわたる市場で不必要な取引が多すぎる可能性があることを意味します.

  4. 市場の全体的な方向性を判断できない場合,間違った方向に取引を起こす可能性があります.

これらのリスクに対処するために,主な最適化アプローチは以下のとおりです.

  1. CCI信号をフィルタリングするための他の指標を組み込む.

  2. バックテストで停止位置を最適化します

  3. 市場が不安定になるのを防ぐために 傾向を特定する指標を追加します

  4. 主要なサポートとレジスタンス領域の分析に基づいて取引の方向性を決定する.

オプティマイゼーションの方向性

この戦略を最適化するための主な側面は以下の通りである.

  1. CCI パラメータ最適化: CCI 振り返り期間を調整し,指標パラメータを最適化します.

  2. ストップ・ロスの最適化: 異なるストップ・メソッドをテストし,最適なストップ・ロスを選択する. トレイリング・ストップを追加することを検討する.

  3. フィルター最適化: MACD,RSIのような追加のフィルターを追加して,偽信号を減らすためのマルチインジケーターフィルタリングシステムを構築します.

  4. トレンドフィルタリング: 反トレンド取引を避けるために移動平均のようなトレンド識別指標を追加します.

  5. 自動利益採取: 市場変動に基づいて自動的に利益を取るために動的な利益採取メカニズムを構築します

結論

DCCIブレイクアウト戦略は,非常に実践的な短期取引システムである.CCI指標を使用して過買い/過売り状況を特定し,方向性バイアスの移動平均を組み込む.リスクはストップ損失によって管理される.シンプルで明確なシグナルにより,この戦略は短期取引で容易に実装できる.継続的なテストと最適化は戦略のパフォーマンスをさらに向上させる.


/*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)
    

もっと