
Esta estratégia é uma estratégia de negociação de criptomoedas baseada em datas do calendário, com operações de compra e venda utilizando datas específicas do ciclo lunar. A estratégia começa no ano novo lunar e continua até o final do mês de dezembro do calendário do ano, seguindo regras simples: compra no 5o dia de cada mês lunar e venda no 26o dia de cada mês lunar. Esta estratégia tenta capturar padrões de mercado que possam estar relacionados ao ciclo lunar, oferecendo aos comerciantes uma estrutura de negociação estruturada e fácil de seguir.
O princípio central da estratégia é baseado no possível impacto do ciclo lunar sobre o mercado de criptomoedas. O código atende a essa idéia da seguinte forma:
A estratégia usa um método de cálculo de data exato, armazenando o número de dias de cada mês lunar em uma matriz e acumulando o número total de dias a partir do início do novo ano lunar, para determinar com precisão a data lunar atual. Este método garante o disparo exato do sinal de negociação.
Analisando o código da estratégia, pode-se concluir os seguintes benefícios:
Apesar dos benefícios mencionados acima, a estratégia também apresenta alguns riscos potenciais:
Para reduzir esses riscos, os comerciantes podem considerar a confirmação de transações em combinação com outros indicadores técnicos, ou definir um stop loss fixo para limitar a perda de uma única transação.
Ao analisar o código em profundidade, pode-se sugerir o seguinte:
Apresentando um mecanismo de stop loss: Adicionar uma condição de parada de porcentagem ou de valor absoluto, para que os perdedores se desloquem automaticamente quando atingirem um determinado limiar, evitando perdas significativas. O código de otimização pode aumentar semelhantesif strategy.position_size > 0 and close < entry_price * (1 - stop_loss_percent)A condição de julgamento.
Confirmação de indicadores técnicos integradosCombinação de indicadores de tendência (como a média móvel) ou de momentum (como o RSI, o indicador de força relativa) como condição auxiliar, executando a negociação de datas de calendário somente quando os indicadores técnicos fornecem um sinal favorável. Isso pode melhorar a qualidade do sinal.
Optimizar a data de compra e venda: Analisar quais datas do calendário são realmente melhores para comprar e vender, em vez de usar o dia 5 e o dia 26 de forma fixa. Algumas combinações de datas específicas podem ter um melhor desempenho.
Gestão de posições parciaisMudança de estratégia: negociar com parte do capital em vez de 100%, ou ajustar o tamanho da posição de acordo com a dinâmica da volatilidade do mercado para dispersar o risco.
Adição de filtros de status de mercadoSuspender a execução da estratégia em condições de mercado extremas (como alta volatilidade ou uma tendência de mercado de baixa visível) para evitar a negociação em condições adversas.
Ampliação do tempo de aplicação: adicionar dados do calendário para mais anos, ou desenvolver uma função para calcular automaticamente a data do calendário, para que a estratégia possa funcionar indefinidamente.
Aumentar o comércio de variedadesA estratégia pode ser estendida a várias criptomoedas ou outras classes de ativos, observando as diferenças de desempenho em diferentes mercados durante o ciclo lunar.
A implementação dessas orientações de otimização pode aumentar significativamente a robustez e a adaptabilidade da estratégia, mantendo a sua simplicidade e a sua visão intuitiva.
A estratégia de negociação de criptomoedas baseada no ciclo lunar oferece uma perspectiva de negociação única, utilizando operações de compra e venda em datas específicas do calendário. A maior vantagem da estratégia reside na simplicidade de suas regras claras e na facilidade de implementação, combinando esse fator único do ciclo lunar, podendo capturar padrões de mercado ignorados pela análise técnica convencional.
No entanto, a estratégia também enfrenta desafios com a falta de gerenciamento de risco e adaptabilidade ao mercado. Para melhorar a eficácia da estratégia, recomenda-se a introdução de medidas de melhoria, como mecanismos de parada de prejuízos, confirmação de indicadores técnicos e otimização das datas de compra e venda. Essas otimizações podem não apenas reduzir os riscos potenciais, mas também aumentar a capacidade de adaptação da estratégia em diferentes ambientes de mercado.
É importante notar que qualquer estratégia de negociação precisa ser testada adequadamente de retrospectiva e prospectiva para verificar seu desempenho em condições reais de mercado. Ao adotar essa estratégia, o comerciante deve fazer os ajustes apropriados de acordo com sua capacidade de tolerância ao risco e seus objetivos de investimento, e tomar decisões de negociação mais abrangentes em combinação com outros métodos de análise.
/*backtest
start: 2024-08-11 00:00:00
end: 2025-08-09 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("Lunar ETHUSDT Trading 100% Invest with Fee & Slippage (2020~2026)", overlay=true, commission_type=strategy.commission.percent, commission_value=0.1)
// Fee and slippage settings
feePercent = 0.1 // 0.1%
slippageTicks = 3
tickSize = syminfo.mintick
slippage = slippageTicks * tickSize
// Function for lunar new year start date and monthly lengths by year
f_get_lunar_data() =>
y = year(time)
if y == 2020
[timestamp("Asia/Seoul", 2020, 1, 25, 0, 0), array.from(29,30,29,30,29,30,29,30,29,30,30,29)]
else if y == 2021
[timestamp("Asia/Seoul", 2021, 2, 12, 0, 0), array.from(30,29,30,29,30,29,30,29,30,29,30,30)]
else if y == 2022
[timestamp("Asia/Seoul", 2022, 2, 1, 0, 0), array.from(29,30,29,30,29,30,29,30,30,29,30,29)]
else if y == 2023
[timestamp("Asia/Seoul", 2023, 1, 22, 0, 0), array.from(30,29,30,29,30,29,30,30,29,30,29,30)]
else if y == 2024
[timestamp("Asia/Seoul", 2024, 2, 10, 0, 0), array.from(30,29,30,29,30,29,30,29,30,29,30,30,29)]
else if y == 2025
[timestamp("Asia/Seoul", 2025, 1, 29, 0, 0), array.from(29,30,29,30,29,30,29,30,30,29,30,29)]
else if y == 2026
[timestamp("Asia/Seoul", 2026, 2, 17, 0, 0), array.from(30,29,30,29,30,29,30,30,29,30,29,30)]
else
[na, array.new_int()]
// Function to create cumulative monthly days array
f_get_lunar_md(days_arr) =>
arr = array.new_int()
sum = 0
for i = 0 to array.size(days_arr) - 1
sum += array.get(days_arr, i)
array.push(arr, sum)
arr
// Get lunar start date and monthly lengths
[ts_start, lunar_lengths] = f_get_lunar_data()
valid = not na(ts_start)
days_since = valid ? math.floor((time - ts_start) / 86400000) : na
cumulative = valid ? f_get_lunar_md(lunar_lengths) : na
// Declare lunar month, day, last day variables
var int lunar_month = na
var int lunar_day = na
var int lunar_last_day = na
// Calculate lunar date
if valid and not na(days_since) and days_since >= 0
lunar_month := na
lunar_day := na
lunar_last_day := na
for i = 0 to array.size(cumulative) - 1
cum = array.get(cumulative, i)
prev = i == 0 ? 0 : array.get(cumulative, i - 1)
if days_since < cum
lunar_month := i + 1
lunar_day := days_since - prev + 1
lunar_last_day := array.get(lunar_lengths, i)
break
else
lunar_month := na
lunar_day := na
lunar_last_day := na
// Buy condition: Lunar day 5 and no current position
buy_condition = not na(lunar_day) and lunar_day == 5 and strategy.position_size == 0
// Sell condition: Lunar day 26 and holding position
sell_condition = not na(lunar_day) and lunar_day == 26 and strategy.position_size > 0
// Buy/sell price adjusted for slippage and fee
price_buy = close + slippage
price_buy_with_fee = price_buy * (1 + feePercent * 0.01)
price_sell = close - slippage
price_sell_with_fee = price_sell * (1 - feePercent * 0.01)
// Calculate buy quantity using 100% of equity
qty = math.floor(strategy.equity / price_buy_with_fee)
// Buy order (limit)
if buy_condition and qty > 0
strategy.entry("Lunar Buy", strategy.long, qty, limit=price_buy)
// Sell order (close all)
if sell_condition and strategy.position_size > 0
strategy.close("Lunar Buy")
// True range variable (for label position adjustment)
tr = ta.tr(true)
// Date format creation
yr = year(time)
mo = month(time)
dy = dayofmonth(time)
mo_str = mo < 10 ? "0" + str.tostring(mo) : str.tostring(mo)
dy_str = dy < 10 ? "0" + str.tostring(dy) : str.tostring(dy)
solar_str = str.tostring(yr) + "-" + mo_str + "-" + dy_str
// Display solar and lunar date and position label (on bar close)
if barstate.islastconfirmedhistory and not na(lunar_day)
label.new(bar_index, high - tr * 6, "Solar: " + solar_str + "\nLunar: " + str.tostring(lunar_month) + "-" + str.tostring(lunar_day) ,
style=label.style_label_up, size=size.normal, color=color.new(color.teal, 50), textcolor=color.white)
// Display "15" label at bottom on lunar day 15 (lowest of last 50 bars - 1 true range)
if not na(lunar_day) and lunar_day == 15
low_offset = ta.lowest(low, 50) - tr
label.new(bar_index, low_offset, "15", style=label.style_label_down, color=color.orange, textcolor=color.white, size=size.normal)