この戦略は,価格トレンド方向を特定するためにSMAとEMAなどの複数の移動平均を組み合わせ,価格突破に基づいてストップ損失ラインを設定し,トレンドフォロー戦略を設計する.価格が上昇すると,上帯をストップ損失として追いかける.価格が下がると,下限をストップ損失として追いかける.戦略の利点は,複数の移動平均の組み合わせが価格データをスムーズにし,トレンドを特定できる;動的なストップ損失デザインは過度に敏感なストップを避ける.戦略のリスクは,ストップ損失ラインの設定が時間内にストップ損失を止めるにはあまりにも緩いかもしれないということだ.
この戦略は,KAMAが価格変化により敏感に反応し,ターンを事前に特定できるため,トレンド方向を判断するための基礎としてKAMAを使用しています.同時に,戦略には,価格をフィルターし,主要なトレンド方向を識別するためのSMAとEMAなどの他の複数の移動平均値の組み合わせが含まれています.
ストップ・ロスのライン設定は,価格自体と移動平均値に基づいています.特に,上向きのストップ・ロスのラインは移動平均値プラスバッファとしての比率です.下向きのストップ・ロスのラインは緩衝値としての平均値マイナス比率です.これは価格が逆転すると直ちにストップ・ロスを可能にします.
入場条件は,価格がダウンサイドストップロスの線を上から下へと突破すると長であり,価格がダウンサイドストップロスの線を上から下へと突破すると短である.
この戦略の最大の利点は,複数の移動平均値を組み合わせることで,トレンド判断の精度が向上し,誤った信号が減少することが可能である.同時に,戦略のストップ・ロスは移動平均値に基づいて動的に変化し,リアルタイムで調整し,突然の出来事に対応することができます.
さらに,単一指標戦略と比較して,この戦略はトレンド追跡と突破戦略の利点を組み合わせます.トレンド市場では,利益を最大化することができます.
この戦略の主なリスクは,ストップ・ロスのラインの設定が時間内にストップ・ロスを停止するにはあまりにも緩いかもしれないことです.これはストップ・ロスのラインのリトラセーション比が固定されているため,市場で暴力的な変化が発生した場合,ストップ・ロスのラインは時間内に更新できないため,より多くの損失につながる可能性があります.
さらに,移動平均値自体は高いヒステレシスを持ち,価格変化にすぐに反応できない.これは,市場の急激な逆転時に損失を間に合わずに防ぐこともあります.
戦略は以下の側面で最適化できます.
ストップ損失線比の異なるパラメータ設定をテストし,より良いパラメータ組み合わせを見つける.
ストップ・ロスの線が市場の変動の程度に応じて動的に変化させようとします.
判断するための他の指標を増やし,ストップ損失ベースにより多くの変数を導入し,戦略の適応性を向上させる.
移動平均のサイクルパラメータを最適化して,価格を平らにするための最良のサイクル設定を見つけます.
この戦略は,トレンドの方向性を決定するために複数の移動平均を組み合わせ,トレンドを追跡することを目的としたダイナミックなトレーリングストップロスのメカニズムを設計することで,全体的にかなり堅牢である.利点としては,誤った信号を軽減し,ストップロスを通してリスクを制御できる.欠点は,ストップロスの線があまりにも幅広く設定され,迅速にストップロスを停止することが可能である.戦略を最適化するための次のステップは,ストップロスのラインの設計に焦点を当て,市場の変化に応じて動的に調整できるようにすることです.
/*backtest start: 2023-02-22 00:00:00 end: 2024-02-28 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy('Atlantean Trend Signal BUY SELL Strategy', overlay=true) ma_length = input.int(title='Moving Average Length', minval=1, defval=3) percent = input.float(3.3, 'STOP LOSS Percent', step=0.1, minval=0) src = input(title='Source', defval=close) mav = input.string(title="Moving Average Type", defval="KAMA", options=["SMA", "EMA", "WMA", "DEMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF", "HULL", "TILL", "KAMA"]) T3a1 = 0.7 _type = false //input(false, title='Activate Moving Average Screening Mode') _type1 = false //input(false, title='Activate Moving Average Color Change Screening Mode') activateScreener = input.bool(false, title="Activate Screener?") showsignallabels = input(title='Show Signal Labels?', defval=true) Var_Func(src, ma_length) => valpha = 2 / (ma_length + 1) vud1 = src > src[1] ? src - src[1] : 0 vdd1 = src < src[1] ? src[1] - src : 0 vUD = math.sum(vud1, 9) vDD = math.sum(vdd1, 9) vCMO = nz((vUD - vDD) / (vUD + vDD)) VAR = 0.0 VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1]) VAR VAR = Var_Func(src, ma_length) DEMA = 2 * ta.ema(src, ma_length) - ta.ema(ta.ema(src, ma_length), ma_length) Wwma_Func(src, ma_length) => wwalpha = 1 / ma_length WWMA = 0.0 WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1]) WWMA WWMA = Wwma_Func(src, ma_length) // KAMA Calculation Kama_Func(src, ma_length) => xvnoise = math.abs(src - src[1]) nfastend = 0.666 nslowend = 0.0645 nsignal = math.abs(src - src[ma_length]) nnoise = math.sum(xvnoise, ma_length) nefratio = nnoise != 0 ? nsignal / nnoise : 0 nsmooth = math.pow(nefratio * (nfastend - nslowend) + nslowend, 2) nAMA = 0.0 nAMA := nz(nAMA[1]) + nsmooth * (src - nz(nAMA[1])) nAMA Zlema_Func(src, ma_length) => zxLag = ma_length / 2 == math.round(ma_length / 2) ? ma_length / 2 : (ma_length - 1) / 2 zxEMAData = src + src - src[zxLag] ZLEMA = ta.ema(zxEMAData, ma_length) ZLEMA ZLEMA = Zlema_Func(src, ma_length) Tsf_Func(src, ma_length) => lrc = ta.linreg(src, ma_length, 0) lrc1 = ta.linreg(src, ma_length, 1) lrs = lrc - lrc1 TSF = ta.linreg(src, ma_length, 0) + lrs TSF TSF = Tsf_Func(src, ma_length) HMA = ta.wma(2 * ta.wma(src, ma_length / 2) - ta.wma(src, ma_length), math.round(math.sqrt(ma_length))) T3e1 = ta.ema(src, ma_length) T3e2 = ta.ema(T3e1, ma_length) T3e3 = ta.ema(T3e2, ma_length) T3e4 = ta.ema(T3e3, ma_length) T3e5 = ta.ema(T3e4, ma_length) T3e6 = ta.ema(T3e5, ma_length) T3c1 = -T3a1 * T3a1 * T3a1 T3c2 = 3 * T3a1 * T3a1 + 3 * T3a1 * T3a1 * T3a1 T3c3 = -6 * T3a1 * T3a1 - 3 * T3a1 - 3 * T3a1 * T3a1 * T3a1 T3c4 = 1 + 3 * T3a1 + T3a1 * T3a1 * T3a1 + 3 * T3a1 * T3a1 T3 = T3c1 * T3e6 + T3c2 * T3e5 + T3c3 * T3e4 + T3c4 * T3e3 getMA(src, ma_length) => ma = 0.0 ma := switch mav 'SMA' => ta.sma(src, ma_length) 'EMA' => ta.ema(src, ma_length) 'WMA' => ta.wma(src, ma_length) 'DEMA' => DEMA 'TMA' => ta.sma(ta.sma(src, math.ceil(ma_length / 2)), math.floor(ma_length / 2) + 1) 'VAR' => VAR 'WWMA' => WWMA 'ZLEMA' => ZLEMA 'TSF' => TSF 'HULL' => HMA 'TILL' => T3 'KAMA' => Kama_Func(src, ma_length) ma ALL = getMA(src, ma_length) exMov = ALL fark = exMov * percent * 0.01 longStop = exMov - fark longStopPrev = nz(longStop[1], longStop) longStop := exMov > longStopPrev ? math.max(longStop, longStopPrev) : longStop shortStop = exMov + fark shortStopPrev = nz(shortStop[1], shortStop) shortStop := exMov < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop dir = 1 dir := nz(dir[1], dir) dir := dir == -1 and exMov > shortStopPrev ? 1 : dir == 1 and exMov < longStopPrev ? -1 : dir MOST = dir == 1 ? longStop : shortStop cro = _type and _type1 ? ta.crossover(exMov, exMov[1]) : _type ? ta.crossover(close, exMov) : ta.crossover(exMov, MOST) cru = _type and _type1 ? ta.crossunder(exMov, exMov[1]) : _type ? ta.crossunder(close, exMov) : ta.crossunder(exMov, MOST) direction = 0 direction := cro ? 1 : cru ? -1 : direction[1] col1 = exMov > exMov[1] col3 = exMov < exMov[1] colorM = col1 and _type and _type1 ? color.rgb(14, 241, 52) : col3 and _type and _type1 ? color.red : color.new(#00bcd4, 0) if (cro) strategy.entry('LONG', strategy.long) if (cru) strategy.close('LONG') plot(_type ? na : MOST, color=color.new(color.maroon, 0), linewidth=3, title='MOST') plot(exMov, color=colorM, linewidth=2, title='exMov') plotshape(cro and showsignallabels, title='BUY', text='BUY', location=location.belowbar, style=shape.labelup, size=size.tiny, color=color.new(#00bcd4, 0), textcolor=color.new(color.white, 0)) plotshape(cru and showsignallabels, title='SELL', text='SELL', location=location.abovebar, style=shape.labeldown, size=size.tiny, color=color.new(#e91e63, 0), textcolor=color.new(color.white, 0))