この戦略はコモディティチャネルインデックス (CCI) 指標に基づい,過剰販売条件でロング,過剰購入条件でショートすることを目指している.また,トレンドの方向にのみ取引するために指数関数移動平均 (EMA) フィルターをオプションに使用している.この戦略は固定パーセントまたは平均真数範囲 (ATR) ベースのストップ損失と利益を得ることも提供する.
市場傾向を判断するためにCCI指標を使用する
CCIは,現在の価格と,一定の期間の平均価格を比較することで,勢いを測定する.
CCIが150を超えると買い過ぎで -100を下回ると売過ぎです
選択的に EMA フィルタを使用する
価格がEMA以上で,EMAを下回るとショートするだけです
EMA を使ってトレンドの方向性を決定し,反トレンドの取引を避ける
2種類のストップ・ロストと,利益を取ることを提供する
固定パーセントに基づくストップ損失と利益の引き上げ: 入場価格の固定パーセントを使用する
ATR ベースのストップ・ロストと 利益の引き上げ: ストップ・ロストの ATR マルチプリキュアを使用し,リスク・報酬比に基づいて利益の引き上げを計算します
入国条件
CCIが -100を超えると長引く
CCIが150を下回るとショート
価格がEMAの右側にある場合にのみ入力します.
出口条件
ストップ・ロストまたは/または/または/または/または/または/または/または/または/または/または/または
CCIが買い過ぎ/売り過ぎの領域に戻ったときの閉じた位置
計画
CCIの古典的な使い方として,CCIの入口のために過買い/過売りを使用する.
選択的なEMAは,トレンドに沿って取引を保証し,逆転を避ける
柔軟性のために2種類のストップ・ロスト/テイク・プロフィートを提供
CCIのシグナルで閉店し,再び逆転利益を固定する
グラフィティはCCIのシグナルを明確に強調します
シンプルで明快な論理,理解し最適化しやすい
CCIは遅延効果があり,逆転を逃したり,誤った信号を与える可能性があります.
誤ったEMAパラメータは,トレンドを見逃したり,戦略を非効果的にする可能性があります.
固定パーセントストップ損失/利益の取得は,市場の変化に適応性が低い
ATR ストップ損失/ATR 期間に敏感な利益を取ることは,最適化されるべきです
引き上げリスクが大きいため,ポジションのサイズを調整する必要があります
市場状況によってパフォーマンスが異なります パラメータを再評価します
最適なパラメータ組み合わせを見つけるためにCCI期間を評価する
最良の傾向推定のために,異なるEMA期間をテストする
最適なリスク報酬比のためにストップ損失/収益を調整する
偽信号をさらに避けるために音量などの他のフィルターを追加します
パターン確認のためにトレンドライン/チャートパターンと組み合わせる
引き下げを制御する固定サイズのようなポジションサイズルールを追加する
異なる市場条件におけるバックテスト,動的に調整
この戦略は,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))