Tendance à la moyenne mobile croisée ouverte-close suivant la stratégie

Auteur:ChaoZhang est là., Date: 2024-01-15 14h24 et 27h
Les étiquettes:

img

Résumé

La stratégie Open Close Cross Moving Average Trend Following est une stratégie de suivi de tendance basée sur les moyennes mobiles des prix ouverts et fermés. Elle détermine la tendance actuelle du marché en calculant les moyennes mobiles des prix ouverts et fermés; elle est longue lorsque la moyenne mobile du prix de clôture dépasse la moyenne mobile du prix d'ouverture, et court lorsque la moyenne mobile du prix de clôture dépasse la moyenne mobile du prix d'ouverture.

Principaux

La logique de base de cette stratégie est basée sur la relation entre les prix d'ouverture et de fermeture pour déterminer la tendance actuelle. Le prix d'ouverture reflète la relation offre-demande actuelle du marché et la psychologie du trading, tandis que le prix de clôture reflète le résultat final du jour. En général, si le prix de clôture est supérieur au prix d'ouverture, cela indique que la tendance du marché pour la journée est à la hausse et le sentiment est plus haussier. Si le prix de clôture est inférieur au prix d'ouverture, cela suggère que la tendance du marché pour la journée est à la baisse et le sentiment est plus baissier.

Cette stratégie utilise cette logique en calculant les moyennes mobiles des prix d'ouverture et de clôture pour juger de la direction de la tendance actuelle.

  1. Une position longue peut être ouverte lorsque la moyenne mobile du prix de clôture dépasse la moyenne mobile du prix d'ouverture.

  2. En effet, le taux d'intérêt de l'épargne-investissement est supérieur à celui de l'épargne-investissement.

  3. Fermez les positions existantes avec un stop loss lorsque des signaux inversés se produisent.

La stratégie définit également des arrêts de trail pour verrouiller les bénéfices. Après avoir entré une position, elle calcule dynamiquement la différence de point entre le prix d'entrée et le prix actuel. Lorsque le mouvement du prix dépasse le seuil de point de stop-loss défini, la ligne de stop-loss se déplacera vers le haut pour verrouiller des bénéfices partiels.

En résumé, la stratégie évalue les tendances sur la durée de la moyenne mobile; ne détient qu'une seule position directionnelle à la fois; quitte les positions existantes directement avec des signaux inversés sans arrêts ATR; et dispose de paramètres d'arrêt de trailing pour verrouiller les bénéfices.

Analyse des avantages

Cette stratégie présente les principaux avantages suivants:

  1. Des règles simples et clairesLe jugement de la tendance basé sur la relation ouverte-close est facile à comprendre et à optimiser les paramètres.

  2. Choix de l'AM flexibleIl existe des dizaines de types de MA parmi lesquels choisir et optimiser.

  3. Résolution réglableLa résolution peut être réglée à 3 à 4 fois celle du graphique pour une plus grande sensibilité et rapidité des signaux.

  4. Mécanisme d'arrêt des pertesLe trailing stop contrôle efficacement les pertes et les retraits par transaction.

  5. Période de détention personnalisableLa période de détention et la volatilité peuvent être contrôlées en ajustant les paramètres de l'AM.

  6. Résultats de l'évaluation des risquesLes points de stop-loss et les points de compensation modifient la préférence risque-récompense.

Analyse des risques

Les principaux risques de cette stratégie se situent dans les domaines suivants:

  1. Des retours de tendance manquantsLes signaux de sortie peuvent retarder les renversements de prix, ce qui entraîne des pertes.

  2. Ne convient pas aux conditions de forte volatilitéL'augmentation de la fréquence des échanges dans des conditions volatiles crée des coûts de commission élevés.

  3. Faire confiance à un indicateur uniqueL'ajout d'autres indicateurs comme le MACD pourrait compléter la logique.

  4. Risque d'optimisation excessive. Les paramètres MA et les paramètres stop loss peuvent être facilement surajustés. Les performances hors échantillon peuvent se détériorer.

Directions d'optimisation

La stratégie peut être optimisée et améliorée à partir de domaines tels que:

  1. Indicateurs complémentairesLes indicateurs de volatilité et de dynamique peuvent accroître la robustesse et la stabilité.

  2. Paramètres dynamiques conditionnelsLes périodes de mise en marché peuvent être ajustées en fonction des tendances ou de la détection de régimes de marché latéraux pour une meilleure adaptabilité.

  3. Contrôle dynamique des risquesLes points de stop-loss et les compensations peuvent être calibrés sur les niveaux de volatilité récemment réalisés.

  4. Logique de stop loss amélioréeDes mécanismes de stop loss plus avancés comme les ATR peuvent remplacer le simple trailing stop.

Conclusion

La stratégie Open Close Cross Moving Average Trend Following est une stratégie de trading de tendance typique basée sur une relation ouverte-close et des moyennes mobiles.


