Stratégie de double inclusion et de tendance


Date de création: 2024-01-30 15:11:48 Dernière modification: 2024-01-30 15:11:48
Copier: 1 Nombre de clics: 440
1
Suivre
1235
Abonnés

Stratégie de double inclusion et de tendance

Aperçu

La stratégie de double inclusion et de tendance est une stratégie de trading quantitatif qui utilise la forme double inclusion et la moyenne mobile pour juger de la tendance. Cette stratégie, combinée à la forme double inclusion, fournit un signal de négociation à haute probabilité, tout en utilisant la moyenne mobile pour juger de la tendance du marché et faire plus de blanchiment dans la direction de la tendance.

Principe de stratégie

  1. Calculer la moyenne mobile de Hull comme indicateur de tendance.
  2. Lorsqu’une deuxième forme implicite apparaît, on considère qu’il s’agit d’un signal de transaction à forte probabilité. La forme implicite est la forme où le prix le plus élevé des deux premières lignes K et le prix le plus bas sont tous inclus dans la troisième ligne K.
  3. Si le prix de clôture est au-dessus de la moyenne mobile et forme un contenu multiple, un ordre de stop d’achat est établi près du sommet sous forme de contenu; si le prix de clôture est en dessous de la moyenne mobile et forme un contenu vide, un ordre de stop de vente est établi près du bas contenu.
  4. Une fois que le stop-loss est déclenché, réglez le stop-loss et le stop-loss en fonction de l’amplitude et du ratio de stop-loss prédéfinis.

Analyse des avantages

  1. La forme incluse fournit un signal de revers avec une probabilité plus élevée. L’apparition d’une double forme incluse peut indiquer une reversation de prix à court terme.
  2. L’utilisation d’une moyenne mobile, combinée à une moyenne mobile, permet d’opérer dans le sens d’une grande tendance et d’améliorer la probabilité de réaliser un profit.
  3. L’utilisation d’un guichet unique d’arrêt à proximité du point de rupture pendant la tendance offre de meilleures opportunités d’entrée.

Analyse des risques

  1. Les signaux de négociation fournis par la forme implicite peuvent souvent être perdante dans des situations de choc.
  2. Les moyennes mobiles utilisées comme indicateur de la tendance peuvent également émettre de faux signaux, entraînant des pertes de négociation à la baisse.
  3. Les paramètres de stop loss sont trop petits et peuvent être déclenchés par une légère baisse de prix.

Direction d’optimisation

  1. Les moyennes mobiles de différents paramètres peuvent être testées comme indicateur de tendance.
  2. Il est possible de filtrer les fluctuations de l’indicateur en les combinant avec d’autres indicateurs afin d’éviter les transactions aveugles en l’absence de tendance claire.
  3. Des combinaisons de paramètres plus optimales peuvent être obtenues par l’analyse de données volumineuses, telles que la période de la moyenne mobile, le multiplicateur d’arrêt et le taux d’arrêt.
  4. Des conditions de filtrage peuvent être ajoutées pour les périodes de négociation et les variétés afin de s’adapter aux différentes périodes de temps et aux différentes variétés.

Résumer

La stratégie de double inclusion et de tendance utilise la forme double inclusion pour fournir un signal de négociation à plus forte probabilité, tout en aidant la moyenne mobile à déterminer la direction de la tendance majeure. La stratégie de type rupture est plus stable. Grâce à l’optimisation des paramètres et à l’optimisation des règles, la stratégie peut être mieux adaptée au marché et obtenir un taux de rentabilité plus élevé.

Code source de la stratégie
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
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/
// © Kaspricci

//@version=5
strategy(
     title = "Double Inside Bar & Trend Strategy - Kaspricci", 
     shorttitle = "Double Inside Bar & Trend", 
     overlay=true, 
     initial_capital = 100000, 
     currency = currency.USD, 
     default_qty_type = strategy.percent_of_equity, 
     default_qty_value = 100, 
     calc_on_every_tick = true, 
     close_entries_rule = "ANY")

// ================================================ Entry Inputs ======================================================================
headlineEntry   = "Entry Seettings"

maSource        = input.source(defval = close,             group = headlineEntry, title = "MA Source")
maType          = input.string(defval = "HMA",             group = headlineEntry, title = "MA Type", options = ["EMA", "HMA", "SMA", "SWMA", "VWMA", "WMA"])
maLength        = input.int(   defval = 45,    minval = 1, group = headlineEntry, title = "HMA Length")

float ma = switch maType 
    "EMA"  => ta.ema(maSource,  maLength)
    "HMA"  => ta.hma(maSource,  maLength)
    "SMA"  => ta.sma(maSource,  maLength)
    "SWMA" => ta.swma(maSource)
    "VWMA" => ta.vwma(maSource, maLength)
    "WMA"  => ta.wma(maSource,  maLength)

plot(ma, "Trend MA", color.purple)

// ================================================ Trade Inputs ======================================================================
headlineTrade   = "Trade Seettings"

