Estratégia de rastreamento de perdas de parada aberta-alta-baixa

Autora:ChaoZhang, Data: 2024-02-18 14:30:08
Tags:

img

Resumo

Esta estratégia é projetada com base nos dados abertos, altos e baixos dos gráficos de velas para identificar pontos de reversão de tendência para as entradas. Após as entradas, as linhas de stop loss serão definidas com base no indicador ATR e rastreadas. Os alvos também serão calculados com base na relação risco-recompensa. Quando o preço atinge a meta de stop loss ou lucro, as ordens serão enviadas para fechar posições.

Estratégia lógica

Os sinais de entrada desta estratégia vêm dos preços abertos, altos e baixos. Um sinal de compra é gerado quando o preço de abertura é igual ao baixo do candelabro, e um sinal de venda é gerado quando o preço de abertura é igual ao alto, indicando oportunidades potenciais de reversão da tendência.

Após a entrada, a perda de parada de tração dinâmica é calculada com base no indicador ATR. A perda de parada longa é definida no mínimo mais baixo das N barras recentes menos 1 ATR; a perda de parada curta é definida no máximo mais alto das N barras recentes mais 1 ATR. A linha de perda de parada será atualizada dinamicamente para os movimentos de preço de tração.

Os objetivos de lucro são calculados com base na definição do rácio risco-recompensa. O objectivo longo é fixado no preço de entrada mais (a diferença de risco entre o preço de entrada e a perda de parada multiplicada pelo rácio risco-recompensa); o objectivo curto é fixado no preço de entrada menos (a diferença de risco entre a perda de parada e o preço de entrada multiplicada pelo rácio risco-recompensa).

Quando o preço atingir a meta de stop loss ou lucro, as ordens serão enviadas para posições de aplanamento.

Análise das vantagens

As vantagens desta estratégia incluem:

  1. Sinais de entrada simples e claros, evitando múltiplos golpes.

  2. O ATR dinâmico de trail stop bloqueia os lucros e impede a perseguição de altos e baixos.

  3. O controlo da relação risco/recompensa evita deixar os lucros na mesa e o excesso de negociação.

  4. Aplicável a diferentes produtos, fácil de otimizar.

Análise de riscos

Há também alguns riscos desta estratégia:

  1. Os sinais de entrada podem atrasar-se até certo ponto, perdendo a melhor entrada no mercado.

  2. O nível de prejuízo é o mais baixo possível, mas não o mais elevado.

  3. Sem determinação de tendência, propensos a ficarem presos em mercados variados.

  4. Incapaz de lidar com posições durante a noite.

As direcções de otimização são:

  1. Incorporar outros indicadores de tendência para evitar erros.

  2. Ajustar os parâmetros do ATR ou adicionar um controlo de volatilidade para melhorar o stop loss.

  3. Adicionar filtro de tendência para reduzir o ruído do sinal.

  4. Adicionar manuseio de posição durante a noite para certos produtos.

Conclusão

Em conclusão, esta é uma estratégia simples e direta com lógica de entrada clara, metodologia razoável de stop loss e bom controle de risco. Mas há algumas limitações como viés de tendência insuficiente, atraso de sinal, etc. Essas falhas também apontam direções para otimização futura.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// Open-High-Low strategy

strategy('Strategy: OLH', shorttitle="OLH", overlay=true )

// Inputs
slAtrLen = input.int(defval=14, title="ATR Period for placing SL", group="StopLoss settings")
showSLLines = input.bool(defval=false, title="Show SL lines in chart", tooltip="Show SL lines also as dotted lines in chart. Note: chart may look untidy.", group="Stolploss settings")
// Trade related
rrRatio = input.float(title='Risk:Reward', step=0.1, defval=2.0, group="Trade settings")
endOfDay = input.int(defval=1500, title="Close all trades, default is 3:00 PM, 1500 hours (integer)", group="Trade settings")
mktAlwaysOn = input.bool(defval=true, title="Markets that never closed (Crypto, Forex, Commodity)", tooltip="Some markers never closes. For those cases, make this checked.", group="Trade settings")
lotSize = input.int(title='Lot Size', step=1, defval=1, group="Trade settings")


// Utils
green(open, close) => close > open ? true : false
red(open, close) => close < open ? true : false
body(open, close) => math.abs(open - close)
lowerwick = green(open, close) ? open - low : close - low
upperwick = green(open, close) ? high - close : high - open
crange = high - low
crangep = high[1] - low[1] // previous candle's candle-range
bullish = close > open ? true : false
bearish = close < open ? true : false


// Trade signals
longCond = barstate.isconfirmed and (open == low)
shortCond = barstate.isconfirmed and (open == high)

// For SL calculation
atr = ta.atr(slAtrLen)
highestHigh = ta.highest(high, 7)
lowestLow = ta.lowest(low, 7)
longStop = showSLLines ? lowestLow - (atr * 1) : na
shortStop = showSLLines ? highestHigh + (atr * 1) : na
plot(longStop, title="Buy SL", color=color.green, style=plot.style_cross)
plot(shortStop, title="Sell SL", color=color.red, style=plot.style_cross)

// Trade execute
h = hour(time('1'), syminfo.timezone)
m = minute(time('1'), syminfo.timezone)
hourVal = h * 100 + m
totalTrades = strategy.opentrades + strategy.closedtrades
if (mktAlwaysOn or (hourVal < endOfDay))
    // Entry
    var float sl = na
    var float target = na
    if (longCond)
        strategy.entry("enter long", strategy.long, lotSize, limit=na, stop=na, comment="Enter Long")
        sl := longStop
        target := close + ((close - longStop) * rrRatio)
        alert('Buy:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)
    if (shortCond)
        strategy.entry("enter short", strategy.short, lotSize, limit=na, stop=na, comment="Enter Short")
        sl := shortStop
        target := close - ((shortStop - close) * rrRatio)
        alert('Sell:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)

    // Exit: target or SL
    if ((close >= target) or (close <= sl))
        strategy.close("enter long", comment=close < sl ? "Long SL hit" : "Long target hit")
    if ((close <= target) or (close >= sl))
        strategy.close("enter short", comment=close > sl ? "Short SL hit" : "Short target hit")
else if (not mktAlwaysOn)
    // Close all open position at the end if Day
    strategy.close_all(comment = "Close all entries at end of day.")



Mais.