A estratégia de rastreamento de explosão de momento julga os avanços de preços calculando mudanças percentuais de preço e filtra sinais com volume de negociação para implementar a captura de alta probabilidade de pontos de avanço de tendência.
Os principais indicadores utilizados nesta estratégia para determinar os sinais de entrada são:
Mudança percentual de preço (isFourPercentBull) - Calcule a mudança percentual do preço de fechamento em relação ao preço de fechamento do dia anterior para determinar se o preço efetivamente atravessou.
Relação entre o preço de fechamento e o preço mais alto (HighCloseRatio) - Calcular a relação entre o preço de fechamento e o preço mais alto para determinar a força da ruptura do preço.
Volume de negociação (volume) - Exige que o volume de negociação seja superior ao do dia anterior para garantir uma ruptura válida.
Mediana móvel simples de 200 dias (SMA) - Exige que o preço de fechamento e o preço de abertura sejam superiores à linha de 200 dias para determinar a direção da tendência.
Quando as várias condições acima são atendidas ao mesmo tempo, um sinal de compra é emitido. Depois, a estratégia usa o rastreamento de preços para parar a perda e bloquear os lucros. Especificamente, a fórmula de cálculo para a linha de stop loss é:
trailPrice = close * (100 - trailPercent) / 100
onde trailPercent é a porcentagem configurável de stop loss. Isso garante que, enquanto os preços aumentarem, a linha de stop loss também aumentará para bloquear os lucros. Quando os preços caírem de volta para a linha de stop loss, feche as posições para parar as perdas.
Como uma estratégia de fuga típica, tem as seguintes vantagens:
A filtragem multicondicional assegura a validade da fuga e evita falsas fugas.
Adotar o rastreamento de preços stop loss, que pode cortar ativamente as perdas e bloquear os lucros para maximizar a evitação de drawdowns.
A lógica estratégica é simples e clara, fácil de compreender e de otimizar.
A estratégia apresenta também alguns riscos:
Ainda existe uma probabilidade de fuga fracassada que não pode evitar completamente perdas.
Paradas de rastreamento excessivamente agressivas podem causar paradas frequentes.
A configuração inadequada dos parâmetros pode levar a frequências de negociação excessivas ou a sinais perdidos.
As soluções para os riscos correspondentes são:
Otimizar os parâmetros e reduzir a magnitude da perda de parada para garantir espaço suficiente.
Relaxar razoavelmente as condições de ruptura para garantir que as tendências claras não sejam perdidas.
Teste diferentes variedades para avaliar a estabilidade da estratégia.
Tendo em conta a elevada frequência de paradas nesta estratégia, as seguintes direcções podem ser ainda mais otimizadas:
O valor da posição em risco deve ser calculado de acordo com o método de classificação da posição em risco.
Aumentar os algoritmos de aprendizagem de máquina para treinar julgamentos de combinações de parâmetros de melhor desempenho com base em dados históricos.
Adicionar condições de julgamento auxiliares baseadas em variações de volume para garantir a eficácia.
Avaliar as diferenças nas definições dos parâmetros entre as diferentes variedades para encontrar o melhor ajuste.
A estratégia de rastreamento de explosão de momento é uma estratégia de rastreamento de tendências muito prática em geral. Resolve o problema da incapacidade de parar efetivamente a perda e o lucro em estratégias de ruptura, enquanto ainda controla bem os riscos ao capturar tendências. Com espaço para melhorias adicionais através da introdução de otimizações e aprendizado de máquina, vale a pena pesquisa e aplicação aprofundadas.
/*backtest start: 2023-03-01 00:00:00 end: 2023-12-10 05:20:00 period: 1d basePeriod: 1h 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/ // © doks23 //@version=5 strategy(title = "SD:Momentum Burst", overlay=true, initial_capital=1000,commission_value = 0,slippage = 0,process_orders_on_close=true) //Check Vol checkVol = input.bool(defval=false,title="IncludeAvgVolume?") volSMAlength = input(50, title="VolumeLength") volumeSma = ta.sma(volume, volSMAlength) highvolume = volume >= volumeSma volumeCond=checkVol?highvolume:true // Profit and Loss trailPercent = input.float(title="Trail%", defval=3, step=0.1) //longCondition PercentThreshold=input.float(3.8,'BreakoutPercent', step=0.1) MaxThreshold=input.float(10,'Max Breakout', step=0.1) HighCloseRatio=input.float(70,'Close to High Ratio', step=1) float candleCloseBull = ((close[0] - open[0]) / (high[0] - open[0]) * 100) float isFourPercentBull = (((close[0] - close[1]) / close[1]) * 100) LongCond=volume > volume[1] and isFourPercentBull > PercentThreshold and candleCloseBull > HighCloseRatio and isFourPercentBull<MaxThreshold barcolor(color=(LongCond?color.yellow: na),title='BObar') longCondition= LongCond and volumeCond and close>ta.sma(close,200) and open>ta.sma(close,200) //Input Strategy DateCheck= input.bool(title = 'Custom Date Range?', defval=true,group = 'Strategy') FromDate= input(defval = timestamp("1 Jan 2019 00:00"),group = 'Strategy') ToDate =input(defval = timestamp("31 Dec 2023 00:00"),group = 'Strategy') PostionSize =input.string('Contract','Select Position Size',options = ['Percent of Equity','Contract'],group = 'Strategy') ContractQty =input.int(1,'No of Contract',group = 'Strategy') //Backtesting Date Range TimeWindow=true // Number of Contract var int trade_qty=na if(PostionSize=='Contract') trade_qty:=ContractQty else trade_qty:= (strategy.equity>strategy.initial_capital)?math.floor(strategy.equity/strategy.initial_capital):ContractQty //Position Buy BuyTriggerPrice = ta.valuewhen(longCondition,high,0) //Trailing price var float trailPrice = na float percentMulti = (100 - trailPercent) / 100 longCondition2=longCondition and TimeWindow if longCondition2 strategy.entry("Long", strategy.long,qty=trade_qty,stop = BuyTriggerPrice) trailPrice := close*percentMulti if strategy.position_size>0 trailPrice := math.max(close*percentMulti,trailPrice[1]) if low <= trailPrice strategy.exit('Exit','Long',stop = trailPrice) if strategy.position_size==0 trailPrice:=na // Plot Strategy var float trail_long_SL=na if strategy.position_size>0 trail_long_SL:=trailPrice else trail_long_SL:=na //Strategy Plot PlotMA=input.bool(title="Plot MA?", defval=false) plot(PlotMA?ta.sma(close,10):na,color = color.red,title = '10MA') plot(PlotMA?ta.sma(close,21):na,color = color.white,title = '21MA') plot(PlotMA?ta.sma(close,200):na,color = color.orange,title = '200MA') // plot(trail_long_SL,color = color.gray,style = plot.style_steplinebr,linewidth = 1)