Stratégie de suivi de tendance basée sur MOST et KAMA


Date de création: 2024-02-29 11:04:38 Dernière modification: 2024-02-29 11:04:38
Copier: 3 Nombre de clics: 697
1
Suivre
1617
Abonnés

Stratégie de suivi de tendance basée sur MOST et KAMA

Aperçu

La stratégie utilise plusieurs moyennes mobiles (SMA, EMA, KAMA) pour identifier la direction de la tendance des prix et concevoir une stratégie de suivi de la tendance en fonction de la rupture des prix. Lorsque les prix augmentent, trails the upper band comme arrêt; lorsque les prix baissent, trails the lower limit comme arrêt. L’avantage de la stratégie est la combinaison de plusieurs moyennes mobiles qui permettent de lisser les données des prix et d’identifier la tendance.

Principe de stratégie

La stratégie utilise le KAMA comme indicateur de base pour déterminer la direction de la tendance, car le KAMA est plus sensible aux changements de prix et permet d’identifier les virages plus tôt. En outre, la stratégie contient une combinaison de plusieurs autres moyennes mobiles, telles que SMA, EMA, etc., qui permettent de filtrer les prix et d’identifier la direction de la tendance principale.

Le paramètre de la stratégie est basé sur le prix lui-même et sur la moyenne mobile. En particulier, le stop-loss suivi à la hausse est superposé à la moyenne mobile par un pourcentage de plus comme tampon; le stop-loss suivi à la baisse est enlevé à la moyenne mobile par un pourcentage de plus comme tampon. Cela permet de réaliser une perte immédiate lorsque le prix est inversé.

Les conditions d’entrée sont les suivantes: faire plus lorsque le prix passe de bas en haut à la limite supérieure de rupture; faire moins lorsque le prix passe de haut en bas à la limite inférieure de rupture.

Analyse des avantages

Le plus grand avantage de cette stratégie réside dans le fait que la combinaison de plusieurs moyennes mobiles permet d’améliorer l’exactitude des jugements de tendance et de réduire les faux signaux. En outre, la ligne de stop-loss de la stratégie est basée sur la dynamique des variations des moyennes mobiles et peut être ajustée en fonction des prix en temps réel pour répondre à des événements soudains.

En outre, par rapport à la stratégie de l’indicateur unique, la stratégie combine les avantages de la stratégie de suivi de la tendance et de la stratégie de rupture. Dans une situation de tendance, il est possible de maximiser les profits; dans une situation de choc, les pertes peuvent être réduites par un arrêt de perte.

Analyse des risques

Le principal risque de cette stratégie est que le paramètre de la ligne de stop-loss peut être trop lâche et ne peut pas être arrêté à temps. Cela est dû au fait que le taux de rétractation de la ligne de stop-loss est fixé et que si la situation change radicalement et que la ligne de stop-loss ne peut pas être mise à jour à temps, cela peut entraîner des pertes plus importantes.

En outre, la moyenne mobile est elle-même très retardée et ne peut pas réagir immédiatement aux variations de prix. Cela peut également entraîner une perte de temps en cas de retournement rapide de la situation.

Direction d’optimisation

Cette stratégie peut être optimisée dans les domaines suivants:

  1. Tester le rapport entre les lignes de rupture sous différents paramètres pour trouver une meilleure combinaison de paramètres;

  2. Essayez de définir le stop loss comme une variation dynamique, en fonction de la volatilité du marché;

  3. l’ajout d’autres critères de jugement, l’introduction de plus de variables sur la base de stop-loss et l’amélioration de l’adaptabilité de la stratégie;

  4. Optimiser les paramètres cycliques des moyennes mobiles pour trouver le meilleur réglage cyclique des prix lisse.

Résumer

Cette stratégie est globalement robuste, elle détermine la direction de la tendance à l’aide de plusieurs combinaisons de moyennes mobiles et conçoit un mécanisme de suivi dynamique des arrêts de perte visant à suivre la tendance. L’avantage est de pouvoir réduire les faux signaux et de contrôler les risques en bloquant les pertes. L’inconvénient est que les lignes de stop-loss peuvent être trop larges et ne peuvent pas être arrêtées rapidement.

Code source de la stratégie
/*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))