stopLossType    = input.string(defval = "ATR",                         group = headlineTrade,                 title = "Stop Loss Type",            options = ["ATR", "FIX"])
atrLength       = input.int(   defval = 50,   minval = 1,              group = headlineTrade, inline = "ATR", title = "   ATR: Length                 ")
atrFactor       = input.float( defval =  2.5, minval = 0, step = 0.05, group = headlineTrade, inline = "ATR", title = "Factor       ",             tooltip = "multiplier for ATR value")
takeProfitRatio = input.float( defval =  2.0, minval = 0, step = 0.05, group = headlineTrade,                 title = "            TP Ration",     tooltip = "Multiplier for Take Profit calculation")
fixStopLoss     = input.float( defval = 10.0, minval = 0, step = 0.5,  group = headlineTrade, inline = "FIX", title = "   FIX: Stop Loss             ") * 10 // need this in ticks
fixTakeProfit   = input.float( defval = 20.0, minval = 0, step = 0.5,  group = headlineTrade, inline = "FIX", title = "Take Profit",               tooltip = "in pips") * 10 // need this in ticks
useRiskMagmt    = input.bool(  defval = true,                          group = headlineTrade, inline = "RM",  title = "")
riskPercent     = input.float( defval = 1.0,  minval = 0., step = 0.5, group = headlineTrade, inline = "RM",  title = "Risk in %                ", tooltip = "This will overwrite quantity from startegy settings and calculate the trade size based on stop loss and risk percent") / 100

// ================================================ Filter Inputs =====================================================================
headlineFilter  = "Filter Setings"

// date filter
filterDates     = input.bool(defval = false,                                 group = headlineFilter, title = "Filter trades by dates")
startDateTime   = input(defval = timestamp("2022-01-01T00:00:00+0000"), group = headlineFilter, title = "       Start Date & Time")
endDateTime     = input(defval = timestamp("2099-12-31T23:59:00+0000"), group = headlineFilter, title = "       End Date & Time  ")

dateFilter      = not filterDates or (time >= startDateTime and time <= endDateTime)

// session filter
filterSession   = input.bool(title = "Filter trades by session", defval = false, group = headlineFilter)
session         = input(title = "       Session", defval = "0045-2245", group = headlineFilter)

sessionFilter   = not filterSession or time(timeframe.period, session, timezone = "CET")

// ================================================ Trade Entries and Exits =====================================================================

// calculate stop loss
stopLoss        = switch stopLossType
    "ATR" => nz(math.round(ta.atr(atrLength) * atrFactor / syminfo.mintick, 0), 0)
    "FIX" => fixStopLoss

// calculate take profit
takeProfit      = switch stopLossType
    "ATR" => math.round(stopLoss * takeProfitRatio, 0)
    "FIX" => fixTakeProfit


doubleInsideBar = high[2] > high[1] and high[2] > high[0] and low[2] < low[1] and low[2] < low[0]

// highlight mother candel and inside bar candles
bgcolor(doubleInsideBar ? color.rgb(33, 149, 243, 80) : na)
bgcolor(doubleInsideBar ? color.rgb(33, 149, 243, 80) : na, offset = -1)
bgcolor(doubleInsideBar ? color.rgb(33, 149, 243, 80) : na, offset = -2)

var float buyStopPrice  = na
var float sellStopPrice = na

if (strategy.opentrades == 0 and doubleInsideBar and barstate.isconfirmed)
    buyStopPrice  := high[0] // high of recent candle (second inside bar)
    sellStopPrice := low[0] // low of recent candle (second inside bar)

    tradeID = str.tostring(strategy.closedtrades + strategy.opentrades + 1)

    quantity = useRiskMagmt ? math.round(strategy.equity * riskPercent / stopLoss, 2) / syminfo.mintick : na

    commentTemplate = "{0} QTY: {1,number,#.##} SL: {2} TP: {3}"

    if (close > ma)
        longComment = str.format(commentTemplate, tradeID + "L", quantity, stopLoss / 10, takeProfit / 10)
        strategy.entry(tradeID + "L", strategy.long, qty = quantity, stop = buyStopPrice, comment = longComment)
        strategy.exit(tradeID + "SL", tradeID + "L", profit = takeProfit, loss = stopLoss, comment_loss = "SL", comment_profit = "TP")

    if (close < ma)
        shortComment = str.format(commentTemplate, tradeID + "S", quantity, stopLoss / 10, takeProfit / 10)
        strategy.entry(tradeID + "S", strategy.short, qty = quantity, stop = sellStopPrice, comment = shortComment)
        strategy.exit(tradeID + "SL", tradeID + "S", profit = takeProfit, loss = stopLoss, comment_loss = "SL", comment_profit = "TP")

// as soon as the first pending order has been entered the remaing pending order shall be cancelled 
if strategy.opentrades > 0
    currentTradeID = str.tostring(strategy.closedtrades + strategy.opentrades)
    strategy.cancel(currentTradeID + "S")
    strategy.cancel(currentTradeID + "L")