Estratégia de negociação Golden Cross


Data de criação: 2024-01-26 14:29:01 última modificação: 2024-01-26 14:29:01
cópia: 4 Cliques: 613
1
focar em
1617
Seguidores

Estratégia de negociação Golden Cross

Visão geral

A estratégia de negociação de cruzamento de golden cross utiliza a cruzamento de médias móveis de dois períodos diferentes como um sinal de compra e venda. Concretamente, quando a média móvel de curto período atravessa a média móvel de longo período a partir da direção inferior, gera um sinal de cruzamento de ouro, indicando que o preço está em alta; quando a média móvel de curto período a partir da direção de cima cai e quebra a média móvel de longo período, gera um sinal de cruzamento de morte, indicando que o preço está em baixa.

Princípio da estratégia

A estratégia baseia-se em dois princípios:

  1. As médias móveis de curto prazo capturam as tendências e os pontos de inflexão mais recentes; as médias móveis de longo prazo representam as principais tendências do mercado.

  2. Quando a média móvel de curto prazo e a média móvel de longo prazo formam uma cruz dourada, indica que a força do mercado de curto prazo supera a força da tendência de longo prazo e, portanto, é provável que comece uma nova tendência ascendente. Quando a cruz da morte se forma, indica que a tendência de queda de longo prazo é dominante e, portanto, é provável que a queda continue.

Especificamente, a estratégia define uma média móvel simples de 13 e 30 períodos e gera um sinal de negociação quando eles se cruzam. O princípio do cruzamento é o seguinte:

  1. Quando a média móvel de curto período atravessa a média móvel de longo período, um sinal de cruzamento dourado é gerado, indicando uma oportunidade de fazer mais. Nesse caso, entre por meio da avaliação da robustez da tendência: se o preço mantiver a alta acima de um determinado ciclo, tenha confiança de que a tendência atual é alta, então faça mais.

  2. Quando a média móvel de curto prazo atravessa a média móvel de longo prazo, um sinal de cruzamento de morte é gerado, indicando uma oportunidade de curto prazo. Nesse caso, a entrada é feita através da avaliação da robustez da tendência: se o preço mantiver a queda por mais de um determinado período, tenha confiança de que a tendência atual é descendente, então faça curto prazo.

  3. A intensidade do sinal de cruzamento é avaliada através da inclinação da média móvel. O sinal de cruzamento é considerado forte o suficiente para ser admitido somente quando a inclinação da média móvel curta e longa é maior do que um determinado limite. Isso inhibe a interferência do sinal de falso comum.

  4. O Stop Loss está definido em 20% e o Stop Stop em 100%.

Análise de vantagens

A estratégia de duplo equilíbrio tem as seguintes vantagens:

  1. A ideia é clara, simples, fácil de entender e implementar, adequada para iniciantes.

  2. O uso de características médias de preços tem um certo efeito de redução de ruído, evitando ser enganado por flutuações de preços de curto prazo.

  3. Avaliar a robustez da tendência, evitando fazer mais vazio mecanicamente, mas combinando com o julgamento do grande mercado.

  4. A introdução de um fator de gradiente móvel na média móvel tornou o sinal mais confiável.

  5. A otimização da retrospectiva é simples, apenas precisando ajustar alguns parâmetros-chave, como o parâmetro da média móvel e o tempo de resistência da tendência.

Análise de Riscos

A estratégia também apresenta os seguintes riscos:

  1. O cruzamento de duas eqüilíbrias continua sendo um sinal de atraso, não prevendo perfeitamente o ponto de inflexão, existindo um certo grau de atraso. O ciclo da média móvel deve ser apropriadamente reduzido ou usado em conjunto com fatores que podem prever o ponto de inflexão.

  2. Os sistemas de negociação mecânica são vulneráveis a ataques coletivos e simultâneos, o que agrava a situação de excesso, fazendo com que a parada de perda ou o bloqueio não seja eficaz. Deve ser configurado um bloqueio de perda de escala, ou intervenção manual apropriada.

  3. Não é possível lidar bem com oscilações, deve-se evitar variedades que se repetem horizontalmente durante esse tipo de ciclo, escolher variedades com uma direção clara para o comércio.

  4. A janela de tempo para avaliar a robustez da tendência é definida de modo que, se houver ou não um grande impacto nos resultados, os testes repetidos determinam o valor ideal.

