
Strategi ini didasarkan pada siklus fase bulan sebagai sinyal perdagangan, menggabungkan beberapa indikator seperti RSI, MACD, dan OBV untuk mengidentifikasi peluang perdagangan mata uang digital seperti Bitcoin. Keuntungan utama dari strategi ini adalah memanfaatkan faktor eksternal fase bulan sebagai sinyal pemicu perdagangan, dan, berbeda dengan kebanyakan strategi yang hanya bergantung pada indikator teknis, dapat menghindari manipulasi pasar sampai batas tertentu.
Logika inti dari strategi ini adalah berdasarkan pada fase yang berbeda dari siklus fase bulan untuk menilai apakah memenuhi kondisi over atau under. Rumus untuk menghitung fase bulan adalah:
Panjang siklus fase bulan = 29.5305882 hari Saat bulan purnama diketahui, jumlah hari dari saat bulan purnama itu dimulai hingga saat ini dapat dihitung Usia fase bulan = jarak hari dari bulan purnama yang diketahui % panjang siklus fase bulan Nilai fase bulan = ((1 + cos ((usia fase bulan/panjang siklus fase bulan*2*π))/2
Ukuran fase bulan dapat digunakan untuk menentukan fase bulan saat ini. Fase bulan bervariasi antara 0 dan 1, nilai yang lebih besar menunjukkan semakin dekat dari bulan purnama, nilai yang lebih kecil menunjukkan semakin dekat dari bulan baru.
Strategi ini didasarkan pada apakah penurunan fase bulan sesuai dengan kondisi over atau under. Jika penurunan fase bulan lebih besar dari penurunan fase bulan ((default 0.51), ada kesempatan untuk melakukan over; Jika penurunan fase bulan kurang dari penurunan fase bulan ((default 0.49), ada kesempatan untuk melakukan over.
Selain itu, strategi ini juga menggabungkan volume perdagangan, RSI, MACD dan indikator lainnya untuk menghindari sinyal perdagangan dalam situasi yang tidak ideal. Hanya jika volume perdagangan meningkat, RSI dan MACD memenuhi syarat, posisi akan dibuka.
Strategi ini memiliki beberapa keuntungan utama:
Secara keseluruhan, strategi ini memanfaatkan keunggulan unik dari fase bulan dan didukung oleh berbagai indikator teknis untuk mengidentifikasi peluang perdagangan probabilitas tinggi dan mengendalikan risiko perdagangan secara efektif melalui pengendalian risiko.
Strategi ini memiliki risiko utama sebagai berikut:
Untuk mengendalikan risiko ini, langkah-langkah berikut dapat diambil:
Dengan optimasi parameter dan penggunaan indikator komposit, risiko perdagangan dapat dihindari secara signifikan.
Strategi ini masih memiliki ruang untuk dioptimalkan lebih jauh:
Strategi ini memungkinkan perdagangan Bitcoin yang efisien melalui sinyal perdagangan yang unik dari fase bulan, yang bekerja sama dengan indikator teknologi utama. Strategi ini lebih tahan terhadap risiko manipulasi pasar dibandingkan dengan strategi indikator tunggal, dan memiliki keuntungan unik. Strategi ini dapat memperoleh keuntungan yang lebih baik secara stabil dengan mencegah risiko dan mengoptimalkan parameter penghentian kerugian.
/*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")