Analyse stratégique des bandes RSI et OTT

Auteur:ChaoZhang est là., Date: 2023-10-09 16h21 et 20h
Les étiquettes:

Résumé

Cette stratégie est appelée RSI_OTT-TP/SL. Elle combine l'indicateur RSI et les bandes OTT pour déterminer les signaux de trading, appartenant aux stratégies de suivi des tendances.

La logique de la stratégie

  1. Cette stratégie utilise des indicateurs RSI et OTT pour déterminer la tendance et les points d'entrée.

  2. L'indicateur RSI est utilisé pour juger de la direction générale de la tendance. Il peut montrer si le marché est suracheté ou survendu. Le franchissement de l'indice RSI au-dessus du niveau de surachat est un signal d'achat, tandis que le franchissement en dessous du niveau de survente est un signal de vente.

  3. Les bandes OTT sont utilisées pour découvrir les points d'entrée. Ce sont des bandes formées sur la base de l'indicateur de taux de changement de volatilité (VAR). Lorsque le prix franchit la bande inférieure vers le haut, c'est un signal d'achat. Lorsque le prix franchit la bande supérieure vers le bas, c'est un signal de vente.

  4. Après avoir déterminé la tendance et confirmé le point d'entrée, cette stratégie ouvrira des positions longues ou courtes lorsque le prix franchira les bandes OTT.

  5. La stratégie fermera automatiquement les positions lorsque le prix du profit ou du stop-loss est atteint.

  6. La stratégie permet également de négocier uniquement en long, en court ou dans les deux sens.

Les avantages

  1. La combinaison des bandes RSI et OTT peut trouver des points d'entrée à forte probabilité dans le cadre d'un jugement de tendance précis.

  2. Les bandes OTT utilisent un indicateur de dynamique et sont très sensibles aux fluctuations des prix, ce qui peut détecter les points tournants tôt.

  3. Les fonctions de prise de profit et d'arrêt de perte aident à verrouiller les profits et à limiter les pertes avant leur expansion, ce qui favorise le contrôle des risques.

  4. La structure du code est claire avec suffisamment de commentaires, facile à comprendre et à modifier.

  5. Les paramètres de stratégie peuvent être ajustés de manière flexible via l'interface pour s'adapter aux différents environnements du marché.

Les risques

  1. L'indice RSI a une émission en retard et peut manquer les points d'inversion de tendance, ce qui entraîne des pertes inutiles.

  2. Les bandes OTT peuvent également générer de faux signaux.

  3. Les paramètres doivent être ajustés pour différents produits.

  4. La stratégie n'est testée que sur un seul produit. Les paramètres doivent être optimisés séparément pour différents produits dans le commerce en direct.

  5. La fenêtre de temps de backtest est courte et peut ne pas valider pleinement l'efficacité de la stratégie.

Directions d'optimisation

  1. Envisagez d'ajouter d'autres indicateurs pour la filtration, tels que MACD, KD, etc., afin de réduire les faux enregistrements.

  2. Les fourchettes de prise de profit et de stop-loss peuvent être ajustées dynamiquement en fonction de la volatilité.

  3. Optimisation des paramètres de recherche pour différents produits afin d'établir des critères de sélection des paramètres.

  4. Essayez des méthodes d'apprentissage automatique pour optimiser dynamiquement les paramètres de stratégie.

  5. Les indicateurs de volume peuvent également être utilisés pour déterminer les tendances.

  6. Considérez l'utilisation de la pénétration MA comme stop loss au lieu d'un simple stop loss en pourcentage.

Résumé

En résumé, il s'agit d'une stratégie de suivi de tendance typique. Elle juge d'abord la direction de la tendance à travers le RSI, puis utilise des bandes OTT pour aider à déterminer des points d'entrée spécifiques, et enfin définit le profit et le stop loss pour verrouiller les bénéfices et contrôler les risques. Les avantages de cette stratégie sont des combinaisons d'indicateurs simples et efficaces et de bons résultats de backtest. Mais il existe également des risques tels que le retard du RSI et les faux signaux de bande OTT. Cela nous oblige à optimiser soigneusement les paramètres dans le trading en direct et à ajouter d'autres indicateurs techniques pour la confirmation afin d'améliorer la stabilité de la stratégie. Avec une optimisation et une vérification continues, cette stratégie peut devenir un modèle de stratégie de suivi de tendance très pratique.


