
この戦略は,SMA,EMA,KAMAなどの複数の移動平均を使用し,価格トレンドの方向を識別し,価格突破のセットストップラインに基づいてトレンドを追跡する戦略を設計する.価格が上昇すると,trails the upper bandはストップとして;価格が低下すると,trails the下限はストップとして.戦略の優点は,価格データを平らにするための複数の移動平均線の組み合わせであり,トレンドを識別する.ダイナミックなストップデザインは,過度に敏感なストップを回避する.戦略のリスクは,ストップラインの設定が過度に緩やかであり,時 ਸਿਰストップをすることができないことである.
この戦略は,KAMAをトレンドの方向を判断する基礎指標として使用する.KAMAは価格の変化に反応するので,より敏感で,転向を早期に識別することができる.また,戦略には,SMA,EMAなど,他の複数の移動平均の組み合わせが含まれ,価格をフィルターして,主要なトレンドの方向を識別することができる.
戦略のストップラインは,価格そのものと移動平均に基づいて設定されます.具体的には,上向きに追跡するストップラインは,移動平均に1パーセントを緩衝として重ねます.下向きに追跡するストップラインは,移動平均に1パーセントを緩衝として減算します.これは,価格が反転したとき,即座にストップすることができます.
入場条件は,価格が上行ストップラインを上下から突破したときに多めにすること.価格が上行ストップラインを上下から突破したときに空にする.
この戦略の最大の利点は,複数の移動平均を組み合わせることで,トレンド判断の正確性を高め,偽信号を減らすことです.同時に,戦略のストップ・ローンは,移動平均の動態の変化に基づいて,リアルタイム価格に応じて調整し,突発的なイベントへの対応を実現します.
また,単一指標戦略と比較して,この戦略は,トレンド追跡と突破戦略の優位性を融合している.トレンドの状況では,最大限の利益を上げることができる; 震動の状況では,ストップ・ロスの設定によって損失を減らすことができる.
この戦略の主なリスクは,ストップラインの設定があまりに緩やかになり,タイムリーにストップできないことにある.これは,ストップラインの撤回比率が固定設定されているため,市場状況が急激に変化すれば,タイムリーにストップラインを更新できないことが大きな損失をもたらす可能性があるからである.
さらに,Moving Average自体は遅滞性があり,価格変化に即座に反応することができない.これは,市場が急速に逆転する時に,時宜に止まらないことも原因になるかもしれない.
この戦略は以下の点で最適化できます.
異なるパラメータの設定の下の止損線比をテストし,より優良なパラメータの組み合わせを見つける.
ストップラインを動的に設定し,市場の変動に応じて調整する.
他の指標の判断を増やし,ストップベースにより多くの変数を導入し,戦略の適応性を向上させる.
移動平均の周期パラメータを最適化して,最適な平滑価格の周期設定を見つける.
この戦略は,全体的に比較的堅牢であり,複数の移動平均の組み合わせによってトレンドの方向を判断し,トレンドの運行を追跡する目的のダイナミック・トラッキング・ストップ・メカニズムを設計する.優点は,偽信号を軽減し,ストップ・コントロールによるリスクである.欠点は,ストップ・ラインがあまりにも広く設定され,迅速にストップ・オフができないことである.次の最適化戦略は,ストップ・ラインの設計に努力し,市場の変化に応じてダイナミックに調整できるようにすべきである.
/*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))