Estratégia de alta contínua de clique duplo de média móvel golden cross


Data de criação: 2023-11-13 10:47:48 última modificação: 2023-11-13 10:47:48
cópia: 0 Cliques: 649
1
focar em
1617
Seguidores

Estratégia de alta contínua de clique duplo de média móvel golden cross

Visão geral

Esta é uma estratégia de negociação que utiliza a forma de um forco de ouro de média móvel, em conjunto com a linha de tendência de forma contínua ascendente. Quando a linha rápida da direção inferior quebra a linha lenta, formando um sinal de forca de ouro. Se a tendência após a forca de ouro pode continuar para cima, então você pode abrir mais posição nesta fase.

Princípio da estratégia

A estratégia baseia-se principalmente na forma do forquinho de ouro da média móvel para determinar o momento de entrada. Concretamente, define uma média móvel rápida MA1 e uma média móvel lenta MA2. Quando a MA1 se rompe com a MA2 a partir da direção de baixo, é sinal de fazer mais.

A fim de evitar falsos sinais causados por um curto-prazo Gold Forks, a estratégia incluiu um julgamento de angular devaluação, ou seja, apenas quando o ângulo de MA2 é maior do que o valor de queda definido para desencadear um sinal de compra. Isso pode filtrar algumas subidas de curto prazo não-trend.

A estratégia estabelece simultaneamente uma linha de stop loss e uma linha de stop loss. A linha de stop loss é usada para evitar perdas causadas por uma mudança súbita no mercado, e a linha de stop loss é usada para bloquear a saída de lucro. A linha de stop loss é especificamente definida como um determinado percentual do preço de entrada.

Quando a subida do preço atinge o ponto de parada, a estratégia opta por parar e sair do campo. Ao mesmo tempo, se a subida for forte nesta rodada, a estratégia fará uma operação de reversão de baixa novamente.

Análise de vantagens

É uma estratégia de seguimento de tendências simples e intuitiva, mas que tem as seguintes vantagens:

  1. Combinação de médias móveis para filtrar o ruído do mercado e bloquear a direção da tendência
  2. Os ângulos de defesa evitam oscilações de curto prazo
  3. Operação bidirecional para lucrar em situações de turbulência
  4. Configurar o Stop Loss Stop, controlar o risco

Análise de Riscos

A estratégia também apresenta alguns riscos que devem ser lembrados:

  1. A média móvel está atrasada e pode ter perdido o ponto de inflexão
  2. Embora haja um stop loss, existe uma probabilidade de que o stop loss seja ultrapassado em um mercado que muda instantaneamente
  3. Riscos duplicados em transações bilaterais, com a escolha incorreta de pontos de venda que podem causar prejuízos
  4. Parâmetros indevidamente definidos, como a seleção do ciclo da média móvel, podem afetar o desempenho da estratégia

Direção de otimização

A estratégia pode ser melhorada em alguns aspectos:

  1. Aumentar os indicadores de tendência, como MACD, Brinks, etc., para melhorar a precisão de localização
  2. Parâmetros periódicos de média móvel de otimização dinâmica com métodos como aprendizado de máquina
  3. Optimizar as configurações de stop loss, como o uso de stop loss tracking, etc.
  4. Aumentar o controle do volume de transações para evitar perdas excessivas
  5. Indicadores como o indicador de segmento e outros indicam a intensidade da tendência desta rodada, ajustando dinamicamente a força de abertura de posição

Resumir

No geral, esta é uma estratégia de acompanhamento de tendências simples e práticas. Ela possui certas vantagens, mas também precisa estar atenta aos riscos. Melhorias podem ser obtidas com a otimização de parâmetros adicionais, a seleção de indicadores, a configuração de stop-loss, etc. Mas nenhuma estratégia pode evitar completamente o risco sistemático do mercado.

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

//written by [email protected]
//@version=5
strategy(title="MJ-Dual Moving Average",initial_capital=10000,overlay=false)

// import TradingView/ZigZag/6 as ZigZagLib 

// // Create Zig Zag instance from user settings.
// var zigZag = ZigZagLib.newInstance(
//   ZigZagLib.Settings.new(
//       input.float(5.0, "Price deviation for reversals (%)", 0.00001, 100.0, 0.5, "0.00001 - 100"),
//       input.int(10, "Pivot legs", 2),
//       input(#2962FF, "Line color"),
//       input(true, "Extend to last bar"),
//       input(true, "Display reversal price"),
//       input(true, "Display cumulative volume"),
//       input(true, "Display reversal price change", inline = "priceRev"),
//       input.string("Absolute", "", ["Absolute", "Percent"], inline = "priceRev"),
//       true)
//  )

