Cet article détaille une stratégie de trading quantifié en longues lignes utilisant la reconnaissance des bandes d’oscillation pour effectuer des inversions. Cette stratégie permet de faire des achats en déduisant que le prix a traversé la bande d’oscillation et d’effectuer des opérations de suivi du mouvement.
Premièrement, les principes stratégiques
L’indicateur central de la stratégie est la zone de fluctuation, et les étapes de calcul sont les suivantes:
Calculer la moyenne mobile de la voie médiane, de la voie supérieure et de la voie inférieure;
Un signal d’achat est généré lorsque le prix dépasse la trajectoire descendante de bas en haut;
Le prix de l’or est le prix de l’or, et le prix de l’or est le prix de l’or.
Il est possible de choisir d’arrêter le train au signal de vente ou au passage en piste.
Le stop loss est réglé sur un pourcentage fixe de stop loss.
De cette façon, il peut être acheté lorsque le prix est en baisse, puis retiré par un stop ou un stop loss pour réaliser une opération de revers.
Deux, les avantages stratégiques
Le plus grand avantage de cette stratégie est l’utilisation de bandes de fréquences pour identifier les points de retournement, une méthode d’analyse technique plus mature.
Un autre avantage est la mise en place d’un mécanisme de stop-loss qui permet de contrôler le risque d’une transaction individuelle.
Enfin, la construction par lots peut aussi aider à réaliser des bénéfices par tranches après la reprise.
Troisièmement, les risques potentiels
Mais il y a aussi des problèmes potentiels avec cette stratégie:
Tout d’abord, le calcul des moyennes mobiles est en retard et pourrait manquer le moment idéal pour acheter.
Deuxièmement, les paramètres de freinage et de points de perte doivent être soigneusement testés et optimisés.
Finalement, la tenue d’une position en ligne longue doit faire face à une certaine pression de retrait.
Quatrième partie, résumé
Cet article présente en détail une stratégie de trading quantitatif sur les longues lignes qui utilise le retournement des bandes d’oscillation. Elle permet d’identifier efficacement les occasions de retournement des prix et de réaliser des positions sur les longues lignes. Mais elle nécessite également de contrôler les problèmes tels que le retard de la moyenne mobile et d’optimiser les points d’arrêt-stop.
/*backtest
start: 2023-09-07 00:00:00
end: 2023-09-12 04:00:00
period: 14m
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/
// © ediks123
//strategy logic has been borrowed from ceyhun and tweaked the settings for back testing
//@version=4
//SPY 4 hrs settings 8, 13 , 3.33 , 0.9 on 4 hrs chart
//QQQ above settings is good , but 13, 13 has less number of bars
//QQQ 4 hrs settings 13, 13 , 3.33 , 0.9 on 4 hrs chart
strategy(title="Volatility Bands Reversal Strategy", shorttitle="VolatilityBandReversal" , overlay=true, 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,
av = input(8, title="Band Average")
vp = input(13, title="Volatility Period")
df = input(3.33,title="Deviation Factor",minval=0.1)
lba = input(0.9,title="Lower Band Adjustment",minval=0.1)
riskCapital = input(title="Risk % of capital", defval=10, minval=1)
stopLoss=input(6,title="Stop Loss",minval=1)
exitOn=input(title="Exit on", defval="touch_upperband", options=["Sell_Signal", "touch_upperband"])
src = hlc3
typical = src >= src[1] ? src - low[1] : src[1] - low
deviation = sum( typical , vp )/ vp * df
devHigh = ema(deviation, av)
devLow = lba * devHigh
medianAvg = ema(src, av)
emaMediaAvg=ema(medianAvg, av)
upperBandVal= emaMediaAvg + devHigh
lowerbandVal= emaMediaAvg - devLow
MidLineVal=sma(medianAvg, av)
UpperBand = plot ( upperBandVal, color=#EE82EE, linewidth=2, title="UpperBand")
LowerBand = plot ( lowerbandVal , color=#EE82EE, linewidth=2, title="LowerBand")
MidLine = plot (MidLineVal, color=color.blue, linewidth=2, title="MidLine")
buyLine = plot ( (lowerbandVal + MidLineVal )/2 , color=color.blue, title="BuyLine")
up=ema(medianAvg, av) + devHigh
down=ema(medianAvg, av) - devLow
ema50=ema(hlc3,50)
plot ( ema50, color=color.orange, linewidth=2, title="ema 50")
//outer deviation
//deviation1 = sum( typical , vp )/ vp * 4
//devHigh1 = ema(deviation, av)
//devLow1 = lba * devHigh
//medianAvg1 = ema(src, av)
//UpperBand1 = plot (emaMediaAvg + devHigh1, color=color.red, linewidth=3, title="UpperBand1")
//LowerBand1 = plot (emaMediaAvg - devLow1, color=color.red, linewidth=3, title="LowerBand1")
//
///Entry Rules
//1)First candle close below the Lower Band of the volatility Band
//2)Second candle close above the lower band
//3)Third Candle closes above previous candle
Buy = close[2] < down[2] and close[1]>down[1] and close>close[1]
//plotshape(Buy,color=color.blue,style=shape.arrowup,location=location.belowbar, text="Buy")
//barcolor(close[2] < down[2] and close[1]>down[1] and close>close[1] ? color.blue :na )
//bgcolor(close[2] < down[2] and close[1]>down[1] and close>close[1] ? color.green :na )
///Exit Rules
//1)One can have a static stops initially followed by an trailing stop based on the risk the people are willing to take
//2)One can exit with human based decisions or predefined target exits. Choice of deciding the stop loss and profit targets are left to the readers.
Sell = close[2] > up[2] and close[1]<up[1] and close<close[1]
//plotshape(Sell,color=color.red,style=shape.arrowup,text="Sell")
barcolor(close[2] > up[2] and close[1]<up[1] and close<close[1] ? color.yellow :na )
bgcolor(close[2] > up[2] and close[1]<up[1] and close<close[1] ? color.red :na )
//Buyer = crossover(close,Buy)
//Seller = crossunder(close,Sell)
//alertcondition(Buyer, title="Buy Signal", message="Buy")
//alertcondition(Seller, title="Sell Signal", message="Sell")
//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="vbLE", long=true, qty=qty1, when=Buy)
bgcolor(strategy.position_size>=1 ? color.blue : na)
// stop loss exit
stopLossVal = strategy.position_size>=1 ? strategy.position_avg_price * ( 1 - (stopLoss/100) ) : 0.00
//draw initil stop loss
plot(strategy.position_size>=1 ? stopLossVal : na, color = color.purple , style=plot.style_linebr, linewidth = 2, title = "stop loss") //, trackprice=true)
strategy.close(id="vbLE", comment="SL exit Loss is "+tostring(close - strategy.position_avg_price, "###.##") , when=abs(strategy.position_size)>=1 and close < stopLossVal )
//close on Sell_Signal
strategy.close(id="vbLE", comment="Profit is : "+tostring(close - strategy.position_avg_price, "###.##") , when=strategy.position_size>=1 and exitOn=="Sell_Signal" and Sell)
//close on touch_upperband
strategy.close(id="vbLE", comment="Profit is : "+tostring(close - strategy.position_avg_price, "###.##") , when=strategy.position_size>=1 and exitOn=="touch_upperband" and (crossover(close, up) or crossover(high, up)))