Stratégie de moyenne mobile forte à cinq volets

EMA WMA SMA TMA VAR WWMA ZLEMA TSF
Date de création: 2024-05-23 18:14:35 Dernière modification: 2024-05-23 18:14:35
Copier: 3 Nombre de clics: 575
1
Suivre
1617
Abonnés

Stratégie de moyenne mobile forte à cinq volets

Aperçu

La stratégie des moyennes mobiles à cinq forces est une stratégie de négociation basée sur plusieurs moyennes mobiles. La stratégie utilise cinq moyennes mobiles de différentes périodes et types pour identifier les tendances fortes du marché. Les trois premières moyennes mobiles sont un élément central de la stratégie, principalement utilisées pour l’identification des tendances et la génération de signaux.

En tenant compte de la tendance et de la position relative des différentes moyennes mobiles périodiques et de types, la stratégie permet de juger plus précisément de la direction et de la force des tendances actuelles du marché et d’ajuster les positions en temps opportun en fonction des changements de tendance pour une meilleure rentabilité.

Principe de stratégie

La stratégie utilise des moyennes mobiles de 5 périodes et types différents:

  1. Moyenne mobile de premier niveau: affichage, balises, sources de données, période, longueur, largeur de ligne, couleur et type personnalisables.
  2. Moyenne mobile de deuxième niveau: affichage, balises, source de données, période, longueur, largeur de ligne, couleur et type personnalisables.
  3. Moyenne mobile de troisième niveau: affichage, balises, sources de données, période, longueur, largeur de ligne, couleur et type personnalisables.
  4. Moyenne mobile de quatrième niveau: principalement utilisée pour l’aide au jugement, elle permet de personnaliser l’affichage, les balises, les sources de données, les délais, la longueur, la largeur des lignes et les couleurs.
  5. Moyenne mobile de cinquième niveau: principalement utilisée pour l’aide au jugement, avec des affichages, des balises, des sources de données, des délais, des longueurs, des largeurs de ligne et des couleurs personnalisables.

Les cinq types de moyennes mobiles peuvent être réglés de manière flexible, y compris les 8 types suivants: SMA, EMA, WMA, TMA, VAR, WWMA, ZLEMA et TSF.

L’idée centrale de la stratégie est d’utiliser plusieurs confirmations de tendances de différentes périodes et types de moyennes mobiles pour juger de la direction et de l’intensité des tendances:

  • Il est préférable de faire plus lorsque le prix de clôture est au-dessus des moyennes mobiles de niveau 1, 2 et 3.
  • La position de couverture est prise lorsque le prix de clôture est en dessous des moyennes mobiles de niveaux 1, 2 et 3;
  • Si le cours de clôture est inférieur aux moyennes mobiles des niveaux 1 et 2, alors que vous avez déjà détenu une position surdimensionnée, vous devrez faire un pari.
  • Lorsque la position est vide, si le cours de clôture dépasse la moyenne mobile des couches 1 et 2, la position est nulle.

En outre, la stratégie affiche la couleur de la ligne K en fonction de la direction actuelle de la position:

  • La ligne K apparaît en vert pour les positions en surplus.
  • La ligne K est rouge pour les positions vides.
  • Dans les autres cas, la ligne K est grise.

Avantages stratégiques

  1. La stratégie utilise plusieurs combinaisons de moyennes mobiles à moyen et à long terme pour juger des tendances. La capacité d’identification des tendances est forte et permet de saisir efficacement les principales tendances du marché.
  2. Les paramètres de la stratégie peuvent être réglés de manière flexible, y compris le type, la période et la durée des moyennes mobiles, qui peuvent être optimisés en fonction des caractéristiques du marché et des préférences des investisseurs.
  3. Adaptation à plusieurs marchés. Cette stratégie est basée sur la tendance des prix, elle est adaptée aux marchés et peut être utilisée sur plusieurs marchés, tels que les actions, les futures, les devises et les crypto-monnaies.
  4. La logique est claire et simple. La logique centrale de la stratégie est claire et simple, facile à comprendre et à mettre en œuvre, sans avoir besoin de modèles mathématiques trop complexes.

