Estratégia de acumulação de breakout baseada em filtragem de barras significativas


Data de criação: 2024-01-03 16:30:16 última modificação: 2024-01-03 16:30:16
cópia: 0 Cliques: 585
1
focar em
1621
Seguidores

Estratégia de acumulação de breakout baseada em filtragem de barras significativas

Visão geral

A estratégia prevê a tendência, julgando a coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de coluna de col

Princípio da estratégia

  1. O corpo de comprimento real do corpo de linha K atual, se for maior do que 3 vezes o valor médio dos últimos 6 corpos de linha K, é considerado um corpo de linha de coluna semântica.

  2. Se 3 colunas consecutivas de coluna de significado de coluna são linhas de luz, então é considerado um sinal de múltiplas cabeças; se 3 colunas consecutivas de coluna de significado de coluna são linhas de luz, então é considerado um sinal de cabeças vazias.

  3. Ao mesmo tempo em que julga o sinal, um sinal de negociação adicional é gerado se o preço atingir um ponto alto ou baixo antes da ruptura.

  4. Usando a linha média SMA como filtro, só se pode abrir uma posição quando o preço ultrapassa a SMA.

  5. Depois de manter uma posição, se o preço voltar a ultrapassar o ponto de entrada ou a linha média SMA, a posição será liquidada.

Análise de vantagens

  1. O uso de um filtro de coluna de significado para determinar a tendência pode filtrar interferência desnecessária e tornar o sinal mais claro.

  2. A combinação de sinais de tendência e sinais de ruptura pode melhorar a qualidade do sinal e reduzir os falsos sinais.

  3. O filtro de linha média de SMA evita a perseguição de alta e baixa. Comprar abaixo do fechamento, vender acima do fechamento, aumenta a confiabilidade do sinal.

  4. A definição de condições de parada de perda de parada pode parar a parada de perda em tempo hábil para a conservação de fundos.

Análise de Riscos

  1. Esta estratégia é mais radical, usando sinais de julgamento de 3 linhas K, que podem confundir oscilações de curto prazo com uma reversão de tendência.

  2. Os dados de testes são insuficientes e podem variar de acordo com a variedade e o ciclo.

  3. Não foi incluído o controle de posições nocturnas no disco noturno, existindo o risco de posições nocturnas.

Direção de otimização

  1. Os parâmetros para a coluna de coluna de coluna de coluna de coluna de coluna podem ser melhorados, como o número de linhas K julgadas, a definição de coluna de coluna de coluna de coluna de coluna de coluna de coluna, etc.

  2. É possível testar a influência de diferentes parâmetros de ciclo sobre o efeito, procurando o melhor ciclo.

  3. Pode ser adicionado o Stop Loss ATR para controlar o risco.

  4. Pode-se considerar a adição de lógica de controle de posição durante a noite.

Resumir

Esta estratégia utiliza o filtro de ondas e tendências da linha de coluna de significado, em combinação com a formação de sinais de negociação de ruptura, para filtrar efetivamente os pequenos movimentos desnecessários, os sinais são mais claros e confiáveis. Mas, devido ao curto período de julgamento, pode haver um certo risco de erro de julgamento. Pode ser aperfeiçoado com a otimização de parâmetros e o controle de vento.

Código-fonte da estratégia
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//AlexInc
//2018

// закрытие - вычислить и в течение скольки-то баров его добиваться
// если нет, то по первому противоположному
// по стоп-лоссу в любом случае - стоп вычислить

