Estratégia inteligente de trailing stop loss com base na média móvel e no padrão intradiário

SMA MA18 ATR
Data de criação: 2025-01-17 16:04:09 última modificação: 2025-01-17 16:04:09
cópia: 4 Cliques: 361
1
focar em
1617
Seguidores

Estratégia inteligente de trailing stop loss com base na média móvel e no padrão intradiário

Visão geral

Esta é uma estratégia baseada na média móvel de 18 dias (SMA18), combinada com reconhecimento de padrões de negociação intradiária e um mecanismo inteligente de trailing stop. Essa estratégia observa principalmente a relação entre o preço e a SMA18, combina os pontos altos e baixos intradiários e entra na posição longa no momento certo. A estratégia adota um plano de stop-loss flexível, que pode usar um ponto de stop-loss fixo ou um ponto mais baixo de dois dias como referência de stop-loss.

Princípio da estratégia

A lógica central da estratégia inclui os seguintes elementos-chave:

  1. As condições de entrada são baseadas na posição relativa do preço em relação à média móvel de 18 dias. Você pode escolher entrar no mercado quando ele romper a média móvel ou entrar acima da média móvel.
  2. Ao analisar os padrões da linha K intradiária, especialmente prestando atenção ao padrão da linha K interna (barra interna), a precisão da entrada é melhorada
  3. Com base nas características de desempenho de diferentes dias de negociação da semana, você pode negociar seletivamente em dias específicos
  4. O preço de entrada é definido em uma ordem limite, com um pequeno prêmio acima do ponto mais baixo para aumentar a probabilidade de uma transação.
  5. O mecanismo de stop loss suporta dois modos: um é um stop loss fixo com base no preço de entrada e o outro é um stop loss móvel com base no ponto mais baixo dos dois dias de negociação anteriores.

Vantagens estratégicas

  1. Combinando indicadores técnicos e padrões de preços, os sinais de entrada são mais confiáveis
  2. Mecanismo de seleção de tempo de negociação flexível, que pode ser otimizado de acordo com diferentes características do mercado
  3. A solução inteligente de stop loss protege os lucros ao mesmo tempo que dá aos preços espaço suficiente para flutuações
  4. Os parâmetros de estratégia são altamente ajustáveis ​​e podem se adaptar a diferentes ambientes de mercado
  5. Por meio da triagem de padrões internos da linha K, os sinais falsos são efetivamente reduzidos

Risco estratégico

  1. Em mercados voláteis, paradas fixas podem levar a saídas prematuras
  2. Para uma reversão rápida, um trailing stop loss pode garantir menos lucro
  3. Durante a fase lateral, candlesticks internos frequentes podem levar a negociações excessivas. Contramedidas:
  • Ajuste dinamicamente a distância do stop loss de acordo com a volatilidade do mercado
  • Adicionar indicadores de confirmação de tendência
  • Defina uma meta mínima de lucro para filtrar negociações de baixa qualidade

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

  1. Introduzir indicadores de volatilidade (como ATR) para ajustar dinamicamente a distância de stop loss
  2. Aumentar a dimensão da análise de volume e melhorar a confiabilidade do sinal
  3. Desenvolver algoritmos de seleção de datas mais inteligentes para otimizar automaticamente os tempos de negociação com base no desempenho histórico
  4. Adicionado filtro de força de tendência para evitar negociação em tendências fracas
  5. Otimizar o algoritmo interno de reconhecimento de linha K para melhorar a precisão do reconhecimento de padrões

Resumir

Essa estratégia cria um sistema de negociação relativamente completo combinando métodos de análise de múltiplas dimensões. A principal vantagem da estratégia está em suas configurações de parâmetros flexíveis e no mecanismo inteligente de stop-loss, que permite que ela se adapte a diferentes ambientes de mercado. Por meio de otimização e melhoria contínuas, espera-se que a estratégia mantenha um desempenho estável sob diversas condições de mercado.

Código-fonte da estratégia
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-16 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © zweiprozent

strategy('Buy Low over 18 SMA Strategy', overlay=true, default_qty_value=1)
xing = input(false, title='crossing 18 sma?')
sib = input(false, title='trade inside Bars?')
shortinside = input(false, title='trade inside range bars?')
offset = input(title='offset', defval=0.001)
belowlow = input(title='stop below low minus', defval=0.001)
alsobelow = input(false, title='Trade only above 18 sma?')
tradeabove = input(false, title='Trade with stop above order?')
trailingtwo = input(false, title='exit with two days low trailing?')


insideBar() =>  //and high <= high[1] and low >= low[1] ? 1 : 0
    open <= close[1] and close >= open[1] and close <= close[1] or open >= close[1] and open <= open[1] and close <= open[1] and close >= close[1] ? 1 : 0

