勢いを追うCCI戦略

作者: リン・ハーンチャオチャン開催日:2023年10月25日 17:37:39
タグ:

img

概要

この戦略はコモディティチャネルインデックス (CCI) 指標に基づい,過剰販売条件でロング,過剰購入条件でショートすることを目指している.また,トレンドの方向にのみ取引するために指数関数移動平均 (EMA) フィルターをオプションに使用している.この戦略は固定パーセントまたは平均真数範囲 (ATR) ベースのストップ損失と利益を得ることも提供する.

戦略の論理

  1. 市場傾向を判断するためにCCI指標を使用する

    • CCIは,現在の価格と,一定の期間の平均価格を比較することで,勢いを測定する.

    • CCIが150を超えると買い過ぎで -100を下回ると売過ぎです

  2. 選択的に EMA フィルタを使用する

    • 価格がEMA以上で,EMAを下回るとショートするだけです

    • EMA を使ってトレンドの方向性を決定し,反トレンドの取引を避ける

  3. 2種類のストップ・ロストと,利益を取ることを提供する

    • 固定パーセントに基づくストップ損失と利益の引き上げ: 入場価格の固定パーセントを使用する

    • ATR ベースのストップ・ロストと 利益の引き上げ: ストップ・ロストの ATR マルチプリキュアを使用し,リスク・報酬比に基づいて利益の引き上げを計算します

  4. 入国条件

    • CCIが -100を超えると長引く

    • CCIが150を下回るとショート

    • 価格がEMAの右側にある場合にのみ入力します.

  5. 出口条件

    • ストップ・ロストまたは/または/または/または/または/または/または/または/または/または/または/または

    • CCIが買い過ぎ/売り過ぎの領域に戻ったときの閉じた位置

  6. 計画

    • グラフ CCI インジケーター,色域

利点分析

  1. CCIの古典的な使い方として,CCIの入口のために過買い/過売りを使用する.

  2. 選択的なEMAは,トレンドに沿って取引を保証し,逆転を避ける

  3. 柔軟性のために2種類のストップ・ロスト/テイク・プロフィートを提供

  4. CCIのシグナルで閉店し,再び逆転利益を固定する

  5. グラフィティはCCIのシグナルを明確に強調します

  6. シンプルで明快な論理,理解し最適化しやすい

リスク分析

  1. CCIは遅延効果があり,逆転を逃したり,誤った信号を与える可能性があります.

  2. 誤ったEMAパラメータは,トレンドを見逃したり,戦略を非効果的にする可能性があります.

  3. 固定パーセントストップ損失/利益の取得は,市場の変化に適応性が低い

  4. ATR ストップ損失/ATR 期間に敏感な利益を取ることは,最適化されるべきです

  5. 引き上げリスクが大きいため,ポジションのサイズを調整する必要があります

  6. 市場状況によってパフォーマンスが異なります パラメータを再評価します

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

  1. 最適なパラメータ組み合わせを見つけるためにCCI期間を評価する

  2. 最良の傾向推定のために,異なるEMA期間をテストする

  3. 最適なリスク報酬比のためにストップ損失/収益を調整する

  4. 偽信号をさらに避けるために音量などの他のフィルターを追加します

  5. パターン確認のためにトレンドライン/チャートパターンと組み合わせる

  6. 引き下げを制御する固定サイズのようなポジションサイズルールを追加する

  7. 異なる市場条件におけるバックテスト,動的に調整

概要

この戦略は,CCIのクラシックなオーバーバイト/オーバーセール原則を利用してエントリーする. EMAフィルターはトレンドトレードを制御する. 柔軟性のために2種類のストップ・ロスト/テイク・プロフィートが提供されている. グラティングはシグナルを明確に強調する. シンプルで明確な論理,理解し最適化が容易である. パラメータチューニング,フィルター追加,リスク管理などによりさらなる改善が可能である.


