Cette stratégie s’appelle le multi-stratégie basée sur la réversion de l’indicateur de volatilité finale. Cette stratégie utilise l’indicateur de volatilité finale pour juger de la situation de survente et de survente, et effectue plusieurs opérations de contre-marché lorsque l’indicateur atteint la situation de survente.
L’indicateur de volatilité finale fusionne des informations sur les prix de plusieurs cycles pour juger du niveau de survente du marché. Lorsque l’indicateur franchit le bas, il indique que le marché est en survente, ce qui laisse présager un rebond.
La logique de la transaction est la suivante:
Lorsque l’indicateur de volatilité finale atteint un point bas (par exemple, 45), cela signifie que le marché est en survente et qu’il est envisagé de faire plus.
Continuez à détenir des positions multiples jusqu’à ce que l’indicateur traverse la ligne médiane (par exemple, 70), et que la position de placement s’arrête.
Si le prix dépasse le seuil de rupture, il est préférable d’arrêter le jeu. Si l’indicateur montre une divergence à plusieurs niveaux, il est possible d’ajuster le seuil de rupture.
Si l’indicateur revient à la baisse, il peut être envisagé d’augmenter la position.
L’avantage de cette stratégie est de capturer les opportunités de rebond des oversold. Cependant, les paramètres de l’indicateur doivent être optimisés et l’indicateur lui-même est en retard, ce qui nécessite une analyse de tendance. La gestion des stops et des fonds est également particulièrement importante.
En général, l’utilisation d’indicateurs pour déterminer le moment de la reprise est une méthode courante. Cependant, les traders doivent conserver la flexibilité de leur jugement et ne peuvent pas s’appuyer entièrement sur un seul indicateur.
/*backtest
start: 2023-09-11 00:00:00
end: 2023-09-12 00:00:00
period: 5m
basePeriod: 1m
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/
// © mohanee
//@version=4
strategy(title="Ultimate Oscillator [Long] Strategy", shorttitle="UO" , overlay=false, pyramiding=2, default_qty_type=strategy.percent_of_equity, default_qty_value=20, initial_capital=10000, currency=currency.USD) //default_qty_value=10, default_qty_type=strategy.fixed,
//Ultimate Oscillator logic copied from TradingView builtin indicator
/////////////////////////////////////////////////////////////////////////////////
length1 = input(5, minval=1), length2 = input(10, minval=1), length3 = input(15, minval=1)
//rsiUOLength = input(7, title="RSI UO length", minval=1)
signalLength = input(9, title="Signal length", minval=1)
buyLine = input (45, title="Buy Line (UO crossing up oversold at ) ") //crossover
exitLine = input (70, title="Exit Line (UO crsossing down overbought at) ") //crossunder
riskCapital = input(title="Risk % of capital", defval=10, minval=1)
stopLoss=input(3,title="Stop Loss",minval=1)
takeProfit=input(false, title="Take Profit")
profitExitLine = input (75, title="Take Profit at RSIofUO crossing below this value ") //crossunder
showSignalLine=input(true, "show Signal Line")
//showUO=input(false, "show Ultimate Oscialltor")
average(bp, tr_, length) => sum(bp, length) / sum(tr_, length)
high_ = max(high, close[1])
low_ = min(low, close[1])
bp = close - low_
tr_ = high_ - low_
avg7 = average(bp, tr_, length1)
avg14 = average(bp, tr_, length2)
avg28 = average(bp, tr_, length3)
ultOscVal = 100 * (4*avg7 + 2*avg14 + avg28)/7
//Ultimate Oscillator
/////////////////////////////////////////////////////////////////////////////////
//Willimas Alligator copied from TradingView built in Indicator
/////////////////////////////////////////////////////////////////////////////////
smma(src, length) =>
smma = 0.0
smma := na(smma[1]) ? sma(src, length) : (smma[1] * (length - 1) + src) / length
smma
//moving averages logic copied from Willimas Alligator -- builtin indicator in TradingView
sma1=smma(hl2,5)
sma2=smma(hl2,20)
sma3=smma(hl2,50)
//Willimas Alligator
/////////////////////////////////////////////////////////////////////////////////
myVwap= vwap(hlc3)
//drawings
/////////////////////////////////////////////////////////////////////////////////
hline(profitExitLine, title="Middle Line 60 [Profit Exit Here]", color=color.purple , linestyle=hline.style_dashed)
obLevelPlot = hline(exitLine, title="Overbought", color=color.red , linestyle=hline.style_dashed)
osLevelPlot = hline(buyLine, title="Oversold", color=color.blue, linestyle=hline.style_dashed)
//fill(obLevelPlot, osLevelPlot, title="Background", color=color.blue, transp=90)
//rsiUO = rsi(ultOscVal,rsiUOLength)
rsiUO=ultOscVal
//emaUO = ema(rsiUO, 9)
//signal line
emaUO = ema(ultOscVal , 5) // ema(ultOscVal / rsiUO, 9)
//ultPlot=plot(showUO==true? ultOscVal : na, color=color.green, title="Oscillator")
plot(rsiUO, title = "rsiUO" , color=color.purple)
plot(showSignalLine ? emaUO : na , title = "emaUO [signal line]" , color=color.blue) //emaUO
//drawings
/////////////////////////////////////////////////////////////////////////////////
//Strategy Logic
/////////////////////////////////////////////////////////////////////////////////
longCond= crossover(rsiUO, buyLine) or crossover(rsiUO, 30)
//longCond= ( ema10>ema20 and crossover(rsiUO, buyLine) ) or ( ema10 < ema20 and crossover(rsiUO, 75) )
//Entry--
//Echeck how many units can be purchased based on risk manage ment and stop loss
qty1 = (strategy.equity * riskCapital / 100 ) / (close*stopLoss/100)
//check if cash is sufficient to buy qty1 , if capital not available use the available capital only
qty1:= (qty1 * close >= strategy.equity ) ? (strategy.equity / close) : qty1
//strategy.entry(id="LERSIofUO", long=true, qty=qty1, when = close > open and barssince(longCond)<=3 and strategy.position_size<1 ) //and sma1 > sma3) // and close>open and rsiUO >= 25 ) //and
strategy.entry(id="LEUO", long=true, qty=qty1, when = close > open and barssince(longCond)<=3 and strategy.position_size<1 and sma2 > sma3) // and close>open and rsiUO >= 25 ) //and
//Add
//strategy.entry(id="LEUO", comment="Add" , qty=qty1/2 , long=true, when = strategy.position_size>=1 and close < strategy.position_avg_price and crossover(rsiUO, 60) ) //and sma1 > sma3) // and close>open and rsiUO >= 25 ) //and
//strategy.entry(id="LEUO", long=true, qty=qty1, when = close > open and barssince(longCond)<=10 and valuewhen(longCond , close , 1) > close and rsiUO>=30) // and close>open and rsiUO >= 25 ) //and
//for Later versions
//also check for divergence ... later version
//also check if close above vwap session
//strategy.entry(id="LEUO", long=false, when = sma1< sma2 and crossunder(rsiUO,60) )
//change the bar color to yellow , indicating startegy will trigger BUY
barcolor( close > open and barssince(longCond)<=3 and strategy.position_size<1 and sma2 > sma3 ? color.orange : na)
//barcolor(abs(strategy.position_size)>=1 ? color.blue : na )
bgcolor(abs(strategy.position_size)>=1 ? color.blue : na , transp=70)
//signal for addition to existing position
barcolor( strategy.position_size>=1 and close < strategy.position_avg_price and crossover(rsiUO, 60) ? color.yellow : na)
//bgcolor( strategy.position_size>=1 and close < strategy.position_avg_price and crossover(rsiUO, 60) ? color.yellow : na, transp=30)
//partial exit
strategy.close(id="LEUO", comment="PExit", qty=strategy.position_size/3, when= takeProfit and abs(strategy.position_size)>=1 and close > strategy.position_avg_price and crossunder(rsiUO,profitExitLine) )
//close the Long order
strategy.close(id="LEUO", comment="Profit is "+tostring(close - strategy.position_avg_price, "###.##"), when=abs(strategy.position_size)>=1 and crossunder(rsiUO,exitLine) ) //and close > strategy.position_avg_price )
//strategy.close(id="LEUO", comment="CloseAll", when=abs(strategy.position_size)>=1 and crossunder(rsiUO2,40) ) //and close > strategy.position_avg_price )
// stop loss exit
stopLossVal = strategy.position_size>=1 ? strategy.position_avg_price * ( 1 - (stopLoss/100) ) : 0.00
strategy.close(id="LEUO", comment="SL exit Loss is "+tostring(close - strategy.position_avg_price, "###.##") , when=abs(strategy.position_size)>=1 and close < stopLossVal and rsiUO < exitLine)
//reason to rsiUO <30 is if price is going down , indicator should reflect it ... but indicator is above 30 means it showing divergence... so hold on it until it crossdown 30 ...that way even Stop Loss less than predefined ...
//Strategy Logic
/////////////////////////////////////////////////////////////////////////////////