Cet article traite d'une stratégie de négociation basée sur une moyenne mobile simple. La stratégie compare le prix de clôture avec une moyenne mobile sur 17 périodes, en allant long lorsque le prix de clôture dépasse la moyenne mobile et en allant court lorsqu'il dépasse la moyenne mobile.
La stratégie utilise les paramètres suivants pour calculer la moyenne mobile:
Sur la base de ces paramètres, la fonction getMAType( est appelée pour calculer la SMA de 17 périodes des prix de clôture.
Ensuite, comparez la relation entre le prix de clôture et la moyenne mobile:
Lorsque le prix de clôture dépasse la moyenne mobile depuis le bas, un signal long est généré. Lorsqu'il dépasse le bas depuis le haut, un signal court est généré.
Au cours de la période de backtest, ouvrir des positions longues lorsque des signaux longs apparaissent et ouvrir des positions courtes lorsque des signaux courts apparaissent.
Le plus grand avantage de cette stratégie est que la logique est très simple et claire. Avec un seul indicateur, il juge l'inversion de tendance en fonction du changement de direction de l'indicateur. La stratégie est facile à comprendre et à mettre en œuvre, adaptée aux débutants.
En outre, les moyennes mobiles appartiennent à des indicateurs de tendance, qui permettent de suivre efficacement les changements de tendance et d'éviter les interférences du bruit de marché à court terme.
En ajustant les paramètres, il peut s'adapter à différents cycles et produits.
Premièrement, cette stratégie repose uniquement sur un seul indicateur, de sorte que les critères d'appréciation sont relativement uniques, ce qui peut générer davantage de faux signaux.
En outre, en tant que système de suivi des tendances, il ne fonctionne pas bien sur les marchés à plage et latéraux.
En outre, sans stop-loss ni prise de profit, il existe un risque d'accroissement des pertes.
Les solutions sont d'intégrer d'autres indicateurs, d'optimiser les combinaisons de paramètres pour réduire les faux signaux.
Voici quelques idées pour optimiser la stratégie:
Ajuster les paramètres de la moyenne mobile, optimiser les numéros de périodes, par exemple changer à 30 ou à 50 périodes.
Essayez différents types de moyennes mobiles, comme EMA, VIDYA, etc. Ils ont une sensibilité variable aux variations de prix.
Ajouter d'autres indicateurs en combinaison, par exemple MACD pour évaluer la force; RSI pour réduire les faux signaux.
Ajoutez des mécanismes de stop-loss. Définissez un pourcentage fixe ou un stop-loss de suivi basé sur l'ATR pour contrôler le montant de la perte d'un seul commerce.
Ajoutez des mécanismes de prise de bénéfices, fixez un pourcentage de bénéfice cible pour maximiser les bénéfices.
Ces optimisations peuvent rendre les performances de la stratégie plus stables et éviter des retards excessifs.
Cet article analyse une stratégie de trading simple basée sur une moyenne mobile à 17 périodes. La stratégie a des sources de signaux simples, faciles à comprendre et à mettre en œuvre, appartenant à un système typique de suivi des tendances.
/*backtest start: 2023-12-05 00:00:00 end: 2024-01-04 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Simple 17 BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0) /////////////// Time Frame /////////////// testStartYear = input(2012, "Backtest Start Year") testStartMonth = input(1, "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) testPeriod() => true ///////////// Moving Average ///////////// source = input(title="MA Source", defval=ohlc4) maType = input(title="MA Type", defval="sma", options=["sma", "ema", "swma", "wma", "vwma", "rma"]) length = input(title="MA Length", defval=17) ///////////// Get MA Function ///////////// getMAType(maType, sourceType, maLen) => res = sma(close, 1) if maType == "ema" res := ema(sourceType, maLen) if maType == "sma" res := sma(sourceType, maLen) if maType == "swma" res := swma(sourceType) if maType == "wma" res := wma(sourceType, maLen) if maType == "vwma" res := vwma(sourceType, maLen) if maType == "rma" res := rma(sourceType, maLen) res MA = getMAType(maType, source, length) /////////////// Strategy /////////////// long = close > MA short = close < MA last_long = 0.0 last_short = 0.0 last_long := long ? time : nz(last_long[1]) last_short := short ? time : nz(last_short[1]) long_signal = crossover(last_long, last_short) short_signal = crossover(last_short, last_long) /////////////// Execution /////////////// if testPeriod() strategy.entry("L", strategy.long, when=long_signal) strategy.entry("S", strategy.short, when=short_signal) /////////////// Plotting /////////////// p1 = plot(MA, color = long ? color.lime : color.red, linewidth=2) p2 = plot(close, linewidth=2) fill(p1, p2, color=strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=80)