Estratégia de tijolos de momentum


Data de criação: 2024-02-19 15:32:17 última modificação: 2024-02-19 15:32:17
cópia: 1 Cliques: 577
1
focar em
1617
Seguidores

Estratégia de tijolos de momentum

Esta estratégia analisa a formação de um craque e determina as mudanças na dinâmica do mercado, fazendo mais curto-circuito de acordo com a direção do craque.

Princípio da estratégia

O princípio central da estratégia é simular a formação de blocos calculando a relação entre o ATR e o preço de fechamento. Concretamente, definindo as duas variáveis Brick1 e Brick2.

O Brick1 é calculado da seguinte forma: se o preço de fechamento for superior ao valor de Brick1 de ontem + ATR, então Brick1 é o valor de Brick1 de ontem + ATR; se o preço de fechamento for inferior ao valor de Brick1 de ontem - ATR, então Brick1 é o valor de Brick1 de ontem - ATR; caso contrário, Brick1 herda o valor de Brick1 de ontem.

Brick2 é calculado da seguinte forma: se o valor de Brick1 não for igual ao valor de Brick1 ontem, então Brick2 é o valor de Brick1 ontem; caso contrário, herda o valor de Brick2 ontem.

Isso simula a formação de um ângulo. Quando o Brick1 sobe acima de um ATR, forma-se um ângulo ascendente; quando o Brick1 desce acima de um ATR, forma-se um ângulo descendente. O Brick2 registra a posição de um ângulo.

Quando Brick1 e Brick2 cruzam para cima, a coluna expande-se para cima e é considerada uma coluna; quando Brick1 e Brick2 cruzam para baixo, a coluna encolhe para baixo e é considerada uma coluna.

Vantagens estratégicas

  1. Utilizando o ATR para determinar a formação de silos, evitando o uso de silos de tamanho fixo, que se adaptam dinamicamente às flutuações do mercado
  2. Para julgar a direção do espaço-tempo através da interseção dos eixos, identifique as mudanças de força
  3. A sensibilidade aos julgamentos sobre a dinâmica do mercado pode ser ajustada através de diferentes ciclos de ATR
  4. Visualização da formação e interseção de um eixo, intuindo a tendência do mercado

Risco estratégico

  1. A escolha do tamanho do ATR afeta a taxa de retorno da estratégia. Se o ATR for muito pequeno, muito silício é formado, produzindo mais sinais de invalidez; se o ATR for muito grande, muito pouco silício, é fácil perder oportunidades.
  2. A tendência real pode não seguir o padrão de Mercúrio, e o sinal cruzado de Mercúrio pode ser rejeitado por uma inversão de mercado.
  3. É preciso ser muito sensível aos custos de transação, caso contrário, a frequência de transações em cruzamentos reduzirá significativamente a receita líquida.

Pode-se encontrar o melhor ciclo ATR através da otimização de parâmetros; ajustar a estratégia de stop-loss para reduzir os danos causados por sinais inativos; amplificar adequadamente a variedade de negociação para reduzir o impacto dos custos sobre os lucros.

Otimização de Estratégia

  1. Filtragem de sinais em combinação com outros indicadores, como indicadores de quantidade de energia, indicadores de vibração, etc., para evitar sinais inválidos
  2. Aumentar o filtro de tendência, emitindo sinais apenas na direção da tendência, evitando a perda de reversão
  3. Otimizar os parâmetros da amostra durante o período de teste para encontrar automaticamente os melhores parâmetros

Resumir

Esta estratégia julga as tendências e a dinâmica de curto prazo no mercado através de um cruzamento de simulações dinâmicas. A visualização da forma é intuitiva. A estratégia tem um grande espaço de otimização, a otimização de parâmetros e a filtragem de sinais podem aumentar ainda mais a estabilidade.