Direção de otimização

A estratégia de duplo equilíbrio entre linhas pode ser melhorada em:

  1. Adicionar indicadores para avaliar tendências de grande escala, evitando operações de contracorrente. Por exemplo, adicionar a posição de uma circunferência de comparação ou de uma linha lunar.

  2. Adicione a verificação do volume de transações, emitindo sinais apenas em caso de aumento do volume de transações, evitando sinais falsos.

  3. Optimizar os parâmetros da média móvel para encontrar a melhor combinação de períodos. Você pode tentar adaptar os parâmetros da média móvel.

  4. A combinação de indicadores de fórmulas convencionais, como MACD, KD e outros julgamentos auxiliares, aumenta a precisão do sinal.

  5. A instalação de um travão de parada em escala permite um melhor controlo do risco.

Resumir

A estratégia de cruzamento de duas equações é, em geral, uma estratégia muito intuitiva e interpretável. Combina as características de desnível de ruído das médias móveis com a capacidade de identificar tendências simples de julgamento de cruzamento. Ao mesmo tempo, a verificação do sinal, evitando o seguimento cego, também aumenta sua praticidade e estabilidade.

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

//@version=4

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © MakeMoneyCoESTB2020


//*********************Notes for continued work***************

//************************************************************

//Hello my fellow investors
//I am creating a simple non-cluttered strategy that uses 3(+1) simple means to determine: viability, entry, and exit
//1) Has a consistent trend been maintained for several days/weeks
//2) SH SMA crossover LG SMA = Bullish entry/LG SMA crossover SH SMA = Bearish entry
//3) Use the Slope factor & Weeks in Trend (WiT) to dertermine how strong of an entry signal you are comfortable with
//4) Exit position based on next SMA cross and trend reversal or stop loss%
//3+1) For added confidence in trend detection: Apply MACD check - buy--> MACD line above signal line and corssover below histogram \\ sell --> MACD line below signal line and crossover above histogram.
//*)This code also allows you to determine your desired backtesting date compliments of alanaster


//This code is the product of many hours of hard work on the part of the greater tradingview community.  The credit goes to everyone in the community who has put code out there for the greater good.

//Happy Hunting!

// 1. Define strategy settings*************************************************************************************************************************************************************************

//Title
strategy("KISS Strategy: SMA + EMA", shorttitle="KISS Strat")

//define calculations price source
price = input(title="Price Source", defval=close)

// 2. Calculate strategy values*************************************************************************************************************************************************************************

//Calculate 13/30/200SMA 
SH_SMA_length= input(title="SH SMA Length", defval=13) //short SMA length
LG_SMA_length= input(title="LG SMA Length", defval=30) //long SMA length
GV_SMA_length= input(title="SH SMA Length", defval=200) //Gravitational SMA length

SH_SMA=sma(price, SH_SMA_length) //short SMA 
LG_SMA=sma(price, LG_SMA_length) //long SMA
GV_SMA=sma(price, GV_SMA_length) //gravitational SMA

//calculate MACD
//define variables for speed
fast = 12, slow = 26
//define parameters to calculate MACD
fastMA = ema(price, fast)
slowMA = ema(price, slow)
//define MACD line
macd = fastMA - slowMA
//define SIGNAL line
signal = sma(macd, 9)

//Determine what type of trend we are in
dcp = security(syminfo.tickerid, 'D', close)   //daily close price 
wcp = security(syminfo.tickerid, 'W', close)   //weekly close price 

WiT = input(title="Weeks In Trend", defval=1, maxval=5, minval=1)    //User input for how many weeks of price action to evaluate (Weeks in Trend = WiT)
BearTrend = false       //initialize trend variables as false
BullTrend = false       //initialize trend variables as false

// BullTrend := (wcp > SH_SMA) and (SH_SMA > LG_SMA)  //true if price is trending up based on weekly price close
// BearTrend := (wcp < SH_SMA) and (SH_SMA < LG_SMA)  //true if price is trending down based on weekly price close


// BullTrend := (price > SH_SMA) and (SH_SMA > LG_SMA)  //true if price is trending up
// BearTrend := (price < SH_SMA) and (SH_SMA < LG_SMA)  //true if price is trending down

