
La estrategia de negociación de cruce de golden cross utiliza el cruce de las medias móviles de dos períodos diferentes como una señal de compra y venta. Específicamente, cuando las medias móviles de corto período rompen las medias móviles de largo período desde la parte inferior, se produce una señal de cruce de oro, lo que significa que el precio se vuelve alcista; cuando las medias móviles de corto período caen desde la parte superior y rompen las medias móviles de largo período, se produce una señal de cruce muerto, lo que significa que el precio se vuelve bajista.
La estrategia se basa en dos principios:
Las medias móviles reflejan la tendencia y la fuerza del mercado. Las medias móviles de corto plazo capturan los movimientos y los puntos de inflexión más recientes del mercado. Las medias móviles de largo plazo muestran las principales tendencias del mercado.
Cuando las medias móviles de corto plazo y las medias móviles de largo plazo forman cruces doradas, indican que la fuerza del mercado a corto plazo supera la fuerza de la tendencia a largo plazo, por lo que es probable que comience una nueva tendencia alcista. Cuando se forman cruces muertas, indican que la tendencia bajista a largo plazo es dominante, por lo que es probable que continúe bajando.
Concretamente, la estrategia establece un promedio móvil simple de 13 y 30 períodos y genera una señal de negociación cuando se cruzan. El principio de cruce es el siguiente:
Cuando las medias móviles de corto período atraviesan las medias móviles de largo período, se genera una señal de cruzamiento dorada, lo que indica una oportunidad de hacer más. En este caso, se puede ingresar a través de la evaluación de la solidez de la tendencia: si los precios se mantienen al alza por más de un período determinado y se tiene confianza en que la tendencia actual es al alza, entonces haga más.
Cuando las medias móviles de corto plazo atraviesan las medias móviles de largo plazo, se produce una señal de cruce de muerte que indica la oportunidad de hacer una brecha. En este caso, la entrada se realiza mediante la evaluación de la robustez de la tendencia: si el precio se mantiene bajando por más de un período determinado, con la confianza de que la tendencia actual es a la baja, entonces haga una brecha.
La intensidad de la señal de cruce se evalúa a través de la pendiente de la media móvil. La señal de cruce se considera lo suficientemente fuerte como para entrar en juego solo cuando la pendiente de la media móvil a corto y largo plazo es mayor que un umbral determinado. Esto inhibe la interferencia de la señal falsa normal.
El Stop Loss está establecido en el 20% y el Stop Stop en el 100%.
La estrategia de doble línea de cruce tiene las siguientes ventajas:
La idea es clara y simple, fácil de entender y de implementar, adecuada para los principiantes.
Utilizando la característica de la media de precios, tiene un cierto efecto de desactivación de ruido, evitando ser engañados por las fluctuaciones de precios a corto plazo.
Evaluar la robustez de la tendencia, evitar hacer demasiado vacío mecánicamente, y combinar el juicio de la bolsa.
La introducción de un factor de movimiento de la pendiente de la media móvil hace que la señal sea más confiable.
La optimización de la retracción es simple, solo se necesitan ajustar unos pocos parámetros clave como el promedio móvil y el tiempo de permanencia de la tendencia.
La estrategia también tiene los siguientes riesgos:
El cruce de dos líneas uniformes sigue siendo una señal de retraso por su naturaleza, no puede predecir el punto de inflexión perfectamente y existe un cierto grado de retraso. Se debe reducir adecuadamente el ciclo de las medias móviles o usarlo junto con factores que puedan predecir el punto de inflexión.
Los sistemas mecánicos de negociación son propensos a los ataques simultáneos colectivos, lo que agrava la situación de exceso, lo que invalida el deterioro o el deterioro. Se debe configurar un deterioro de pérdidas en escaleras o una intervención manual adecuada.
No se puede manejar muy bien las situaciones de oscilación, se debe evitar las variedades que se repiten horizontalmente en este tipo de períodos, y elegir las variedades con una dirección clara para el comercio.
La ventana de tiempo para evaluar la solidez de la tendencia se establece de manera que si el impacto en los resultados es grande, se debe probar repetidamente para determinar el valor óptimo.
Las estrategias de doble equilátero también pueden ser optimizadas en los siguientes aspectos:
Aumentar los indicadores para evaluar las tendencias a gran escala, evitando operaciones de contratiempo. Por ejemplo, agregar la posición de la línea de circunferencia de comparación o la línea lunar.
Se añade la verificación del volumen de transacciones, y se emite la señal sólo en caso de que el volumen de transacciones se incremente, para evitar falsas señales.
Optimice los parámetros de las medias móviles para encontrar la combinación de períodos óptima. Puede intentar adaptarse a los parámetros de las medias móviles.
La combinación de indicadores de fórmulas convencionales, como MACD, KD y otros criterios auxiliares, mejora la precisión de la señal.
El control de riesgo se puede obtener mediante la instalación de un bloqueador de pérdidas escalonado.
La estrategia de cruzamiento de dos líneas uniformes es una idea de estrategia muy intuitiva y explicable en general. Combina las propiedades de eliminación de ruido de las medias móviles con la capacidad de identificar tendencias simples para determinar cruces. Al mismo tiempo, se realiza una cierta verificación de la señal para evitar un seguimiento ciego, lo que también mejora su utilidad y estabilidad.
/*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