Stratégie de suivi de la tendance des prix en dynamique

Auteur:ChaoZhang est là., Date: le 13 novembre 2023 à 16h44
Les étiquettes:

img

Résumé

La stratégie de suivi de la tendance des prix de l'élan utilise plusieurs indicateurs d'élan pour identifier les tendances des prix, établit des positions au début des tendances et bloque les bénéfices par le biais de paramètres de stop profit et de stop loss pour suivre les tendances des prix.

La logique de la stratégie

La stratégie de suivi de la tendance des prix de l'élan s'applique principalement aux indicateurs techniques suivants:

  1. Indicateur ROC: L'indicateur ROC est utilisé pour calculer le taux de variation des prix sur une certaine période afin de déterminer la dynamique des prix.

  2. Indicateur de puissance des taureaux et des ours: Cet indicateur reflète la comparaison de puissance entre les taureaux et les ours.

  3. Divergence: cet indicateur identifie l'inversion de tendance en calculant la divergence de prix et de volume.

  4. Canal de Donchian: Cet indicateur construit un canal en utilisant les prix les plus élevés et les plus bas, et les limites du canal peuvent servir de support et de résistance.

  5. Moyenne mobile: Cet indicateur permet de calmer les fluctuations des prix afin d'identifier la direction générale de la tendance.

La stratégie détermine les tendances des prix et les points d'inversion en fonction des indicateurs ci-dessus et établit des positions longues ou courtes en fonction des signaux des indicateurs au début des tendances.

Analyse des avantages

Les avantages de cette stratégie sont les suivants:

  1. L'utilisation de multiples indicateurs pour déterminer les tendances réduit la probabilité d'une mauvaise appréciation.

  2. L'utilisation de divergences d'indicateurs permet de capturer avec précision les points d'inversion de tendance.

  3. La combinaison des canaux et des moyennes mobiles permet de déterminer la tendance globale.

  4. La fixation d'un stop profit et d'un stop loss assure des bénéfices en temps opportun et évite des retraits plus importants.

  5. Les paramètres réglables rendent la stratégie adaptable à différentes périodes et produits.

  6. La logique claire facilite une optimisation ultérieure.

Analyse des risques

Les risques potentiels de cette stratégie sont les suivants:

  1. Les multiples indicateurs peuvent augmenter la probabilité d'un signal erroné.

  2. Les points de stop loss trop bas peuvent augmenter la probabilité de stop loss, tandis que les points trop larges peuvent augmenter les drawdowns.

  3. L'application à l'aveugle sur différentes périodes de marché peut entraîner une inadaptation.

  4. Pour obtenir des rendements excédentaires, un capital suffisant pour soutenir les unités en position élevée est nécessaire.

  5. Il existe des risques de suradaptation des tests de retour.

Directions d'optimisation

La stratégie peut être optimisée dans les aspects suivants:

  1. Optimiser les paramètres des indicateurs pour trouver les combinaisons optimales pour différentes périodes et produits.

  2. Introduire des algorithmes d'apprentissage automatique pour trouver automatiquement les paramètres optimaux.

  3. Mettre en place des mécanismes de stop loss adaptatifs basés sur les conditions du marché.

  4. Incorporer des facteurs et des fondamentaux à haute fréquence pour améliorer l'alpha.

  5. Développer des cadres de test automatisés pour l'optimisation des paramètres et la vérification des performances.

  6. Mettre en place des modules de gestion des risques pour contrôler la taille des positions et réduire les retraits.

  7. Ajouter des échanges et des tests simulés et en direct pour améliorer la stabilité.

Conclusion

Cette stratégie combine plusieurs indicateurs de dynamique pour déterminer les tendances des prix et utilise le stop profit/loss pour verrouiller les bénéfices. Elle peut capturer efficacement les tendances avec une forte stabilité.


/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-09 00:00:00
period: 1m
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/
// © mbagheri746

//@version=4
strategy("Bagheri IG Ether v2", overlay=true, margin_long=100, margin_short=100)

TP = input(3000, minval = 1 , title ="Take Profit")
SL = input(2200, minval = 1 , title ="Stop Loss")


//_________________ RoC Definition _________________


rocLength = input(title="ROC Length", type=input.integer, minval=1, defval=186)
smoothingLength = input(title="Smoothing Length", type=input.integer, minval=1, defval=50)
src = input(title="Source", type=input.source, defval=close)

ma = ema(src, smoothingLength)
mom = change(ma, rocLength)

sroc = nz(ma[rocLength]) == 0
     ? 100
     : mom == 0
         ? 0
         : 100 * mom / ma[rocLength]

//srocColor = sroc >= 0 ? #0ebb23 : color.red
//plot(sroc, title="SROC", linewidth=2, color=srocColor, transp=0)
//hline(0, title="Zero Level", linestyle=hline.style_dotted, color=#989898)


//_________________ Donchian Channel _________________

length1 = input(53, minval=1, title="Upper Channel")
length2 = input(53, minval=1, title="Lower Channel")
offset_bar = input(91,minval=0, title ="Offset Bars")

upper = highest(length1)
lower = lowest(length2)

basis = avg(upper, lower)


DC_UP_Band = upper[offset_bar]
DC_LW_Band = lower[offset_bar]

l = plot(DC_LW_Band, style=plot.style_line, linewidth=1, color=color.red)
u = plot(DC_UP_Band, style=plot.style_line, linewidth=1, color=color.aqua)

