この戦略は,市場動向を特定し,ブレイカー戦略を実装するために,ボリンジャーバンドと組み合わせた主要な技術指標としてCBMAを使用しています.価格が上部帯を超えるとショートになり,価格が下部帯を下回るとロングになります.これは人気のあるダブルトラックブレイカーシステムに属します.
CBMAを計算する: 価格変動を効果的に追跡できるCBMAをスムーズにするために適応型EMAを使用する.
ボリンジャー帯のパラメータを設定:CBMAを中間帯として使用し,市場に応じて調整できる標準偏差倍数を使用して上部/下部帯を設定します.
ブレイクトレード:価格が上位帯を突破すると売却し,価格が下位帯を突破すると購入し,トレンドフォローブレイカー戦略を使用します.
キャンセル・フラッシュ・オーダーで 一度に1つの方向で取引する
固定オーダーサイズを設定します 資本に応じて調整できます
CBMAは流暢性があり,価格を効果的に追跡できる.
アダプティブ EMAは移動平均の反応性を最適化します
上下帯は突破時に 明確な方向信号を出す
トレンドフォロワーモデルでは ショットソー取引を避けます
固定オーダーサイズが単一の取引リスクを制御する.
ブロンジャー・バンドのパラメータは最適化が必要です 幅が幅も狭すぎると問題が発生します
突破信号には 偽突破があるかもしれない
損失を制御するには ストップ損失が必要です
固定オーダーサイズは 市場に基づいて位置を調整することはできません.
取引は"つの方向にしか行われず,それ以上の利益を得ることはできません.
ボリンジャー・バンドのパラメータを動的に最適化して 市場に適したものにします
フィルタリングの指標を追加して 偽の突破を避ける
利潤をロックするには ストップロスを追加します
ハッジ・トレーディングは 利益の拡大のために 長期・短期の両方を行います
位置測定システムを追加します.
この戦略は,明確なブレイクアウト信号のためにボリンジャーバンドと組み合わせた適応型移動平均技術を使用するブレイカートレンドフォローシステムです. シンプルな論理と固定オーダーサイズがリスクを制御し,実用的な価値があります. しかし,誤ったブレイクアウトやパラメータ最適化などの問題は残っています. リスクを制御しながら実際の取引パフォーマンスを向上させ,強化するためにより多くの指標が必要です. 全体的に,改善の余地が豊富で立派なスタートブレイクアウトシステムです.
/*backtest start: 2023-10-29 00:00:00 end: 2023-11-05 00:00:00 period: 3m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="CBMA Bollinger Bands Strategy directed [ChuckBanger]", shorttitle="CBMA BB CB", overlay=true ) length = input(title="Length", type=input.integer, defval=12, minval=1) regular = input(title="Regular BB Or CBMA?", type=input.bool, defval=false) src = input(title="Source", type=input.source, defval=close) mult = input(title="Multipler", type=input.float, defval=2.3, minval=.001, maxval=50, step=.1) emaLen = input(title="EMA Length", type=input.integer, defval=11, minval=1) emaGL = input(title="EMA Gain Limit", type=input.integer, defval=50, minval=1) highlight = input(title="Highlight On/Off", type=input.bool, defval=true) 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.risk.max_drawdown(50, strategy.percent_of_equity) calc_hma(src, length) => hullma = wma(2*wma(src, length/2)-wma(src, length), round(sqrt(length))) hullma calc_cbma(price, length, emaLength, emaGainLimit) => alpha = 2 / (emaLength + 1) ema = ema(price, emaLength) int leastError = 1000000 float ec = 0 float bestGain = 0 for i = emaGainLimit to emaGainLimit gain = i / 10 ec := alpha * ( ema + gain * (price - nz(ec[1])) ) + (1 - alpha) * nz(ec[1]) error = price - ec if (abs(error) < leastError) leastError = abs(error) bestGain = gain ec := alpha * ( ema + bestGain * (price - nz(ec[1])) ) + (1 - alpha) * nz(ec[1]) hull = calc_hma(price, length) cbma = (ec + hull) / 2 cbma cbma = calc_cbma(src, length, emaLen, emaGL) basis = regular ? sma(src, length) : cbma dev = mult * stdev(src, length) upper = basis + dev lower = basis - dev cbmaColor = fixnan(highlight and not regular ? cbma > high ? color.purple : cbma < low ? color.aqua : na : color.red) plot(basis, color=cbmaColor) p1 = plot(upper, color=color.blue) p2 = plot(lower, color=color.blue) fill(p1, p2) if (crossover(src, lower)) strategy.entry("CBMA_BBandLE", strategy.long, stop=lower, oca_name="BollingerBands", comment="CBMA_BBandLE") else strategy.cancel(id="CBMA_BBandLE") if (crossunder(src, upper)) strategy.entry("CBMA_BBandSE", strategy.short, stop=upper, oca_name="BollingerBands", comment="CBMA_BBandSE") else strategy.cancel(id="CBMA_BBandSE")