Strategi ini menggunakan kitaran fasa bulan sebagai isyarat perdagangan, digabungkan dengan RSI, MACD, OBV dan penunjuk lain untuk mengenal pasti peluang perdagangan untuk mata wang kripto seperti Bitcoin. Keuntungan utama strategi ini adalah menggunakan fasa bulan, faktor luaran, sebagai pencetus perdagangan, yang berbeza dengan kebanyakan strategi yang hanya bergantung pada penunjuk teknikal, sehingga dapat mengelakkan manipulasi pasaran hingga tahap tertentu.
Logik teras strategi ini adalah untuk menentukan peluang panjang atau pendek berdasarkan peringkat yang berbeza dalam kitaran fasa bulan.
Panjang kitaran fasa bulan = 29.5305882 hari
Memandangkan masa bulan purnama yang diketahui, bilangan hari dari bulan purnama itu hingga masa semasa boleh dikira
Umur bulan = Hari sejak bulan purnama yang diketahui % Panjang kitaran fasa bulan
Nilai fasa bulan = (1 + cos(umur bulan / panjang kitaran fasa bulan * 2 * π)) / 2
Nilai fasa bulan turun naik antara 0 hingga 1. Nilai yang lebih besar bermaksud lebih dekat dengan bulan purnama, sementara nilai yang lebih kecil bermaksud lebih dekat dengan bulan baru.
Strategi ini menilai peluang panjang atau pendek berdasarkan ambang fasa bulan. Jika nilai fasa bulan lebih besar daripada ambang panjang (default 0.51), ada peluang untuk pergi panjang. Jika nilai fasa bulan kurang daripada ambang pendek (default 0.49), ada peluang untuk pergi pendek.
Di samping itu, strategi ini juga menggabungkan penunjuk seperti jumlah dagangan, RSI dan MACD untuk mengelakkan isyarat dagangan semasa keadaan yang tidak menguntungkan.
Kelebihan utama strategi ini:
Ringkasnya, strategi ini memanfaatkan sepenuhnya kelebihan unik fasa bulan, dan menggabungkan pelbagai penunjuk teknikal untuk mengenal pasti peluang perdagangan yang berkemungkinan tinggi, sementara memanfaatkan mekanisme kawalan risiko untuk menentukan risiko perdagangan dengan berkesan.
Risiko utama strategi ini termasuk:
Untuk mengawal risiko ini, langkah-langkah berikut boleh diambil:
Melalui pengoptimuman parameter dan penunjuk gabungan, risiko perdagangan dapat dikurangkan dalam tahap yang besar.
Masih ada ruang untuk mengoptimumkan lagi strategi ini:
Strategi ini merealisasikan perdagangan Bitcoin yang cekap melalui isyarat perdagangan fasa bulan yang unik, digabungkan dengan penunjuk teknikal arus perdana. Berbanding dengan strategi penunjuk tunggal, strategi ini dapat melindungi risiko manipulasi pasaran dengan lebih baik dan mempunyai kelebihan yang unik. Dengan memanfaatkan stop loss untuk mencegah risiko dan pengoptimuman parameter, pulangan yang stabil dan baik dapat diperoleh dengan stabil. Masih ada ruang yang besar untuk meningkatkan strategi ini dan ia mempunyai prospek aplikasi yang menjanjikan.
/*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")