Stratégie de suivi des oscillations de la bande d'isolation

Auteur:ChaoZhang est là., Date: 2024-02-04 10:28:24 Je suis désolé
Les étiquettes:

img

Résumé

L'idée principale de cette stratégie est de calculer les lignes de stop-loss longues et courtes en fonction de l'indicateur ATR. Il génère des signaux de trading lorsque le prix traverse ces lignes de stop-loss. Il a à la fois des capacités de suivi de tendance et de capture d'oscillation.

Principe de stratégie

La stratégie utilise l'ATR de la période N multiplié par un coefficient pour calculer les lignes de stop-loss longues et courtes.

Long Stop = Highest Price - ATR * Coefficient 
Short Stop = Lowest Price + ATR * Coefficient

Il va long lorsque le prix augmente et traverse la longue ligne d'arrêt-perte, et court lorsque le prix tombe et traverse la courte ligne d'arrêt-perte.

En utilisant la bande ATR comme niveau de stop-loss, cette méthode peut capturer pleinement la tendance du prix tout en assurant le risque de stop-loss.

Analyse des avantages

Le principal avantage de cette stratégie est qu'elle permet d'ajuster automatiquement le niveau de stop-loss pour capturer les tendances des prix tout en contrôlant les risques.

  1. L'indicateur ATR permet d'ajuster la fourchette d'arrêt-perte en fonction de la volatilité du marché afin de contrôler efficacement les pertes uniques.

  2. En adoptant une méthode innovante pour générer des signaux, on peut filtrer un peu de bruit et éviter de courir après des sommets et des bas.

  3. L'ajustement en temps réel des lignes de stop-loss pour suivre les fluctuations des prix empêche le stop-loss d'être trop lâche et de générer plus de bénéfices.

Analyse des risques

La stratégie comporte également certains risques, principalement concentrés dans la définition du niveau de stop-loss et la génération de signaux.

  1. Un cycle ATR et des coefficients incorrects peuvent entraîner un stop-loss trop large ou trop étroit.

  2. La méthode du signal de rupture peut manquer les premières opportunités de tendance.

  3. Il peut y avoir un certain retard dans le suivi du stop-loss pendant la fin de la tendance, incapable de sortir parfaitement.

Les contre-mesures visent principalement à ajuster les paramètres afin de rendre le stop-loss plus raisonnable ou à aider à déterminer la tendance et les signaux à l'aide d'autres indicateurs.

Directions d'optimisation

La stratégie peut être encore optimisée dans les aspects suivants:

  1. Mettre en place un stop-loss de deuxième couche pour contrôler davantage les risques.

  2. Combiner d'autres indicateurs pour déterminer la tendance et améliorer la qualité du signal.

  3. Ajoutez des stratégies d'arrêt des bénéfices pour augmenter les bénéfices lorsque la tendance se poursuit.

  4. Optimiser le cycle ATR et les paramètres des coefficients pour rapprocher le stop-loss des fluctuations réelles des prix.

Résumé

Dans l'ensemble, cette stratégie est très pratique. Elle peut contrôler efficacement les risques en ajustant automatiquement le niveau de stop-loss, tout en obtenant de bons profits grâce au suivi des tendances. Nous pouvons optimiser et améliorer davantage la stratégie en combinant d'autres méthodes analytiques sur la base existante pour la rendre plus stable et intelligente.


/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
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/
// © melihtuna
//@version=4
strategy("Chandelier Exit - Strategy",shorttitle="CE-STG" , overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD, commission_value=0.03, commission_type=strategy.commission.percent)

length = input(title="ATR Period", type=input.integer, defval=22)
mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
showLabels = input(title="Show Buy/Sell Labels ?", type=input.bool, defval=false)
useClose = input(title="Use Close Price for Extremums ?", type=input.bool, defval=true)
highlightState = input(title="Highlight State ?", type=input.bool, defval=true)

atr = mult * atr(length)

longStop = (useClose ? highest(close, length) : highest(length)) - atr
longStopPrev = nz(longStop[1], longStop) 
longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop

shortStop = (useClose ? lowest(close, length) : lowest(length)) + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

