Cette stratégie utilise l’indicateur Williams Fractal pour identifier les hauts et les bas des prix et, en combinaison avec la forme ABCD, pour déterminer la direction de la tendance, pour effectuer une entrée après la confirmation de la tendance afin de suivre la tendance à la courte ligne et de tirer profit.
L’indicateur Williams Fractal est utilisé pour identifier les hauts et les bas des prix, en fonction de la forme ABCD du marché haussier ou de la forme ABCD du marché baissier.
Critères de jugement de la forme ABCD:
La distance entre AB et CD est proche et la distance entre BC et CD répond à un certain nombre de critères de proportion (entre 0,382 et 0,886 et 1,13 et 2,618).
D est inférieur à C, c’est le bull market, D est supérieur à C, c’est le bear market.
En utilisant la fonction barssince, on détermine la distance fractal d’une direction précédente à la plus récente pour déterminer la direction de la tendance générale actuelle.
Lorsque vous identifiez la forme ABCD, entrez en plus / moins, et définissez des arrêts de perte et des arrêts, pour suivre la courte ligne de tendance.
L’utilisation de l’indicateur Williams Fractal pour aider au jugement permet d’identifier plus précisément le point de basculement.
Les critères de jugement de forme ABCD sont simples, fiables et faciles à programmer.
En combinant la fonction barssince avec celle de la direction de la tendance générale, il est possible de réduire efficacement les pertes causées par les fausses ruptures.
Il est possible de suivre les courts courants de la tendance et d’en tirer profit après avoir défini un stop-loss.
La Williams Fractal est en retard et risque de manquer le tournant pour causer des pertes.
Il existe plusieurs formes ABCD qui se chevauchent sur la courte ligne centrale, ce qui peut entraîner une erreur d’identification.
Les courts-circuits peuvent être pris au piège lorsque les grandes tendances ne sont pas jugées avec précision.
Les paramètres d’arrêt de perte trop petits sont faciles à détecter, et les paramètres trop grands sont moins efficaces.
Les méthodes d’optimisation correspondantes:
Il est possible d’essayer d’utiliser d’autres indicateurs d’aide à la décision pour trouver des moyens plus efficaces d’identifier les points de basculement.
Optimiser les paramètres de la forme ABCD pour rendre les jugements plus stricts et plus fiables.
L’optimisation des méthodes de jugement des grandes tendances, afin de prévenir les erreurs de jugement des grandes tendances.
Testez différents ratios de stop-loss pour trouver le point d’arrêt optimal.
Vous pouvez essayer d’utiliser d’autres indicateurs comme le MACD, le KDJ et d’autres pour aider à déterminer les tendances et trouver des dates d’entrée plus précises.
Les paramètres peuvent être optimisés en fonction des cycles des différentes variétés pour trouver le point d’arrêt de perte le plus approprié pour le cycle de la variété.
Le cycle complet peut être optimisé en fonction des variations du marché pour trouver la combinaison optimale de paramètres.
Il est possible de combiner des indicateurs tels que les lignes d’équilibre pour filtrer les signaux d’entrée de jeu et améliorer la stabilité de la stratégie.
Des algorithmes d’apprentissage automatique peuvent être introduits pour améliorer l’exactitude de l’identification en utilisant des modèles de formation de données supplémentaires.
Cette stratégie est une approche globale, claire et fiable, utilisant l’indicateur Williams Fractal et la courte ligne de tendance dans le jugement de la forme ABCD, puis la combinaison de filtrage de tendance et de stop-loss pour suivre la tendance. Il y a encore beaucoup de place pour l’optimisation de la stratégie, qui peut être améliorée en termes de signaux d’entrée, d’optimisation des paramètres et de jugement de tendance, afin de mieux adapter la stratégie aux différents environnements du marché.
/*backtest
start: 2023-09-16 00:00:00
end: 2023-09-23 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// @version=4
// @author=Daveatt - BEST
// ABCD Pattern Strat
StrategyName = "BEST ABCD Pattern Strategy"
ShortStrategyName = "BEST ABCD Pattern Strategy"
// strategy(title=StrategyName, shorttitle=ShortStrategyName, overlay=true,
// pyramiding=2, default_qty_value=100, precision=7, currency=currency.USD,
// commission_value=0.2,commission_type=strategy.commission.percent, initial_capital=1000000,
// default_qty_type=strategy.fixed)
filterBW = input(false, title="filter Bill Williams Fractals?")
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////// UTILITIES ///////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// ||-----------------------------------------------------------------------------------------------------||
// ||--- Fractal Recognition Functions: ---------------------------------------------------------------||
isRegularFractal(mode, _high, _low) =>
ret = mode == 1 ? _high[4] < _high[3] and _high[3] < _high[2] and _high[2] > _high[1] and _high[1] > _high[0] :
mode == -1 ? _low[4] > _low[3] and _low[3] > _low[2] and _low[2] < _low[1] and _low[1] < _low[0] : false
isBWFractal(mode, _high, _low) =>
ret = mode == 1 ? _high[4] < _high[2] and _high[3] <= _high[2] and _high[2] >= _high[1] and _high[2] > _high[0] :
mode == -1 ? _low[4] > _low[2] and _low[3] >= _low[2] and _low[2] <= _low[1] and _low[2] < _low[0] : false
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
////////////////////////////// ABCD PATTERN ///////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
f_abcd()=>
_r = timeframe.period
_g = barmerge.gaps_off
_l = barmerge.lookahead_on
_high = high
_low = low
filteredtopf = filterBW ? isRegularFractal(1, _high, _low) : isBWFractal(1, _high, _low)
filteredbotf = filterBW ? isRegularFractal(-1, _high, _low) : isBWFractal(-1, _high, _low)
// ||--- ZigZag:
istop = filteredtopf
isbot = filteredbotf
topcount = barssince(istop)
botcount = barssince(isbot)
zigzag = (istop and topcount[1] > botcount[1] ? _high[2] :
isbot and topcount[1] < botcount[1] ? _low[2] : na)
x = valuewhen(zigzag, zigzag, 4)
a = valuewhen(zigzag, zigzag, 3)
b = valuewhen(zigzag, zigzag, 2)
c = valuewhen(zigzag, zigzag, 1)
d = valuewhen(zigzag, zigzag, 0)
xab = (abs(b-a)/abs(x-a))
xad = (abs(a-d)/abs(x-a))
abc = (abs(b-c)/abs(a-b))
bcd = (abs(c-d)/abs(b-c))
// ABCD Part
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 1.13 and bcd <= 2.618
_bull_abcd = _abc and _bcd and d < c
_bear_abcd = _abc and _bcd and d > c
_bull = _bull_abcd and not _bull_abcd[1]
_bear = _bear_abcd and not _bear_abcd[1]
[_bull, _bear, zigzag]
lapos_x = timenow + round(change(time)*12)
[isLong, isShort, zigzag] = f_abcd()
plot(zigzag, title= 'ZigZag', color=color.black, offset=-2)
plotshape(isLong, style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), size=size.normal, text="ABCD", textcolor=color.white)
plotshape(isShort, style=shape.labeldown, location=location.abovebar, color=color.new(color.maroon, 0), size=size.normal, text="ABCD", textcolor=color.white)
long_entry_price = valuewhen(isLong, close, 0)
short_entry_price = valuewhen(isShort, close, 0)
sinceNUP = barssince(isLong)
sinceNDN = barssince(isShort)
buy_trend = sinceNDN > sinceNUP
sell_trend = sinceNDN < sinceNUP
//////////////////////////
//* Profit Component *//
//////////////////////////
//////////////////////////// MinTick ///////////////////////////
fx_pips_value = syminfo.type == "forex" ? syminfo.mintick*10 : 1
input_tp_pips = input(100, "Backtest Profit Goal (in USD)",minval=0)*fx_pips_value
input_sl_pips = input(20, "Backtest STOP Goal (in USD)",minval=0)*fx_pips_value
tp = buy_trend? long_entry_price + input_tp_pips : short_entry_price - input_tp_pips
sl = buy_trend? long_entry_price - input_sl_pips : short_entry_price + input_sl_pips
plot_tp = buy_trend and high[1] <= tp ? tp : sell_trend and low[1] <= tp ? tp : na
plot_sl = buy_trend and low[1] >= sl ? sl : sell_trend and high[1] >= sl ? sl : na
plot(plot_tp, title="TP", style=plot.style_circles, linewidth=3, color=color.blue)
plot(plot_sl, title="SL", style=plot.style_circles, linewidth=3, color=color.red)
longClose = isShort
shortClose = isLong
strategy.entry("Long", 1, when=isLong)
// strategy.close("Long", when=longClose )
strategy.exit("XL","Long", limit=tp, when=buy_trend, stop=sl)
strategy.entry("Short", 0, when=isShort)
// strategy.close("Short", when=shortClose )
strategy.exit("XS","Short", when=sell_trend, limit=tp, stop=sl)