
La stratégie de rupture de prix de la chaîne adaptative est une stratégie de rupture de longue ligne basée sur la moyenne mobile adaptative adaptative (AMA) et la gamme de chaînes adaptatives pour juger des signaux d’achat et de vente. Cette stratégie utilise l’AMA pour calculer la direction de la tendance du prix actuel et combine la gamme de chaînes adaptées dynamiquement pour trouver des signaux de rupture de prix afin d’effectuer des achats et des ventes opportuns.
L’indicateur central de la stratégie est la moyenne mobile adaptative moyenne (AMA) et la formule de calcul de l’AMA pour capturer les tendances des prix est:
AMA(t) = α(t-1) * P(t) + [1 - α(t-1)] * AMA(t-1)
P (t) est le prix actuel et α (t) est la constante de la fluctuation, dont la valeur est comprise entre 0 et 1. α (t) est ajusté dynamiquement par une certaine règle pour contrôler la sensibilité de l’AMA aux variations de prix. Plus précisément, la valeur de α (t) est proportionnelle à l’AMA et à l’écart entre le prix et le SNRT. La formule SNRT est la suivante:
SNRT = (P(t) - AMA(t-1)) / AMA(t-1)
Ainsi, lorsque les fluctuations de prix augmentent, α ((t) augmentera, ce qui rend l’AMA plus sensible au suivi des prix; lorsque les fluctuations de prix diminuent, α ((t) diminuera, ce qui rend l’AMA plus lisse.
Sur la base de l’AMA, la stratégie établit ensuite une gamme de canaux adaptatifs pour détecter les signaux de rupture de prix. Les rails supérieurs et inférieurs de la gamme de canaux sont les suivants:
En haut de la voie: H{\displaystyle t} = (1 + β)*H(t-1)) * AMA(t)
La sous-route: L (t) = (1 - β)*L(t-1)) * AMA(t)
où β est un paramètre réglable qui contrôle la largeur du canal. Enfin, la stratégie génère un signal de transaction en observant si le prix a fait une percée vers le haut ou le bas:
Il y a aussi des gens qui ne sont pas d’accord avec le fait que les prix augmentent.
Il y a des gens qui ne sont pas d’accord avec le fait que les prix baissent, mais ils ne le sont pas.
Autrement, le stock est vide.
Cette stratégie présente les avantages suivants:
L’utilisation de l’AMA au lieu d’une moyenne mobile ordinaire permet de capturer les tendances des prix de manière plus flexible, en particulier dans les marchés à forte volatilité.
La portée des canaux d’adaptation peut être ajustée de manière dynamique, en élargissant la largeur des canaux en cas d’incertitude, en resserrant les canaux pour suivre les prix en cas de tendance claire.
Les signaux de rupture de prix sont capables d’être saisis en temps opportun au début d’une tendance et ont un taux de victoire plus élevé.
La logique de la stratégie est simple et claire, facile à comprendre et à mettre en œuvre, adaptée aux transactions quantitatives.
La stratégie présente également les risques suivants:
Une mauvaise définition des paramètres AMA peut entraîner des tendances de prix erronées ou de faux signaux.
Les paramètres de la voie d’adaptation tels que β doivent être réglés avec précaution, sinon il peut y avoir trop de transactions fréquentes ou une tendance à l’omission.
Les signaux de rupture de prix sont facilement trompeurs et devraient être filtrés par d’autres indicateurs.
La stratégie elle-même ne prend pas en compte la gestion des fonds et les mécanismes de stop-loss, ce qui entraîne un certain risque de pertes.
Cette stratégie peut être optimisée dans les domaines suivants:
Optimisation de la méthode de calcul de la valeur α de l’AMA pour la rendre plus sensible aux variations de prix.
Ajout d’une confirmation ultérieure après une brèche de passage pour éviter que les fausses brèches ne génèrent de faux signaux.
Le filtrage est effectué en combinaison avec des indicateurs de volume de transactions ou de volatilité, afin d’assurer l’efficacité de la percée.
Ajout d’un mécanisme de suivi des arrêts de perte pour bloquer les bénéfices et contrôler les risques.
Optimiser la gestion des fonds et déterminer la gestion des positions raisonnables pour les différents actifs.
La stratégie de rupture de prix d’adaptation de la chaîne est une stratégie de rupture de suivi de tendance simple et pratique dans l’ensemble. Elle suit la tendance des prix en s’adaptant à la moyenne mobile par une application flexible, et est complétée par la découverte de signaux de rupture de la chaîne par adaptation.
/*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)