Estratégia de trailing stop loss de supertendência baseada em Heikin Ashi


Data de criação: 2024-02-06 14:43:14 última modificação: 2024-02-06 14:43:14
cópia: 0 Cliques: 1000
1
focar em
1617
Seguidores

Estratégia de trailing stop loss de supertendência baseada em Heikin Ashi

Visão geral da estratégia

A estratégia é uma estratégia de parada de tendência que combina a linha de Heikin Ashi e o indicador de tendência super. Ela usa a linha de Heikin Ashi para filtrar o ruído do mercado, o indicador de tendência super para determinar a direção da tendência e, usando a tendência super como uma linha de parada dinâmica, permite uma eficiente rastreamento de tendência e controle de risco.

Princípio da estratégia

  1. Calcule a linha de Heikin Ashi, incluindo o preço de abertura, o preço de fechamento, o preço mais alto e o preço mais baixo.
  2. Calcule o indicador de tendência super: com base no ATR e no preço, calcule o up-track e o down-track.
  3. Combinando o Heikin Ashi com o Supertrend para determinar a direção da tendência.
  4. A tendência de alta é quando o preço de fechamento do Heikin Ashi está mais próximo da linha de fechamento de uma linha K anterior do que a linha de fechamento de uma linha K anterior do que a linha de fechamento de uma linha K anterior do que a linha de fechamento de uma linha K anterior do que a linha de fechamento de uma linha K anterior do que a linha de fechamento de uma linha K inferior do que a linha de fechamento de uma linha K anterior do que a linha de fechamento de uma linha K inferior do que a linha de fechamento de uma linha K superior do que a linha de fechamento de uma linha K superior do que a linha de fechamento de uma linha K superior do que a linha de fechamento de uma linha K superior.
  5. Na tendência de baixa, a linha de parada de seguimento é a linha de parada de seguimento da linha de parada de seguimento da linha de parada de seguimento da linha de parada de seguimento da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de parada da linha de saída da linha de saída da linha de saída da linha de saída da linha de saída da linha de saída da linha de saída da linha de saída da linha de saída da linha de saída da linha de saída da linha de saída da

Vantagens estratégicas

  1. O uso de filtros Heikin Ashi para detecção de falhas de tendências é mais confiável.
  2. Supertrend serve como um stop loss dinâmico, maximizando o lucro da tendência e evitando retrações excessivas.
  3. Combinando diferentes períodos de tempo para julgar o espaço, a confirmação de sinais de alta e baixa frequência é mais confiável.
  4. A função de liquidação por tempo fixo evita a influência de comportamentos irracionais em um determinado momento.

Risco estratégico

  1. O risco de perda de lucro pode ser reduzido com a flexibilização adequada da linha de perda de lucro.
  2. A configuração inadequada dos parâmetros de supertrend pode causar um stop loss muito amplo ou muito estreito. Diferentes combinações de parâmetros podem ser testadas.
  3. Não se considera a gestão de fundos. Deverá ser criado um controlo de posição.
  4. Os custos de transação não são considerados.

Direção de otimização da estratégia

  1. Optimizar a combinação de parâmetros de tendências super, procurando o parâmetro ótimo.
  2. Adição de funções de controle de posição.
  3. Adicionar considerações de custos, como taxas, pontos de deslizamento, etc.
  4. A amplitude do stop loss pode ser ajustada de forma flexível, de acordo com a força e fraqueza da tendência.
  5. Considere a combinação de outros indicadores para filtrar os sinais de entrada.

Resumir

A estratégia integra os benefícios dos dois indicadores Heikin Ashi e Supertrend, captando a direção da tendência e, ao mesmo tempo, usando a supertrend para realizar o rastreamento dinâmico e o stop loss automatizado, para bloquear o lucro da tendência. O risco da estratégia vem principalmente da reversão da tendência e da otimização dos parâmetros, ambos os aspectos podem ser melhorados com mais otimização.

