Zwei-Wege-Handelsstrategie auf der Grundlage der Mondphasen

Schriftsteller:ChaoZhang, Datum: 2024-02-21 16:15:25
Tags:

img

Übersicht

Diese Strategie handelt sowohl lang als auch kurz basierend auf Mondphasen, bei Neumonden lang und bei Vollmond kurz.

Strategie Logik

Die Strategie berechnet die Mondphasen genau anhand von Daten mit einer benutzerdefinierten Funktion. Das Mondalter von weniger als 15 ist ein Neumond und zwischen 15 und 30 ein Vollmond. Es erzeugt lange und kurze Signale auf der Grundlage der Mondphasen, öffnet lange Positionen bei Neumond und kurze Positionen bei Vollmond. Es schließt Positionen bei umgekehrten Signalen - schließt Longs bei Vollmond und Shorts bei Neumond.

Die Nutzer können zwischen lang am Neumond, kurz am Vollmond oder umgekehrt wählen. Boolean-Variablen verfolgen, ob Trades derzeit geöffnet sind. Es öffnet neue Trades, wenn Signale erscheinen, während keine Position geöffnet ist, und schließt aktuelle Positionen bei umgekehrten Signalen.

Vorteile

  1. Erfasst langfristige Trends anhand der Periodizität des Mondzyklus
  2. Anpassbare Anzeigfarben, Füllung usw.
  3. Auswahl von bidirektionalen Strategien
  4. Offene/schließende Kennzeichen
  5. Anpassbare Startzeit für die Optimierung von Backtests

Risiken

  1. Lange Mondzyklen verfehlen kurzfristige Bewegungen
  2. Kein Stop-Loss kann zu hohen Verlusten führen
  3. Feste Zyklen, anfällig für Musterbildung

Risikominderung:

  1. Hinzufügen anderer kurzfristiger Indikatoren für den Handel mit mehreren Zeitrahmen
  2. Implementieren von Stop Loss
  3. Optimierung der Positionsgröße zur Begrenzung der Verlustwirkung

Optimierungsrichtlinien

Die Strategie kann verbessert werden, indem

  1. Mehr Indikatoren hinzufügen, um Signale zu filtern und die Robustheit zu verbessern
  2. Ergänzung der Positionsgröße zur Optimierung und Verringerung der Verlustwirkung
  3. Hinzufügen eines Stop-Loss-Moduls zur Begrenzung von Verlusten
  4. Optimierung der offenen und geschlossenen Bedingungen zur Verringerung des Rutschverlaufs und Verbesserung der Gewinnrate

Schlussfolgerung

Die Strategie nutzt die Periodizität von Mondzyklen, um eine bidirektionale Handelsstrategie auf der Grundlage von Neumond und Vollmond umzusetzen. Sie hat klare Signale, hohe Anpassbarkeit und fängt langfristige Trends gut ein. Die Unfähigkeit, Verluste zu begrenzen, birgt jedoch erhebliche Risiken. Es wird empfohlen, kurzzeitige Indikatoren zu kombinieren und Positionsgrößen und Stop-Losses hinzuzufügen, um die Strategie weiter zu optimieren.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

// ---------------------------© paaax----------------------------
// ---------------- Author1: Pascal Simon (paaax) ----------------
// -------------------- www.pascal-simon.de ---------------------
// ---------------- www.tradingview.com/u/paaax/-----------------
// Source: https://gist.github.com/L-A/3497902#file-moonobject-js

// -------------------------© astropark--------------------------
// --------------- Author2: Astropark (astropark) ---------------
// -------------- https://bit.ly/astroparktrading ---------------
// -------------- www.tradingview.com/u/astropark/---------------


// @version=4
strategy(title="[astropark] Moon Phases [strategy]", overlay=true, pyramiding = 10, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 100000, currency = currency.USD, commission_value = 0.1)

// INPUT    --- {

newMoonColor = input(color.black, "New Moon Color")
fullMoonColor = input(color.white, "Full Moon Color")

