CCTBBOの逆転追跡戦略

作者: リン・ハーンチャオチャン開催日:2023年11月23日 13:42:03
タグ:

img

概要

この戦略は,スティーブ・カーニッシュによって開発されたCCTボリンガーバンド振動器 (CCTBO) 指標に基づいています.これは,トレーリングストップメカニズムと組み合わせた移動平均値の価格ブレイクを検出することによって価格逆転を特定します.

戦略の論理

この戦略は,CCTBBOの値を計算するために高価格をソースデータとして使用する.オシレーターは -200〜200の間に変動する. 0 は平均価格マイナス2標準偏差,100 は平均価格プラス2標準偏差を表す.オシレーターがEMA線を越えたり,EMA線を下回ったときに取引シグナルが生成される.特に,オシレーターがEMA線を越えたり,それらの間の距離が設定されたマーゲン値よりも大きいとき,ロングポジションが開かれる.オシレーターがEMAラインを下回り,距離がネガティブ設定値未満になったとき,ショートポジションが開かれる.ポジションのマーゲンサイズは設定されたパーセントに応じて計算される.さらに,戦略は,価格変化の百分比またはティック動きの数をベースとしたトレリングストップロスを使用し,ポジションを退出する.

利点分析

  • 影響力の高いCCTボリンガーバンドオシレーター指標を使用して,誤った信号を減らす
  • EMAラインとマージンの条件を組み合わせることで,振動中に過度の無効な取引を避けるためにシグナルをフィルターします.
  • 損失が大きすぎる場合,損失を間に合うようにストップ・ロスの後継メカニズムを適用します.

リスク分析

  • CCTオシレーター自体も 遅延があるため,価格逆転の最適なタイミングが欠けている.
  • 過剰な手数料値と EMA 期間設定が短すぎると取引頻度とリスクが増加します
  • ストップロスの設定が緩すぎると損失リスクが増加する

リスク管理

  • EMAライン期間を調整し,フィルターに長い期間を使用します.
  • リスクと収益をバランスさせるための適切なマージン値を調整する
  • 単一の損失を制御するためにポジションパーセントを減らす
  • より速い停止のために,遅延停止損失範囲を合理的に減らす.

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

戦略は以下の側面で最適化できます.

  1. 入口と出口を決定するために,ボリンジャー帯,ケルトナーチャネルなど,他の変動指標と置き換える
  2. 信号の信頼性を確保するためにMACD,RSIなどの他のフィルタリング指標を追加
  3. EMA期間,マーージン値などのパラメータを自動最適化するために機械学習アルゴリズムを使用します.
  4. 取引リスクを制御するために固定分数,マルティンゲールのようなポジションサイズメカニズムを追加
  5. 流動性またはATRストップを使用した遅延ストップ損失メカニズムの最適化

概要

概要すると,これはCCTボリンジャーバンド指標を使用して価格逆転を特定するための定量的な取引戦略です.特定の利点がありますが,改善の余地もあります.パラメータを最適化し,フィルターを追加し,機能エンジニアリングを使用し,機械学習を導入することで,この戦略の安定性と収益性がさらに向上できます.


/*backtest
start: 2023-11-15 00:00:00
end: 2023-11-17 11:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
// This strategy is based on the CCT Bollinger Band Oscillator (CCTBO) 
// developed by Steve Karnish of Cedar Creek Trading and coded by LazyBear.
// Indicator is available here https://www.tradingview.com/v/iA4XGCJW/

strategy("Strategy CCTBBO v2 | Fadior", shorttitle="Strategy CCTBBO v2", pyramiding=0, precision=2, calc_on_order_fills=false, initial_capital=1000, default_qty_type=strategy.percent_of_equity, currency="USD", default_qty_value=100, overlay=false)

length_stddev=input(title="Stddev loopback period",defval=20)
length_ema=input(title="EMA period", defval=2)
margin=input(title="Margin", defval=0, type=float, step=0.1)
price = input(title="Source", defval=high)
digits= input(title="Number of digits",defval=2,step=1,minval=2,maxval=6)
offset = input(title="Trailing offset (0.01 = 1%) :", defval=0.013, type=float, step=0.01)
pips= input(title="Offset in ticks ?",defval=false,type=bool)

src=request.security(syminfo.tickerid, "1440", price)

cctbbo=100 * ( src + 2*stdev( src, length_stddev) - sma( src, length_stddev ) ) / ( 4 * stdev( src, length_stddev ) )

ul=hline(150, color=gray, editable=true)
ll=hline(-50, color=gray)
hline(50, color=gray)
fill(ul,ll, color=green, transp=90)
plot(style=line, series=cctbbo, color=blue, linewidth=2)
plot(ema(cctbbo, length_ema), color=red)

d = digits == 2 ? 100 : digits == 3 ? 1000 : digits == 4 ? 10000 : digits == 5 ? 100000 : digits == 6 ? 1000000 : na

TS = 1
TO = pips ? offset : close*offset*d
CQ = 100
TSP = TS
TOP = (TO > 0) ? TO : na

longCondition = crossover(cctbbo, ema(cctbbo, length_ema)) and cctbbo - ema(cctbbo, length_ema) > margin
if (longCondition)
    strategy.entry("Long", strategy.long)
    strategy.exit("Close Long", "Long", qty_percent=CQ, trail_points=TSP, trail_offset=TOP)


shortCondition = crossunder(cctbbo, ema(cctbbo, length_ema)) and cctbbo - ema(cctbbo, length_ema) < -margin
if (shortCondition)
    strategy.entry("Short", strategy.short)
    strategy.exit("Close Short", "Short", qty_percent=CQ, trail_points=TSP, trail_offset=TOP)
    
    

もっと