Cette stratégie est basée sur la moyenne mobile, peut ajuster automatiquement les paramètres et convient aux marchés ondulants à des délais élevés.
Cette stratégie utilise une moyenne mobile adaptative comme signal de trading. Elle calcule d'abord la moyenne mobile simple (CMA) de la période spécifiée (début). Elle teste ensuite les paramètres de la CMA autour de la période, en jugeant quelle combinaison a le moins de touches par corps de chandelier et de mèche. Enfin, elle utilise la CMA avec le moins de touches comme ligne de signal.
Plus précisément, la stratégie teste la CMA avec la période plus 1 (CMA_P1) et moins 1 (CMA_M1), compte le nombre de touches par corps et par mèche. Si CMA a moins de touches que CMA_P1 et CMA_M1, alors conservez la période en cours; si CMA_P1 a moins de touches, alors augmentez la période de 1; si CMA_M1 a moins de touches, alors diminuez la période de 1.
Lorsque le prix traverse la CMA à la hausse, un signal d'achat est généré; lorsque le prix traverse la CMA à la baisse, un signal de vente est généré.
Cette stratégie de moyenne mobile adaptative présente les avantages suivants:
Trouvez automatiquement les paramètres optimaux. Pas besoin de sélectionner manuellement la période de moyenne mobile, la stratégie testera différentes périodes et trouvera l'optimum.
Réduire les faux signaux. Par rapport à la MA à période fixe, la MA adaptative peut filtrer plus de bruit et réduire de nombreux faux signaux.
Adaptez-vous aux changements du marché. Lorsque le marché passe de la plage à la tendance, la période de MA augmentera automatiquement pour générer des signaux; lorsque le marché passe de la tendance à la plage, la période de MA diminuera automatiquement. Ainsi, la stratégie peut s'adapter dynamiquement aux changements du marché.
Cette méthode adaptative peut simplifier l'ensemble du système de négociation sans optimisation manuelle des paramètres.
Le concept peut être appliqué à d'autres indicateurs tels que les bandes de Bollinger adaptatives, les KD adaptatives, etc.
Il y a aussi quelques risques à prendre en compte pour cette stratégie:
Risque d'option d'achat. Lorsque le marché a un modèle d'option d'achat, le corps de la bougie peut ne pas réussir à briser la ligne MA, ce qui entraîne de mauvais signaux. Des conditions de filtre doivent être ajoutées pour réduire ce risque.
Risque d'échec. L'échec de MA ne se poursuit pas toujours, certains échecs peuvent survenir. La validation de l'échec est nécessaire pour assurer un taux de réussite élevé.
Risque d'inversion de tendance. L'inversion de tendance après l'entrée de la tendance doit être changée en temps opportun, sinon elle peut entraîner des pertes. Le stop loss doit être réglé pour contrôler la perte.
Risque d'optimisation des paramètres. Les paramètres ajustés adaptatifs peuvent tomber dans l'optimisation locale, ce qui entraîne des MA redondants. Des méthodes d'évaluation des modèles doivent être introduites pour éviter ce problème.
Risque de surajustement. Le réglage excessif des paramètres peut entraîner un surajustement et la perte de la capacité de généralisation du modèle. Une vérification prolongée dans différents environnements de marché est nécessaire, et non pas seulement se fier aux résultats des tests antérieurs.
Quelques orientations pour améliorer cette stratégie d'AM adaptative:
Ajouter la validation de la rupture de tendance via des ruptures consécutives pour filtrer les fausses ruptures.
Augmenter la stratégie de stop loss, stop loss lorsque le prix retourne de l'autre côté de MA.
Ajoutez le filtre d'option pour éviter les mauvais signaux lorsque l'option d'appel apparaît.
Introduire des mesures d'évaluation telles que IC, LIC, SIC, etc. pour limiter le réglage des paramètres et prévenir le surajustement.
Élargir à d'autres indicateurs tels que la stratégie de croix d'or adaptative, les bandes de Bollinger adaptatives, etc.
Optimiser le calcul de la MA en utilisant la MA pondérée, la MA exponentielle, etc. pour obtenir une MA plus fluide.
Cette stratégie génère des signaux de trading en ajustant de manière adaptative la période de MA pour trouver des paramètres optimaux. Par rapport aux paramètres fixes, elle peut réduire de nombreux faux signaux et s'adapter aux changements du marché. Mais nous devons également faire attention aux risques potentiels et faire une vérification et une optimisation avant de l'appliquer dans le trading en direct pour des profits stables.
Je ne sais pas.
/*backtest start: 2022-11-10 00:00:00 end: 2023-11-16 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/ // © fondDealer96636 //@version=5 strategy('Automatic Moving Average', overlay=true, max_bars_back=201, pyramiding=0, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000) // input start = 20 lookback = input(20, "Sensitivity", tooltip="Low (High Sensitivity), High (Low Sensitivity).\n\nAdjust according to timeframe and asset.") smoothing = input(3, "Smoothing") source = input(close, "Source") startYear = input(2020, "Start year") resp = 1 in_date_range = time >= timestamp(syminfo.timezone, startYear, 1, 1, 0, 0) // global var ix = -1 var mal = array.new_int(0) // functions avg(source, len) => sum = 0.0 for i = 0 to len-1 sum += source[i] sum/len bull = close > open wick_touch(x) => bull ? ((close <= x and x <= high) or (low <= x and x <= open)) : ((open <= x and x <= high) or (low <= x and x <= close)) body_touch(x) => bull ? (open < x and x < close) : (close < x and x < open) touches(t) => touches = 0 for i = 0 to lookback-1 touches += t[i] ? 1 : 0 touches // local ix := ix+1 prev_mal = ix >= 1 ? array.get(mal, ix-1) : start cma = avg(source, prev_mal) cma_p1 = avg(source, prev_mal+1) cma_m1 = avg(source, prev_mal-1) d = touches(wick_touch(cma)) d_p1 = touches(wick_touch(cma_p1)) d_m1 = touches(wick_touch(cma_m1)) d_b = touches(body_touch(cma)) d_p1_b = touches(body_touch(cma_p1)) d_m1_b = touches(body_touch(cma_m1)) any_body_touch = d_b > 0 or d_p1_b > 0 or d_m1_b > 0 no_wick_touch = d <= 0 and d_p1 <= 0 and d_m1 <= 0 wick_maximized = d >= d_p1 and d >= d_m1 ? prev_mal : (d_p1 >= d and d_p1 >= d_m1 ? prev_mal+resp : (d_m1 >= d and d_m1 >= d_p1 ? prev_mal-resp : na)) up = cma > cma[1] down = cma < cma[1] against_trend = (up and close < cma) or (down and close > cma) new_mal = no_wick_touch or against_trend ? prev_mal-resp : (any_body_touch ? prev_mal+resp : wick_maximized) next_mal = na(new_mal) ? prev_mal : new_mal array.push(mal, next_mal < 2 ? 2 : (next_mal > 200 ? 200 : next_mal)) // graph scma = ta.ema(cma, smoothing) uptrend = scma > scma[1] downtrend = scma < scma[1] plot(scma, "Automatic MA", color=uptrend ? color.green : color.red) uptrending = close > scma and uptrend downtrending = close < scma and downtrend defy = not uptrending and not downtrending defy_cross = defy and body_touch(scma) barcolor(uptrending ? color.lime : (downtrending ? color.red : (defy_cross ? color.black : color.white))) // strategy change_to_uptrend = uptrending and downtrend[1] change_to_downtrend = downtrending and uptrend[1] long = in_date_range and change_to_uptrend short = in_date_range and change_to_downtrend if long strategy.entry("Long", strategy.long) if short strategy.entry("Short", strategy.short)