La stratégie de rupture de canal de moyenne mobile adaptative est une stratégie de rupture de tendance basée sur la moyenne mobile adaptative (AMA) et une plage de canaux adaptatifs pour générer des signaux de trading.
L'indicateur de base de cette stratégie est l'adaptive moving average (AMA), qui est utilisé pour capturer la tendance des prix.
L'analyse de l'efficacité de l'analyse est effectuée en fonction de l'efficacité de l'analyse de l'efficacité.
où P (t) est le prix actuel et α (t) est la constante de lissage entre 0 et 1. α (t) est réglée dynamiquement selon certaines règles pour contrôler la sensibilité de l'AMA aux variations de prix.
Le nombre d'épreuves est calculé en fonction de la fréquence de l'épreuve
Ainsi, à mesure que les fluctuations des prix augmentent, α ((t) augmentera pour rendre l'AMA plus réactif; lorsque les fluctuations diminuent, α ((t) diminuera pour rendre l'AMA plus lisse.
Basée sur l'AMA, la stratégie construit une plage de canaux adaptative pour détecter les signaux de rupture de prix.
La valeur de l'indice est la valeur de l'indice d'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice de l'indice.
La partie inférieure: L (t) = (1 - β*L (t-1)) * AMA (t)
où β est un paramètre réglable contrôlant la largeur du canal. Enfin, la stratégie génère des transactions basées sur les écarts de prix des niveaux du canal:
Entrez long lorsque le prix dépasse le niveau supérieur.
Entrez en short lorsque le prix dépasse le niveau inférieur.
Sinon, restez à plat.
Les avantages de cette stratégie sont les suivants:
L'AMA est plus flexible pour capturer les tendances des prix que les moyennes mobiles simples, en particulier sur les marchés volatils.
Le canal adaptatif peut ajuster dynamiquement sa largeur, en s'élargissant lorsque la tendance n'est pas claire et en se rétrécissant lorsqu'une tendance émerge.
Les signaux de rupture de prix peuvent capturer rapidement la tendance avec des taux de gain plus élevés.
La logique est simple et claire, facile à comprendre et automatisée pour le trading quantitatif.
Les risques de cette stratégie comprennent:
Les paramètres AMA incorrects peuvent manquer les tendances des prix ou générer de faux signaux.
Les paramètres du canal adaptatif comme β doivent être soigneusement réglés, faute de quoi il peut y avoir trop d'écart ou de tendances manquées.
Les ruptures de prix sont sujettes à de fausses ruptures, ce qui nécessite plus de filtres.
La stratégie n'inclut ni la gestion des risques ni les mécanismes de stop loss.
La stratégie peut être optimisée par:
Amélioration du calcul α pour rendre l'AMA plus réactif.
Ajout d'une confirmation supplémentaire après les éruptions initiales pour éviter de faux signaux.
Appliquer des filtres tels que le volume ou la volatilité pour valider la validité de la rupture.
Incorporer un stop-loss de suivi pour sécuriser les bénéfices et contrôler les risques.
Optimisation de la taille des positions pour les différentes classes d'actifs.
En résumé, la stratégie de rupture de canal de moyenne mobile adaptative est une stratégie de rupture simple et pratique qui suit les tendances. Elle utilise l'AMA flexible pour suivre les tendances des prix et un canal adaptatif pour détecter les signaux de rupture.
/*backtest start: 2022-10-26 00:00:00 end: 2023-11-01 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // CryptoStatistical - 2019 // AMA Strategy Channel Breakout Strategy from E. Durenard - Professional Automated Trading // https://www.amazon.com/Professional-Automated-Trading-Theory-Practice/dp/1118129857 strategy(title="[CS] AMA Strategy - Channel Break Out", shorttitle="AMA_ChannelBreakout_Strategy", initial_capital = 1000, overlay=true, pyramiding = 0, calc_on_every_tick=false, calc_on_order_fills=false, commission_type= strategy.commission.percent, commission_value = 0.08, currency=currency.USD) testStartYear = input(2019, "Backtest Start Year") testStartMonth = input(6, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true) testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na bgcolor(testPeriodBackgroundColor, transp=95) testPeriod() => true price = input(title='Price Source:', type=input.source, defval=close) ama = price hb = price lb = price // Static model parameters minfactor = 0. maxfactor = 1. deviation_max = 1. deviation_min = 1. beta_hb = 1. beta_lb = 1. snr = 1. normalized_atan= 0. alpha = 0.5 // Suggested snr-factor from .5 upto 3.1 by .3 to find best parameter snrfactor = input(title='SNR Factor:', type=input.float, minval=0.6, maxval=3.3, step=0.3, defval=2.1) // Sensitivity Lookback search for the best perdiod from 5 to 20 lookback = input(title='Sensitivity Lookback:', type=input.integer, defval=5) // Suggested Beta from .5 below 4.5 by .3, usually in the range 1.2, 1.5 beta = input(title='Beta:', type=input.float, minval=0.6, maxval=4.5, step=0.3, defval=2.1) offsetlabel = input(title='Offset Label:', type=input.float, minval=0.001, maxval=0.03, step=0.001, defval=0.001) // pi/2 pi2 = 1.5707963267948966 // Zero-lag resampled moving average (Durschner nwma) f_nwma(_src, _period) => fast = _period/2 lambda = _period/fast alpha = lambda * (_period - 1)/(_period - lambda) average1 = wma(_src,_period) average2 = wma(average1,fast) nwma = (1+alpha)*average1 - alpha*average2 ama := alpha[1]*price + (1-alpha[1])*nz(ama[1]) deviation_max := alpha[1]*max((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_max[1]) deviation_min := -alpha[1]*min((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_min[1]) beta_hb := beta*deviation_max beta_lb := beta*deviation_min hb := (1 + beta_hb[1])*ama lb := (1 - beta_lb[1])*ama snr := if price > hb ((price - ama[1])/ama[1])/beta_lb else if price < lb -((price - ama[1])/ama[1])/beta_hb else 0 normalized_atan := (atan(snrfactor*snr) + pi2)/(2*pi2) alpha := f_nwma(minfactor + (maxfactor - minfactor)*normalized_atan, lookback) plot(ama, color=color.black) plot(hb, color=color.green) plot(lb, color=color.red) // Buy Condition Var bc = false // Sell Condition Var sc = false d = color.black // Buy Condition if(price > hb) bc := true d := color.green // Sell Condition if(price < lb) sc := true d := color.red if(testPeriod()) strategy.entry("Long", strategy.long, when = bc) strategy.entry("Short", strategy.short, when = sc) alertcondition(bc, title='BuyCondition', message='Buy') alertcondition(sc, title='SellCondition', message='Sell') plotshape(title='Buy', series=bc ? price * (1 - offsetlabel) : na, text='A1B', style=shape.labelup, location=location.absolute, color=d, textcolor=color.white, offset=0) plotshape(title='Sell', series=sc ? price * (1 + offsetlabel) : na, text='A1S', style=shape.labeldown, location=location.absolute, color=d, textcolor=color.white, offset=0)