/*backtest
start: 2023-01-08 00:00:00
end: 2024-01-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title = "Open Close Cross Strategy (PineScript=v4)", shorttitle = "OCC Strategy", overlay = true )

// Revision:        1
// Author:          @JayRogers
//
// Description:
//  - Strategy based around Open-Close Crossovers.
// Setup:
//  - I have generally found that setting the strategy resolution to 3-4x that of the chart you are viewing
//    tends to yield the best results, regardless of which MA option you may choose (if any)
//  - Don't aim for perfection. Just aim to get a reasonably snug fit with the O-C band, with good runs of
//    green and red.
//  - Option to either use basic open and close series data, or pick your poison with a wide array of MA types.
//  - Optional trailing stop for damage mitigation if desired (can be toggled on/off)
//  - Positions get taken automagically following a crossover - which is why it's better to set the resolution
//    of the script greater than that of your chart, so that the trades get taken sooner rather than later.
//  - If you make use of the trailing stops, be sure to take your time tweaking the values. Cutting it too fine
//    will cost you profits but keep you safer, while letting them loose could lead to more drawdown than you
//    can handle.

// === INPUTS ===
useRes = input(defval=true, title="Use Alternate Resolution? ( recommended )")
stratRes = input(defval="120", title="Set Resolution ( should not be lower than chart )", type=input.resolution)
useMA = input(defval=true, title="Use MA? ( otherwise use simple Open/Close data )")
basisType = input(defval="DEMA", title="MA Type: SMA, EMA, DEMA, TEMA, WMA, VWMA, SMMA, HullMA, LSMA, ALMA ( case sensitive )", type=input.string)
basisLen = input(defval=14, title="MA Period", minval=1)
offsetSigma = input(defval=6, title="Offset for LSMA / Sigma for ALMA", minval=0)
offsetALMA = input(defval=0.85, title="Offset for ALMA", minval=0, step=0.01)
useStop = input(defval=true, title="Use Trailing Stop?")
slPoints = input(defval=200, title="Stop Loss Trail Points", minval=1)
slOffset = input(defval=400, title="Stop Loss Trail Offset", minval=1)
// === /INPUTS ===

// === BASE FUNCTIONS ===
// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len, offSig, offALMA) =>
    v1 = sma(src, len)  // Simple
    v2 = ema(src, len)  // Exponential
    v3 = 2 * v2 - ema(v2, len)  // Double Exponential
    v4 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)  // Triple Exponential
    v5 = wma(src, len)  // Weighted
    v6 = vwma(src, len)  // Volume Weighted
    sma_1 = sma(src, len)  // Smoothed
    v7 = na(v5[1]) ? sma_1 : (v5[1] * (len - 1) + src) / len
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))  // Hull
    v9 = linreg(src, len, offSig)  // Least Squares
    v10 = alma(src, len, offALMA, offSig)  // Arnaud Legoux
    type == "EMA" ? v2 : type == "DEMA" ? v3 : type == "TEMA" ? v4 : 
       type == "WMA" ? v5 : type == "VWMA" ? v6 : type == "SMMA" ? v7 : 
       type == "HullMA" ? v8 : type == "LSMA" ? v9 : type == "ALMA" ? v10 : v1
// security wrapper for repeat calls
reso(exp, use, res) =>
    security_1 = security(syminfo.tickerid, res, exp)
    use ? security_1 : exp
// === /BASE FUNCTIONS ===

// === SERIES SETUP ===
// open/close
variant__1 = variant(basisType, close, basisLen, offsetSigma, offsetALMA)
reso__1 = reso(variant__1, useRes, stratRes)
reso__2 = reso(close, useRes, stratRes)
closeSeries = useMA ? reso__1 : reso__2
variant__2 = variant(basisType, open, basisLen, offsetSigma, offsetALMA)
reso__3 = reso(variant__2, useRes, stratRes)
reso__4 = reso(open, useRes, stratRes)
openSeries = useMA ? reso__3 : reso__4
trendState = bool(na)
trendState := closeSeries > openSeries ? true : 
   closeSeries < openSeries ? false : trendState[1]
// === /SERIES ===

// === PLOTTING ===
barcolor(color=closeSeries > openSeries ? #006600 : #990000, title="Bar Colours")
// channel outline
closePlot = plot(closeSeries, title="Close Line", color=#009900, linewidth=2, style=plot.style_line, transp=90)
openPlot = plot(openSeries, title="Open Line", color=#CC0000, linewidth=2, style=plot.style_line, transp=90)
// channel fill
closePlotU = plot(trendState ? closeSeries : na, transp=100, editable=false)
openPlotU = plot(trendState ? openSeries : na, transp=100, editable=false)
closePlotD = plot(trendState ? na : closeSeries, transp=100, editable=false)
openPlotD = plot(trendState ? na : openSeries, transp=100, editable=false)
fill(openPlotU, closePlotU, title="Up Trend Fill", color=#009900, transp=40)
fill(openPlotD, closePlotD, title="Down Trend Fill", color=#CC0000, transp=40)
// === /PLOTTING ===

// === STRATEGY ===
// conditions
longCond = crossover(closeSeries, openSeries)
shortCond = crossunder(closeSeries, openSeries)
// entries and base exit
strategy.entry("long", strategy.long, when=longCond)
strategy.entry("short", strategy.short, when=shortCond)
// if we're using the trailing stop
if useStop
    strategy.exit("XL", from_entry="long", trail_points=slPoints, trail_offset=slOffset)
    strategy.exit("XS", from_entry="short", trail_points=slPoints, trail_offset=slOffset)
// not sure needed, but just incase..
strategy.exit("XL", from_entry="long", when=shortCond)
strategy.exit("XS", from_entry="short", when=longCond)
// === /STRATEGY ===


Plus de