inside() =>
    high <= high[1] and low >= low[1] ? 1 : 0
enterIndex = 0.0
enterIndex := enterIndex[1]

inPosition = not na(strategy.position_size) and strategy.position_size > 0
if inPosition and na(enterIndex)
    enterIndex := bar_index
    enterIndex



//if strategy.position_size <= 0 

//    strategy.exit("Long", stop=low[0]-stop_loss,comment="stop loss")


//if not na(enterIndex) and bar_index - enterIndex + 0 >= 0 

//    strategy.exit("Long", stop=low[0]-belowlow,comment="exit")

//    enterIndex := na

T_Low = request.security(syminfo.tickerid, 'D', low[0])
D_High = request.security(syminfo.tickerid, 'D', high[1])
D_Low = request.security(syminfo.tickerid, 'D', low[1])
D_Close = request.security(syminfo.tickerid, 'D', close[1])
D_Open = request.security(syminfo.tickerid, 'D', open[1])

W_High2 = request.security(syminfo.tickerid, 'W', high[1])
W_High = request.security(syminfo.tickerid, 'W', high[0])
W_Low = request.security(syminfo.tickerid, 'W', low[0])
W_Low2 = request.security(syminfo.tickerid, 'W', low[1])
W_Close = request.security(syminfo.tickerid, 'W', close[1])
W_Open = request.security(syminfo.tickerid, 'W', open[1])

//longStopPrice  = strategy.position_avg_price * (1 - stopl)
// Go Long - if prev day low is broken and stop loss prev day low
entryprice = ta.sma(close, 18)

//(high[0]<=high[1]or close[0]<open[0]) and low[0]>vwma(close,30) and time>timestamp(2020,12,0,0,0)

showMon = input(true, title='trade tuesdays?')
showTue = input(true, title='trade wednesdayy?')
showWed = input(true, title='trade thursday?')
showThu = input(true, title='trade friday?')
showFri = input(true, title='trade saturday?')
showSat = input(true, title='trade sunday?')
showSun = input(true, title='trade monday?')

isMon() =>
    dayofweek(time('D')) == dayofweek.monday and showMon
isTue() =>
    dayofweek(time('D')) == dayofweek.tuesday and showTue
isWed() =>
    dayofweek(time('D')) == dayofweek.wednesday and showWed
isThu() =>
    dayofweek(time('D')) == dayofweek.thursday and showThu
isFri() =>
    dayofweek(time('D')) == dayofweek.friday and showFri
isSat() =>
    dayofweek(time('D')) == dayofweek.saturday and showSat
isSun() =>
    dayofweek(time('D')) == dayofweek.sunday and showSun


clprior = close[0]
entryline = ta.sma(close, 18)[1]
//(isMon() or isTue()or isTue()or  isWed() 
noathigh = high < high[1] or high[2] < high[3] or high[1] < high[2] or low[1] < ta.sma(close, 18)[0] and close > ta.sma(close, 18)[0]

if noathigh and time > timestamp(2020, 12, 0, 0, 0) and (alsobelow == false or high >= ta.sma(close, 18)[0]) and (isMon() or isTue() or isWed() or isThu() or isFri() or isSat() or isSun()) and (high >= high[1] or sib or low <= low[1])  //((sib == false and inside()==true) or inside()==false) and (insideBar()==true or shortinside==false)
    if tradeabove == false
        strategy.entry('Long', strategy.long, limit=low + offset * syminfo.mintick, comment='long')
    if tradeabove == true and (xing == false or clprior < entryline)  // and high<high[1] 
        strategy.entry('Long', strategy.long, stop=high + offset * syminfo.mintick, comment='long')


//if time>timestamp(2020,12,0,0,0) and isSat()  
//    strategy.entry("Long", strategy.long, limit=0, comment="long")


//strategy.exit("Long", stop=low-400*syminfo.mintick)

//strategy.exit("Long", stop=strategy.position_avg_price-10*syminfo.mintick,comment="exit")
//strategy.exit("Long", stop=low[1]-belowlow*syminfo.mintick, comment="stop")

if strategy.position_avg_price > 0 and trailingtwo == false and close > strategy.position_avg_price
    strategy.exit('Long', stop=strategy.position_avg_price, comment='stop')

if strategy.position_avg_price > 0 and trailingtwo == false and (low > strategy.position_avg_price or close < strategy.position_avg_price)
    strategy.exit('Long', stop=low[0] - belowlow * syminfo.mintick, comment='stop')

if strategy.position_avg_price > 0 and trailingtwo
    strategy.exit('Long', stop=ta.lowest(low, 2)[0] - belowlow * syminfo.mintick, comment='stop')