Il s'agit d'une stratégie de trading quantitative qui combine le double croisement de la moyenne mobile, les conditions de surachat/survente du RSI et la gestion du ratio risque-rendement. La stratégie détermine l'orientation de la tendance du marché à travers des croisements de moyenne mobile à court et à long terme tout en utilisant l'indicateur RSI pour identifier les zones de surachat/survente pour un filtrage plus précis des signaux commerciaux. Elle intègre également des paramètres de stop-loss dynamiques basés sur ATR et un système de gestion des objectifs de profit à taux de risque-rendement fixe.
La stratégie utilise des moyennes mobiles de 9 jours et 21 jours comme base pour la détermination de la tendance, avec des zones de surachat / survente (35/65) pour la confirmation du signal. Les conditions d'entrée longues nécessitent la MA à court terme supérieure à la MA à long terme et à la RSI dans le territoire survendu (en dessous de 35); l'entrée courte nécessite la MA à court terme inférieure à la MA à long terme et à la RSI dans le territoire survendu (au-dessus de 65). La stratégie utilise 1,5 fois la valeur de la distance ATR pour le stop-loss et calcule automatiquement les objectifs de profit basés sur un rapport risque-rendement de 2: 1.
Cette stratégie construit un système de trading relativement complet grâce à la coordination de plusieurs indicateurs techniques. Elle se concentre non seulement sur la qualité du signal d'entrée, mais aussi sur la gestion des risques et la fixation des objectifs de profit. Bien qu'il existe des domaines d'optimisation, la conception globale du cadre est raisonnable avec une bonne valeur pratique et une marge d'expansion.
/*backtest start: 2024-10-01 00:00:00 end: 2024-10-31 23:59:59 period: 1h basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("JakeJohn", overlay=true) // Input parameters smaShortLength = input(9, title="Short SMA Length") smaLongLength = input(21, title="Long SMA Length") lengthRSI = input(14, title="RSI Length") rsiOverbought = input(65, title="RSI Overbought Level") rsiOversold = input(35, title="RSI Oversold Level") riskRewardRatio = input(2, title="Risk/Reward Ratio") // 2:1 atrMultiplier = input(1.5, title="ATR Multiplier") // Multiplier for ATR to set stop loss // Calculate indicators smaShort = ta.sma(close, smaShortLength) smaLong = ta.sma(close, smaLongLength) rsi = ta.rsi(close, lengthRSI) atr = ta.atr(14) // Entry conditions longCondition = (smaShort > smaLong) and (rsi < rsiOversold) // Buy when short SMA is above long SMA and RSI is oversold shortCondition = (smaShort < smaLong) and (rsi > rsiOverbought) // Sell when short SMA is below long SMA and RSI is overbought // Variables for trade management var float entryPrice = na var float takeProfit = na var int entryBarIndex = na // Entry logic for long trades if (longCondition and (strategy.position_size == 0)) entryPrice := close takeProfit := entryPrice + (entryPrice - (entryPrice - (atr * atrMultiplier))) * riskRewardRatio strategy.entry("Buy", strategy.long) entryBarIndex := bar_index // Record the entry bar index label.new(bar_index, high, "BUY", style=label.style_label_up, color=color.green, textcolor=color.white, size=size.small) // Entry logic for short trades if (shortCondition and (strategy.position_size == 0)) entryPrice := close takeProfit := entryPrice - (entryPrice - (entryPrice + (atr * atrMultiplier))) * riskRewardRatio strategy.entry("Sell", strategy.short) entryBarIndex := bar_index // Record the entry bar index label.new(bar_index, low, "SELL", style=label.style_label_down, color=color.red, textcolor=color.white, size=size.small) // Manage trade duration and exit after a minimum of 3 hours if (strategy.position_size != 0) // Check if the trade has been open for at least 3 hours (180 minutes) if (bar_index - entryBarIndex >= 180) // 3 hours in 1-minute bars if (strategy.position_size > 0) strategy.exit("Take Profit Long", from_entry="Buy", limit=takeProfit) else strategy.exit("Take Profit Short", from_entry="Sell", limit=takeProfit) // Background colors for active trades var color tradeColor = na if (strategy.position_size > 0) tradeColor := color.new(color.green, 90) // Light green for long trades else if (strategy.position_size < 0) tradeColor := color.new(color.red, 90) // Light red for short trades else tradeColor := na // No color when no trade is active bgcolor(tradeColor, title="Trade Background") // Plotting position tools if (strategy.position_size > 0) // Plot long position tool strategy.exit("TP Long", limit=takeProfit) if (strategy.position_size < 0) // Plot short position tool strategy.exit("TP Short", limit=takeProfit) // Plotting indicators plot(smaShort, color=color.green, title="Short SMA", linewidth=2) plot(smaLong, color=color.red, title="Long SMA", linewidth=2) // Visual enhancements for RSI hline(rsiOverbought, "Overbought", color=color.red) hline(rsiOversold, "Oversold", color=color.green) plot(rsi, color=color.blue, title="RSI", linewidth=2) // Ensure there's at least one plot function plot(close, color=color.black, title="Close Price", display=display.none) // Hidden plot for compliance