
Die Strategie verwendet mehrere Moving Averages wie SMA, EMA, KAMA, um die Richtung des Preistrends zu erkennen, und entwirft eine Strategie, die den Trend verfolgt, indem sie eine Stop-Line auf Basis eines Preisbruchs setzt. Wenn der Preis steigt, trails the upper band als Stop; wenn der Preis fällt, trails the lower limit als Stop. Die Strategie hat den Vorteil, dass mehrere Moving Average-Kombinationen die Preisdaten ausgleichen und Trends erkennen können.
Die Strategie verwendet KAMA als Basisindikator für die Trendrichtung, da KAMA auf Preisänderungen reagiert und so eine Umkehrung früher erkennen kann. Die Strategie enthält auch eine Kombination aus verschiedenen anderen Moving Averages wie SMA, EMA und anderen, die Preise filtern und die Haupttrendrichtung erkennen können.
Die Stop-Line der Strategie basiert auf dem Preis selbst und dem Moving Average. Konkret bedeutet dies, dass die aufwärts verfolgte Stop-Line einen Prozentsatz des Moving Averages als Buffer überlagert. Die aufwärts verfolgte Stop-Line nimmt einen Prozentsatz des Moving Averages als Buffer ab.
Die Eintrittsbedingungen sind, wenn der Preis von unten nach oben die Aufwärtsstop-Linie durchbrochen hat, mehr zu machen; wenn der Preis von oben nach unten die Abwärtsstop-Linie durchbrochen hat, leer zu machen.
Der größte Vorteil dieser Strategie besteht darin, dass die Genauigkeit der Trendbeurteilung durch die Kombination mehrerer Moving Averages verbessert und falsche Signale reduziert werden. Die Stop-Loss-Linie der Strategie basiert auf der Dynamik der Moving Averages und kann auf Echtzeitpreise angepasst werden, um auf unerwartete Ereignisse zu reagieren.
Darüber hinaus kombiniert die Strategie die Vorteile der Trend-Tracking- und Break-Out-Strategie im Vergleich zur Single-Indicator-Strategie. In Trend-Situationen kann der Gewinn maximiert werden, während der Verlust durch Stop-Loss-Einstellungen in Shock-Situationen verringert werden kann.
Das Hauptrisiko dieser Strategie besteht darin, dass die Stop-Line-Einstellung zu locker sein kann und nicht rechtzeitig gestoppt werden kann. Dies liegt daran, dass der Rückzug der Stop-Line-Ratio fest eingestellt ist und es möglicherweise zu großen Verlusten führt, wenn die Stop-Line nicht rechtzeitig aktualisiert werden kann, wenn sich die Situation dramatisch ändert.
Darüber hinaus ist der Moving Average selbst sehr nachlässig und kann nicht sofort auf Preisänderungen reagieren. Dies kann auch dazu führen, dass er nicht in der Lage ist, bei schnellen Wendungen des Marktes rechtzeitig zu stoppen.
Diese Strategie kann in folgenden Bereichen optimiert werden:
Test der Stop-Line-Ratio unter verschiedenen Parameter-Einstellungen, um eine bessere Kombination von Parametern zu finden;
Versuchen Sie, die Stop-Line auf dynamische Veränderungen zu setzen, die sich an den Schwankungen des Marktes anpassen.
Erweiterung der Indikatoren, Einführung weiterer Variablen auf der Stop-Loss-Basis und Erhöhung der Anpassungsfähigkeit der Strategie;
Optimieren Sie die Periodenparameter für die Moving Averages, um die Perioden-Einstellungen zu finden, die den optimalen Gleitpreis ermöglichen.
Die Strategie ist insgesamt relativ robust, um die Richtung des Trends durch verschiedene Kombinationen von Moving Averages zu beurteilen und einen dynamischen Stop-Loss-Mechanismus zu entwickeln, der darauf abzielt, den Trend zu verfolgen. Der Vorteil ist, dass das Risiko von Falschsignalen durch Stop-Loss-Kontrolle verringert werden kann. Der Nachteil ist, dass die Stop-Line möglicherweise zu breit eingestellt ist und nicht schnell gestoppt werden kann. Die nächste Optimierungsstrategie sollte sich auf die Gestaltung der Stop-Line konzentrieren, damit sie sich dynamisch an Marktveränderungen anpassen kann.
/*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))