Risque stratégique

  1. Risque de blanchiment dans les marchés de choc. Cette stratégie est généralement utilisée dans les marchés de choc, où il peut y avoir plus de petites transactions à perte, ce qui entraîne une baisse des bénéfices nets.
  2. Risque d’optimisation des paramètres. La stratégie utilise de nombreux paramètres et peut entraîner des retraits importants dans les futures transactions en bourse si les données historiques ne sont pas suffisamment retracées et les paramètres optimisés.
  3. Le risque de renversement de tendance. Cette stratégie s’applique principalement à la tendance. Si la tendance du marché est inversée, la stratégie peut continuer à négocier dans la direction de la tendance initiale, entraînant des pertes.

Pour réduire ce risque, les améliorations suivantes peuvent être envisagées:

  1. Logique de détection et de jugement des marchés en tremblement de terre pour réduire le nombre de transactions dans des conditions non tendancielles.
  2. Les tests d’optimisation des paramètres de la stratégie sont effectués de manière adéquate pour trouver la combinaison optimale de paramètres la plus stable.
  3. Il est possible d’établir des limites raisonnables de stop loss et de maîtriser le risque maximal d’une transaction unique. En même temps, il est possible d’ajuster la position en temps opportun pour confirmer le renversement de tendance par d’autres indicateurs ou signaux.

Orientation de l’optimisation de la stratégie

  1. L’introduction de plus d’indicateurs de confirmation de tendance, tels que MACD, DMI, etc., améliore la précision des jugements de tendance.
  2. Dans le cas d’un marché en crise, il est possible d’envisager l’introduction de logiques d’opération adaptées aux conditions de crise, telles que les transactions sur grille.
  3. Les paramètres de la stratégie peuvent être optimisés pour les différentes caractéristiques du marché, afin d’améliorer l’adaptabilité.
  4. On peut envisager de combiner cette stratégie avec d’autres stratégies, comme une combinaison de stratégie de tendance + stratégie de choc, une combinaison de stratégie de tendance + stratégie de contre-courant, etc., pour améliorer la robustesse de la stratégie.

Résumer

La stratégie des moyennes mobiles à cinq forces est une stratégie de négociation basée sur la confirmation de plusieurs tendances, qui permet de juger avec précision la direction et la force de la tendance actuelle du marché en tenant compte de plusieurs cycles et types de mouvements de moyennes mobiles, et d’ajuster les positions en temps opportun en fonction des changements de tendance. La logique de la stratégie est simple et claire, les paramètres sont flexibles et s’adaptent à plusieurs marchés, mais se produisent généralement dans les marchés en turbulence, et il existe un certain risque d’optimisation des paramètres et de revirement de tendance.

