Esta estratégia usa o ciclo de fase lunar como sinais de negociação, combinado com RSI, MACD, OBV e outros indicadores para identificar oportunidades de negociação para criptomoedas como Bitcoin.
A lógica central desta estratégia é determinar oportunidades longas ou curtas com base em diferentes estágios do ciclo de fase lunar.
Duração do ciclo de fases lunares = 29,5305882 dias
Dada uma hora de lua cheia conhecida, o número de dias a partir dessa lua cheia até a hora atual pode ser calculado
Idade lunar = Dias desde a lua cheia conhecida % Duração do ciclo da fase lunar
Valor da fase lunar = (1 + cos(Idade lunar / comprimento do ciclo da fase lunar * 2 * π)) / 2
O valor da fase lunar flutua entre 0 e 1. Quanto maior o valor significa mais perto da lua cheia, enquanto o valor menor significa mais perto da lua nova.
A estratégia julga oportunidades longas ou curtas com base nos limiares da fase lunar. Se o valor da fase lunar for maior que o limiar longo (padrão 0,51), há chance de ir longo. Se o valor da fase lunar for menor que o limiar curto (padrão 0,49), há chance de ir curto.
Além disso, a estratégia também combina indicadores como volume de negociação, RSI e MACD para evitar sinais de negociação durante condições desfavoráveis.
As principais vantagens desta estratégia:
Em resumo, esta estratégia faz pleno uso das vantagens únicas das fases lunares e combina múltiplos indicadores técnicos para identificar oportunidades de negociação de alta probabilidade, ao mesmo tempo que utiliza mecanismos de controlo de risco para definir eficazmente os riscos de negociação.
Os principais riscos desta estratégia incluem:
Para controlar estes riscos, podem ser tomadas as seguintes medidas:
Através da otimização dos parâmetros e da combinação de indicadores, os riscos comerciais podem ser reduzidos em grande medida.
Ainda há espaço para uma melhor otimização desta estratégia:
Esta estratégia realiza uma negociação eficiente do Bitcoin através de sinais de negociação de fase lunar únicos, combinados com indicadores técnicos convencionais. Em comparação com as estratégias de indicador único, esta estratégia pode proteger melhor contra riscos de manipulação de mercado e tem vantagens únicas. Ao alavancar o stop loss para evitar riscos e otimização de parâmetros, retornos estáveis e bons podem ser obtidos de forma estável. Ainda há muito espaço para melhorar esta estratégia e tem perspectivas de aplicação promissoras.
/*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")