
Diese Strategie ist eine Kalender-Datum-basierte Methode für den Handel mit Kryptowährungen, bei der Käufe und Verkäufe an bestimmten Tagen des Kalenderzyklus durchgeführt werden. Die Strategie beginnt mit dem Kalenderjahr und dauert bis zum Ende des Kalendermonats Dezember des jeweiligen Jahres und folgt einfachen Regeln: Kaufen am 5. Tag eines jeden Kalendermonats und verkaufen am 26. Tag eines jeden Kalendermonats.
Das Kernprinzip der Strategie basiert auf den möglichen Auswirkungen des Kalenderzyklus auf den Kryptowährungsmarkt. Der Code verwirklicht diese Idee durch:
Die Strategie verwendet eine genaue Datumsrechnung, die die Anzahl der Tage in jedem Kalendermonat durch eine Array speichert und die Gesamtzahl der Tage ab dem Kalenderjahr kumuliert, um den aktuellen Kalendertag genau zu bestimmen. Diese Methode garantiert die genaue Auslösung des Handelssignals.
Eine Analyse des Codes dieser Strategie zeigt folgende Vorteile:
Obwohl diese Strategie die oben genannten Vorteile hat, gibt es einige potenzielle Risiken:
Um diese Risiken zu verringern, kann der Händler die Bestätigung von Geschäften in Kombination mit anderen technischen Indikatoren in Betracht ziehen oder einen festen Stop-Loss-Level festlegen, um den Verlust eines einzelnen Handels zu begrenzen.
Durch die tiefere Analyse des Codes lassen sich folgende Optimierungsmöglichkeiten vorschlagen:
Einführung eines Stop-Loss-Mechanismus: Hinzufügen von Stop-Loss-Bedingungen in Prozent oder in absoluten Beträgen, automatische Auslöschung bei Verlusten bis zu einem bestimmten Tiefpunkt, um erhebliche Verluste zu vermeiden. Optimierungscode kann ähnlich hinzugefügt werdenif strategy.position_size > 0 and close < entry_price * (1 - stop_loss_percent)Das ist eine sehr schwierige Entscheidung.
Integration in die Bestätigung der technischen Kennzahlen: In Kombination mit einem Trendindikator (wie einem Moving Average) oder einem Momentumindikator (wie dem Relative Strength Index RSI) als Nebenbedingung, nur dann Kalendertagshandlungen ausführen, wenn ein technischer Indikator ein günstiges Signal liefert. Dies verbessert die Signalqualität.
Optimierung der Kauf- und VerkaufstageAnhand von historischen Daten wird analysiert, welche Kalendertage tatsächlich die besten Kauf- und Verkaufsmomente für die Kombination bieten, anstatt den festen 5. und 26. Tag zu verwenden. Es ist möglich, dass bestimmte Datumskombinationen besser abschneiden.
PositionsverwaltungDie Strategie kann geändert werden, um mit einem Teil des Kapitals statt mit 100% des Kapitals zu handeln, oder die Größe der Position kann an die dynamischen Marktschwankungen angepasst werden, um das Risiko zu verteilen.
Hinzufügen eines MarktstatusfiltersIn extremen Marktbedingungen (z. B. bei hoher Volatilität oder einem offensichtlichen Bärenmarkt-Trend) wird die Ausführung der Strategie ausgesetzt, um den Handel in einem ungünstigen Umfeld zu vermeiden.
Erweiterung des Zeitrahmens: Hinzufügen von Kalenderdaten für mehrere Jahre oder Entwicklung einer Funktion, die automatisch Kalenderdaten berechnet, so dass die Strategie für unbegrenzte Zeit läuft.
Erhöhung des Handels mit mehreren SortenDie Strategie soll auf mehrere Kryptowährungen oder andere Assetklassen ausgedehnt werden, um die unterschiedliche Performance in verschiedenen Märkten zu beobachten.
Die Implementierung dieser Optimierungsrichtungen kann die Robustheit und Anpassungsfähigkeit der Strategie erheblich verbessern, während der Kerngedanke der Strategie einfach und intuitiv bleibt.
Kalenderzyklus-basierte Kryptowährungs-Handelsstrategien bieten eine einzigartige Handelsperspektive für Kauf- und Verkaufsaktivitäten an bestimmten Kalendertagen. Der größte Vorteil dieser Strategie liegt in ihren einfachen, klaren Regeln und der einfachen Umsetzung, kombiniert mit dem einzigartigen Faktor des Kalenderzyklus, der möglicherweise Marktmuster erfasst, die von der üblichen technischen Analyse übersehen werden.
Die Strategie wird jedoch auch von einem Mangel an Risikomanagement und Marktadaptivität gefordert. Um die Effektivität der Strategie zu verbessern, werden Verbesserungen wie die Einführung von Stop-Loss-Mechanismen, die Bestätigung von technischen Indikatoren und die Optimierung der Kauf- und Verkaufstage empfohlen. Diese Optimierungen können nicht nur das potenzielle Risiko verringern, sondern auch die Anpassungsfähigkeit der Strategie in verschiedenen Marktumgebungen verbessern.
Es ist erwähnenswert, dass jede Handelsstrategie ausreichend zurück- und vorwärts getestet werden muss, um ihre Leistung unter realen Marktbedingungen zu überprüfen. Der Händler sollte diese Strategie entsprechend seiner Risikoverfügbarkeit und seinen Anlagezielen anpassen und in Verbindung mit anderen Analysemethoden umfassendere Handelsentscheidungen treffen.
/*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)