var int dir = 1
dir := close > shortStopPrev ? 1 : close < longStopPrev ? -1 : dir

var color longColor = color.green
var color shortColor = color.red

longStopPlot = plot(dir == 1 ? longStop : na, title="Long Stop", style=plot.style_linebr, linewidth=2, color=longColor)
buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal ? longStop : na, title="Long Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=longColor, transp=0)
plotshape(buySignal and showLabels ? longStop : na, title="Buy Label", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=longColor, textcolor=color.white, transp=0)

shortStopPlot = plot(dir == 1 ? na : shortStop, title="Short Stop", style=plot.style_linebr, linewidth=2, color=shortColor)
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal ? shortStop : na, title="Short Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=shortColor, transp=0)
plotshape(sellSignal and showLabels ? shortStop : na, title="Sell Label", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=shortColor, textcolor=color.white, transp=0)

midPricePlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0, display=display.none, editable=false)

longFillColor = highlightState ? (dir == 1 ? longColor : na) : na
shortFillColor = highlightState ? (dir == -1 ? shortColor : na) : na
fill(midPricePlot, longStopPlot, title="Long State Filling", color=longFillColor)
fill(midPricePlot, shortStopPlot, title="Short State Filling", color=shortFillColor)


long_short = input(true, "Long-Short",type=input.bool, group="Strategy Settings")

start     = input(timestamp("2019-01-01"), "Date", type=input.time, group="Strategy Settings")
finish    = input(timestamp("2025-01-01"), "Date", type=input.time, group="Strategy Settings")   
window()  => true

slRatio=input(5, "Manuel Stop Loss Ratio", type=input.float, minval=0, group="Strategy Settings")
tpRatio=input(20, "Take Profit Ratio", type=input.float, minval=0, group="Strategy Settings")
tsStartRatio=input(10, "Trailing Stop Start Ratio", type=input.float, minval=0, group="Strategy Settings")
tsRatio=input(5, "Trailing Stop Ratio", type=input.float, minval=1, group="Strategy Settings")

lastBuyPrice = strategy.position_avg_price

diffHiPriceRatio = (high-lastBuyPrice)/lastBuyPrice*100
diffLoPriceRatio = (close-lastBuyPrice)/lastBuyPrice*100
posHiRatio=0.0
posHiRatio:= strategy.position_size > 0 ? diffHiPriceRatio > posHiRatio[1] ? diffHiPriceRatio : posHiRatio[1] : 0

s_diffHiPriceRatio = (low-lastBuyPrice)/lastBuyPrice*100
s_diffLoPriceRatio = (close-lastBuyPrice)/lastBuyPrice*100
s_posHiRatio=0.0
s_posHiRatio:= strategy.position_size < 0 ? s_diffLoPriceRatio < s_posHiRatio[1] ? s_diffLoPriceRatio : s_posHiRatio[1] : 0

strategy.entry("LONG", strategy.long, when = window() and buySignal)
strategy.close("LONG", when = window() and sellSignal)
strategy.close("LONG", when = diffLoPriceRatio<(slRatio*(-1)), comment="STOP-LONG")
strategy.close("LONG", when = diffHiPriceRatio>tpRatio, comment="TAKE-PROFIT-LONG")
strategy.close("LONG", when = ((posHiRatio[1]>tsStartRatio) and (posHiRatio[1]-diffHiPriceRatio)>tsRatio), comment="TRAILING-STOP-LONG")

if long_short
    strategy.entry("SHORT", strategy.short, when = window() and sellSignal)
    strategy.close("SHORT", when = window() and buySignal)
    strategy.close("SHORT", when = s_diffLoPriceRatio>(slRatio), comment="STOP-SHORT")
    strategy.close("SHORT", when = s_diffHiPriceRatio<(tpRatio*(-1)), comment="TAKE-PROFIT-SHORT")
    strategy.close("SHORT", when = ((s_posHiRatio[1]*(-1)>tsStartRatio) and ((s_posHiRatio[1]-s_diffLoPriceRatio))*(-1)>tsRatio), comment="TRAILING-STOP-SHORT")

Plus de