Estratégia de dupla inclusão e tendência


Data de criação: 2024-01-30 15:11:48 última modificação: 2024-01-30 15:11:48
cópia: 1 Cliques: 705
1
focar em
1617
Seguidores

Estratégia de dupla inclusão e tendência

Visão geral

A estratégia de duplo conteúdo e tendência é uma estratégia de negociação quantitativa que usa a dupla forma de conteúdo e a média móvel para determinar a tendência. A estratégia, combinada com a dupla forma de conteúdo, fornece um sinal de negociação de maior probabilidade, enquanto usa a média móvel para determinar a tendência do mercado e faz mais curto-circuito na direção da tendência.

Princípio da estratégia

  1. Calcule a média móvel de Hull como um indicador de tendência.
  2. Quando ocorre uma segunda forma de conjugação, considere-se que é um sinal de negociação de maior probabilidade. A forma de conjugação é a forma em que o preço mais alto das duas primeiras linhas de K e o preço mais baixo são todos incluídos pela terceira linha de K.
  3. Se o preço de fechamento estiver acima da média móvel e formar uma inclinação múltipla, estabeleça uma ordem de parada de compra perto do ponto mais alto da inclinação; Se o preço de fechamento estiver abaixo da média móvel e formar uma inclinação vazia, estabeleça uma ordem de parada de venda perto do ponto mais baixo da inclinação.
  4. Uma vez que o Stop-Loss é acionado, o Stop-Loss e o Stop-Loss são ajustados de acordo com a amplitude e a proporção de Stop-Loss predefinidas.

Análise de vantagens

  1. A forma de inclinação oferece um sinal de reversão de maior probabilidade. A ocorrência de uma forma de dupla inclinação pode indicar uma reversão de preço no curto prazo.
  2. Usado em combinação com a média móvel, pode operar em direção a grandes tendências, aumentando a probabilidade de lucro.
  3. A adoção de um ponto de parada próximo ao ponto de ruptura durante a tendência permite uma melhor entrada.

Análise de Riscos

  1. Em situações de turbulência, os sinais de negociação fornecidos pela forma implícita podem ocorrer com frequência em perdas.
  2. As médias móveis, como indicadores de tendências, também podem emitir sinais errados, resultando em perdas de negociação adversas.
  3. A configuração do ponto de parada é muito pequena e pode ser desencadeada por um pequeno deslizamento de preço.

Direção de otimização

  1. As médias móveis de diferentes parâmetros podem ser testadas como indicadores de tendências.
  2. A volatilidade pode ser filtrada em combinação com outros indicadores, evitando a negociação cega quando não há uma tendência clara.
  3. Uma combinação de parâmetros mais apropriada pode ser obtida através da análise de big data, como o ciclo da média móvel, o multiplicador de parada e o índice de parada.
  4. Pode ser adicionado um filtro de tempo de negociação e variedade para adaptar-se a diferentes períodos de tempo e características de diferentes variedades.

Resumir

A estratégia de dupla inclinação e tendência usa a forma de dupla inclinação para fornecer um sinal de negociação de maior probabilidade, ao mesmo tempo em que ajuda a média móvel a determinar a direção da grande tendência, fazendo mais curto-circuito na direção da tendência, é uma estratégia de tipo de ruptura mais estável. Através da otimização de parâmetros e otimização de regras, a estratégia pode ser melhor adaptada ao mercado e obter uma maior taxa de lucro.

Código-fonte da estratégia
/*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")