Stratégie de hausse continue de la croix dorée à double clic sur la moyenne mobile


Date de création: 2023-11-13 10:47:48 Dernière modification: 2023-11-13 10:47:48
Copier: 0 Nombre de clics: 649
1
Suivre
1617
Abonnés

Stratégie de hausse continue de la croix dorée à double clic sur la moyenne mobile

Aperçu

Il s’agit d’une stratégie de négociation qui utilise la forme d’une fourchette en moyenne mobile et qui s’accompagne d’une tendance à la hausse continue. Lorsque la ligne rapide franchit la ligne lente depuis la direction du bas, un signal de fourchette est formé. Si la tendance après la fourchette continue à la hausse, il est possible d’ouvrir plus de positions à ce stade.

Principe de stratégie

La stratégie est principalement basée sur la forme de la fourche de la moyenne mobile pour juger de l’heure d’entrée. Plus précisément, définir une moyenne mobile rapide MA1 et une moyenne mobile lente MA2.

Afin d’éviter les faux signaux causés par les forks à court terme, la stratégie a ajouté un jugement de dépréciation d’angle, qui déclenche un signal d’achat uniquement lorsque l’angle de la MA2 est supérieur à la dépréciation définie. Cela permet de filtrer certaines hausses à court terme non tendancielles.

La stratégie définit à la fois une ligne de stop-loss et une ligne de stop-loss. La ligne de stop-loss est utilisée pour éviter les pertes causées par une rotation soudaine du marché, et la ligne de stop-loss est utilisée pour bloquer un départ rentable. Elle est spécifiquement définie comme une certaine fourchette de pourcentage du prix d’entrée.

Lorsque la hausse des prix atteint le point d’arrêt, la stratégie choisit de s’arrêter et de s’éloigner. En même temps, si la hausse est forte, la stratégie effectue une nouvelle opération de rétrogradation.

Analyse des avantages

Il s’agit d’une stratégie de suivi de tendances relativement simple et intuitive. Elle présente les avantages suivants:

  1. La combinaison des moyennes mobiles permet de filtrer le bruit du marché et de déterminer la direction de la tendance
  2. Les valeurs d’angle permettent d’éviter d’être induites en erreur par les oscillations à court terme.
  3. Une opération bidirectionnelle pour tirer profit des chocs
  4. Réglez le stop loss et maîtrisez le risque

Analyse des risques

Cette stratégie comporte également des risques à prendre en compte:

  1. Les moyennes mobiles sont en retard et risquent de manquer un tournant
  2. Bien qu’il y ait des stop-loss, il y a une probabilité que le stop-loss soit dépassé dans un marché qui change instantanément.
  3. Le risque de doubler les transactions bilatérales, le mauvais choix des points de vente peut entraîner des pertes
  4. Des paramètres mal définis, tels que la sélection d’une moyenne mobile, peuvent affecter la performance de la stratégie

Direction d’optimisation

La stratégie peut être optimisée de plusieurs façons:

  1. Augmentation des indicateurs de jugement des tendances, tels que le MACD, les bandes de Brin et autres, pour une meilleure précision de localisation
  2. Paramètres périodiques d’une moyenne mobile optimisée dynamiquement par des méthodes telles que l’apprentissage automatique
  3. Optimisation des paramètres de l’arrêt de perte, par exemple en utilisant le suivi de la perte
  4. Augmenter le contrôle des transactions pour éviter des pertes excessives
  5. La dynamique d’ajustement de la force d’ouverture de position est inversée, combinée à des indicateurs tels que l’indicateur de segmentation pour déterminer la force de la tendance de cette ronde

Résumer

Dans l’ensemble, il s’agit d’une stratégie de suivi de tendance simple et pratique. Elle présente certains avantages, mais nécessite également une attention particulière aux risques. Des améliorations peuvent être apportées pour obtenir de meilleurs rendements stables grâce à une optimisation supplémentaire des paramètres, à la sélection des indicateurs, à la mise en place d’un stop-loss, etc. Cependant, aucune stratégie ne peut éviter complètement le risque systémique du marché.

Code source de la stratégie
/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//written by [email protected]
//@version=5
strategy(title="MJ-Dual Moving Average",initial_capital=10000,overlay=false)

// import TradingView/ZigZag/6 as ZigZagLib 

