Sistema de tortugas marinas de Connecticut


Fecha de creación: 2023-11-06 10:23:12 Última modificación: 2023-11-06 10:23:12
Copiar: 1 Número de Visitas: 663
1
Seguir
1617
Seguidores

Sistema de tortugas marinas de Connecticut

Descripción general

La estrategia se desarrolló basándose en el famoso sistema de negociación de la tortuga, siguiendo las reglas primitivas en la medida de lo posible. Es un sistema de seguimiento de tendencias que forma señales de entrada y salida a través de dos líneas de equilibrio.

Principio de estrategia

  • Construir una línea de doble promedio utilizando el precio máximo calculado en la línea de día N1 y la línea de día N2 (de 20 y 55 días por defecto).
  • Construye una línea de doble equinoccio utilizando el precio mínimo calculado en la línea de sol N3 y la línea de sol N4 (de 10 y 20 días por defecto).
  • Hacer más cuando el precio de cierre es superior a la línea de sol N2; hacer un equilibrio cuando el precio de cierre es inferior a la línea de sol N4;
  • Después de hacer más, cada ganancia es una N veces ATR (default 1 veces), una subida de la posición, hasta un máximo de 5 veces.
  • Se establece un stop-loss fijo, con un ATR de N veces por debajo del precio de entrada por defecto (de 2 veces por defecto).
  • La entrada en una nueva posición se permite solo después de que la operación anterior haya sido ganada.

Análisis de las ventajas

La estrategia tiene las siguientes ventajas:

  • El método de trading de tendencias es capaz de capturar las tendencias medianas y largas.
  • Las líneas dobles uniformes forman una condición de filtración para evitar el intercambio frecuente durante las convulsiones.
  • El seguimiento del stop loss debe ser razonable y evitar que el stop loss sea demasiado amplio o demasiado estrecho.
  • La configuración paramétrica permite ajustar las características de riesgo-beneficio del sistema.
  • En la actualidad, el mercado de divisas en general está en pleno apogeo.

Análisis de riesgos

La estrategia también tiene sus riesgos:

  • El hecho de no poder detener la tendencia en el momento oportuno puede provocar grandes pérdidas.
  • El exceso de acumulaciones puede conllevar el riesgo de sobre-negociación.
  • La configuración incorrecta de los parámetros puede hacer que el sistema sea demasiado radical o conservador.
  • El riesgo de que los datos de retroalimentación coincidan es que el disco duro puede ser menos efectivo que el retroalimentación.

El riesgo puede reducirse de la siguiente manera:

  • Aumentar el juicio de señales de reversión, como la desviación del MACD, para reducir la pérdida de resistencia.
  • Optimizar los parámetros para que el sistema sea robusto.
  • Aumentar el método de tamaño de posición. Reducir la posición cuando se producen grandes pérdidas.

Dirección de optimización

La estrategia puede ser optimizada en los siguientes aspectos:

  • El aumento de la lógica de negociación a la baja permite que la estrategia obtenga ganancias incluso en situaciones de descenso.
  • Se ha añadido un módulo de optimización de la línea de pérdidas para que la línea de pérdidas se ajuste adecuadamente a las fluctuaciones de los precios.
  • Añade un módulo de administración de posiciones para optimizar el tamaño de cada posición.
  • La combinación de índices de tendencia como el ADX para determinar la fuerza de la tendencia y evitar el error de negociación.
  • Optimizar los parámetros para obtener una curva de ganancias más plana.
  • Tenga en cuenta los costos de las transacciones, como los puntos de deslizamiento y las comisiones de las transacciones en disco.

Resumir

Esta estrategia obtiene ganancias mediante el seguimiento de la tendencia y tiene una cierta ventaja de retroalimentación. Sin embargo, el efecto en el mercado real aún debe ser probado y se necesita una optimización adicional de la estabilidad de los parámetros y la mejora del módulo de gestión de pérdidas y posiciones para que la estrategia sea más adecuada para el comercio en el mercado real. En general, la estrategia es razonable y tiene un gran potencial de mejora.

