La stratégie de la grille DCA de renversement de la moyenne de renversement de double fond applique principalement le prix de renversement moyen et la stratégie DCA pour mettre en œuvre la construction de position progressive.
La stratégie vérifie d'abord s'il y a deux prix de clôture consécutifs égaux au bas sur le graphique du chandelier, ce qu'on appelle un double bas. Si un double bas est détecté, elle considère qu'il peut y avoir une opportunité d'inversion de prix. À ce stade, la stratégie définira plusieurs ordres limite autour du prix du bas. Les prix de ces ordres seront calculés en fonction de l'ATR et de la volatilité, formant une zone de grille. Cela permet d'obtenir l'effet DCA et permet aux traders de construire progressivement des positions à des prix différents après l'inversion.
Plus précisément, l'indicateur ATR sur les 14 bougies récentes est d'abord obtenu par ta.atr. Ensuite, la volatilité des prix sur les 5 bougies récentes est calculée. Ce sont les principaux paramètres utilisés pour déterminer la zone de la grille. La grille contient 4 niveaux de prix - prix inférieur + volatilité, prix inférieur + 0,75 * volatilité, et ainsi de suite. Une fois que la double condition inférieure est déclenchée, 4 ordres de limite de taille égale seront placés selon cette formule. Les ordres non remplis seront annulés après plusieurs bougies.
En outre, la stratégie définit également un prix de stop loss et un prix de prise de profit. Le prix de stop loss est fixé au prix le plus bas du double bas moins une taille de tick, tandis que le prix de prise de profit est fixé au prix d'entrée plus 5 fois l'ATR. Ces deux prix seront mis à jour en temps réel lorsque la taille de la position est supérieure à 0.
Les principaux avantages de cette stratégie sont les suivants:
Principaux risques:
Quelques domaines à améliorer:
La stratégie de réseau DCA de double inversion de fond signifie inversion consolide le modèle de prix, les techniques d'indicateur et le trading de réseau. Il a un calendrier précis, une base de coûts contrôlable et une protection contre le retrait. Il a encore de la place pour l'optimisation et vaut la peine d'être étudié.
/*backtest start: 2024-02-12 00:00:00 end: 2024-02-19 00:00:00 period: 3m 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/ // © cherepanovvsb //@version=5 strategy("Reversal (only long)", overlay=true, margin_long=1, margin_short=1,initial_capital=1000,commission_type = strategy.commission.percent,commission_value =0.1,currency='USD', process_orders_on_close=true) plotshape(low == low[1], style=shape.triangleup, location=location.belowbar, color=color.blue, title="1 Setup") plotshape(low == low[1] and low[1]==low[2], style=shape.triangleup, location=location.belowbar, color=color.red, title="Triple Setup") ATRlenght = input.int(title="ATR length for taking profit", defval=14, group="Strategy Settings") rewardMultiplier= input.int(title="ATR multiplier", defval=5, group="Strategy Settings") Volatility_length=input.int(title='Volatility length',defval=5,group="Strategy Settings") Volatility_multiplier=input.float(title='Volatility multiplier',defval=0.5,step=0.1, group="Strategy Settings") Candles_to_wait=input.int(title='How many candles to wait after placing orders grid?',defval=4,group="Strategy Settings") // Get ATR atr1 = ta.atr(ATRlenght) //Get volatility values (not ATR) float result = 0 for i = 0 to Volatility_length result+=high[i]-low[i] volatility=result*Volatility_multiplier/Volatility_length //Validate entrance points validlow = low [2]== low[1] and not na(atr1) validlong = validlow and strategy.position_size == 0 and low[1]<low // Calculate SL/TP longStopPrice = low[1]-syminfo.mintick longStopDistance = close - longStopPrice longTargetPrice = close + (longStopDistance * rewardMultiplier) strategy.initial_capital = 50000 //Assign all variables var tradeStopPrice = 0.0 var tradeTargetPrice = 0.0 var point1=0.0 var point2=0.0 var point3=0.0 var point4=0.0 var contracts = int(strategy.initial_capital/close)/4 if validlong tradeStopPrice := longStopPrice tradeTargetPrice := longTargetPrice point1:=low[1]+volatility point2:=low[1]+volatility*0.75 point3:=low[1]+volatility*0.5 point4:=low[1]+volatility*0.25 strategy.entry ("Long1", strategy.long,limit=point1,qty=contracts, when=validlong) strategy.entry ("Long2", strategy.long,limit=point2,qty=contracts, when=validlong) strategy.entry ("Long3", strategy.long,limit=point3,qty=contracts, when=validlong) strategy.entry ("Long4", strategy.long,limit=point4,qty=contracts, when=validlong) stopcondition = ta.barssince(validlong) == Candles_to_wait strategy.cancel("Long1",when=stopcondition) strategy.cancel("Long2",when=stopcondition) strategy.cancel("Long3",when=stopcondition) strategy.cancel("Long4",when=stopcondition) strategy.exit(id="Long Exit", limit=tradeTargetPrice, stop=tradeStopPrice, when=strategy.position_size > 0) plot(strategy.position_size != 0 or validlong ? tradeStopPrice : na, title="Trade Stop Price", color=color.red, style=plot.style_linebr, linewidth=3) plot(strategy.position_size != 0 or validlong ? tradeTargetPrice : na, title="Trade Target Price", color=color.green, style=plot.style_linebr, linewidth=3) plot(strategy.position_size != 0? point1 : na, title="Long1", color=color.green, style=plot.style_linebr, transp=0) plot(strategy.position_size != 0? point2 : na, title="Long2", color=color.green, style=plot.style_linebr, transp=0) plot(strategy.position_size != 0? point3 : na, title="Long3", color=color.green, style=plot.style_linebr, transp=0) plot(strategy.position_size != 0? point4 : na, title="Long4", color=color.green, style=plot.style_linebr, transp=0)