// // Create Zig Zag instance from user settings.
// var zigZag = ZigZagLib.newInstance(
//   ZigZagLib.Settings.new(
//       input.float(5.0, "Price deviation for reversals (%)", 0.00001, 100.0, 0.5, "0.00001 - 100"),
//       input.int(10, "Pivot legs", 2),
//       input(#2962FF, "Line color"),
//       input(true, "Extend to last bar"),
//       input(true, "Display reversal price"),
//       input(true, "Display cumulative volume"),
//       input(true, "Display reversal price change", inline = "priceRev"),
//       input.string("Absolute", "", ["Absolute", "Percent"], inline = "priceRev"),
//       true)
//  )

// // Update 'zigZag' object on each bar with new ​pivots, ​volume, lines, labels.
// zigZag.update()
// // plot(zigZag.pivots, "zigZag")

ma1= ta.sma(close,8)
ma2= ta.sma(close,21)

angleCriteria = input.int(title="Angle", defval=7, minval=1, maxval=13)

i_lookback   = input.int(2,     "Angle Period", minval = 1)
i_atrPeriod  = input.int(10,    "ATR Period",   minval = 1)
i_angleLevel = input.int(6,     "Angle Level",  minval = 1)
i_maSource   = input.source(close, "MA Source")
TP = input.float(1, "TP", minval = 0.1)
SL = input.float(1, "SL", minval = 0.1)

f_angle(_src, _lookback, _atrPeriod) =>
    rad2degree = 180 / 3.141592653589793238462643  //pi 
    ang = rad2degree * math.atan((_src[0] - _src[_lookback]) / ta.atr(_atrPeriod)/_lookback)
    ang
_angle = f_angle(ma2, i_lookback, i_atrPeriod)
plot(ta.atr(i_atrPeriod), "atr")
// plot(ma1,color=#FF0000)
// plot(ma2,color=#00FF00)

crosso=ta.crossover(ma1,ma2) 
crossu=ta.crossunder(ma1,ma2)

_lookback = 15

f_somethingHappened(_cond, _lookback) =>
    bool _crossed = false
    for i = 1 to _lookback
        if _cond[i]
            _crossed := true
    _crossed
    
longcrossed = f_somethingHappened(crosso,_lookback)
shortcrossed = f_somethingHappened(crossu,_lookback)

atr_factor = 1
atr = ta.atr(i_atrPeriod)
e = atr * atr_factor 

afr = close 
afr := nz(afr[1], afr)

atr_factoryHigh = close + e
atr_factoryLow = close - e 

if atr_factoryLow > afr 
    afr := atr_factoryLow
if atr_factoryHigh < afr 
    afr := atr_factoryHigh

// plot(afr, "afr", display = display.data_window)
// plot(atr_factoryHigh, "afr", color = color.yellow, display = display.all)
// plot(atr_factoryLow, "afr", color = color.green, display = display.all)


inLong() => strategy.position_size > 0
inShort() => strategy.position_size < 0
inZero() => not inLong() and not inShort()

long = longcrossed and _angle > angleCriteria
short= shortcrossed and _angle < -(angleCriteria)

plotshape(long, "Buy", shape.arrowup, location.belowbar, color = #FF0000)
plotshape(short, "Sell", shape.arrowdown, location.abovebar, color = #00FF00)

var longTp = 0.0
var longSl = 0.0
var shortTp = 0.0
var shortSl = 0.0
[b_middle, b_high, b_low] = ta.bb(close, 20, 2)
entry_price = strategy.opentrades.entry_price(0)

if inZero()
    if short
        longTp := close * (1 + TP/100)
        longSl := close * (1 - SL/100)
        strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))
    if long
        shortTp := close * (1 - TP/100)
        shortSl := close * (1 + SL/100)
        strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

if inLong()
    // if close - entry_price > close * 0.005
    //     longSl := entry_price + close * 0.001
    if high > longTp
        strategy.close("LONG")
        if (close - open) > close * 0.014
            shortTp := close * (1 - TP/100)
            shortSl := close * (1 + SL/100)
            strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

    if close < longSl
        strategy.close("LONG")
    if open >= b_high and close >= b_high
        strategy.close("LONG")
    // if high > b_high and entry_price < high
    //     strategy.close("LONG")


if inShort()
    // if entry_price - close > close * 0.005
    //     shortSl := entry_price - close * 0.001
    if low < shortTp
        strategy.close("SHORT")
        if (open - close) > close * 0.014
            longTp := close * (1 + TP/100)
            longSl := close * (1 - SL/100)
            strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))


    if close > shortSl
        strategy.close("SHORT")
    if open < b_low and close < b_low
        strategy.close("SHORT")
    // if low < b_low and entry_price > low
    //     strategy.close("SHORT")