Stratégie de croisement à double moyenne mobile


Date de création: 2023-12-13 15:51:13 Dernière modification: 2023-12-13 15:51:13
Copier: 0 Nombre de clics: 1316
1
Suivre
1621
Abonnés

Stratégie de croisement à double moyenne mobile

Aperçu

La stratégie de point de croisement bi-équilibre est une stratégie de négociation quantitative basée sur des moyennes mobiles. Elle détermine la tendance des prix en calculant des croisements de lignes rapides et lentes et en émettant des signaux d’achat et de vente aux points de croisement.

Principe de stratégie

La formule de calcul de la stratégie de points de croisement bi-égal est la suivante: Ligne rapide ((Ligne moyenne de la coque): WMA ((2 * WMA ((valeur, n/2) - WMA ((valeur, n), SQRT ((n))
Ligne lente (Super Smoother): Filtre à trois valeurs

Parmi ceux-ci, WMA représente la moyenne mobile pondérée, SQRT représente la racine carrée ouverte et le filtre contient un retard de phase un et deux retard de phase deux.

La stratégie consiste à déterminer la relation entre les deux lignes en calculant les valeurs de la ligne rapide et de la ligne lente, parmi lesquelles:
La ligne rapide est un signal d’achat. La ligne rapide est un signal de vente, la ligne lente est un signal de vente.

Analyse des avantages

La stratégie de point-point de croisement de deux équilibre, combinant les avantages du jugement de deux équilibre et de la négociation de points, permet de saisir avec précision les points de retournement de tendance et d’entrer et de sortir à temps. Par rapport à la stratégie de ligne unique, elle présente les avantages suivants:

  1. La combinaison de deux lignes homogènes élimine les faux signaux. Les lignes rapides déterminent la direction de la tendance et la force, et les lignes lentes filtrent les oscillations, rendant le signal plus fiable.
  2. Les filtres Super Smoother sont dotés d’une puissante capacité d’extraction de données, permettant d’extraire efficacement les tendances des prix.
  3. La ligne moyenne de Hull est très sensible aux variations de prix et peut capturer les virages en temps opportun.

Analyse des risques

La stratégie du point d’intersection de deux lignes égales comporte aussi des risques:

  1. En cas de tremblement de terre, il peut y avoir plus de signaux de whipsaw. L’espace de la ligne moyenne peut être élargi de manière appropriée pour réduire les faux signaux.
  2. L’élargissement de l’intervalle entre les deux lignes équivalentes risque de manquer une partie de l’opportunité. Il faut peser la quantité et la qualité du signal capturé.
  3. Cette stratégie est plus adaptée aux variétés à tendance plus claire et ne convient pas aux produits à forte volatilité.

Direction d’optimisation

Les stratégies de point d’intersection bi-homogène peuvent être optimisées à partir des dimensions suivantes:

  1. Ajustez les paramètres de la moyenne pour les variétés avec différentes périodes et amplitudes d’oscillation.
  2. Ajout d’indicateurs ou de filtres supplémentaires pour juger de la qualité des tendances afin de réduire le whipsaw.
  3. Le ratio de placement est optimisé en combinaison avec les indicateurs de tendance.

Résumer

La stratégie de points de croisement bi-équilibrés hérite des avantages de la stratégie de points équilibrés, étend l’utilisation du jugement bi-équilibré et de la méthode de négociation ponctuelle, formant un programme de négociation quantitative plus avancé et plus fiable. Elle présente des avantages uniques en matière de négociation à temps, qui méritent d’être testés et explorés. Cet article analyse en profondeur les principes, les avantages et les inconvénients de la stratégie et donne des hypothèses d’optimisation pour référence.

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

//@version=5
//

strategy(title='Open Close Cross Strategy ', shorttitle='sacinvesting', overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10, calc_on_every_tick=false)

// === INPUTS ===
useRes = input(defval=true, title='Use Alternate Resolution?')
intRes = input(defval=3, title='Multiplier for Alernate Resolution')
stratRes = timeframe.ismonthly ? str.tostring(timeframe.multiplier * intRes, '###M') : timeframe.isweekly ? str.tostring(timeframe.multiplier * intRes, '###W') : timeframe.isdaily ? str.tostring(timeframe.multiplier * intRes, '###D') : timeframe.isintraday ? str.tostring(timeframe.multiplier * intRes, '####') : '60'
basisType = input.string(defval='SMMA', title='MA Type: ', options=['SMA', 'EMA', 'DEMA', 'TEMA', 'WMA', 'VWMA', 'SMMA', 'HullMA', 'LSMA', 'ALMA', 'SSMA', 'TMA'])
basisLen = input.int(defval=8, title='MA Period', minval=1)
offsetSigma = input.int(defval=6, title='Offset for LSMA / Sigma for ALMA', minval=0)
offsetALMA = input.float(defval=0.85, title='Offset for ALMA', minval=0, step=0.01)
scolor = input(false, title='Show coloured Bars to indicate Trend?')
delayOffset = input.int(defval=0, title='Delay Open/Close MA (Forces Non-Repainting)', minval=0, step=1)
tradeType = input.string('BOTH', title='What trades should be taken : ', options=['LONG', 'SHORT', 'BOTH', 'NONE'])
// === /INPUTS ===

// Constants colours that include fully non-transparent option.
green100 = #008000FF
lime100 = #00FF00FF
red100 = #FF0000FF
blue100 = #0000FFFF
aqua100 = #00FFFFFF
darkred100 = #8B0000FF
gray100 = #808080FF

// === BASE FUNCTIONS ===
// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len, offSig, offALMA) =>
    v1 = ta.sma(src, len)  // Simple
    v2 = ta.ema(src, len)  // Exponential
    v3 = 2 * v2 - ta.ema(v2, len)  // Double Exponential
    v4 = 3 * (v2 - ta.ema(v2, len)) + ta.ema(ta.ema(v2, len), len)  // Triple Exponential
    v5 = ta.wma(src, len)  // Weighted
    v6 = ta.vwma(src, len)  // Volume Weighted
    v7 = 0.0
    sma_1 = ta.sma(src, len)  // Smoothed
    v7 := na(v7[1]) ? sma_1 : (v7[1] * (len - 1) + src) / len
    v8 = ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len)))  // Hull
    v9 = ta.linreg(src, len, offSig)  // Least Squares
    v10 = ta.alma(src, len, offALMA, offSig)  // Arnaud Legoux
    v11 = ta.sma(v1, len)  // Triangular (extreme smooth)
    // SuperSmoother filter
    // ©️ 2013 John F. Ehlers
    a1 = math.exp(-1.414 * 3.14159 / len)
    b1 = 2 * a1 * math.cos(1.414 * 3.14159 / len)
    c2 = b1
    c3 = -a1 * a1
    c1 = 1 - c2 - c3
    v12 = 0.0
    v12 := c1 * (src + nz(src[1])) / 2 + c2 * nz(v12[1]) + c3 * nz(v12[2])
    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 : type == 'TMA' ? v11 : type == 'SSMA' ? v12 : v1

// security wrapper for repeat calls
reso(exp, use, res) =>
    security_1 = request.security(syminfo.tickerid, res, exp, gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
    use ? security_1 : exp

// === /BASE FUNCTIONS ===

// === SERIES SETUP ===
closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)
// === /SERIES ===

// === PLOTTING ===

// Get Alternate resolution Series if selected.
closeSeriesAlt = reso(closeSeries, useRes, stratRes)
openSeriesAlt = reso(openSeries, useRes, stratRes)
//
trendColour = closeSeriesAlt > openSeriesAlt ? color.green : color.red
bcolour = closeSeries > openSeriesAlt ? lime100 : red100
barcolor(scolor ? bcolour : na, title='Bar Colours')
closeP = plot(closeSeriesAlt, title='Close Series', color=trendColour, linewidth=2, style=plot.style_line, transp=20)
openP = plot(openSeriesAlt, title='Open Series', color=trendColour, linewidth=2, style=plot.style_line, transp=20)
fill(closeP, openP, color=trendColour, transp=80)

// === /PLOTTING ===
//
//
// === ALERT conditions
xlong = ta.crossover(closeSeriesAlt, openSeriesAlt)
xshort = ta.crossunder(closeSeriesAlt, openSeriesAlt)
longCond = xlong  // alternative: longCond[1]? false : (xlong or xlong[1]) and close>closeSeriesAlt and close>=open
shortCond = xshort  // alternative: shortCond[1]? false : (xshort or xshort[1]) and close<closeSeriesAlt and close<=open
// === /ALERT conditions.

// === STRATEGY ===
// stop loss
slPoints = input.int(defval=0, title='Initial Stop Loss Points (zero to disable)', minval=0)
tpPoints = input.int(defval=0, title='Initial Target Profit Points (zero for disable)', minval=0)
// Include bar limiting algorithm
ebar = input.int(defval=10000, title='Number of Bars for Back Testing', minval=0)
dummy = input(false, title='- SET to ZERO for Daily or Longer Timeframes')
//
// Calculate how many mars since last bar
tdays = (timenow - time) / 60000.0  // number of minutes since last bar
tdays := timeframe.ismonthly ? tdays / 1440.0 / 5.0 / 4.3 / timeframe.multiplier : timeframe.isweekly ? tdays / 1440.0 / 5.0 / timeframe.multiplier : timeframe.isdaily ? tdays / 1440.0 / timeframe.multiplier : tdays / timeframe.multiplier  // number of bars since last bar
//
//set up exit parameters
TP = tpPoints > 0 ? tpPoints : na
SL = slPoints > 0 ? slPoints : na

// Make sure we are within the bar range, Set up entries and exit conditions
if (ebar == 0 or tdays <= ebar) and tradeType != 'NONE'
    strategy.entry('long', strategy.long, when=longCond == true and tradeType != 'SHORT')
    strategy.entry('short', strategy.short, when=shortCond == true and tradeType != 'LONG')
    strategy.close('long', when=shortCond == true and tradeType == 'LONG')
    strategy.close('short', when=longCond == true and tradeType == 'SHORT')
    strategy.exit('XL', from_entry='long', profit=TP, loss=SL)
    strategy.exit('XS', from_entry='short', profit=TP, loss=SL)

// === /STRATEGY ===
// eof