fillBackground = input(true, "Fill Background?")
newMoonBackgroundColor = input(#fffff0aa, "New Moon Background Color")
fullMoonBackgroundColor = input(#aaaaaaaa, "Full Moon Background Color")

//} --- INPUT

// FUNCTION --- {

normalize(_v) =>
    x = _v
    x := x - floor(x)
    if x < 0
        x := x + 1
    x

calcPhase(_year, _month, _day) =>

    int y = na
    int m = na
    float k1 = na 
    float k2 = na 
    float k3 = na
    float jd = na
    float ip = na

    y := _year - floor((12 - _month) / 10)       
    m := _month + 9
    if m >= 12 
        m := m - 12
    
    k1 := floor(365.25 * (y + 4712))
    k2 := floor(30.6 * m + 0.5)
    k3 := floor(floor((y / 100) + 49) * 0.75) - 38
    
    jd := k1 + k2 + _day + 59
    if jd > 2299160
        jd := jd - k3
    
    ip := normalize((jd - 2451550.1) / 29.530588853)
    age = ip * 29.53

//} --- FUNCTION

// INIT     --- {

age = calcPhase(year, month, dayofmonth)
moon = 
     floor(age)[1] > floor(age) ? 1 : 
     floor(age)[1] < 15 and floor(age) >= 15 ? -1 : na

//} --- INIT

// PLOT     --- {

plotshape(
     moon==1, 
     "Full Moon", 
     shape.circle, 
     location.top, 
     color.new(newMoonColor, 20), 
     size=size.normal
     )   

plotshape(
     moon==-1, 
     "New Moon", 
     shape.circle, 
     location.bottom, 
     color.new(fullMoonColor, 20), 
     size=size.normal
     )   

var color col = na
if moon == 1 and fillBackground
    col := fullMoonBackgroundColor
if moon == -1 and fillBackground
    col := newMoonBackgroundColor
bgcolor(col, title="Moon Phase", transp=10)

//} --- PLOT


// STRATEGY     --- {

strategy = input("buy on new moon, sell on full moon", options=["buy on new moon, sell on full moon","sell on new moon, buy on full moon"])
longCond = strategy == "buy on new moon, sell on full moon" ? moon == -1 : moon == 1
shortCond = strategy == "buy on new moon, sell on full moon" ? moon == 1 : moon == -1

weAreInLongTrade = false
weAreInShortTrade = false
weAreInLongTrade := (longCond or weAreInLongTrade[1]) and shortCond == false
weAreInShortTrade := (shortCond or weAreInShortTrade[1]) and longCond == false
buySignal = longCond and weAreInLongTrade[1] == false
sellSignal = shortCond and weAreInShortTrade[1] == false

showBuySellSignals = input(defval=true, title = "Show Buy/Sell Signals")
longEnabled = input(true, title="Long enabled")
shortEnabled = input(true, title="Short enabled")

analysisStartYear = input(2017, "Backtesting From Year", minval=1980)
analysisStartMonth = input(1, "And Month", minval=1, maxval=12)
analysisStartDay = input(1, "And Day", minval=1, maxval=31)
analysisStartHour = input(0, "And Hour", minval=0, maxval=23)
analysisStartMinute = input(0, "And Minute", minval=0, maxval=59)
analyzeFromTimestamp = timestamp(analysisStartYear, analysisStartMonth, analysisStartDay, analysisStartHour, analysisStartMinute)

plotshape(showBuySellSignals and buySignal, title="Buy Label", text="Buy", location=location.belowbar, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
plotshape(showBuySellSignals and sellSignal, title="Sell Label", text="Sell", location=location.abovebar, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)

strategy.entry("long", strategy.long, when = time > analyzeFromTimestamp and buySignal and longEnabled)
strategy.entry("short", strategy.short, when = time > analyzeFromTimestamp and sellSignal and shortEnabled)
strategy.close("long", when = sellSignal)
strategy.close("short", when = buySignal)

//} --- STRATEGY


Mehr