
Strategi ini adalah kaedah dagangan cryptocurrency berdasarkan tarikh kalendar, dengan membeli dan menjual operasi dengan memanfaatkan tarikh tertentu dalam kitaran kalendar. Strategi ini bermula dari tahun baru kalendar dan berterusan hingga akhir Disember kalendar tahun itu, mengikut peraturan mudah: beli pada hari ke-5 setiap bulan kalendar dan jual pada hari ke-26 setiap bulan kalendar.
Prinsip utama strategi ini adalah berdasarkan kepada kemungkinan kesan kitaran lunar terhadap pasaran cryptocurrency. Kod ini mewujudkan idea ini dengan cara berikut:
Strategi menggunakan kaedah pengiraan tarikh yang tepat, menyimpan bilangan hari setiap bulan kalendar melalui array, dan mengumpul jumlah hari dari tahun baru kalendar, untuk menentukan tarikh kalendar semasa dengan tepat. Kaedah ini menjamin pemicu isyarat perdagangan yang tepat.
Analisis kod strategi ini dapat meringkaskan kelebihan berikut:
Walaupun terdapat kelebihan seperti di atas, strategi ini juga mempunyai risiko yang berpotensi:
Untuk mengurangkan risiko ini, peniaga boleh mempertimbangkan untuk mengesahkan dagangan dalam kombinasi dengan petunjuk teknikal lain, atau menetapkan stop loss tetap untuk mengehadkan kerugian dalam satu dagangan.
Dengan menganalisis kod secara mendalam, beberapa arah pengoptimuman boleh dicadangkan:
Memperkenalkan mekanisme stop loss: Tambah syarat stop loss peratusan atau jumlah mutlak, secara automatik menutup kedudukan apabila kerugian mencapai nilai terendah tertentu, untuk mengelakkan kerugian yang besar. Kod pengoptimuman boleh menambah samaif strategy.position_size > 0 and close < entry_price * (1 - stop_loss_percent)Penghakiman Syarat
Pengesahan Indeks TeknologiBerkongsi dengan indikator trend (seperti moving average) atau indikator momentum (seperti RSI yang agak kuat) sebagai syarat tambahan, hanya melakukan perdagangan tarikh kalendar apabila indikator teknikal memberikan isyarat yang menguntungkan. Ini dapat meningkatkan kualiti isyarat.
Optimumkan tarikh jual beliDengan mengkaji semula data sejarah, analisis hari-hari kalendar mana yang sebenarnya memberikan peluang terbaik untuk membeli dan menjual pasangan, dan bukannya menggunakan hari ke-5 dan ke-26 secara tetap. Mungkin ada kombinasi tarikh tertentu yang lebih baik.
Bahagian pengurusan kedudukanPerubahan strategi untuk berdagang dengan sebahagian daripada dana dan bukannya 100% dana, atau menyesuaikan saiz kedudukan mengikut dinamik turun naik pasaran untuk menyebarkan risiko.
Tambah penapis status pasaran: menangguhkan pelaksanaan strategi dalam keadaan pasaran yang melampau (seperti turun naik yang tinggi atau trend pasaran beruang yang jelas) untuk mengelakkan perdagangan dalam keadaan yang tidak menguntungkan.
Memperluas jangka masa: Tambah data kalendar untuk lebih banyak tahun, atau kembangkan fungsi untuk mengira tarikh kalendar secara automatik, supaya strategi dapat berjalan tanpa had.
Meningkatkan perdagangan pelbagai jenis: memperluaskan strategi ke beberapa mata wang kripto atau kelas aset lain, melihat perbezaan prestasi dalam pasaran yang berbeza mengikut kitaran lunar.
Pelaksanaan arah pengoptimuman ini dapat meningkatkan ketangguhan dan adaptasi strategi dengan ketara, sambil mengekalkan konsep inti yang mudah dan intuitif.
Strategi perdagangan cryptocurrency berdasarkan kitaran kalendar menawarkan perspektif perdagangan yang unik, menggunakan tarikh kalendar tertentu untuk membeli dan menjual operasi. Keunggulan terbesar strategi ini adalah peraturan yang jelas dan mudah dilaksanakan, digabungkan dengan faktor unik kitaran kalendar, yang mungkin menangkap corak pasaran yang diabaikan oleh analisis teknikal biasa.
Walau bagaimanapun, strategi ini juga menghadapi cabaran kekurangan pengurusan risiko dan kesesuaian pasaran. Untuk meningkatkan keberkesanan strategi, disarankan untuk memperkenalkan langkah-langkah penambahbaikan seperti mekanisme hentian kerugian, pengesahan petunjuk teknikal dan pengoptimuman tarikh jual beli.
Perlu diperhatikan bahawa strategi perdagangan apa pun perlu diuji dengan baik dan diuji ke hadapan untuk mengesahkan prestasi dalam keadaan pasaran sebenar. Apabila menggunakan strategi ini, peniaga harus membuat penyesuaian yang sesuai mengikut kebolehan risiko dan matlamat pelaburan mereka sendiri, dan membuat keputusan perdagangan yang lebih menyeluruh dalam kombinasi dengan kaedah analisis lain.
/*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)