Système de protection des tortues marines du Connecticut


Date de création: 2023-11-06 10:23:12 Dernière modification: 2023-11-06 10:23:12
Copier: 1 Nombre de clics: 663
1
Suivre
1617
Abonnés

Système de protection des tortues marines du Connecticut

Aperçu

La stratégie est basée sur le célèbre système de négociation de coquillages, développé selon des règles aussi primitives que possible. Il s’agit d’un système de suivi des tendances, qui forme des signaux d’entrée et de sortie à travers des lignes doubles.

Principe de stratégie

  • Construisez une ligne à double équivalence en utilisant les valeurs maximales calculées sur les lignes solaires N1 et N2 (par défaut 20 et 55).
  • Construire une ligne de double équivalence en utilisant les lignes de jour N3 et N4 calculées à partir du prix minimum (les 10 et 20 par défaut).
  • Lorsque le prix de clôture est supérieur à la ligne de jour N2, faites plus; lorsque le prix de clôture est inférieur à la ligne de jour N4, faites le plein.
  • Chaque fois que vous faites un plus, vous augmentez le N-fold ATR (par défaut 1 fois), vous augmentez la position une fois, jusqu’à 5 fois.
  • Il s’agit d’un stop-loss fixe qui prend par défaut N fois l’ATR inférieur au prix d’entrée (par défaut 2 fois).
  • Les nouveaux joueurs ne sont autorisés à entrer dans une nouvelle position qu’après avoir gagné la transaction précédente.

Analyse des avantages

Cette stratégie présente les avantages suivants:

  • Il suit le principe de l’échange de tendances et est capable de capturer les tendances de la ligne moyenne et longue.
  • Les conditions de filtrage de l’équilibre binaire permettent d’éviter des transactions fréquentes pendant les secousses.
  • Le suivi des stop-loss doit être raisonnablement réglé pour éviter que les stop-loss ne soient trop larges ou trop étroits.
  • Les paramètres paramétraux permettent d’ajuster les caractéristiques de risque/bénéfice du système.
  • Il est possible d’augmenter la position et de gagner plus sur la tendance.

Analyse des risques

Cette stratégie comporte aussi des risques:

  • Le fait de ne pas être en mesure d’arrêter la tendance en temps opportun peut entraîner de lourdes pertes.
  • Le risque d’une survente de l’investissement peut être lié à un nombre excessif de mises en place.
  • Les paramètres mal définis peuvent entraîner un système trop radical ou trop conservateur.
  • Les données de retouche sont adaptées au risque, l’efficacité du disque dur peut être plus faible que celle de la retouche.

Le risque peut être réduit par:

  • Augmentation du jugement sur les signaux de retournement, tels que le décalage du MACD, et réduction des pertes de contre-courant.
  • Optimiser les paramètres pour rendre le système plus robuste.
  • Augmentation de la méthode de dimensionnement des positions. Réduction des positions en cas de pertes importantes.

Direction d’optimisation

Cette stratégie peut être optimisée dans les domaines suivants:

  • L’augmentation de la logique de négociation à vide permet à la stratégie de tirer profit de la baisse.
  • Ajout d’un module d’optimisation de la ligne de stop-loss, permettant à la ligne de stop-loss de s’adapter aux fluctuations des prix.
  • Ajout d’un module de gestion des positions afin d’optimiser la taille des positions à chaque ajout.
  • Les indices de tendance tels que l’ADX sont utilisés pour juger de la force ou de la faiblesse de la tendance et éviter les erreurs de trading.
  • Optimiser les paramètres pour obtenir une courbe de rendement plus lisse.
  • Le coût de transaction est calculé en tenant compte des points de dérapage, des frais de transaction et autres.

Résumer

Cette stratégie a un certain avantage de rétroaction en suivant les tendances. Cependant, l’efficacité du marché réel doit encore être testée. Il est nécessaire d’optimiser davantage la stabilité des paramètres, d’améliorer le module de gestion des stop-loss et des positions pour que la stratégie soit plus adaptée au marché réel.

Code source de la stratégie
/*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)