Estrategia de comercio bidireccional basada en las fases lunares

El autor:¿ Qué pasa?, Fecha: 2024-02-21 16:15:25
Las etiquetas:

img

Resumen general

Esta estrategia opera tanto largo como corto basado en las fases lunares, yendo largo en lunas nuevas y corto en lunas llenas.

Estrategia lógica

La estrategia calcula las fases lunares con precisión basándose en fechas usando una función personalizada. La edad de la luna menor de 15 es una luna nueva, y entre 15 y 30 una luna llena. Genera señales largas y cortas basadas en las fases lunares, abriendo posiciones largas en lunas nuevas y posiciones cortas en lunas llenas. Cierra posiciones en señales inversas - cerrando posiciones largas en lunas llenas y cortas en lunas nuevas.

Los usuarios pueden elegir entre long en luna nueva, corto en luna llena o viceversa. Las variables booleanas rastrean si las operaciones están abiertas actualmente.

Ventajas

  1. Captura las tendencias a largo plazo utilizando la periodicidad del ciclo lunar
  2. Colores de visualización personalizables, relleno, etc.
  3. Elección de estrategias bidireccionales
  4. Indicadores de apertura/cierre claros
  5. Tiempo de inicio de backtest personalizable para la optimización

Los riesgos

  1. Los ciclos largos de la luna no captan los movimientos a corto plazo
  2. Sin stop loss puede llevar a grandes pérdidas
  3. Ciclos fijos propensos a la formación de patrones

Mitigación del riesgo:

  1. Añadir otros indicadores de ciclo corto para operaciones con marcos de tiempo múltiples
  2. Implementar el stop loss
  3. Optimizar el tamaño de la posición para limitar el impacto de las pérdidas

Direcciones de optimización

La estrategia puede mejorarse mediante:

  1. Añadir más indicadores para filtrar las señales y mejorar la robustez
  2. Añadir dimensionamiento de posiciones para optimizar y reducir el impacto de las pérdidas
  3. Añadir un módulo de stop loss para limitar las pérdidas
  4. Optimización de las condiciones de apertura/cierre para reducir el deslizamiento y mejorar la tasa de ganancia

Conclusión

La estrategia explota la periodicidad de los ciclos lunares para implementar una estrategia de negociación bidireccional basada en las lunas nuevas y llenas. Tiene señales claras, alta personalización y captura bien las tendencias a largo plazo. Pero la incapacidad de limitar las pérdidas plantea riesgos significativos. Se recomienda combinar indicadores de ciclo corto y agregar dimensionamiento de posición y stop loss para optimizar aún más la estrategia.


/*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


Más.