Code source de la stratégie
/*backtest
start: 2023-05-17 00:00:00
end: 2024-05-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Quintuple Strong Moving Average Strategy","QuisMa", overlay=true, margin_long=100, margin_short=100)

// 1
mav1_show = input.bool(true, 'Show Plot', group='Level 1 ', inline='mav1_0')
mav1_label = input.bool(true, 'Show Label', group='Level 1 ', inline='mav1_0')
mav1_source = input.source(close, '', group='Level 1 ', inline='mav1_1')
mav1_timeframe = input.timeframe('5', '', group='Level 1 ', inline='mav1_1')
mav1_length = input.int(50, 'Length', group='Level 1 ', inline='mav1_3')
mav1_size = input.int(2000, 'Size', minval=1, group='Level 1 ', inline='mav1_3')
mav1_width = input.int(2, '', minval=0, group='Level 1 ', inline='mav1_2')
mav1_color = input.color(color.new(#ffd000, 0), '', group='Level 1 ', inline='mav1_2')
mav1_type = input.string(title='Moving Average Type 1', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 2
mav2_show = input.bool(true, 'Show Plot', group='Level 2', inline='mav2_0')
mav2_label = input.bool(true, 'Show Label', group='Level 2', inline='mav2_0')
mav2_source = input.source(close, '', group='Level 2', inline='mav2_1')
mav2_timeframe = input.timeframe('30', '', group='Level 2', inline='mav2_1')
mav2_length = input.int(50, 'Length', group='Level 2', inline='mav2_3')
mav2_size = input.int(2000, 'Size', minval=1, group='Level 2', inline='mav2_3')
mav2_width = input.int(2, '', minval=0, group='Level 2', inline='mav2_2')
mav2_color = input.color(color.new(#ffd000, 0), '', group='Level 2', inline='mav2_2')
mav2_type = input.string(title='Moving Average Type 2', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 3
mav3_show = input.bool(true, 'Show Plot', group='Level 3', inline='mav3_0')
mav3_label = input.bool(true, 'Show Label', group='Level 3', inline='mav3_0')
mav3_source = input.source(close, '', group='Level 3', inline='mav3_1')
mav3_timeframe = input.timeframe('60', '', group='Level 3', inline='mav3_1')
mav3_length = input.int(50, 'Length', group='Level 3', inline='mav3_3')
mav3_size = input.int(2000, 'Size', minval=1, group='Level 3', inline='mav3_3')
mav3_width = input.int(2, '', minval=0, group='Level 3', inline='mav3_2')
mav3_color = input.color(color.new(#ffd000, 0), '', group='Level 3', inline='mav3_2')
mav3_type = input.string(title='Moving Average Type 3', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 4
mav4_show = input.bool(true, 'Show Plot', group='Level 4', inline='mav4_0')
mav4_label = input.bool(true, 'Show Label', group='Level 4', inline='mav4_0')
mav4_source = input.source(close, '', group='Level 4', inline='mav4_1')
mav4_timeframe = input.timeframe('480', '', group='Level 4', inline='mav4_1')
mav4_length = input.int(50, 'Length', group='Level 4', inline='mav4_3')
mav4_size = input.int(2000, 'Size', minval=1, group='Level 4', inline='mav4_3')
mav4_width = input.int(2, '', minval=0, group='Level 4', inline='mav4_2')
mav4_color = input.color(color.new(#ffd000, 0), '', group='Level 4', inline='mav4_2')
mav4_type = input.string(title='Moving Average Type 4', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 5
mav5_show = input.bool(true, 'Show Plot', group='Level 5', inline='mav5_0')
mav5_label = input.bool(true, 'Show Label', group='Level 5', inline='mav5_0')
mav5_source = input.source(close, '', group='Level 5', inline='mav5_1')
mav5_timeframe = input.timeframe('720', '', group='Level 5', inline='mav5_1')
mav5_length = input.int(50, 'Length', group='Level 5', inline='mav5_3')
mav5_size = input.int(2000, 'Size', minval=1, group='Level 5', inline='mav5_3')
mav5_width = input.int(2, '', minval=0, group='Level 5', inline='mav5_2')
mav5_color = input.color(color.new(#ffd000, 0), '', group='Level 5', inline='mav5_2')
mav5_type = input.string(title='Moving Average Type 5', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])


// FUNCTIONS {{{
candle_size_ms = time - time[1]  // milliseconds of a candle

timetostring(tms) =>
    d_ = math.floor(tms / 86400)
    h_ = math.floor((tms - d_ * 86400) / 3600)
    m_ = math.floor((tms - d_ * 86400 - h_ * 3600) / 60)
    s_ = math.floor(tms - d_ * 86400 - h_ * 3600 - m_ * 60)
    ret = d_ > 0 ? str.tostring(d_) + ' D ' : ''
    ret += (h_ > 0 ? str.tostring(h_) + ' H ' : '')
    ret += (m_ > 0 ? str.tostring(m_) + ' m ' : '')
    if d_ == 0
        ret += (s_ > 0 ? str.tostring(s_) + ' s ' : '')
        ret
    ret

tftostring(tf) =>
    tfa = str.split(tf, '')
    tfalast = array.get(tfa, array.size(tfa) - 1)
    tfalastIsNum = na(str.tonumber(tfalast)) ? false : true
    txt = tfalastIsNum ? timetostring(str.tonumber(tf) * 60) : tf
    txt

htfLabel(htfy, tf, col) =>
    txt = tftostring(tf)
    htftxt = 'ᐊ ' + txt
    htftip = 'HTF  [ ' + txt + ' ] ' + str.tostring(htfy, '#.##')
    label.new(x=time + candle_size_ms * 2, y=htfy, xloc=xloc.bar_time, yloc=yloc.price, color=color.new(color.black, 100), textcolor=col, style=label.style_label_left, size=size.normal, text=htftxt, tooltip=htftip)

// Moving Averages Functions {{{
Var_Func(src, length) =>
    valpha = 2 / (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

Wwma_Func(src, length) =>
    wwalpha = 1 / length
    WWMA = 0.0
    WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1])
    WWMA

Zlema_Func(src, length) =>
    zxLag = length / 2 == math.round(length / 2) ? length / 2 : (length - 1) / 2
    zxEMAData = src + src - src[zxLag]
    ZLEMA = ta.ema(zxEMAData, length)
    ZLEMA

Tsf_Func(src, length) =>
    lrc = ta.linreg(src, length, 0)
    lrc1 = ta.linreg(src, length, 1)
    lrs = lrc - lrc1
    TSF = ta.linreg(src, length, 0) + lrs
    TSF

getMA(src, length, mav_type) =>
    ma = 0.0
    if mav_type == 'SMA'
        ma := ta.sma(src, length)
    if mav_type == 'EMA'
        ma := ta.ema(src, length)
    if mav_type == 'WMA'
        ma := ta.wma(src, length)
    if mav_type == 'TMA'
        ma := ta.sma(ta.sma(src, math.ceil(length / 2)), math.floor(length / 2) + 1)
    if mav_type == 'VAR'
        ma := Var_Func(src, length)
    if mav_type == 'WWMA'
        ma := Wwma_Func(src, length)
    if mav_type == 'ZLEMA'
        ma := Zlema_Func(src, length)
    if mav_type == 'TSF'
        ma := Tsf_Func(src, length)
    ma

mav1 = request.security(syminfo.tickerid, mav1_timeframe, getMA(mav1_source, mav1_length, mav1_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav1_show ? mav1 : na, 'mav 1', color=mav1_color, linewidth=mav1_width, show_last=mav1_size)
var label mav1lbl = na
label.delete(mav1lbl)
mav1lbl := mav1_label ? htfLabel(mav1, mav1_timeframe, mav1_color) : na

mav2 = request.security(syminfo.tickerid, mav2_timeframe, getMA(mav2_source, mav2_length, mav2_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav2_show ? mav2 : na, 'mav 2', color=mav2_color, linewidth=mav2_width, show_last=mav2_size)
var label mav2lbl = na
label.delete(mav2lbl)
mav2lbl := mav2_label ? htfLabel(mav2, mav2_timeframe, mav2_color) : na

mav3 = request.security(syminfo.tickerid, mav3_timeframe, getMA(mav3_source, mav3_length, mav3_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav3_show ? mav3 : na, 'mav 3', color=mav3_color, linewidth=mav3_width, show_last=mav3_size)
var label mav3lbl = na
label.delete(mav3lbl)
mav3lbl := mav3_label ? htfLabel(mav3, mav3_timeframe, mav3_color) : na

mav4 = request.security(syminfo.tickerid, mav4_timeframe, getMA(mav4_source, mav4_length, mav4_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav4_show ? mav4 : na, 'mav 4', color=mav4_color, linewidth=mav4_width, show_last=mav4_size)
var label mav4lbl = na
label.delete(mav4lbl)
mav4lbl := mav4_label ? htfLabel(mav4, mav4_timeframe, mav4_color) : na

mav5 = request.security(syminfo.tickerid, mav5_timeframe, getMA(mav5_source, mav5_length, mav5_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav5_show ? mav5 : na, 'mav 5', color=mav5_color, linewidth=mav5_width, show_last=mav5_size)
var label mav5lbl = na
label.delete(mav5lbl)
mav5lbl := mav5_label ? htfLabel(mav5, mav5_timeframe, mav5_color) : na

// Alış ve Satış Koşulları
alisKosulu = close > mav1 and close > mav2 and close > mav3
satisKosulu = close < mav1 and close < mav2 and close < mav3

// Alış ve Satış Sinyalleri
if (alisKosulu and not satisKosulu)
    strategy.entry("Alış", strategy.long)
if (satisKosulu and not alisKosulu)
    strategy.entry("Satış", strategy.short)

// Pozisyonları Kapatma Koşulları
if (strategy.opentrades > 0)
    if (close < mav1 and close < mav2 and strategy.position_size > 0)
        strategy.close("Alış")
    if (close > mav1 and close > mav2 and strategy.position_size < 0)
        strategy.close("Satış")

// Mum Rengi Ayarlama
longKosul = strategy.opentrades > 0 and strategy.position_size > 0
shortKosul = strategy.opentrades > 0 and strategy.position_size < 0

barcolor(longKosul ? color.green : shortKosul ? color.red : color.gray)