Estratégia de negociação quantitativa de vetor de tendência de média móvel

SMMA MA EMA DEMA TEMA WMA VWMA HullMA LSMA ALMA SSMA TMA SL TP
Data de criação: 2025-02-20 10:59:37 última modificação: 2025-02-27 17:49:25
cópia: 2 Cliques: 383
2
focar em
319
Seguidores

Estratégia de negociação quantitativa de vetor de tendência de média móvel Estratégia de negociação quantitativa de vetor de tendência de média móvel

Visão geral

Trata-se de uma estratégia de negociação quantitativa baseada em múltiplos sinais de cruzamento de médias móveis. A estratégia utiliza um cruzamento de médias móveis de preços de abertura e de fechamento como sinal de negociação e suporta vários tipos de médias móveis, incluindo SMMA, EMA, DEMA, etc. A estratégia é altamente configurável e pode ser otimizada para parâmetros de acordo com diferentes ambientes de mercado e necessidades de negociação.

Princípio da estratégia

O núcleo da estratégia é identificar o ponto de conversão da tendência do mercado, monitorando o cruzamento entre a média móvel de abertura e a média móvel de fechamento. Quando o preço de fechamento cruza a média de abertura, um sinal de multiplicação é gerado; Quando o preço de fechamento cruza a média de abertura abaixo da média de abertura, um sinal de ruptura é gerado. A estratégia suporta o retorno de vários períodos de tempo e oferece um recurso de parada para gerenciar o risco.

Vantagens estratégicas

  1. Flexível escolha de linha média: Suporte a 11 diferentes tipos de linha média móvel, que podem ser escolhidos de acordo com as características do mercado.
  2. Gestão de risco: mecanismo de parada e parada de perda embutida para controlar o risco de cada transação.
  3. Adaptação de múltiplos períodos: suporta múltiplos períodos de tempo, de minutos a meses, e pode ser otimizado para múltiplos períodos por meio de ajustes de parâmetros.
  4. Suporte de visualização: fornece a função de marcação de tendências em cores, facilitando a compreensão intuitiva do movimento do mercado.

Risco estratégico

  1. Risco de atraso: a média móvel é essencialmente um indicador de atraso, podendo gerar sinais de atraso em mercados altamente voláteis.
  2. Risco de mercado de choque: em mercados de choque horizontal, os sinais de cruzamento frequentes podem levar a excesso de negociação.
  3. Dependência de parâmetros: a eficácia da estratégia depende fortemente da escolha de parâmetros, e diferentes ambientes de mercado podem exigir diferentes combinações de parâmetros.

Direção de otimização da estratégia

  1. Filtragem de sinais: pode-se adicionar indicadores auxiliares, como volume de tráfego, taxa de flutuação e outros, para filtrar sinais falsos.
  2. Parâmetros dinâmicos: introdução de um mecanismo de parâmetros de adaptação, ajustando o período e o tipo da linha média de acordo com a dinâmica da situação do mercado.
  3. Gerenciamento de posições: otimização do sistema de gerenciamento de posições, ajustando dinamicamente a proporção de posições de acordo com a volatilidade do mercado e a intensidade da tendência.

Resumir

A estratégia capta pontos de conversão de tendências de mercado por meio de sinais de cruzamento de múltiplos equilíbrios móveis e possui uma maior capacidade de configuração e gerenciamento de risco. Com a otimização de parâmetros e filtragem de sinais razoáveis, o desempenho estável pode ser mantido em diferentes ambientes de mercado. A chave para o sucesso da estratégia está na escolha do tipo e da combinação de parâmetros de equilíbrio adequados e na criação de um mecanismo de controle de risco eficaz.

