Stratégie de croisement des prix de clôture mensuels et des moyennes mobiles

Auteur:ChaoZhang est là., Date: 23 janvier 2023 à 17h09
Les étiquettes:

img

Résumé

Cette stratégie génère des signaux de trading basés sur le croisement entre le prix de clôture mensuel et les lignes de moyenne mobile.

La logique de la stratégie

La logique de base de cette stratégie est la suivante:

  1. Prenez le paramètre de la moyenne mobile de période comme entrée. Choisissez entre SMA et EMA.
  2. Option permettant d'afficher la ligne moyenne mobile.
  3. Option d'utiliser le prix de clôture d'un autre ticker comme source de signal.
  4. Déterminer les signaux de négociation en fonction de la relation entre le prix de clôture mensuel et la moyenne mobile:
    • Le prix de clôture est supérieur à MA - Long
    • Le montant de l'émission de la valeur ajoutée de la valeur ajoutée de la valeur ajoutée

Cette stratégie utilise la capacité de lissage des moyennes mobiles pour filtrer les bruits de prix et capturer les inversions de tendance à moyen terme.

Les avantages

Les principaux avantages de cette stratégie sont les suivants:

  1. Utilise des données mensuelles pour filtrer efficacement les bruits intradiens et capturer les tendances à moyen et long terme
  2. Période de mise à niveau personnalisable pour l'optimisation entre différents tickers
  3. Option d'utiliser un autre ticker comme source de signal améliore la stabilité
  4. Mettre en œuvre des techniques avancées de lutte contre la repeinture
  5. Temps d'expérience flexible pour faciliter les essais

En résumé, il s'agit d'un cadre stratégique simple mais pratique qui peut être adapté à la plupart des actions grâce à un ajustement des paramètres, particulièrement adapté aux investisseurs à moyen et long terme.

Les risques

Il y a aussi quelques risques à noter:

  1. Les données mensuelles sont mises à jour lentement, ne pouvant pas refléter les variations de prix en temps réel
  2. Il est en retard et pourrait rater des opportunités à court terme
  3. Les MAs ont des délais inhérents, le timing du signal imprévisible.
  4. Une sélection de paramètres sous-optimale conduit à un surconservatisme ou à des opportunités manquées

Suggestions pour atténuer les risques:

  1. Incorporer des indicateurs techniques plus rapides pour les jugements auxiliaires
  2. Optimiser la période de mise en œuvre afin de trouver les meilleurs paramètres
  3. Utiliser une référence plus stable comme source de signal
  4. Ajustez la taille des positions pour limiter les pertes

Des possibilités d'amélioration

Cette stratégie présente un grand potentiel d'amélioration:

  1. Incorporer le stop loss pour verrouiller les bénéfices et contrôler les risques
  2. Ajouter des indicateurs complémentaires tels que KD, MACD pour améliorer la précision du signal
  3. Utiliser des techniques d'apprentissage automatique pour optimiser dynamiquement les paramètres MA
  4. Mettre en place un dimensionnement des positions qui s'aligne sur les tendances
  5. Des capacités intégrées de commutation longue/courte basées sur les conditions du marché
  6. Fusionner avec des prix plus rapides pour des réactions plus rapides

Conclusion

La stratégie de clôture mensuelle et de croisement MA a une logique simple et directe et peut être adaptée à divers tickers grâce à l'ajustement des paramètres. Elle est particulièrement adaptée aux investisseurs à moyen et long terme.


/*backtest
start: 2022-11-16 00:00:00
end: 2023-11-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © universique

//@version=4
strategy("Monthly MA Close ", shorttitle="MMAC", overlay=true, default_qty_type =  strategy.percent_of_equity, default_qty_value = 100)
//MAY 6 2020 18:00

// No repaint function 
// Function to securely and simply call `security()` so that it never repaints and never looks ahead.
f_secureSecurity(_symbol, _res, _src) => security(_symbol, _res, _src[1], lookahead = barmerge.lookahead_on)
//sec10 = f_secureSecurity(syminfo.tickerid, higherTf, data)

// ————— Converts current chart resolution into a float minutes value.
f_resInMinutes() => 
    _resInMinutes = timeframe.multiplier * (
      timeframe.isseconds ? 1. / 60             :
      timeframe.isminutes ? 1.                  :
      timeframe.isdaily   ? 60. * 24            :
      timeframe.isweekly  ? 60. * 24 * 7        :
      timeframe.ismonthly ? 60. * 24 * 30.4375  : na)
// ————— Returns the float minutes value of the string _res.
f_tfResInMinutes(_res) =>
    // _res: resolution of any TF (in "timeframe.period" string format).
    // Dependency: f_resInMinutes().
    security(syminfo.tickerid, _res, f_resInMinutes())

// —————————— Determine if current timeframe is smaller that higher timeframe selected in Inputs.
// Get higher timeframe in minutes.
//higherTfInMinutes = f_tfResInMinutes(higherTf)
// Get current timeframe in minutes.
currentTfInMinutes = f_resInMinutes()
// Compare current TF to higher TF to make sure it is smaller, otherwise our plots don't make sense.
//chartOnLowerTf = currentTfInMinutes < higherTfInMinutes

// Input
switch1=input(true, title="Show MA")
exponential = input(true, title="Exponential MA")
ticker = input(false, title="Other ticker MA")

tic_ma = input(title="Ticker MA", type=input.symbol, defval="BTC_USDT:swap")
res_ma = input(title="Time MA (W, D, [min])", type=input.string, defval="M")
len_ma = input(8, minval=1, title="Period MA")

ma_cus = exponential?f_secureSecurity(tic_ma, res_ma, ema(close,len_ma)) : f_secureSecurity(tic_ma, res_ma, sma(close,len_ma))
ma_long = exponential?f_secureSecurity(syminfo.tickerid, res_ma, ema(close,len_ma)) : f_secureSecurity(syminfo.tickerid, res_ma, sma(close,len_ma))

cl1 = f_secureSecurity(syminfo.tickerid, 'M', close)
cl2 = f_secureSecurity(tic_ma, 'M', close)

// Input Backtest Range
showDate  = input(defval = false, title = "Show Date Range", type = input.bool)
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 1995, title = "From Year",       type = input.integer, minval = 1850)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2112, title = "Thru Year",       type = input.integer, minval = 1850)

// Funcion Example
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false       // create function "within window of time"

// Calculation
bullish_cross = ticker?cl2>ma_cus : cl1>ma_long
bearish_cross = ticker?cl2<ma_cus : cl1<ma_long

MAColor = bullish_cross ? color.green : bearish_cross ? color.red : color.orange

// Strategy
strategy.entry("long", strategy.long, when = window() and bullish_cross)
strategy.close("long", when = window() and bearish_cross)

// Output
plot(switch1?ma_long:na,color = MAColor,linewidth=4)

// Alerts
alertcondition(bullish_cross, title='Bullish', message='Bullish')
alertcondition(bearish_cross, title='Bearish', message='Bearish')

Plus de