Estratégia de média móvel adaptativa de combinação multifatorial


Data de criação: 2023-12-15 11:30:09 última modificação: 2023-12-15 11:30:09
cópia: 0 Cliques: 638
1
focar em
1629
Seguidores

Estratégia de média móvel adaptativa de combinação multifatorial

Uma visão geral da estratégia

A estratégia de média móvel adaptável de combinação de múltiplos fatores é uma estratégia de combinação que combina o uso de linhas intradiárias, médias móveis, cruzamentos de aglutinação e linhas médias de HA. A estratégia visa explorar mais oportunidades de negociação e obter maiores ganhos acumulados em um mercado de touros.

2. Princípios de estratégia

A lógica central da estratégia é que, combinando o uso de vários indicadores técnicos para classificar os sinais de compra e venda, os resultados correspondem a diferentes fatores, dando sinais de negociação de diferentes intensidades.

Em particular, os quatro principais indicadores técnicos usados pela estratégia incluem:

  1. A estratégia usa a cor da linha de equilíbrio para determinar a tendência do preço. Dois elementos verdes consecutivos, HA, são sinais de compra, e dois elementos vermelhos consecutivos, HA, são sinais de vazio.

  2. Média móvel. Uma estratégia que usa três configurações de parâmetros diferentes, rápido, lento e filtrado ao mesmo tempo. Uma média móvel é um sinal de compra quando uma linha rápida atravessa uma linha lenta e uma linha lenta atravessa uma linha lenta; ao contrário, é um sinal de venda.

  3. Indicador estocástico. O indicador determina o tempo de cruzamento de um polinômetro. Quando a linha %K atravessa a linha %D da direção inferior, é um sinal de compra; Quando a linha %K atravessa a direção superior, é um sinal de venda.

  4. O mecanismo de pontuação de correspondência. De acordo com a correspondência de vários fatores acima, a estratégia adota um mecanismo de pontuação. Quanto mais os fatores de correspondência, maior a intensidade do sinal correspondente.

Através de um julgamento multifatorial, a estratégia pode capturar mais oportunidades de negociação microscópicas no curto e médio prazo, resultando em ganhos extras em um mercado de alta.

Três, vantagens estratégicas

A maior vantagem da estratégia de combinação de múltiplos fatores para se adaptar à média móvel é aumentar a confiabilidade do sinal. Um único indicador técnico é suscetível a sinais errados, e esta estratégia, combinada com o uso de vários indicadores em parceria, pode efetivamente reduzir a interferência de falsos sinais.

Além disso, uma combinação de vários fatores pode aumentar a taxa de vitória das negociações, em comparação com apenas um indicador. Em um mercado de touros, as estratégias podem obter maiores ganhos acumulados.

Riscos estratégicos

O principal risco da estratégia é que a combinação de vários fatores aumenta a complexidade da estratégia. É necessário combinar a configuração de parâmetros de vários indicadores, ajustes frequentes, etc.

Além disso, em um mercado de baixa, a estratégia pode ser muito longa. Mesmo com um stop loss, é difícil evitar grandes perdas.

Além disso, os indicadores técnicos, como os indicadores estocásticos e os equilíbrios HA, são suscetíveis a eventos inesperados, que podem gerar sinais errados e causar prejuízos desnecessários.

Cinco, estratégias de otimização

A estratégia pode ser melhorada em vários aspectos:

  1. Otimizar as configurações de cada parâmetro do indicador para encontrar a combinação ideal de parâmetros.

  2. Adição de módulos de treinamento de modelos e adaptação de parâmetros, otimização de parâmetros em tempo real.

  3. Aumentar a estratégia de stop loss e reduzir a estratégia de maximizar a retirada.

  4. Adição de módulo de controle de posição para ajustar a posição de forma dinâmica de acordo com a situação do mercado.

  5. Modelagem de redes neurais com pontuação multifatorial, combinada com algoritmos de aprendizagem de máquina.

VI. Conclusão

A combinação de múltiplos fatores adapta-se a uma estratégia de média móvel integrada que usa os benefícios de vários indicadores técnicos. A estratégia pode aumentar efetivamente a qualidade do sinal e obter ganhos extras em um mercado de touros. Mas também aumenta a complexidade da estratégia, que precisa de mais testes e otimização.

