Cette stratégie utilise le cycle de phase lunaire comme signaux de trading, combiné avec RSI, MACD, OBV et d'autres indicateurs pour identifier les opportunités de trading pour les crypto-monnaies comme le Bitcoin.
La logique de base de cette stratégie est de déterminer les opportunités longues ou courtes en fonction des différentes étapes du cycle de phase lunaire.
La longueur du cycle de la phase lunaire = 29,5305882 jours
Étant donné un temps de pleine lune connu, le nombre de jours de cette pleine lune à l'heure actuelle peut être calculé
Âge lunaire = jours depuis la pleine lune connue % Longueur du cycle de la phase lunaire
Valeur de la phase lunaire = (1 + cos(Âge lunaire / longueur du cycle de la phase lunaire * 2 * π)) / 2
La valeur de la phase lunaire fluctue entre 0 et 1. Plus la valeur est élevée, c'est-à-dire plus près de la pleine lune, tandis que la valeur inférieure signifie plus près de la nouvelle lune.
La stratégie juge les opportunités longues ou courtes en fonction des seuils de phase lunaire. Si la valeur de phase lunaire est supérieure au seuil long (défault 0.51), il y a une chance d'aller long. Si la valeur de phase lunaire est inférieure au seuil court (défault 0.49), il y a une chance d'aller court.
En outre, la stratégie combine également des indicateurs tels que le volume des transactions, le RSI et le MACD pour éviter les signaux de trading dans des conditions défavorables.
Les principaux avantages de cette stratégie:
En résumé, cette stratégie tire pleinement parti des avantages uniques des phases lunaires et combine plusieurs indicateurs techniques pour identifier les opportunités de négociation à forte probabilité, tout en exploitant des mécanismes de contrôle des risques pour définir efficacement les risques de négociation.
Les principaux risques de cette stratégie sont les suivants:
Pour contrôler ces risques, les mesures suivantes peuvent être prises:
Grâce à l'optimisation des paramètres et à la combinaison d'indicateurs, les risques commerciaux peuvent être atténués dans une large mesure.
Il reste encore des possibilités d'optimisation de cette stratégie:
Cette stratégie réalise un trading Bitcoin efficace grâce à des signaux de trading de phase lunaire uniques, combinés à des indicateurs techniques traditionnels. Par rapport aux stratégies à indicateur unique, cette stratégie peut mieux se protéger contre les risques de manipulation du marché et présente des avantages uniques. En tirant parti du stop loss pour prévenir les risques et l'optimisation des paramètres, des rendements stables et bons peuvent être obtenus de manière stable. Il y a encore beaucoup de place pour améliorer cette stratégie et elle a des perspectives d'application prometteuses.
/*backtest start: 2023-01-08 00:00:00 end: 2024-01-14 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Lunar Phase Strategy by Symphoenix", overlay=true) // Input parameters start_year = input(2023, title="Start year") end_year = input(2023, title="End year") longPhaseThreshold = input(0.51, title="Long Phase Threshold") shortPhaseThreshold = input(0.49, title="Short Phase Threshold") riskPerTrade = input(0.05, title="Risk Per Trade (as a % of Equity)") stopLossPerc = input(0.01, title="Stop Loss Percentage") atrLength = input(21, title="ATR Length for Volatility") trailPerc = input(0.1, title="Trailing Stop Percentage") maxDrawdownPerc = input(0.1, title="Maximum Drawdown Percentage") volumeLength = input(7, title="Volume MA Length") // Constants for lunar phase calculation and ATR atr = ta.atr(atrLength) volMA = ta.sma(volume, volumeLength) // Volume moving average // Improved Lunar Phase Calculation calculateLunarPhase() => moonCycleLength = 29.5305882 daysSinceKnownFullMoon = (time - timestamp("2019-12-12T05:12:00")) / (24 * 60 * 60 * 1000) lunarAge = daysSinceKnownFullMoon % moonCycleLength phase = ((1 + math.cos(lunarAge / moonCycleLength * 2 * math.pi)) / 2) phase lunarPhase = calculateLunarPhase() // Advanced Volume Analysis priceChange = ta.change(close) obv = ta.cum(priceChange > 0 ? volume : priceChange < 0 ? -volume : 0) // Additional Technical Indicators rsi = ta.rsi(close, 14) [macdLine, signalLine, _] = ta.macd(close, 12, 26, 9) // Calculate Position Size based on Volatility and Account Equity calculatePositionSize() => equity = strategy.equity riskAmount = equity * riskPerTrade positionSize = riskAmount / atr if positionSize > 1000000000000 positionSize := 1000000000000 positionSize positionSize = calculatePositionSize() // Maximum Drawdown Tracking var float maxPortfolioValue = na maxPortfolioValue := math.max(maxPortfolioValue, strategy.equity) drawdown = (maxPortfolioValue - strategy.equity) / maxPortfolioValue // Check for maximum drawdown if drawdown > maxDrawdownPerc strategy.close_all() strategy.cancel_all() // Volume Analysis isVolumeConfirmed = volume > volMA // Date Check for Backtesting Period isWithinBacktestPeriod = year >= start_year and year <= end_year // Entry and Exit Conditions // Adjusted Entry and Exit Conditions longCondition = lunarPhase > longPhaseThreshold and lunarPhase < 0.999 and isVolumeConfirmed and obv > obv[1] and rsi < 70 and macdLine > signalLine and isWithinBacktestPeriod shortCondition = lunarPhase < shortPhaseThreshold and lunarPhase > 0.001 and isVolumeConfirmed and obv < obv[1] and rsi > 30 and macdLine < signalLine and isWithinBacktestPeriod if longCondition if strategy.position_size < 0 strategy.close_all() if strategy.position_size < positionSize strategy.entry("Long", strategy.long, qty=positionSize) strategy.exit("Exit Long", "Long", trail_offset=atr * trailPerc, trail_points=atr) if shortCondition if strategy.position_size > 0 strategy.close_all() if strategy.position_size > -positionSize strategy.entry("Short", strategy.short, qty=positionSize) strategy.exit("Exit Short", "Short", trail_offset=atr * trailPerc, trail_points=atr) // Implementing Stop-Loss Logic longStopLoss = strategy.position_avg_price * (1 - stopLossPerc) shortStopLoss = strategy.position_avg_price * (1 + stopLossPerc) if strategy.position_size > 0 and close < longStopLoss strategy.close("Long") if strategy.position_size < 0 and close > shortStopLoss strategy.close("Short")