
Эта стратегия является методом торговли криптовалютами, основанным на календарных датах, для покупки и продажи операций с использованием определенных дат календарного цикла. Эта стратегия начинается с нового календарного года и продолжается до конца декабря календарного года, следуя простому правилу: покупать на 5 день каждого календарного месяца и продавать на 26 день каждого календарного месяца.
Основная идея стратегии основана на влиянии лунного цикла на криптовалютный рынок. Код реализует эту идею следующим образом:
Стратегия использует точный метод подсчета дат, который сохраняет число дней в каждом календарном месяце с помощью арифметики, а также начисляет общее число дней, начиная с нового календарного года, чтобы точно определить текущую календарную дату. Этот метод гарантирует точный триггер торговых сигналов.
Анализ кода этой стратегии позволяет выделить следующие преимущества:
Несмотря на вышеперечисленные преимущества, эта стратегия несет в себе ряд потенциальных рисков:
Чтобы снизить эти риски, трейдер может рассмотреть возможность подтверждения сделки в сочетании с другими техническими показателями или установить фиксированный стоп-лосс, чтобы ограничить потери по одной сделке.
В результате глубокого анализа кода можно сделать следующие выводы по оптимизации:
Внедрение механизма стоп-лосса: добавление стоп-ложа в процентном или абсолютном размере, автоматическое ликвидация позиций при достижении определенного порога, чтобы избежать значительных потерь. Код оптимизации может быть добавлен аналогичноif strategy.position_size > 0 and close < entry_price * (1 - stop_loss_percent)Условное решение.
Включение подтверждения технических показателей: в сочетании с трендовым индикатором (например, движущаяся средняя) или динамическим индикатором (например, RSI) в качестве вспомогательного условия, торгуйте на календарные даты только в том случае, если технический индикатор дает благоприятный сигнал. Это повышает качество сигнала.
Оптимизация даты покупки и продажи: Проанализируйте, какие календарные даты, используя исторические данные, на самом деле обеспечивают наилучшее время для покупки и продажи, а не фиксированное использование 5 и 26 дней. Возможно, некоторые конкретные даты будут работать лучше.
Управление некоторыми позициями: изменение стратегии для торговли с использованием части средств, а не 100% средств, или изменение размера позиции в соответствии с динамикой волатильности рынка, чтобы распределить риск.
Добавить фильтр состояния рынка: приостанавливать исполнение стратегии в экстремальных рыночных условиях (например, высокая волатильность или явная тенденция медвежьего рынка), чтобы избежать торговли в неблагоприятных условиях.
Расширенный временной интервал: Добавить данные календаря на большее количество лет или разработать функцию автоматического вычисления календарных дат, чтобы стратегия могла работать бесконечно долго.
Повышение торговли различными видамиРасширять стратегию на несколько криптовалют или других классов активов, наблюдая за различными показателями на различных рынках в течение календарного цикла.
Реализация этих направлений оптимизации может значительно повысить гибкость и адаптивность стратегии, сохраняя при этом ее простоту и интуитивность.
Стратегия торговли криптовалютами, основанная на календарных циклах, предоставляет уникальную торговую перспективу, используя определенные календарные даты для совершения операций по покупке и продаже. Наибольшие преимущества этой стратегии заключаются в ее простых четких правилах и простоте внедрения, в сочетании с уникальным фактором календарных циклов, которые могут улавливать рыночные модели, которые игнорируются при обычном техническом анализе.
Тем не менее, эта стратегия также сталкивается с проблемой отсутствия управления рисками и адаптации к рынку. Для повышения эффективности стратегии рекомендуется внедрение мер по улучшению, таких как механизм остановки убытков, подтверждение технических показателей и оптимизация даты покупки и продажи. Эти оптимизации могут не только уменьшить потенциальный риск, но и повысить адаптивность стратегии в различных рыночных условиях.
Следует отметить, что любая торговая стратегия должна быть адекватно протестирована задним ходом и вперед, чтобы убедиться, что она работает в реальных рыночных условиях. При использовании этой стратегии трейдер должен соответственно адаптироваться к собственной способности к риску и инвестиционным целям, а также принимать более всесторонние торговые решения в сочетании с другими методами анализа.
/*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)