Strategi ini menggunakan siklus fase bulan sebagai sinyal perdagangan, dikombinasikan dengan RSI, MACD, OBV dan indikator lainnya untuk mengidentifikasi peluang perdagangan untuk cryptocurrency seperti Bitcoin. Keuntungan utama dari strategi ini adalah memanfaatkan fase bulan, faktor eksternal, sebagai pemicu perdagangan, yang berbeda dari sebagian besar strategi yang hanya mengandalkan indikator teknis, sehingga dapat menghindari manipulasi pasar sampai batas tertentu.
Logika inti dari strategi ini adalah untuk menentukan peluang panjang atau pendek berdasarkan tahap yang berbeda dari siklus fase bulan.
Panjang siklus fase bulan = 29,5305882 hari
Mengingat waktu bulan purnama yang diketahui, jumlah hari dari bulan purnama itu sampai waktu saat ini dapat dihitung
Usia bulan = Hari sejak bulan purnama yang diketahui % Panjang siklus fase bulan
Nilai fase bulan = (1 + cos(umur bulan / panjang siklus fase bulan * 2 * π)) / 2
Nilai fase bulan berfluktuasi antara 0 sampai 1. Semakin besar nilai berarti lebih dekat dengan bulan purnama, sementara nilai yang lebih kecil berarti lebih dekat dengan bulan baru.
Strategi ini menilai peluang panjang atau pendek berdasarkan ambang fase bulan. Jika nilai fase bulan lebih besar dari ambang panjang (default 0.51), ada kemungkinan untuk pergi panjang. Jika nilai fase bulan kurang dari ambang pendek (default 0.49), ada kemungkinan untuk pergi pendek.
Selain itu, strategi ini juga menggabungkan indikator seperti volume perdagangan, RSI dan MACD untuk menghindari sinyal perdagangan selama kondisi yang tidak menguntungkan.
Keuntungan utama dari strategi ini:
Singkatnya, strategi ini memanfaatkan sepenuhnya keuntungan unik dari fase bulan, dan menggabungkan beberapa indikator teknis untuk mengidentifikasi peluang perdagangan dengan probabilitas tinggi, sementara memanfaatkan mekanisme pengendalian risiko untuk mendefinisikan risiko perdagangan secara efektif.
Risiko utama dari strategi ini meliputi:
Untuk mengendalikan risiko ini, langkah-langkah berikut dapat diambil:
Melalui optimalisasi parameter dan indikator gabungan, risiko perdagangan dapat dikurangi secara besar-besaran.
Masih ada ruang untuk optimalisasi lebih lanjut dari strategi ini:
Strategi ini mewujudkan perdagangan Bitcoin yang efisien melalui sinyal perdagangan fase bulan yang unik, dikombinasikan dengan indikator teknis arus utama. Dibandingkan dengan strategi indikator tunggal, strategi ini dapat melindungi risiko manipulasi pasar dengan lebih baik dan memiliki keuntungan yang unik. Dengan memanfaatkan stop loss untuk mencegah risiko dan pengoptimalan parameter, pengembalian yang stabil dan baik dapat diperoleh secara stabil. Masih ada ruang besar untuk meningkatkan strategi ini dan memiliki 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")