Código Fuente de la Estrategia
/*backtest
start: 2022-10-30 00:00:00
end: 2023-11-05 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Turtle", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, commission_type=strategy.commission.percent, commission_value=0.1, pyramiding=5)

stopInput = input(2.0, "Stop N", step=.5)
pyramidInput = input(1, "Pyramid N", step=.5)
l1LongInput = input(20, "L1 Long", minval=5)
l2LongInput = input(55, "L2 Long", minval=5)
l1LongExitInput = input (10, "L1 Long Exit", minval=5)
l2LongExitInput = input (20, "L2 Long Exit", minval=5)

FromYear = input(2000, "From Year", minval=1900),   FromMonth = input(1, "From Month", minval=1, maxval=12),    FromDay = input(1, "From Day", minval=1, maxval=31)
ToYear = input(9999, "To Year", minval=1900),       ToMonth = input(1, "To Month", minval=1, maxval=12),        ToDay = input(1, "To Day", minval=1, maxval=31)
FromDate = timestamp(FromYear, FromMonth, FromDay, 00, 00),     ToDate = timestamp(ToYear, ToMonth, ToDay, 23, 59)
TradeDateIsAllowed() => time >= FromDate and time <= ToDate
l1Long = highest(l1LongInput)
l1LongExit = lowest(l1LongExitInput)
l2Long = highest(l2LongInput)
l2LongExit = lowest(l2LongExitInput)

// 
// ADX, +-DI
// https://www.tradingview.com/script/rlMJ05yl-ADX-and-DI-pine-script-3-0/
//
len = 14
th = 20
TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus = 0.0
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus

DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = sma(DX, len)

// Back to Turtle

filter = true // not (DIPlus < ADX and DIMinus < ADX) and DIPlus > DIMinus
var win = false
var totalPrice = 0.0
var buyPrice = 0.0
var avgPrice = 0.0
var nextBuyPrice = 0.0
var stopPrice = 0.0
var totalBuys = 0

var bool inBuy = false
var float l1LongPlot = highest(l1LongInput)
var float l2LongPlot = highest(l2LongInput)

n = atr(14)

var mode = 'L1'
string longLevel = na

if not inBuy 
    l1LongPlot := highest(l1LongInput)[1]
    l2LongPlot := highest(l2LongInput)[1]
    
    if (close > l2Long[1] and filter)
        mode := 'L2'
        if TradeDateIsAllowed() 
            strategy.close_all()
            strategy.entry("long", strategy.long, comment="L2")
            longLevel := 'L2'

        win := false
        buyPrice := close
        totalBuys := 1
        totalPrice := buyPrice
        avgPrice := buyPrice
        stopPrice := close-(stopInput*n)
        nextBuyPrice := high+(pyramidInput*n)
        inBuy := true
    else 
        if (close > l1Long[1] and filter)
            mode := 'L1'
            if not win
                if TradeDateIsAllowed()
                    strategy.close_all()
                    strategy.entry("long", strategy.long, comment="L1")
                    longLevel := 'L1'
            win := false
            buyPrice := close
            totalBuys := 1
            totalPrice := buyPrice
            avgPrice := buyPrice
            stopPrice := close-(stopInput*n)
            nextBuyPrice := high+(pyramidInput*n)
            inBuy := true
        else 
            inBuy := false

else
    l1LongPlot := l1LongPlot[1]
    l2LongPlot := l2LongPlot[1]
    
    if close > nextBuyPrice and TradeDateIsAllowed() and totalBuys < 6
        strategy.entry("long", strategy.long, comment="LP")
        longLevel := 'P'
        stopPrice := close-(stopInput*n)
        nextBuyPrice := high+(pyramidInput*n)
        totalBuys := totalBuys + 1
        totalPrice := totalPrice + buyPrice
        avgPrice := totalPrice / totalBuys

    if (close < stopPrice) 
        inBuy := false
        if TradeDateIsAllowed()
            if (close >= avgPrice)
                longLevel := 'SG'
            else 
                longLevel := 'SR'
            strategy.close("long", strategy.long)
        win := false
        buyPrice := 0
        avgPrice := 0
    else
        if (mode == 'L1' and close > l2Long[1] and filter)
            if win
                inBuy := true
                win := false
                mode := 'L2'
                if TradeDateIsAllowed()
                    strategy.close_all()
                    longLevel := 'L2'
                    strategy.entry("long", strategy.long, comment="L2")
                buyPrice := close
                totalBuys := 1
                totalPrice := buyPrice
                avgPrice := buyPrice
                stopPrice := close-(stopInput*n)
                nextBuyPrice := close+(pyramidInput*n)
        else
            if (close < l1LongExit[1] or close < l2LongExit[1])
                inBuy := false
                if TradeDateIsAllowed()
                    strategy.close("long", strategy.long)
                if close < avgPrice
                    longLevel := 'SR'
                    win := false
                else
                    longLevel := 'SG'
                    win := true
                buyPrice := 0

plot(l1LongPlot, title="l1 long", linewidth=3, style=plot.style_stepline, color=color.green)
plot(l1LongExit[1], title="l1 exit", linewidth=3, style=plot.style_stepline, color=color.red)

plot(l2LongPlot, title="l2 long", linewidth=2, style=plot.style_stepline, color=color.green)
plot(l2LongExit[1], title="l2 exit", linewidth=2, style=plot.style_stepline, color=color.red)

plot(stopPrice, title="stop", linewidth=2, style=plot.style_stepline, color=color.purple)

plotarrow(longLevel == 'L1' ? 1 : 0, colordown=color.black, colorup=color.green, transp=40)
plotarrow(longLevel == 'L2' ? 1 : 0, colordown=color.black, colorup=color.purple, transp=40)
plotarrow(longLevel == 'SR' ? -1 : 0, colordown=color.red, colorup=color.purple, transp=40)
plotarrow(longLevel == 'SG' ? -1 : 0, colordown=color.green, colorup=color.purple, transp=40)