/*backtest
start: 2023-09-08 00:00:00
end: 2023-10-08 00:00:00
period: 2h
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/
// © BigCoinHunter

//@version=5
strategy(title="RSI_OTT-TP/SL", overlay=true, 
     pyramiding=0, default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, initial_capital=1000, 
     currency=currency.USD, commission_value=0.05, 
     commission_type=strategy.commission.percent, 
     process_orders_on_close=true)

//----------- get the user inputs --------------

//---------- RSI -------------
price = input(close, title="Source")

RSIlength = input.int(defval=6,title="RSI Length") 
RSIoverSold = input.int(defval=50, title="RSI OverSold", minval=1)
RSIoverBought = input.int(defval=50, title="RSI OverBought", minval=1)

//------- OTT Bands ----------------
src = close
length=input.int(defval=1, title="OTT Period", minval=1)
percent=input.float(defval=5, title="OTT Percent", step=0.1, minval=0.001)

mav = input.string(title="OTT MA Type", defval="VAR", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])

ottUpperPercent = input.float(title="OTT Upper Line Coeff", defval=0.01, minval = 0.001, step=0.001)
ottLowerPercent = input.float(title="OTT Lower Line Coeff", defval=0.01, minval = 0.001, step=0.001)

Var_Func(src,length)=>
    valpha=2/(length+1)
    vud1=src>src[1] ? src-src[1] : 0
    vdd1=src<src[1] ? src[1]-src : 0
    vUD=math.sum(vud1,9)
    vDD=math.sum(vdd1,9)
    vCMO=nz((vUD-vDD)/(vUD+vDD))
    VAR=0.0
    VAR:=nz(valpha*math.abs(vCMO)*src)+(1-valpha*math.abs(vCMO))*nz(VAR[1])
    
VAR=Var_Func(src,length)

Wwma_Func(src,length)=>
    wwalpha = 1/ length
    WWMA = 0.0
    WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
    
WWMA=Wwma_Func(src,length)

Zlema_Func(src,length)=>
    zxLag = length/2==math.round(length/2) ? length/2 : (length - 1) / 2
    zxEMAData = (src + (src - src[zxLag]))
    ZLEMA = ta.ema(zxEMAData, length)
    
ZLEMA=Zlema_Func(src,length)

Tsf_Func(src,length)=>
    lrc = ta.linreg(src, length, 0)
    lrc1 = ta.linreg(src,length,1)
    lrs = (lrc-lrc1)
    TSF = ta.linreg(src, length, 0)+lrs
    
TSF=Tsf_Func(src,length)

getMA(src, length) =>
    ma = 0.0
    if mav == "SMA"
        ma := ta.sma(src, length)
        ma

    if mav == "EMA"
        ma := ta.ema(src, length)
        ma

    if mav == "WMA"
        ma := ta.wma(src, length)
        ma

    if mav == "TMA"
        ma := ta.sma(ta.sma(src, math.ceil(length / 2)), math.floor(length / 2) + 1)
        ma

    if mav == "VAR"
        ma := VAR
        ma

    if mav == "WWMA"
        ma := WWMA
        ma

    if mav == "ZLEMA"
        ma := ZLEMA
        ma

    if mav == "TSF"
        ma := TSF
        ma
    ma
    
MAvg=getMA(src, length)
fark=MAvg*percent*0.01
longStop = MAvg - fark
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? math.max(longStop, longStopPrev) : longStop
shortStop =  MAvg + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
MT = dir==1 ? longStop: shortStop

OTT=MAvg>MT ? MT*(200+percent)/200 : MT*(200-percent)/200

light_green=#08ff12
light_red=#fe0808

OTTupper = nz(OTT[2])*(1+ottUpperPercent)
OTTlower = nz(OTT[2])*(1-ottLowerPercent)

p1 = plot(OTTupper, color=light_green, linewidth=1, title="OTT UPPER")
p2 = plot(nz(OTT[2]), color=color.new(color.yellow,0), linewidth=1, title="OTT MIDDLE")
p3 = plot(OTTlower, color=light_red, linewidth=1, title="OTT LOWER")

fill(plot1=p1, plot2=p3, title="OTT Background", color=color.new(color.aqua,90), fillgaps=false, editable=true)

buyEntry = ta.crossover(src, OTTlower)
sellEntry = ta.crossunder(src, OTTupper)

//---------- input TP/SL ---------------
tp = input.float(title="Take Profit:", defval=0.0, minval=0.0, maxval=100.0, step=0.1) * 0.01
sl = input.float(title="Stop Loss:  ", defval=0.0, minval=0.0, maxval=100.0, step=0.1) * 0.01

isEntryLong = input.bool(defval=true, title= 'Long Entry', inline="11")
isEntryShort = input.bool(defval=true, title='Short Entry', inline="11")

//---------- backtest range setup ------------
fromDay   = input.int(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input.int(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear  = input.int(defval = 2021, title = "From Year", minval = 2010)
toDay     = input.int(defval = 30, title = "To Day", minval = 1, maxval = 31)
toMonth   = input.int(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear    = input.int(defval = 2022, title = "To Year", minval = 2010)

//------------ time interval setup -----------
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)  // backtest start window
finish    = timestamp(toYear, toMonth, toDay, 23, 59)        // backtest finish window
window()  => true // create function "within window of time"

//------- define the global variables ------
var bool long = true
var bool stoppedOutLong = false
var bool stoppedOutShort = false

//--------- Colors ---------------
//TrendColor = RSIoverBought and (price[1] > BBupper and price < BBupper) and BBbasis < BBbasis[1] ? color.red : RSIoverSold and (price[1] < BBlower and price > BBlower) and BBbasis > BBbasis[1] ? color.green : na
//bgcolor(switch2?(color.new(TrendColor,50)):na)


//--------- calculate the input/output points -----------
longProfitPrice  = strategy.position_avg_price * (1 + tp)     // tp -> take profit percentage
longStopPrice = strategy.position_avg_price * (1 - sl)        // sl -> stop loss percentage

shortProfitPrice  = strategy.position_avg_price * (1 - tp)
shortStopPrice = strategy.position_avg_price * (1 + sl)


//---------- RSI + Bollinger Bands Strategy -------------
vrsi = ta.rsi(price, RSIlength)

rsiCrossOver = ta.crossover(vrsi, RSIoverSold)
rsiCrossUnder = ta.crossunder(vrsi, RSIoverBought)

OTTCrossOver = ta.crossover(src, OTTlower)
OTTCrossUnder = ta.crossunder(src, OTTupper)

if (not na(vrsi))

    if rsiCrossOver and OTTCrossOver
        long := true
        
    if rsiCrossUnder and OTTCrossUnder
        long := false

//------- define the global variables ------
buySignall = false
sellSignall = false

//------------------- determine buy and sell points ---------------------
buySignall := window() and long  and (not stoppedOutLong)
sellSignall := window() and (not long)  and (not stoppedOutShort)


//---------- execute the strategy -----------------
if(isEntryLong and isEntryShort)
    if long 
        strategy.entry("LONG", strategy.long, when = buySignall, comment = "ENTER LONG")
        stoppedOutLong := true
        stoppedOutShort := false
    else 
        strategy.entry("SHORT", strategy.short, when = sellSignall, comment = "ENTER SHORT")
        stoppedOutLong  := false
        stoppedOutShort := true

else if(isEntryLong)
    strategy.entry("LONG", strategy.long,  when = buySignall)
    strategy.close("LONG", when = sellSignall)
    if long 
        stoppedOutLong := true
    else
        stoppedOutLong  := false

else if(isEntryShort)
    strategy.entry("SHORT", strategy.short, when = sellSignall)
    strategy.close("SHORT", when = buySignall)
    if not long
        stoppedOutShort := true
    else
        stoppedOutShort := false
    

//----------------- take profit and stop loss -----------------
if(tp>0.0 and sl>0.0)
    if ( strategy.position_size > 0 )
        strategy.exit(id="LONG", limit=longProfitPrice, stop=longStopPrice, comment="Long TP/SL Trigger")

    else if ( strategy.position_size < 0 )
        strategy.exit(id="SHORT", limit=shortProfitPrice, stop=shortStopPrice, comment="Short TP/SL Trigger")

else if(tp>0.0)
    if ( strategy.position_size > 0 )
        strategy.exit(id="LONG", limit=longProfitPrice, comment="Long TP Trigger")

    else if ( strategy.position_size < 0 )
        strategy.exit(id="SHORT", limit=shortProfitPrice, comment="Short TP Trigger")
        
else if(sl>0.0)
    if ( strategy.position_size > 0 )
        strategy.exit(id="LONG",  stop=longStopPrice, comment="Long SL Trigger")

    else if ( strategy.position_size < 0 )
        strategy.exit(id="SHORT",  stop=shortStopPrice, comment="Short SL Trigger")




Plus de