Código-fonte da estratégia
/*backtest
start: 2023-02-12 00:00:00
end: 2024-02-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4


///Component Code Start
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(01, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(2025, "Backtest Stop Year")
testStopMonth = input(1, "Backtest Stop Month")
testStopDay = input(1, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)



/// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=input.bool, defval=false)
testPeriodBackgroundColor = testPeriodBackground and time >= testPeriodStart and time <= testPeriodStop ? 
   #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
/// Component Code Stop


//Zack_the_Lego (original AUTHOR) made into strategy by mkonsap
strategy("Flex Renko Emulator", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
margin = input(true, title="Margin?")
Margin = margin ? margin : false
res = input(type=input.resolution, defval="D", title="Resolution of ATR")
xATR = atr(14)
//TF = x78tf ? "78" : "39"
BrickSize = security(syminfo.tickerid, res, xATR)

//Brick1 =  close >  nz(Brick1[1]) + BrickSize ? nz(Brick1[1]) + BrickSize : close <
                    //nz(Brick1[1]) - BrickSize ?
                        //nz(Brick1[1]) - BrickSize
                            //: nz(Brick1[1]))


Brick1() =>
    s1 = 0.0
    s1 := close > nz(s1[1]) + BrickSize ? nz(s1[1]) + BrickSize : 
       close < nz(s1[1]) - BrickSize ? nz(s1[1]) - BrickSize : nz(s1[1])
    s1


Brick2() =>
    s2 = 0.0
    Brick1_1 = Brick1()
    s2 := Brick1() != Brick1()[1] ? Brick1_1[1] : nz(s2[1])
    s2

colorer = Brick1() > Brick2() ? color.green : color.red
p1 = plot(Brick1(), color=colorer, linewidth=4, title="Renko")
p2 = plot(Brick2(), color=colorer, linewidth=4, title="Renko")
fill(p1, p2, color=color.purple, transp=50)




mylong = crossover(Brick1(), Brick2())
myshort = crossunder(Brick1(), Brick2())

last_long = float(na)
last_short = float(na)
last_long := mylong ? time : nz(last_long[1])
last_short := myshort ? time : nz(last_short[1])

in_long = last_long > last_short ? 2 : 0
in_short = last_short > last_long ? 2 : 0

mylong2 = crossover(Brick1(), Brick2())
myshort2 = crossunder(Brick1(), Brick2())

last_long2 = float(na)
last_short2 = float(na)
last_long2 := mylong2 ? time : nz(last_long2[1])
last_short2 := myshort2 ? time : nz(last_short2[1])

in_long2 = last_long2 > last_short2 ? 0 : 0
in_short2 = last_short2 > last_long2 ? 0 : 0


condlongx = in_long + in_long2
condlong = crossover(condlongx, 1.9)
condlongclose = crossunder(condlongx, 1.9)

condshortx = in_short + in_short2
condshort = crossover(condshortx, 1.9)
condshortclose = crossunder(condshortx, 1.9)


// === STRATEGY - LONG POSITION EXECUTION WITH CLOSE ORDERS ===
//enterLong() => crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0
//exitLong()  => crossunder(condlongx, 1.9) and testPeriod() and strategy.position_size > 0
//strategy.entry(id = "Long", long = true, when = enterLong())
//strategy.close(id = "Long", when = exitLong())
// === STRATEGY - SHORT POSITION EXECUTION WITH CLOSE ORDER===
//enterShort() => crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0 and Margin
//exitShort() => crossunder(condshortx, 1.9)  and testPeriod() and strategy.position_size < 0
//strategy.entry(id = "Short", long = false, when = enterShort())
//strategy.close(id = "Short", when = exitShort())   
//END


///STRATEGY ONLY LONG AND SHORT/////
if crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0
    strategy.entry("Long", strategy.long, comment="Long")

if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0
    strategy.close("Long", when=not Margin)

if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0
    strategy.entry("Short", strategy.short, comment="Short", when=Margin)

/////// END ////