
Strategi ini adalah metode perdagangan cryptocurrency berdasarkan tanggal kalender yang melakukan pembelian dan penjualan dengan memanfaatkan tanggal tertentu dalam siklus kalender. Strategi ini dimulai pada tahun baru kalender dan berlangsung hingga akhir Desember kalender tahun tersebut, mengikuti aturan sederhana: beli pada hari ke-5 setiap bulan kalender dan jual pada hari ke-26 setiap bulan kalender. Metode ini mencoba menangkap model pasar yang mungkin terkait dengan siklus kalender, memberikan pedagang kerangka perdagangan yang terstruktur dan mudah diikuti.
Prinsip inti dari strategi ini didasarkan pada kemungkinan pengaruh siklus lunar terhadap pasar cryptocurrency. Kode ini mewujudkan gagasan ini dengan cara berikut:
Strategi ini menggunakan metode perhitungan tanggal yang tepat, dengan menyimpan jumlah hari setiap bulan kalender melalui array, dan menghitung jumlah total hari yang dimulai dari tahun baru kalender, sehingga menentukan tanggal kalender saat ini dengan tepat. Metode ini menjamin pemicu sinyal perdagangan yang akurat.
Analisis kode dari strategi ini dapat disimpulkan sebagai berikut:
Meskipun memiliki keuntungan seperti yang disebutkan di atas, strategi ini juga memiliki beberapa risiko potensial:
Untuk mengurangi risiko ini, pedagang dapat mempertimbangkan untuk melakukan konfirmasi perdagangan dalam kombinasi dengan indikator teknis lainnya, atau menetapkan stop loss tetap untuk membatasi kerugian dalam satu perdagangan.
Dengan menganalisis kode secara mendalam, beberapa arah optimasi dapat dikemukakan:
Memperkenalkan mekanisme stop loss: Tambahkan persentase atau jumlah mutlak dari kondisi stop loss, secara otomatis menutup posisi ketika kerugian mencapai titik terendah tertentu, untuk menghindari kerugian besar.if strategy.position_size > 0 and close < entry_price * (1 - stop_loss_percent)Pengadilan Syarat
Pengakuan Indikator Teknis Integrasi: Menggabungkan indikator tren (seperti Moving Average) atau indikator momentum (seperti Relative Strength Index RSI) sebagai kondisi tambahan, melakukan perdagangan tanggal kalender hanya ketika indikator teknis memberikan sinyal yang menguntungkan. Hal ini dapat meningkatkan kualitas sinyal.
Optimalkan tanggal pembelian dan penjualan: Analisis tanggal kalender mana yang sebenarnya memberikan waktu terbaik untuk membeli dan menjual kombinasi, dengan memutar data historis, daripada menggunakan hari ke-5 dan ke-26. Mungkin beberapa kombinasi tanggal tertentu akan lebih baik.
Manajemen posisi sebagianPerubahan strategi untuk melakukan perdagangan dengan sebagian dana daripada 100% dana, atau menyesuaikan ukuran posisi sesuai dengan dinamika volatilitas pasar untuk menyebarkan risiko.
Menambahkan filter status pasarPada kondisi pasar yang ekstrim (seperti volatilitas yang tinggi atau tren bearish yang jelas), penundaan pelaksanaan strategi untuk menghindari perdagangan di lingkungan yang tidak menguntungkan.
Perluasan jangka waktu: Tambahkan data kalender untuk lebih banyak tahun, atau kembangkan fungsi yang secara otomatis menghitung tanggal kalender, sehingga strategi dapat berjalan tanpa batas waktu.
Meningkatkan perdagangan berbagai varietas: memperluas strategi ke beberapa mata uang kripto atau kelas aset lainnya, melihat perbedaan kinerja di berbagai pasar selama siklus lunar.
Pelaksanaan orientasi optimasi ini dapat secara signifikan meningkatkan fleksibilitas dan adaptasi strategi, sambil mempertahankan konsep inti yang sederhana dan intuitif.
Strategi perdagangan kripto yang didasarkan pada siklus kalender menawarkan perspektif perdagangan yang unik, yang memanfaatkan tanggal kalender tertentu untuk membeli dan menjual. Keunggulan terbesar dari strategi ini adalah aturan yang jelas dan mudah diterapkan, yang dikombinasikan dengan faktor unik siklus kalender, yang dapat menangkap pola pasar yang diabaikan oleh analisis teknis konvensional.
Namun, strategi ini juga menghadapi tantangan karena kurangnya manajemen risiko dan adaptasi pasar. Untuk meningkatkan efektivitas strategi, disarankan untuk memperkenalkan langkah-langkah perbaikan seperti mekanisme stop loss, identifikasi indikator teknis, dan optimalisasi tanggal pembelian dan penjualan.
Perlu dicatat bahwa setiap strategi perdagangan perlu diuji ulang dan diuji ke depan untuk memverifikasi kinerjanya dalam kondisi pasar yang sebenarnya. Dalam menerapkan strategi ini, pedagang harus melakukan penyesuaian yang tepat sesuai dengan toleransi risiko dan tujuan investasi mereka, dan membuat keputusan perdagangan yang lebih komprehensif dalam kombinasi dengan metode analisis lainnya.
/*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)