
Esta estrategia es una estrategia de comercio de criptomonedas basada en fechas del calendario, que realiza operaciones de compra y venta mediante el aprovechamiento de fechas específicas del ciclo calendario. La estrategia comienza en el año nuevo lunar y continúa hasta el final de diciembre del calendario del año, siguiendo reglas simples: compra el día 5 de cada mes calendario y vende el día 26 de cada mes calendario. Esta estrategia intenta capturar los patrones de mercado que pueden estar relacionados con el ciclo calendario, proporcionando a los comerciantes un marco de comercio estructurado y fácil de seguir.
El principio central de esta estrategia se basa en el efecto que el ciclo lunar puede tener en el mercado de criptomonedas. El código realiza esta idea de la siguiente manera:
La estrategia utiliza un método de cálculo de fecha exacta, que almacena el número de días de cada mes calendario mediante una matriz y calcula el número total de días desde el comienzo del nuevo año calendario, para determinar con precisión la fecha calendario actual. Este método garantiza el disparo preciso de la señal de negociación.
Al analizar el código de esta estrategia, se pueden resumir las siguientes ventajas:
A pesar de las ventajas mencionadas, la estrategia también presenta algunos riesgos potenciales:
Para reducir estos riesgos, los operadores pueden considerar la confirmación de operaciones en combinación con otros indicadores técnicos, o establecer un stop loss fijo para limitar las pérdidas de una sola operación.
A través de un análisis profundo del código, se pueden sugerir las siguientes direcciones de optimización:
Introducción de un mecanismo de stop loss: agregar un porcentaje o un monto absoluto de la condición de pérdidas, para cerrar automáticamente las posiciones cuando las pérdidas alcanzan un determinado umbral, para evitar pérdidas considerables. El código de optimización puede agregar similaresif strategy.position_size > 0 and close < entry_price * (1 - stop_loss_percent)El juicio condicional.
Incorporación en el reconocimiento de indicadores técnicosCombinación de indicadores de tendencia (como el promedio móvil) o de dinámica (como el índice de fuerza relativa, RSI) como condición auxiliar, sólo ejecutar operaciones de fecha lunar cuando los indicadores técnicos proporcionan una señal favorable. Esto puede mejorar la calidad de la señal.
Optimización de la fecha de compra y venta: Análisis de los datos históricos para determinar qué días del calendario ofrecen el mejor momento para comprar y vender en la combinación, en lugar de usar el día 5 y el día 26. Es posible que algunas combinaciones de fechas específicas funcionen mejor.
Administración de posiciones parcialesModificación de estrategias para operar con una parte de los fondos en lugar del 100% de los fondos, o ajustar el tamaño de las posiciones en función de la dinámica de la volatilidad del mercado para dispersar el riesgo.
Añadir un filtro de estado de mercadoSuspender la ejecución de la estrategia en condiciones extremas de mercado (como alta volatilidad o tendencias bajistas evidentes) y evitar el comercio en un entorno desfavorable.
Ampliación de los plazos de aplicación: agregar datos del calendario de más años, o desarrollar una función que calcula automáticamente las fechas del calendario, para que la estrategia pueda funcionar indefinidamente.
Aumentar el comercio de variedadesExtensión de la estrategia a varias criptomonedas u otras categorías de activos, observando las diferencias de rendimiento en diferentes mercados durante el ciclo lunar.
La implementación de estas direcciones de optimización puede aumentar significativamente la robustez y adaptabilidad de las estrategias, mientras se mantiene su lógica básica, simple e intuitiva.
Las estrategias de criptomonedas basadas en el ciclo lunar ofrecen una perspectiva de negociación única, utilizando operaciones de compra y venta en fechas específicas del calendario. La mayor ventaja de la estrategia reside en sus reglas simples y claras y en su facilidad de implementación, que, combinadas con este factor único del ciclo lunar, pueden capturar patrones de mercado que pueden ser ignorados por el análisis técnico convencional.
Sin embargo, la estrategia también enfrenta desafíos por la falta de gestión de riesgos y adaptabilidad al mercado. Para mejorar la eficacia de la estrategia, se recomienda la introducción de medidas de mejora como el mecanismo de suspensión de pérdidas, la identificación de indicadores técnicos y la optimización de las fechas de compra y venta. Estas optimizaciones no solo reducen el riesgo potencial, sino que también aumentan la adaptabilidad de la estrategia en diferentes entornos de mercado.
Cabe señalar que cualquier estrategia de negociación necesita un buen análisis retrospectivo y pruebas de avance para verificar su desempeño en condiciones reales de mercado. Al adoptar la estrategia, el comerciante debe hacer los ajustes adecuados en función de su capacidad de asumir riesgos y objetivos de inversión, y tomar decisiones de negociación más completas en combinación con otros métodos de análisis.
/*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)