//Determine if the market has been in a trend for 'n' weeks

n=WiT                           //create loop internal counting variable
for i=1 to WiT                  //create loop to determine if BearTrend=true to set number of weeks
    if (wcp[n] < price)         //evaluate if BearTrend=false comparing the current price to a paticular week close
        BearTrend := false      //set value to false if older price value is less than newer: trending up
        break                   //break out of for loop when trend first falters
    if (wcp[n] > price)         //evaluate if BearTrend=true comparing the current price to a paticular week close
        BearTrend := true       //set value to true if older price value is greater than newer: trending down
    n:=n-1                      //set internal counter one day closer to present

m=WiT                           //create loop internal counting variable
for j=1 to WiT                  //create loop to determine if BearTrend=true to set number of weeks
    if (wcp[m] > price)         //evaluate if BullTrend=false comparing the current price to a paticular week close
        BullTrend := false      //set value to false if older price value is greater than newer: trending down
        break                   //break out of for loop when trend first falters
    if (wcp[m] < price)         //evaluate if BullTrend=true comparing the current price to a paticular week close
        BullTrend := true       //set value to true if older price value is less than newer: trending up
    m:=m-1                      //set internal counter one day closer to present


//Determine if crossings occur
SH_LGcrossover = crossover(SH_SMA, LG_SMA)  //returns true if short crosses over long
SH_LGcrossunder = crossunder(SH_SMA, LG_SMA)    //returns true if short crosses under long

//Determine the slope of the SMAs when a cross over occurs
SlopeFactor= input(title="Slope Factor", defval=.01, minval=0, step = 0.001) //user input variable for what slope to evaluate against
XSlopeSH = abs(SH_SMA-SH_SMA[2]) //slope of short moving average (time cancels out)
XSlopeLG = abs(LG_SMA-LG_SMA[2]) //slope of long moving average (time cancels out)
StrongSlope = iff (abs(XSlopeSH-XSlopeLG)>SlopeFactor, true, false) //create a boolean variable to determine is slope intensity requirement is met

// ************************************ INPUT BACKTEST RANGE ******************************************=== coutesy of alanaster
fromMonth = input(defval = 4,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2020, title = "From Year",       type = input.integer, minval = 1970)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2112, title = "Thru Year",       type = input.integer, minval = 1970)

// === INPUT SHOW PLOT ===
showDate  = input(defval = true, title = "Show Date Range", type = input.bool)

// === FUNCTION EXAMPLE ===
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => true

bgcolor(color = showDate and window() ? color.gray : na, transp = 90) 
// === EXECUTION ===
//strategy.entry("L", strategy.long, when = window() and crossOv)    // enter long when "within window of time" AND crossover
//strategy.close("L", when = window() and crossUn)                   // exit long when "within window of time" AND crossunder

// 3. Output strategy data*************************************************************************************************************************************************************************

//Embolden line if a trend exists
trendcolorLG = BearTrend?color.red:color.black //highlights beartrend condition met graphically
trendcolorSH = BullTrend?color.green:color.black //highlights beartrend condition met graphically

//plot SMAs
plot(SH_SMA, title = "SH SMA", color = trendcolorSH)
plot(LG_SMA, title = "LG SMA", color = trendcolorLG)
plot(GV_SMA, title = "GV SMA", color = color.silver, linewidth = 4, transp = 70)

//Highlight crossovers
plotshape(series=SH_LGcrossover, style=shape.arrowup, location=location.belowbar,size=size.normal, color=color.green)
plotshape(series=SH_LGcrossunder, style=shape.arrowdown, location=location.abovebar,size=size.normal, color=color.red)

// 4. Determine Long & Short Entry Calculations*************************************************************************************************************************************************************************

//Define countback variable
countback=input(minval=0, maxval=5, title="Price CountBack", defval=0)
//User input for what evaluations to run: SMA or SMA + EMA
SMA_Y_N=input(defval = "Y", title="Run SMA", type=input.string, options=["Y", "N"])
MACD_Y_N=input(defval = "N", title="Run MACD", type=input.string, options=["Y", "N"])