//@version=2
strategy(title = "AlexInc's Bar v1.2", shorttitle = "AlexInc Bar 1.2", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
tryprofitbars = input(6, defval = 6, minval = 1, maxval = 100, title = "Number of candles to take profit anyway")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")

useSMAfilter = input(false, defval = true, title = "Use SMA filter")
SMAlimit = input(10, defval = 10, minval = 1, maxval = 30, title = "SMA filter limit")
bodysizeMlt = input(3, defval = 3, minval = 1, maxval = 10, title = "Body Size Multiplier")
meanfulbardiv = input(3, title = "Meanful Bar size Divider")

showarr = input(false, defval = false, title = "Show Arrows")
fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//SMA #
index = 0
index := barstate.isfirst ==true ? 0 : nz(index[1])+1

buyindex = 0
buyindex := barstate.isfirst ==true ? 0 : buyindex[1]

sellindex = 0
sellindex := barstate.isfirst ==true ? 0 : sellindex[1]

//predictprofit = barstate.isfirst ==true ? 0 : predictprofit[1]

smafilter = sma(close, SMAlimit)

//Body
body = abs(close - open)
range = abs(high - low)
abody = sma(body, 6)

max3 = 0
if body >= body[1] and body >= body[2]
    max3 := body
else
    if body[1] >= body and body[1] >= body[2]
        max3 := body[1]
    else 
        if body[2] >= body and body[2] >= body[1]
            max3 := body[2]

prevmax3 = 0
prevmax3 := nz(max3[1])


bar = close > open ? 1 : close < open ? -1 : 0
firstbullishopen = 0
firstbullishopen := bar == 1 and bar[1] != 1 ? open : nz(firstbullishopen[1])
firstbearishopen = 0
firstbearishopen := bar == -1 and bar[1] != -1 ? open : nz(firstbearishopen[1])

meanfulbar = body > abody / meanfulbardiv

meanfulbearish = 0
meanfulbearish := nz(meanfulbearish[1])

meanfulbullish = 0
meanfulbullish := nz(meanfulbullish[1])

if meanfulbar
    if bar == 1
        meanfulbullish := 1 + meanfulbullish
        meanfulbearish := 0
    else
        if bar == -1
            meanfulbearish := 1 + meanfulbearish
            meanfulbullish := 0


plot(min(low, high)-10, style=circles, color = meanfulbar ? yellow:black, linewidth=3)

//Signals
up1 = (meanfulbearish >= 3) and (close < firstbullishopen or 1) and (strategy.position_size == 0 or close < strategy.position_avg_price) and body > abody / 5 and (useSMAfilter == false or close < smafilter)
if up1 == true
	predictprofit = sma(body, 3)
up2 = sma(bar, 1) == -1 and body > prevmax3 * bodysizeMlt and (strategy.position_size == 0 or close < strategy.position_avg_price) and body > abody / 5 and (useSMAfilter == false or close < smafilter)
if up2 == true
	predictprofit = body * 0.5
plot(min(low, high), style=circles, color = up1?blue:up2?green:gray, linewidth=3)

dn1 = (meanfulbullish >= 3) and (close > firstbearishopen or 1)  and (strategy.position_size == 0 or close > strategy.position_avg_price) and body > abody / 5 and (useSMAfilter==false or close > smafilter)
if dn1 ==true 
	predictprofit = sma(body, 3)
dn2 = sma(bar, 1) == 1 and body > prevmax3 * bodysizeMlt and (strategy.position_size == 0 or close > strategy.position_avg_price) and body > abody / 5 and (useSMAfilter==false or close > smafilter)
if dn2 ==true	
	predictprofit = body * 0.5
plot(max(low, high), style=circles, color = dn1?blue:dn2?green:gray, linewidth=3)


exit = (((strategy.position_size > 0 and bar == 1 ) or (strategy.position_size < 0 and bar == -1)) and body > abody / 2 )
// or index >= buyindex (or sellindex) + tryprofitbars


//Arrows
col = exit ? black : up1 or dn1 ? blue : up2 or dn2 ? red : na
needup = up1 or up2
needdn = dn1 or dn2
needexitup = exit and strategy.position_size < 0
needexitdn = exit and strategy.position_size > 0
plotarrow(showarr and needup ? 1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needdn ? -1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needexitup ? 1 : na, colorup = black, colordown = black, transp = 0)
plotarrow(showarr and needexitdn ? -1 : na, colorup = black, colordown = black, transp = 0)


//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
		buyindex = index
		sellindex = index
	if strategy.position_size == 0
		buyindex = index
		
        
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot )

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
		buyindex = index
		sellindex = index
	if strategy.position_size == 0
		sellindex = index
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot )
    
if  exit
    strategy.close_all()