Código-fonte da estratégia
/*backtest
start: 2024-01-06 00:00:00
end: 2024-02-05 00:00:00
period: 4h
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/
// © ringashish

//@version=4
strategy("sa-strategy with HTF-TSL", overlay=true)


Pd = input(title="ATR Period", type=input.integer, defval=4)
Factor = input(title="ATR Multiplier", type=input.float, step=0.1, defval=2)
ST= supertrend(Factor, Pd)

heikinashi_close = security(heikinashi(syminfo.tickerid), timeframe.period, close)
heikinashi_low = security(heikinashi(syminfo.tickerid), timeframe.period, low)
heikinashi_open = security(heikinashi(syminfo.tickerid), timeframe.period, open)
heikinashi_high = security(heikinashi(syminfo.tickerid), timeframe.period, high)

heikinashi_close30 = security(heikinashi(syminfo.tickerid), "30", close)
//res1 = input("30", type=input.resolution, title="higher Timeframe")


//CCI TSL

res = input("240",type=input.resolution,title = "Higher Time Frame")
CCI = input(20)
ATR = input(5)
Multiplier=input(1,title='ATR Multiplier')
original=input(false,title='original coloring')
thisCCI = cci(close, CCI)
lastCCI = nz(thisCCI[1])


calcx()=> 
    bufferDn= high + Multiplier * sma(tr,ATR)
    bufferUp= low - Multiplier * sma(tr,ATR)
    if (thisCCI >= 0 and lastCCI < 0) 
        bufferUp := bufferDn[1]
    if (thisCCI <= 0 and lastCCI > 0) 
        bufferDn := bufferUp[1]

    if (thisCCI >= 0)
        if (bufferUp < bufferUp[1])
            bufferUp := bufferUp[1]
    else
        if (thisCCI <= 0)
            if (bufferDn > bufferDn[1])
                bufferDn := bufferDn[1]

   
    x = 0.0
    x := thisCCI >= 0 ?bufferUp:thisCCI <= 0 ?bufferDn:x[1]
    x

tempx = calcx()

calcswap() =>
    swap = 0.0
    swap := tempx>tempx[1]?1:tempx<tempx[1]?-1:swap[1]
    swap

tempswap = calcswap()

swap2=tempswap==1?color.blue:color.orange
swap3=thisCCI >=0 ?color.blue:color.orange
swap4=original?swap3:swap2

//display current timeframe's Trend

plot(tempx,"CTF",color=swap4,transp=0,linewidth=2, style = plot.style_stepline)


htfx = security(syminfo.tickerid,res,tempx[1],lookahead = barmerge.lookahead_on)
htfswap4 = security(syminfo.tickerid,res,swap4[1],lookahead = barmerge.lookahead_on)

plot(htfx,"HTF",color=htfswap4,transp=0,linewidth=3,style = plot.style_stepline)









//supertrend
Supertrend(Factor, Pd) =>
    Up=hl2-(Factor*atr(Pd))
    Dn=hl2+(Factor*atr(Pd))
    
    TrendUp = 0.0
    TrendUp := heikinashi_close[1]>TrendUp[1] ? max(Up,TrendUp[1]) : Up
    TrendDown = 0.0
    TrendDown := heikinashi_close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn
    Trend = 0.0
    Trend := heikinashi_close > TrendDown[1] ? 1: heikinashi_close< TrendUp[1]? -1: nz(Trend[1],1)
    Tsl = Trend==1? TrendUp: TrendDown
    
    S_Buy = Trend == 1 ? 1 : 0
    S_Sell = Trend != 1 ? 1 : 0
    
    [Trend, Tsl]

[Trend,Tsl] = Supertrend(Factor, Pd)
// Security
//ST1_Trend_MTF = security(syminfo.tickerid, res1, Tsl,barmerge.lookahead_on)
//plot(ST1_Trend_MTF, "higher ST") 

crossdn = crossunder(heikinashi_close,Tsl) or crossunder(heikinashi_close[1],Tsl) or crossunder(heikinashi_close[2],Tsl) or heikinashi_close < Tsl
crossup = crossover(heikinashi_close,Tsl) or crossover(heikinashi_close[1],Tsl) or crossover(heikinashi_close[2],Tsl) or heikinashi_close > Tsl
plot(Tsl,"ST",color = color.black,linewidth =2)
plot(ema(heikinashi_close,20),"EMA 20",color=color.red)
plot(hma(heikinashi_close,15),"HMA 15",color=color.green)
plot(ema(heikinashi_close,15),"EMA 15",color=color.black)

closedown = (heikinashi_close < hma(heikinashi_close,15) and heikinashi_high > hma(heikinashi_close,15)) or(heikinashi_close < ema(heikinashi_close,20) and heikinashi_high > ema(heikinashi_close,20))
closeup = (heikinashi_close > hma(heikinashi_close,15) and heikinashi_low < hma(heikinashi_close,15)) or (heikinashi_close > ema(heikinashi_close,20) and heikinashi_low < ema(heikinashi_close,20))

buy = heikinashi_open == heikinashi_low and closeup and crossup  and close > htfx
//buy = heikinashi_open == heikinashi_low and heikinashi_close > ema(close,20) and heikinashi_low < ema(close,20) and crossup
buyexit = cross(close,tempx) //heikinashi_open == heikinashi_high //and heikinashi_close < ema(close,15) and heikinashi_high > ema(close,15)

//if heikinashi_close30[1] < ST1_Trend_MTF
//sell = heikinashi_open == heikinashi_high and heikinashi_close < ema(close,20) and heikinashi_high > ema(close,20) and rsi(close,14)<60 and crossdn
sell = heikinashi_open == heikinashi_high and closedown and rsi(close,14)<55 and crossdn  and close < htfx
sellexit = cross(close,tempx) //heikinashi_open == heikinashi_low //and heikinashi_close > ema(close,15) and heikinashi_low < ema(close,15)

rg = 0
rg := buy ? 1 : buyexit ? 2 : nz(rg[1])

longLogic = rg != rg[1] and rg == 1 
longExit = rg != rg[1] and rg == 2 

//plotshape(longExit,"exit buy",style = shape.arrowup,location = location.belowbar,color = color.red, text ="buy exit", textcolor = color.red)
//plotshape(longLogic,"BUY",style = shape.arrowup,location = location.belowbar,color = color.green, text ="buy", textcolor= color.green)

nm = 0
nm := sell ? 1 : sellexit ? 2 : nz(nm[1])

shortLogic = nm != nm[1] and nm == 1 
shortExit = nm != nm[1] and nm == 2 

//plotshape(shortExit,"exit sell",style = shape.arrowup,location = location.belowbar,color = color.red, text ="sell exit", textcolor = color.red)
//plotshape(shortLogic,"SELL",style = shape.arrowup,location = location.belowbar,color = color.green, text ="sell", textcolor= color.green)


//Exit at particular time

ExitHour = input(title="Exit Hour Of Day", type=input.integer, defval=15, step = 5, maxval = 24, minval = 0)
ExitMint = input(title="Exit Minute Of Day", type=input.integer, defval=15, step = 5, maxval = 24, minval = 0)
bgc = input(title="Highlight Background Color?", type=input.bool, defval=true)
mRound(num,rem) => (floor(num/rem)*rem)
exitTime = (hour(time) >= ExitHour and (minute == mRound(ExitMint, timeframe.multiplier))) ? 1 : 0
exitTime := exitTime == 0 ? (hour(time) >= ExitHour and (minute + timeframe.multiplier >= ExitMint)) ? 1 : 0 : exitTime

MarketClose =  exitTime and not exitTime[1]

alertcondition(exitTime and not exitTime[1], title="Intraday Session Close Time", message="Close All Positions")
bgcolor(exitTime and not exitTime[1] and bgc ? #445566 : na, transp =40)



longCondition = longLogic
if (longCondition)
    strategy.entry("long", strategy.long)
 
    


shortCondition = shortLogic
if (shortCondition)
    strategy.entry("short", strategy.short)
    

strategy.close("short", when =cross(close,tempx)  or MarketClose)
strategy.close( "long", when =cross(close,tempx) or MarketClose )