fill(l,u,color = color.new(color.aqua,transp = 90))

//_________________ Bears Power _________________


wmaBP_period = input(65,minval=1,title="BearsP WMA Period")
line_wma = ema(close, wmaBP_period)

BP = low - line_wma


//_________________ Balance of Power _________________

ES_BoP=input(15, title="BoP Exponential Smoothing")
BOP=(close - open) / (high - low)

SBOP = rma(BOP, ES_BoP)

//_________________ Alligator _________________

//_________________ CCI _________________

//_________________ Moving Average _________________

sma_period = input(74, minval = 1 , title = "SMA Period")
sma_shift = input(37, minval = 1 , title = "SMA Shift")

sma_primary = sma(close,sma_period)

SMA_sh = sma_primary[sma_shift]

plot(SMA_sh, style=plot.style_line, linewidth=2, color=color.yellow)

//_________________ Long Entry Conditions _________________//

MA_Lcnd = SMA_sh > low and SMA_sh < high

ROC_Lcnd = sroc < 0

DC_Lcnd = open < DC_LW_Band

BP_Lcnd = BP[1] < BP[0] and BP[1] < BP[2]

BOP_Lcnd = SBOP[1] < SBOP[0]

//_________________ Short Entry Conditions _________________//

MA_Scnd = SMA_sh > low and SMA_sh < high

ROC_Scnd = sroc > 0

DC_Scnd = open > DC_UP_Band

BP_Scnd = BP[1] > BP[0] and BP[1] > BP[2]

BOP_Scnd = SBOP[1] > SBOP[0]

//_________________ OPEN POSITION __________________//

if strategy.position_size  == 0
    strategy.entry(id = "BUY", long = true , when = MA_Lcnd and ROC_Lcnd and DC_Lcnd and BP_Lcnd and BOP_Lcnd)
    strategy.entry(id = "SELL", long = false , when = MA_Scnd and ROC_Scnd and DC_Scnd and BP_Scnd and BOP_Scnd)

//_________________ CLOSE POSITION __________________//

strategy.exit(id = "CLOSE BUY", from_entry = "BUY", profit = TP , loss = SL)

strategy.exit(id = "CLOSE SELL", from_entry = "SELL" , profit = TP , loss = SL)

//_________________ TP and SL Plot __________________//

currentPL= strategy.openprofit
pos_price = strategy.position_avg_price
open_pos = strategy.position_size

TP_line = (strategy.position_size  > 0) ? (pos_price + TP/100) : strategy.position_size < 0 ? (pos_price - TP/100) : 0.0
SL_line = (strategy.position_size  > 0) ? (pos_price - SL/100) : strategy.position_size < 0 ? (pos_price + SL/100) : 0.0

// hline(TP_line, title = "Take Profit", color = color.green , linestyle = hline.style_dotted, editable = false)
// hline(SL_line, title = "Stop Loss", color = color.red , linestyle = hline.style_dotted, editable = false)


Tline = plot(TP_line != 0.0 ? TP_line : na , title="Take Profit", color=color.green, trackprice = true, show_last = 1)
Sline = plot(SL_line != 0.0 ? SL_line : na, title="Stop Loss", color=color.red, trackprice = true, show_last = 1)
Pline = plot(pos_price != 0.0 ? pos_price : na, title="Stop Loss", color=color.gray, trackprice = true, show_last = 1)


fill(Tline , Pline, color = color.new(color.green,transp = 90))
fill(Sline , Pline, color = color.new(color.red,transp = 90))

//_________________ Alert __________________//

//alertcondition(condition = , title = "Position Alerts", message = "Bagheri IG Ether\n Symbol: {{ticker}}\n Type: {{strategy.order.id}}")

//_________________ Label __________________//


inMyPrice           = input(title="My Price", type=input.float, defval=0)
inLabelStyle        = input(title="Label Style", options=["Upper Right", "Lower Right"], defval="Lower Right")

posColor = color.new(color.green, 25)
negColor = color.new(color.red, 25)
dftColor = color.new(color.aqua, 25)
posPnL   = (strategy.position_size != 0) ? (close * 100 / strategy.position_avg_price - 100) : 0.0
posDir   = (strategy.position_size  > 0) ? "long" : strategy.position_size < 0 ? "short" : "flat"
posCol   = (strategy.openprofit > 0) ? posColor : (strategy.openprofit < 0) ? negColor : dftColor
myPnL    = (inMyPrice != 0) ? (close * 100 / inMyPrice - 100) : 0.0

var label lb = na
label.delete(lb)
lb := label.new(bar_index, close,
   color=posCol,
   style=inLabelStyle=="Lower Right"?label.style_label_upper_left:label.style_label_lower_left,
   text=
      "╔═══════╗" +"\n" + 
      "Pos: "  +posDir +"\n" +
      "Pos Price: "+tostring(strategy.position_avg_price) +"\n" +
      "Pos PnL: "  +tostring(posPnL, "0.00") + "%" +"\n" +
      "Profit: "  +tostring(strategy.openprofit, "0.00") + "$" +"\n" +
      "TP: "  +tostring(TP_line, "0.00") +"\n" +
      "SL: "  +tostring(SL_line, "0.00") +"\n" +
      "╚═══════╝")






Plus de