Código-fonte da estratégia
/*backtest
start: 2022-12-08 00:00:00
end: 2023-12-14 00:00: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/
// © cyrule
//@version=4
strategy("2nd Grade Strategy", overlay=true, shorttitle="2GTS", max_lines_count = 500, max_labels_count = 500, calc_on_every_tick = true, calc_on_order_fills = true, pyramiding = 1, default_qty_type = strategy.percent_of_equity, default_qty_value = 10)

source = input(close, title = "Source")

// **********************
// * Heikin-Ahshi       *
// * kudos to garethyeo *
// **********************
showHA   = input(true, title = "Show Heikin Ashi?", group = "Heikin Ashi")
ha_open  = security(heikinashi(syminfo.tickerid), timeframe.period, open)
ha_high  = security(heikinashi(syminfo.tickerid), timeframe.period, high)
ha_low   = security(heikinashi(syminfo.tickerid), timeframe.period, low)
ha_close = security(heikinashi(syminfo.tickerid), timeframe.period, close)

bgcolor(iff(showHA and ha_open < ha_close , color.new(#53b987, transp = 92.5), na), title = 'Green HA')
bgcolor(iff(showHA and ha_open >= ha_close, color.new(#eb4d5c, transp = 92.5), na), title = 'Red HA'  )


// ******************
// * Moving Average *
// ******************
// MA Settings
showMA         = input(true, title = "Show Moving Averages?", group = "Moving Averages")
fastMALength   = input(title = "Fast MA Length", minval = 1, step = 1, defval = 20, group = "Moving Averages")
slowMALength   = input(title = "Slow MA Length", minval = 1, step = 1, defval = 50, group = "Moving Averages")
maType         = input(title = "Moving Average Type", defval = "SMA", options = ["SMA", "EMA", "RMA", "WMA", "VWMA"], group = "Moving Averages")
filterMALength = input(title = "Filter MA Length", minval = 1, step = 1, defval = 200, group = "Moving Averages")
filterMAType   = input(title = "Filter MA Type", defval = "EMA", options = ["SMA", "EMA", "RMA", "WMA", "VWMA"], group = "Moving Averages")

// Calculate MA
var float maFast   = na
var float maSlow   = na
var float maFilter = na

if (maType   == "SMA")
    maFast   := sma(source, fastMALength)
    maSlow   := sma(source, slowMALength)
if (maType   == "EMA")
    maFast   := ema(source, fastMALength)
    maSlow   := ema(source, slowMALength)
if (maType   == "RMA")
    maFast   := rma(source, fastMALength)
    maSlow   := rma(source, slowMALength)
    maFilter := rma(source, filterMALength)
if (maType   == "WMA")
    maFast   := wma(source, fastMALength)
    maSlow   := wma(source, slowMALength)
if (maType   == "VWMA")
    maFast   := vwma(source, fastMALength)
    maSlow   := vwma(source, slowMALength)

if (filterMAType == "SMA")
    maFilter     := sma(source, filterMALength)
if (filterMAType == "EMA")
    maFilter     := ema(source, filterMALength)
if (filterMAType == "RMA")
    maFilter     := rma(source, filterMALength)
if (filterMAType == "WMA")
    maFilter     := wma(source, filterMALength)
if (filterMAType == "VWMA")
    maFilter     := vwma(source, filterMALength)

BiruAtasMerah = (maFast >= maSlow) and (maSlow >= maFilter)
MerahAtasBiru = (maFast <= maSlow) and (maSlow <= maFilter)

// Lukis MA
plot(series = showMA ? maFast   : na, color = color.blue, title = "MA Fast")
plot(series = showMA ? maSlow   : na, color = color.red,  title = "MA Slow")
plot(series = showMA ? maFilter : na, color = #FFCC00,    title = "MA Filter")


// **************
// * Stochastic *
// **************
// Stochastic Settings
showSSC = input(true, title = "Show Stochastic Crossovers?", group = "Stochastic")
Length = input (10, minval = 1, title = "%K Length", group = "Stochastic")
SmoothK = input (3, minval = 1, title = "%K Smoothing", group = "Stochastic")
SmoothD = input (3, minval = 1, title = "%D Smoothing", group = "Stochastic")

// Calculate Stochastic
var float K = na
var float D = na

if (maType ==  "SMA")
	K      := sma(stoch(source, high, low, Length), SmoothK)
	D      := sma(K, SmoothD)
if (maType ==  "EMA")
	K      := ema(stoch(source, high, low, Length), SmoothK)
	D      := ema(K, SmoothD)
if (maType ==  "RMA")
	K      := rma(stoch(source, high, low, Length), SmoothK)
	D      := rma(K, SmoothD)
if (maType ==  "WMA")
	K      := wma(stoch(source, high, low, Length), SmoothK)
	D      := wma(K, SmoothD)
if (maType ==  "VWMA")
	K      := vwma(stoch(source, high, low, Length), SmoothK)
	D      := vwma(K, SmoothD)

StochasticCrossOver  = crossover(K, D)
StochasticCrossUnder = crossunder(K, D)

// Lukis SS
plotshape(showSSC and StochasticCrossOver  and K <=  20            ? K : na, text = "Golden\nCrossover",  color = color.new(color.green, transp = 25), location = location.belowbar, size = size.tiny, title = "Golden Crossover" )
plotshape(showSSC and StochasticCrossUnder and K >=  80            ? D : na, text = "Deadly\nCrossover",  color = color.new(color.red, transp = 25),   location = location.belowbar, size = size.tiny, title = "Deadly Crossover" )
plotshape(showSSC and StochasticCrossOver  and K <=  80 and K > 20 ? K : na, text = "Bullish\nCrossover", color = color.new(color.green, transp = 50), location = location.belowbar, size = size.tiny, title = "Bullish Crossover")
plotshape(showSSC and StochasticCrossUnder and K >=  20 and K < 80 ? D : na, text = "Bearish\nCrossover", color = color.new(color.red, transp = 50),   location = location.belowbar, size = size.tiny, title = "Bearish Crossover")

showBull = input(true, title = "Show Bullish Signal?", group = "Signal")
showBear = input(false, title = "Show Bearish Signal?", group = "Signal")

bullishCriteria = 0
if (ha_open < ha_close) and (ha_open[1] < ha_close[1]) and (ha_open[2] >= ha_close[2])
    bullishCriteria := bullishCriteria + 1
if (maFast > maSlow) and (maSlow > maFilter)
    bullishCriteria := bullishCriteria + 1
if (K > D) and (K > K[1]) and (D > D[1])
    bullishCriteria := bullishCriteria + 1

bearishCriteria = 0
if (ha_open >= ha_close) and (ha_open[1] >= ha_close[1]) and (ha_open[2] < ha_close[2])
    bearishCriteria := bearishCriteria + 1
if (maFast < maSlow) and (maSlow < maFilter)
    bearishCriteria := bearishCriteria + 1
if (K < D) and (K < K[1]) and (D < D[1])
    bearishCriteria := bearishCriteria + 1

signal = color.new(color.white, transp = 0)
if bearishCriteria == 2
    signal := color.new(color.orange, transp = 50)
if bearishCriteria == 3
    signal := color.new(color.red, transp = 50)
if bullishCriteria == 2
    signal := color.new(color.aqua, transp = 50)
if bullishCriteria == 3
    signal := color.new(color.green, transp = 50)

bullishCriteria := showBull ? bullishCriteria : 0
bearishCriteria := showBear ? bearishCriteria : 0

bgcolor(iff(bullishCriteria > 1, signal, na), title = 'Bullish Signal')
bgcolor(iff(bearishCriteria > 1, signal, na), title = 'Bearish Signal')

longTPPerc  = input(title = "Take Profit Threshold (%)"            , minval = 0.0, step = 0.5, defval = 2.5, group = "Trading") / 100
profitRatio = input(title = "Profit-to-Loss ratio (risk tolerance)", minval = 1.0, step = 0.1, defval = 1.4, group = "Trading")
longSLPerc  = longTPPerc / profitRatio
takeProfit  = strategy.position_avg_price * (1 + longTPPerc)
stopLoss    = strategy.position_avg_price * (1 - longSLPerc)
strategy.initial_capital = 50000
strategy.entry("Long" , strategy.long , floor(strategy.initial_capital*.1/close), stop = strategy.position_avg_price * 1.25, when = bullishCriteria > 1)
strategy.entry("Short", strategy.short, floor(strategy.initial_capital*.1/close), stop = strategy.position_avg_price * 1.25, when = bearishCriteria > 1)
strategy.close("Long" , when = (open >= takeProfit) or (open <= stopLoss) or (high >= takeProfit) or (low <= stopLoss))
strategy.close("Short", when = (open >= takeProfit) or (open <= stopLoss) or (high >= takeProfit) or (low <= stopLoss))

plotshape(bullishCriteria, location = location.belowbar, color = color.new(color.black, transp = 100))
plotshape(bearishCriteria, location = location.belowbar, color = color.new(color.black, transp = 100))