/*backtest
start: 2023-09-24 00:00:00
end: 2023-10-24 00:00:00
period: 1h
basePeriod: 15m
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/
// © alifer123

//@version=5
// strategy("CCI+EMA Strategy with Percentage or ATR TP/SL [Alifer]", shorttitle = "CCI_EMA_%/ATR_TP/SL", overlay=false,
//      initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, commission_type=strategy.commission.percent, commission_value=0.045)

length = input(14, "CCI Length")
overbought = input.int(150, step = 10, title = "Overbought")
oversold = input.int(-140, step = 10, title = "Oversold")
src = hlc3
ma = ta.sma(src, length)
cci = (src - ma) / (0.015 * ta.dev(src, length))

// EMA
useEMA = input(true, "Use EMA", tooltip = "Only enters long when price is above the EMA, only enters short when price is below the EMA")
emaLength = input(55, "EMA Length")
var float ema = na
if useEMA
    ema := ta.ema(src, emaLength)

// Take Profit and Stop Loss Method
tpSlMethod_percentage = input(true, "Percentage TP/SL", group="TP/SL Method")
tpSlMethod_atr = input(false, "ATR TP/SL", group="TP/SL Method")

// Percentage-based Take Profit and Stop Loss
tp_percentage = input.float(10.0, title="Take Profit (%)", step=0.1, group="TP/SL Method")
sl_percentage = input.float(10.0, title="Stop Loss (%)", step=0.1, group="TP/SL Method")

// ATR-based Take Profit and Stop Loss
atrLength = input(20, title="ATR Length", group="TP/SL Method")
atrMultiplier = input(4, title="ATR SL Multiplier", group="TP/SL Method")
riskRewardRatio = input(2, title="Risk Reward Ratio", group="TP/SL Method")

// Calculate TP/SL levels based on the selected method, or leave them undefined if neither method is selected
longTP = tpSlMethod_percentage ? strategy.position_avg_price * (1 + tp_percentage / 100) : na
longSL = tpSlMethod_percentage ? strategy.position_avg_price * (1 - sl_percentage / 100) : na
shortTP = tpSlMethod_percentage ? strategy.position_avg_price * (1 - tp_percentage / 100) : na
shortSL = tpSlMethod_percentage ? strategy.position_avg_price * (1 + sl_percentage / 100) : na

if tpSlMethod_atr
    longSL := strategy.position_avg_price - ta.atr(atrLength) * atrMultiplier
    longTP := ((strategy.position_avg_price - longSL) * riskRewardRatio) + strategy.position_avg_price
    shortSL := strategy.position_avg_price + ta.atr(atrLength) * atrMultiplier
    shortTP := ((strategy.position_avg_price - shortSL) * riskRewardRatio) - strategy.position_avg_price

// Enter long position when CCI crosses below oversold level and price is above EMA
longCondition = ta.crossover(cci, oversold) and (not useEMA or close > ema)
if longCondition
    strategy.entry("Buy", strategy.long)

// Enter short position when CCI crosses above overbought level and price is below EMA
shortCondition = ta.crossunder(cci, overbought) and (not useEMA or close < ema)
if shortCondition
    strategy.entry("Sell", strategy.short)

// Close long positions with Take Profit or Stop Loss
if strategy.position_size > 0
    strategy.exit("Long Exit", "Buy", limit=longTP, stop=longSL)

// Close short positions with Take Profit or Stop Loss
if strategy.position_size < 0
    strategy.exit("Short Exit", "Sell", limit=shortTP, stop=shortSL)

// Close positions when CCI crosses back above oversold level in long positions or below overbought level in short positions
if ta.crossover(cci, overbought)
    strategy.close("Buy")
if ta.crossunder(cci, oversold)
    strategy.close("Sell")

// Plotting
color_c = cci > overbought ? color.red : (cci < oversold ? color.green : color.white)
plot(cci, "CCI", color=color_c)
hline(0, "Middle Band", color=color.new(#787B86, 50))
obband = hline(overbought, "OB Band", color=color.new(#78867a, 50))
osband = hline(oversold, "OS Band", color=color.new(#867878, 50))
fill(obband, osband, color=color.new(#787B86, 90))


もっと