Esta estrategia utiliza el ciclo de fase lunar como señales de trading, combinadas con RSI, MACD, OBV y otros indicadores para identificar oportunidades de trading para criptomonedas como Bitcoin.
La lógica central de esta estrategia es determinar oportunidades largas o cortas basadas en diferentes etapas del ciclo de la fase lunar.
La duración del ciclo de la fase lunar = 29,5305882 días
Dado un tiempo de luna llena conocido, el número de días desde esa luna llena hasta el tiempo actual se puede calcular
Edad lunar = Días desde la luna llena conocida % Duración del ciclo de fase lunar
Valor de la fase lunar = (1 + cos(edad lunar / longitud del ciclo de la fase lunar * 2 * π)) / 2
El valor de la fase lunar fluctúa entre 0 y 1. Cuanto mayor sea el valor significa más cerca de la luna llena, mientras que el valor más pequeño significa más cerca de la luna nueva.
La estrategia juzga las oportunidades largas o cortas en función de los umbrales de la fase lunar. Si el valor de la fase lunar es mayor que el umbral largo (por defecto 0.51), hay posibilidades de ir largo. Si el valor de la fase lunar es menor que el umbral corto (por defecto 0.49), hay posibilidades de ir corto.
Además, la estrategia también combina indicadores como el volumen de negociación, el RSI y el MACD para evitar señales de negociación durante condiciones desfavorables.
Las principales ventajas de esta estrategia:
En resumen, esta estrategia hace pleno uso de las ventajas únicas de las fases lunares y combina múltiples indicadores técnicos para identificar oportunidades comerciales de alta probabilidad, al tiempo que aprovecha los mecanismos de control de riesgos para definir eficazmente los riesgos comerciales.
Los principales riesgos de esta estrategia incluyen:
Para controlar estos riesgos, pueden adoptarse las siguientes medidas:
A través de la optimización de parámetros e indicadores combinados, los riesgos comerciales pueden mitigarse en gran medida.
Todavía hay margen para una mayor optimización de esta estrategia:
Esta estrategia realiza el comercio eficiente de Bitcoin a través de señales únicas de comercio de la fase lunar, combinadas con indicadores técnicos convencionales. En comparación con las estrategias de indicadores únicos, esta estrategia puede protegerse mejor contra los riesgos de manipulación del mercado y tiene ventajas únicas. Al aprovechar el stop loss para prevenir riesgos y la optimización de parámetros, se pueden obtener rendimientos constantes y buenos de manera estable. Todavía hay mucho espacio para mejorar esta estrategia y tiene perspectivas de aplicación prometedoras.
/*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")