Stratégie de modèle Momentum ABCD


Date de création: 2023-09-24 13:08:28 Dernière modification: 2023-09-24 13:08:28
Copier: 1 Nombre de clics: 736
1
Suivre
1617
Abonnés

Aperçu

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.

Principe de stratégie

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Analyse des forces stratégiques

  1. L’utilisation de l’indicateur Williams Fractal pour aider au jugement permet d’identifier plus précisément le point de basculement.

  2. Les critères de jugement de forme ABCD sont simples, fiables et faciles à programmer.

  3. 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.

  4. Il est possible de suivre les courts courants de la tendance et d’en tirer profit après avoir défini un stop-loss.

Analyse stratégique des risques

  1. La Williams Fractal est en retard et risque de manquer le tournant pour causer des pertes.

  2. Il existe plusieurs formes ABCD qui se chevauchent sur la courte ligne centrale, ce qui peut entraîner une erreur d’identification.

  3. Les courts-circuits peuvent être pris au piège lorsque les grandes tendances ne sont pas jugées avec précision.

  4. 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:

  1. 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.

  2. Optimiser les paramètres de la forme ABCD pour rendre les jugements plus stricts et plus fiables.

  3. L’optimisation des méthodes de jugement des grandes tendances, afin de prévenir les erreurs de jugement des grandes tendances.

  4. Testez différents ratios de stop-loss pour trouver le point d’arrêt optimal.

Orientation de l’optimisation de la stratégie

  1. 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.

  2. 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é.

  3. Le cycle complet peut être optimisé en fonction des variations du marché pour trouver la combinaison optimale de paramètres.

  4. 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.

  5. 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.

Résumer

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é.

Code source de la stratégie
/*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)