Código-fonte da estratégia
/*backtest
start: 2024-08-01 00:00:00
end: 2025-02-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("Open Close Cross Strategy v6", 
     overlay=true, 
     pyramiding=0, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=10,
     calc_on_every_tick=false)

// === INPUTS ===
var bool useRes = input.bool(true, "Use Alternate Resolution?")
var int intRes = input.int(3, "Multiplier for Alternate Resolution")
var string basisType = input.string("SMMA", "MA Type: ", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "HullMA", "LSMA", "ALMA", "SSMA", "TMA"])
var int basisLen = input.int(8, "MA Period", minval=1)
var int offsetSigma = input.int(6, "Offset for LSMA / Sigma for ALMA", minval=0)
var float offsetALMA = input.float(0.85, "Offset for ALMA", minval=0, step=0.01)
var bool scolor = input.bool(false, "Show coloured Bars to indicate Trend?")
var int delayOffset = input.int(0, "Delay Open/Close MA (Forces Non-Repainting)", minval=0, step=1)
var string tradeType = input.string("BOTH", "What trades should be taken : ", options=["LONG", "SHORT", "BOTH", "NONE"])
var float slPoints = input.float(0, "Initial Stop Loss Points (zero to disable)", minval=0)
var float tpPoints = input.float(0, "Initial Target Profit Points (zero for disable)", minval=0)
var int ebar = input.int(10000, "Number of Bars for Back Testing", minval=0)
var bool dummy = input.bool(false, "- SET to ZERO for Daily or Longer Timeframes")

// Определение таймфрейма для alternate resolution
getAlternateResolution() =>
    timeframe.ismonthly ? str.tostring(timeframe.multiplier * intRes) + "M" :
         timeframe.isweekly ? str.tostring(timeframe.multiplier * intRes) + "W" :
         timeframe.isdaily ? str.tostring(timeframe.multiplier * intRes) + "D" :
         timeframe.isintraday ? str.tostring(timeframe.multiplier * intRes) : "60"

stratRes = getAlternateResolution()

// === MA Functions ===
variant(type, src, len, offSig, offALMA) =>
    float result = switch type
        "EMA" => ta.ema(src, len)
        "DEMA" => 2 * ta.ema(src, len) - ta.ema(ta.ema(src, len), len)
        "TEMA" => 3 * (ta.ema(src, len) - ta.ema(ta.ema(src, len), len)) + ta.ema(ta.ema(ta.ema(src, len), len), len)
        "WMA" => ta.wma(src, len)
        "VWMA" => ta.vwma(src, len)
        "SMMA" => ta.sma(src, len)  // Упрощенная версия SMMA
        "HullMA" => ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len)))
        "LSMA" => ta.linreg(src, len, offSig)
        "ALMA" => ta.alma(src, len, offALMA, offSig)
        "TMA" => ta.sma(ta.sma(src, len), len)
        "SSMA" => 
            a1 = math.exp(-1.414 * math.pi / len)
            b1 = 2 * a1 * math.cos(1.414 * math.pi / len)
            c2 = b1
            c3 = -a1 * a1
            c1 = 1 - c2 - c3
            c1 * (src + nz(src[1])) / 2 + c2 * nz(ta.sma(src, len)[1]) + c3 * nz(ta.sma(src, len)[2])
        => ta.sma(src, len)

// === Series Setup ===
closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)

// Get Alternate resolution Series
closeSeriesAlt = useRes ? request.security(syminfo.tickerid, stratRes, closeSeries, barmerge.gaps_off, barmerge.lookahead_on) : closeSeries
openSeriesAlt = useRes ? request.security(syminfo.tickerid, stratRes, openSeries, barmerge.gaps_off, barmerge.lookahead_on) : openSeries

// === Plotting ===
color trendColor = closeSeriesAlt > openSeriesAlt ? color.green : color.red
color barColor = closeSeries > openSeriesAlt ? color.new(color.lime, 0) : color.new(color.red, 0)

// Перемещаем barcolor в глобальную область видимости
barcolor(scolor ? barColor : na)

var closePlot = plot(closeSeriesAlt, "Close Series", trendColor, 2, plot.style_line)
var openPlot = plot(openSeriesAlt, "Open Series", trendColor, 2, plot.style_line)
fill(closePlot, openPlot, color=trendColor)

// === Trade Conditions ===
xlong = ta.crossover(closeSeriesAlt, openSeriesAlt)
xshort = ta.crossunder(closeSeriesAlt, openSeriesAlt)
longCond = xlong
shortCond = xshort

// === Strategy Logic ===
float tp = tpPoints > 0 ? tpPoints : na
float sl = slPoints > 0 ? slPoints : na

var int lastPositionType = 0  // 1 для long, -1 для short, 0 для нет позиции

if ebar == 0 or (timenow - time) / (timeframe.multiplier * 60000) <= ebar and tradeType != "NONE"
    // Закрытие позиций
    if lastPositionType == 1 and shortCond
        strategy.close("long")
        lastPositionType := 0
        label.new(bar_index, high, "Exit Long", color=color.red, style=label.style_label_down, textcolor=color.white)
    
    if lastPositionType == -1 and longCond
        strategy.close("short")
        lastPositionType := 0
        label.new(bar_index, low, "Exit Short", color=color.green, style=label.style_label_up, textcolor=color.white)
    
    // Открытие новых позиций
    if longCond and tradeType != "SHORT" and lastPositionType == 0
        strategy.entry("long", strategy.long)
        lastPositionType := 1
        label.new(bar_index, low, "Long", color=color.green, style=label.style_label_up, textcolor=color.white)
    
    if shortCond and tradeType != "LONG" and lastPositionType == 0
        strategy.entry("short", strategy.short)
        lastPositionType := -1
        label.new(bar_index, high, "Short", color=color.red, style=label.style_label_down, textcolor=color.white)
    
    // Take Profit и Stop Loss
    if lastPositionType != 0
        strategy.exit("TP/SL", profit=tp, loss=sl)