O recurso está a ser carregado... Carregamento...

Estratégia de parada de tração inteligente baseada em SMA com reconhecimento de padrões intradiários

Autora:ChaoZhang, Data: 2025-01-17 16:04:09
Tags:SMAMA18ATR

 SMA-Based Intelligent Trailing Stop Strategy with Intraday Pattern Recognition

Resumo

Esta é uma estratégia baseada na média móvel simples de 18 dias (SMA18), combinando reconhecimento de padrões intradiários e mecanismos inteligentes de trailing stop. A estratégia observa principalmente a relação de preço com a SMA18, juntamente com posições altas e baixas intradiárias, para executar entradas longas em momentos ideais.

Princípios de estratégia

A lógica do núcleo inclui vários elementos-chave: Condições de entrada baseadas na posição de preço em relação à média móvel de 18 dias, com opções para entradas de ruptura ou acima da linha 2. Análise dos padrões de velas intradiárias, com foco particular nos padrões Inside Bar, para melhorar a precisão de entrada 3. Negociação seletiva baseada nas características do dia da semana 4. Fixação do preço de entrada usando ordens de limite com pequena deslocamento para cima dos mínimos para melhorar a probabilidade de preenchimento 5. Mecanismos de stop-loss duplos: stop fixos baseados no preço de entrada ou trailing stop baseados em mínimos de dois dias

Vantagens da estratégia

  1. Combina indicadores técnicos e padrões de preços para sinais de entrada mais confiáveis
  2. Mecanismo flexível de seleção de horários de negociação para otimização específica do mercado
  3. Sistema inteligente de stop-loss que protege os lucros e permite um movimento adequado dos preços
  4. Parâmetros altamente ajustáveis para diferentes ambientes de mercado
  5. Redução eficaz do sinal falso através de filtragem de padrões de barra interna

Riscos estratégicos

  1. As paradas fixas podem desencadear saídas antecipadas em mercados voláteis
  2. Paradas de atraso podem bloquear lucros mínimos durante reversões rápidas
  3. As barras internas frequentes durante a consolidação podem conduzir a excesso de negociação Medidas de atenuação:
  • O valor da posição em risco ponderado em função da volatilidade do mercado
  • Adição de indicadores de confirmação da tendência
  • Aplicação de objectivos mínimos de lucro para filtrar operações de baixa qualidade

Orientações de otimização

  1. Incorporar indicadores de volatilidade (como ATR) para o ajustamento dinâmico de stop-loss
  2. Adicionar dimensão de análise de volume para melhorar a confiabilidade do sinal
  3. Desenvolver algoritmos de selecção de datas mais inteligentes com base no desempenho histórico
  4. Implementar filtros de força da tendência para evitar a negociação em tendências fracas
  5. Melhorar os algoritmos de reconhecimento de barra interna para melhor identificação de padrões

Resumo

Esta estratégia constrói um sistema de negociação abrangente, combinando várias dimensões analíticas. Seus principais pontos fortes estão em configurações de parâmetros flexíveis e mecanismos inteligentes de stop-loss, permitindo a adaptação a vários ambientes de mercado. Através da otimização e melhoria contínua, a estratégia mostra promessa para manter um desempenho estável em diferentes condições de mercado.


/*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')




Relacionados

Mais.