// // Update 'zigZag' object on each bar with new ​pivots, ​volume, lines, labels.
// zigZag.update()
// // plot(zigZag.pivots, "zigZag")

ma1= ta.sma(close,8)
ma2= ta.sma(close,21)

angleCriteria = input.int(title="Angle", defval=7, minval=1, maxval=13)

i_lookback   = input.int(2,     "Angle Period", minval = 1)
i_atrPeriod  = input.int(10,    "ATR Period",   minval = 1)
i_angleLevel = input.int(6,     "Angle Level",  minval = 1)
i_maSource   = input.source(close, "MA Source")
TP = input.float(1, "TP", minval = 0.1)
SL = input.float(1, "SL", minval = 0.1)

f_angle(_src, _lookback, _atrPeriod) =>
    rad2degree = 180 / 3.141592653589793238462643  //pi 
    ang = rad2degree * math.atan((_src[0] - _src[_lookback]) / ta.atr(_atrPeriod)/_lookback)
    ang
_angle = f_angle(ma2, i_lookback, i_atrPeriod)
plot(ta.atr(i_atrPeriod), "atr")
// plot(ma1,color=#FF0000)
// plot(ma2,color=#00FF00)

crosso=ta.crossover(ma1,ma2) 
crossu=ta.crossunder(ma1,ma2)

_lookback = 15

f_somethingHappened(_cond, _lookback) =>
    bool _crossed = false
    for i = 1 to _lookback
        if _cond[i]
            _crossed := true
    _crossed
    
longcrossed = f_somethingHappened(crosso,_lookback)
shortcrossed = f_somethingHappened(crossu,_lookback)

atr_factor = 1
atr = ta.atr(i_atrPeriod)
e = atr * atr_factor 

afr = close 
afr := nz(afr[1], afr)

atr_factoryHigh = close + e
atr_factoryLow = close - e 

if atr_factoryLow > afr 
    afr := atr_factoryLow
if atr_factoryHigh < afr 
    afr := atr_factoryHigh

// plot(afr, "afr", display = display.data_window)
// plot(atr_factoryHigh, "afr", color = color.yellow, display = display.all)
// plot(atr_factoryLow, "afr", color = color.green, display = display.all)


inLong() => strategy.position_size > 0
inShort() => strategy.position_size < 0
inZero() => not inLong() and not inShort()

long = longcrossed and _angle > angleCriteria
short= shortcrossed and _angle < -(angleCriteria)

plotshape(long, "Buy", shape.arrowup, location.belowbar, color = #FF0000)
plotshape(short, "Sell", shape.arrowdown, location.abovebar, color = #00FF00)

var longTp = 0.0
var longSl = 0.0
var shortTp = 0.0
var shortSl = 0.0
[b_middle, b_high, b_low] = ta.bb(close, 20, 2)
entry_price = strategy.opentrades.entry_price(0)

if inZero()
    if short
        longTp := close * (1 + TP/100)
        longSl := close * (1 - SL/100)
        strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))
    if long
        shortTp := close * (1 - TP/100)
        shortSl := close * (1 + SL/100)
        strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

if inLong()
    // if close - entry_price > close * 0.005
    //     longSl := entry_price + close * 0.001
    if high > longTp
        strategy.close("LONG")
        if (close - open) > close * 0.014
            shortTp := close * (1 - TP/100)
            shortSl := close * (1 + SL/100)
            strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

    if close < longSl
        strategy.close("LONG")
    if open >= b_high and close >= b_high
        strategy.close("LONG")
    // if high > b_high and entry_price < high
    //     strategy.close("LONG")


if inShort()
    // if entry_price - close > close * 0.005
    //     shortSl := entry_price - close * 0.001
    if low < shortTp
        strategy.close("SHORT")
        if (open - close) > close * 0.014
            longTp := close * (1 + TP/100)
            longSl := close * (1 - SL/100)
            strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))


    if close > shortSl
        strategy.close("SHORT")
    if open < b_low and close < b_low
        strategy.close("SHORT")
    // if low < b_low and entry_price > low
    //     strategy.close("SHORT")