Cette stratégie utilise deux moyennes mobiles d'Arnaud Legoux (ALMA), l'une rapide et l'autre lente, pour générer des signaux croisés. ALMA réduit le décalage et lissue la ligne du signal par rapport aux MAs traditionnels.
Les principaux indicateurs et règles sont les suivants:
ALMA rapide: une période plus courte pour attraper les évasions.
ALMA lent: une période plus longue pour mesurer la tendance.
Filtre de volume: valable lorsque la courte EMA dépasse la longue EMA.
Signal d'achat: ALMA rapide passe au-dessus de ALMA lent et le filtre de volume passe.
Signal de vente: ALMA rapide passe sous ALMA lent.
Signal court: ALMA rapide passe sous ALMA lent et le filtre de volume passe.
Signal de couverture: ALMA rapide traverse au-dessus d'ALMA lente.
La stratégie combine l'analyse de tendance, de momentum et de volume pour des signaux robustes.
Comparativement aux stratégies traditionnelles de moyennes mobiles, les principaux avantages sont les suivants:
ALMA réduit le retard et améliore la qualité du signal.
Le filtre de volume évite les pertes dues aux fausses éruptions.
La combinaison rapide/lente mesure la direction de la tendance.
Des règles simples et intuitives, faciles à mettre en œuvre.
Adaptation flexible des paramètres de l'AM pour les différents marchés.
Une gestion raisonnable des risques.
Potentiel d'optimisation supplémentaire grâce au réglage des paramètres.
Dans l'ensemble, la stabilité et la qualité ont été améliorées par rapport aux stratégies de croisement traditionnelles.
Malgré les avantages, il convient de noter les risques suivants:
Les systèmes croisés sont intrinsèquement vulnérables aux fouets.
La performance d'ALMA dépend du réglage des paramètres.
Les pics de volume peuvent induire en erreur la génération de signaux.
Il y a toujours un certain retard, on ne peut pas éviter toutes les pertes.
Risque de suradaptation par optimisation excessive.
Les signaux échouent quand le volume est anormal.
Les techniques d'apprentissage automatique peuvent générer de meilleurs résultats.
Surveiller le rapport bénéfice/risque afin d'éviter des prélèvements excessifs.
Pour faire face aux risques, des améliorations peuvent être apportées dans les domaines suivants:
Optimisez les paramètres d'ALMA pour une meilleure sensibilité.
Experimenter avec différentes mesures de volume.
Introduire un stop loss pour contrôler les pertes par transaction.
Incorporer d'autres indicateurs pour des signaux solides.
Ajoutez un module d'apprentissage automatique pour un réglage plus intelligent du signal.
Déployer sur plusieurs produits pour diversifier la stratégie.
Optimiser les modèles de dimensionnement des positions pour différents marchés.
Recherchez la robustesse pour éviter une suradaptation.
En conclusion, par rapport aux stratégies crossover traditionnelles, cette stratégie améliore la qualité et la robustesse du signal grâce à l'algorithme ALMA et au filtre de volume. Mais l'optimisation de la stratégie est un processus itératif.
/*backtest start: 2022-09-16 00:00:00 end: 2023-09-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/ // © Sarahann999 // Calculations for TP/SL based off: https://kodify.net/tradingview/orders/percentage-profit/ //@version=5 strategy("ALMA Cross", overlay=true) //User Inputs src= (close) long_entry = input(true, title='Long Entry') short_entry = input(true, title='Short Entry') //Fast Settings ALMA1 = input(100, "ALMA Lenghth 1", group= "ALMA Fast Length Settings") alma_offset = input.float(defval=0.85, title='Arnaud Legoux (ALMA) - Offset Value', minval=0, step=0.01) alma_sigma = input.int(defval=6, title='Arnaud Legoux (ALMA) - Sigma Value', minval=0) Alma1 = ta.alma(src, ALMA1, alma_offset, alma_sigma) //Slow Settings ALMA2 = input(120, "ALMA Length 2", group = "ALMA Slow Length Settings") alma_offset2 = input.float(defval=0.85, title='Arnaud Legoux (ALMA) - Offset Value', minval=0, step=0.01) alma_sigma2 = input.int(defval=6, title='Arnaud Legoux (ALMA) - Sigma Value', minval=0) Alma2 = ta.alma(src, ALMA2, alma_offset2, alma_sigma2) //Volume var cumVol = 0. cumVol += nz(volume) if barstate.islast and cumVol == 0 runtime.error("No volume is provided by the data vendor.") shortlen = input.int(5, minval=1, title = "Short Length", group= "Volume Settings") longlen = input.int(10, minval=1, title = "Long Length") short = ta.ema(volume, shortlen) long = ta.ema(volume, longlen) osc = 100 * (short - long) / long //Define Cross Conditions buy = ta.crossover(Alma1, Alma2) sell = ta.crossunder(Alma1, Alma2) //Calculate Take Profit Percentage longProfitPerc = input.float(title="Long Take Profit", group='Take Profit Percentage', minval=0.0, step=0.1, defval=2) / 100 shortProfitPerc = input.float(title="Short Take Profit", minval=0.0, step=0.1, defval=2) / 100 // Figure out take profit price 1 longExitPrice = strategy.position_avg_price * (1 + longProfitPerc) shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc) // Make inputs that set the stop % 1 longStopPerc = input.float(title="Long Stop Loss", group='Stop Percentage', minval=0.0, step=0.1, defval=2.5) / 100 shortStopPerc = input.float(title="Short Stop Loss", minval=0.0, step=0.1, defval=2.5) / 100 // Figure Out Stop Price longStopPrice = strategy.position_avg_price * (1 - longStopPerc) shortStopPrice = strategy.position_avg_price * (1 + shortStopPerc) //Define Conditions buySignal = buy and osc > 0 and strategy.position_size == 0 //sellSignal sellSignal = sell and osc > 0 and strategy.position_size == 0 // Submit entry orders if buySignal and long_entry strategy.entry(id="Long", direction=strategy.long, alert_message="Enter Long") alert(message="BUY Trade Entry Alert", freq=alert.freq_once_per_bar) if sellSignal and short_entry strategy.entry(id="Short", direction=strategy.short, alert_message="Enter Short") alert(message="SELL Trade Entry Alert", freq=alert.freq_once_per_bar) // Submit exit orders based on take profit price if (strategy.position_size > 0) strategy.exit(id="Long TP/SL", limit=longExitPrice, stop=longStopPrice, alert_message="Long Exit 1 at {{close}}") if (strategy.position_size < 0) strategy.exit(id="Short TP/SL", limit=shortExitPrice, stop=shortStopPrice, alert_message="Short Exit 1 at {{close}}") //Draw plot(Alma1,"Alma Fast", color=color.purple, style=plot.style_circles) plot(Alma2,"Alma Slow", color=#acb5c2, style=plot.style_circles)