//Calculate SMA Cross entry conditions
SMAbuy=false
SMAsell=false
SMAbuy := SH_LGcrossover and StrongSlope and BearTrend[WiT*7]   //enter long if short SMA crosses over long SMA & security has been in a BearTrend for 'n' days back
SMAsell := SH_LGcrossunder and StrongSlope and BullTrend[WiT*7] //enter short if short SMA crosses under long SMA & security has been in a BullTrend for 'n' days back

//Calculate MACD Cross entry conditions
MACDbuy = iff(MACD_Y_N=="Y", crossunder(signal[countback], macd[countback]), true) and iff(MACD_Y_N=="Y", macd[countback]<0, true) and StrongSlope and BearTrend     //enter long if fast MACD crosses over slow MACD & there is a strong slope & security has been in a BearTrend for 'n' days back
MACDsell = iff(MACD_Y_N=="Y", crossunder(macd[countback], signal[countback]), true) and iff(MACD_Y_N=="Y", signal[countback]>0, true) and StrongSlope and BullTrend  //enter short if fast MACD crosses under slow MACD & there is a strong slope & security has been in a BullTrend for 'n' days back

//long entry condition
dataHCLB=(iff(SMA_Y_N=="Y", SMAbuy, true) and iff(MACD_Y_N=="Y", MACDbuy, true))
plotshape(dataHCLB, title= "HC-LB", color=color.lime, style=shape.circle, text="HC-LB")
strategy.entry("HC-Long", strategy.long, comment="HC-Long", when = dataHCLB and window())

//short entry condition
dataHCSB=(iff(SMA_Y_N=="Y", SMAsell, true) and iff(MACD_Y_N=="Y", MACDsell, true))
plotshape(dataHCSB, title= "HC-SB", color=color.fuchsia, style=shape.circle, text="HC-SB")
strategy.entry("HC-Short", strategy.short, comment="HC-Short", when=dataHCSB and window())


// 5. Submit Profit and Loss Exit Calculations Orders*************************************************************************************************************************************************************************

// User Options to Change Inputs (%)
stopPer = input(12, title='Stop Loss %', type=input.float) / 100
takePer = input(25, title='Take Profit %', type=input.float) / 100

// Determine where you've entered and in what direction
longStop = strategy.position_avg_price * (1 - stopPer)
shortStop = strategy.position_avg_price * (1 + stopPer)
shortTake = strategy.position_avg_price * (1 - takePer)
longTake = strategy.position_avg_price * (1 + takePer)

//exit position conditions and orders
if strategy.position_size > 0//or crossunder(price[countback], upperBB)
    strategy.exit(id="Close Long", when = window(), stop=longStop, limit=longTake)
if strategy.position_size < 0 //or crossover(price[countback], lowerBB)
    strategy.exit(id="Close Short", when = window(), stop=shortStop, limit=shortTake)





//Evaluate/debug equation***************************************************************************************************************************************************************************
// plotshape((n==5? true : na), title='n=5', style=shape.labeldown, location=location.abovebar, text='5', color=color.white, textcolor=color.black, transp=0) //print n value if 5
// plotshape((n==4? true : na), title='n=4', style=shape.labeldown, location=location.abovebar, text='4', color=color.white, textcolor=color.black, transp=0) //print n value if 4 
// plotshape((n==3? true : na), title='n=3', style=shape.labeldown, location=location.abovebar, text='3', color=color.white, textcolor=color.black, transp=0) //print n value if 3
// plotshape((n==2? true : na), title='n=2', style=shape.labeldown, location=location.abovebar, text='2', color=color.white, textcolor=color.black, transp=0) //print n value if 2
// plotshape((n==1? true : na), title='n=1', style=shape.labeldown, location=location.abovebar, text='1', color=color.white, textcolor=color.black, transp=0) //print n value if 1
// lineValue = 11                                           //set random visible line value to check when equation is true
// colorP = (BearTrend==true) ? color.green : color.red
// plot (lineValue, title = "BearTrend", color = colorP)   //Plot when condition true=green, false=red
// plot (XSlopeLG+15, color=color.white) //used for code debugging
// plot (XSlopeSH+15, color=color.blue) //used for code debugging
// plot (abs(XSlopeSH-XSlopeLG)+20, color=color.fuchsia) //used for code debugging