Estratégia de negociação quantitativa multi-temporal simulando arbitragem triangular


Data de criação: 2024-01-29 11:10:33 última modificação: 2024-01-29 11:10:33
cópia: 0 Cliques: 736
1
focar em
1617
Seguidores

Estratégia de negociação quantitativa multi-temporal simulando arbitragem triangular

Visão geral

Esta estratégia usa três indicadores técnicos diferentes em combinação para construir uma estratégia de arbitragem em vários períodos de tempo, para obter lucros extras de baixo risco, capturando tendências de preços em diferentes períodos de tempo.

Princípio da estratégia

Os três indicadores técnicos usados pela estratégia são o canal de Kelt ((KC), o stop de volatilidade ((Vstop) e o indicador de reunião de William ((WAE)). O canal de Kelt é usado para determinar se o preço está fora do alcance do canal e, portanto, emite um sinal de negociação. O stop de volatilidade é usado para ajustar dinamicamente a posição de parada e, ao mesmo tempo, garantir a parada. O indicador de William é usado para determinar se o preço está em uma direção forte.

  1. Quando o preço está acima da trajetória ascendente do Celtic Channel, é considerado um sinal de otimismo. Quando o preço está abaixo da trajetória descendente do Celtic Channel, é considerado um sinal de baixa.

  2. A parada de taxa de flutuação define a posição de parada de acordo com a flutuação do preço e a largura do canal. Ela é capaz de ajustar dinamicamente, evitando uma posição de parada excessivamente conservadora, garantindo a parada.

  3. O indicador William determina se o preço está em uma forte tendência ascendente ou descendente, calculando o MACD e a largura do canal da faixa de Bryn.

Ao combinar esses três indicadores, os sinais em diferentes períodos de tempo se verificam mutuamente. Isso reduz a probabilidade de erro de julgamento, construindo uma lógica de estratégia de otimização estável.

Análise de vantagens

A maior vantagem desta estratégia reside na precisão do sinal de negociação trazido por uma combinação de vários indicadores. Os três indicadores atuam em diferentes períodos de tempo, verificando-se mutuamente, o que reduz efetivamente a probabilidade de erro de julgamento e aumenta a precisão do sinal. Além disso, a configuração de stop loss de taxa de flutuação é dinâmica e pode ajustar a posição de stop loss de acordo com as flutuações em tempo real, controlando ainda mais o risco.

Em comparação com uma única estratégia de indicadores, a estratégia de combinação pode fornecer sinais de negociação mais precisos e eficientes. Ao mesmo tempo, os três indicadores se complementam, formando decisões de negociação em vários períodos de tempo. Esta lógica de design é muito científica e razoável, e vale a pena aprender.

Análise de Riscos

O principal risco desta estratégia é que a configuração inadequada dos parâmetros pode levar a um excesso de compatibilidade. Os três indicadores têm um total de 8 parâmetros, e a configuração inadequada pode ter um efeito adverso sobre a estratégia. Além disso, a relação de peso entre os indicadores também precisa ser configurada corretamente, caso contrário, os sinais podem se compensar mutuamente, resultando em invalidez.

Para reduzir esses riscos, o processo de definição de parâmetros precisa levar em consideração a adaptabilidade de diferentes ambientes de mercado, ajustando-se à combinação de parâmetros ideal por meio da análise de feedback. Além disso, deve-se ajustar adequadamente a relação de peso entre os indicadores, garantindo que os sinais de negociação sejam efetivamente acionados.

Direção de otimização

O espaço de otimização da estratégia se concentra principalmente em dois aspectos: o ajuste de parâmetros e a melhoria da estratégia de stop loss. Concretamente, pode-se começar a partir dos seguintes aspectos:

  1. Selecionar os parâmetros indicadores de forma mais científica e racional, otimizar a combinação de parâmetros. Os algoritmos podem ser usados para encontrar os parâmetros mais ótimos de acordo com objetivos como maximizar os lucros e minimizar os riscos.

  2. Melhorar a estratégia de parada de perda, reduzir ainda mais a perda desnecessária, aumentando a taxa de vitória, desde que a parada de perda seja garantida. Por exemplo, combinando mais indicadores como sinal de parada ou definindo um retrocesso gradual da posição de parada.

  3. Otimizar a relação de peso dos indicadores e a lógica de julgamento dos sinais de negociação, reduzindo a taxa de erro. Pode-se introduzir mais características de comportamento de preços e construir regras de julgamento mais estáveis e confiáveis.

  4. Tente introduzir modelos de aprendizagem de máquina para otimização automática de parâmetros. Ou use programação de aprendizagem de reforço profundo para avaliação e melhoria de estratégias.

Resumir

Esta estratégia utiliza um sistema de arbitragem em três quadros temporais, através da combinação de um canal celta, um stop-loss de volatilidade e um indicador de William. A combinação de vários indicadores aumenta a precisão do sinal de negociação e o stop-loss dinâmico controla o risco. No entanto, ainda há espaço para melhorias na configuração e otimização dos parâmetros.

Código-fonte da estratégia
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("QuarryLake", overlay=true)  ///Ultilized modified full kelly for this strategy = 36%

///Keltner channel///
nPeriod = input(title="Keltner Period", type=input.integer, defval=200, minval=1)
Mult = input(title="Keltner Mult", type=input.integer, defval=5, minval=1)
xPrice = ema(hlc3, nPeriod)
xMove = ema(high - low, nPeriod)
xMoveMult = xMove * Mult
xUpper = xPrice + xMoveMult
xLower = xPrice - xMoveMult

// plot(xPrice, color=red, title="KSmid")
p1 = plot(xUpper, color=color.white, title="KSup")
p2 = plot(xLower, color=color.white, title="KSdn")
fill(p1, p2, color=close > xUpper ? color.green : close < xLower ? color.red : color.white)

kclongcondition = close > xUpper
kcshortcondition = close < xLower
kccloselongcondition = crossunder(close, xUpper)
kccloseshortcondition = crossover(close, xLower)

///Volatility Stop///
length = input(title="Vstop length", type=input.integer, defval=3, minval=1)
mult1 = 1.5

atr_ = atr(length)
max1 = 0.0
min1 = 0.0
is_uptrend_prev = false
stop = 0.0
vstop_prev = 0.0
vstop1 = 0.0
is_uptrend = false
is_trend_changed = false
max_ = 0.0
min_ = 0.0
vstop = 0.0
max1 := max(nz(max_[1]), close)
min1 := min(nz(min_[1]), close)
is_uptrend_prev := nz(is_uptrend[1], true)
stop := is_uptrend_prev ? max1 - mult1 * atr_ : min1 + mult1 * atr_
vstop_prev := nz(vstop[1])
vstop1 := is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop)
is_uptrend := close - vstop1 >= 0
is_trend_changed := is_uptrend != is_uptrend_prev
max_ := is_trend_changed ? close : max1
min_ := is_trend_changed ? close : min1
vstop := is_trend_changed ? is_uptrend ? max_ - mult1 * atr_ : min_ + mult1 * atr_ : 
   vstop1

plot(vstop, color=is_uptrend ? color.green : color.red, style=plot.style_line, linewidth=1)

vstoplongcondition = close > vstop
vstoplongclosecondition = crossunder(close, vstop)
vstopshortcondition = close < vstop
vstopshortclosecondition = crossover(close, vstop)

///Waddah Attar Explosion///
sensitivity = input(150, title="Sensitivity")
fastLength = input(20, title="FastEMA Length")
slowLength = input(40, title="SlowEMA Length")
channelLength = input(20, title="BB Channel Length")
mult = input(2.0, title="BB Stdev Multiplier")
DEAD_ZONE = nz(rma(tr(true), 100)) * 3.7
calc_macd(source, fastLength, slowLength) =>
    fastMA = ema(source, fastLength)
    slowMA = ema(source, slowLength)
    fastMA - slowMA
calc_BBUpper(source, length, mult) =>
    basis = sma(source, length)
    dev = mult * stdev(source, length)
    basis + dev
calc_BBLower(source, length, mult) =>
    basis = sma(source, length)
    dev = mult * stdev(source, length)
    basis - dev
t1 = (calc_macd(close, fastLength, slowLength) - 
   calc_macd(close[1], fastLength, slowLength)) * sensitivity
t2 = (calc_macd(close[2], fastLength, slowLength) - 
   calc_macd(close[3], fastLength, slowLength)) * sensitivity
e1 = calc_BBUpper(close, channelLength, mult) - 
   calc_BBLower(close, channelLength, mult)
trendUp = t1 >= 0 ? t1 : 0
trendDown = t1 < 0 ? -1 * t1 : 0

waelongcondition = trendUp and trendUp > DEAD_ZONE and trendUp > e1
waeshortcondition = trendDown and trendDown > DEAD_ZONE and trendDown > e1

///Long Entry///
longcondition = kclongcondition and vstoplongcondition and waelongcondition
if longcondition
    strategy.entry("Long", strategy.long)

///Long exit///
closeconditionlong = kccloselongcondition or vstoplongclosecondition
if closeconditionlong
    strategy.close("Long")

///Short Entry///
shortcondition = kcshortcondition and vstopshortcondition and waeshortcondition
if shortcondition
    strategy.entry("Short", strategy.short)

///Short exit///
closeconditionshort = kccloseshortcondition or vstopshortclosecondition
if closeconditionshort
    strategy.close("Short")

///Free Hong Kong, the revolution of our time///