
La estrategia se basa en el principio de la cruz de oro de las medias móviles. En concreto, utiliza una media móvil simple de dos períodos diferentes, la línea de 50 y la línea de 200 períodos. Cuando la línea de 50 períodos de abajo se rompe la línea de 200 períodos, produce una señal de compra; cuando la línea de 50 períodos de arriba se rompe la línea de 200 períodos, produce una señal de venta.
La estrategia está escrita en el lenguaje Pine Script, y la lógica principal es la siguiente:
La importancia de usar el indicador SMA aquí es que puede eliminar el ruido de los datos del mercado y capturar la tendencia a largo plazo. La línea SMA rápida atraviesa la línea SMA lenta, lo que significa que el impulso ascendente a corto plazo derrota la tendencia bajista a largo plazo y genera una señal de compra.
La estrategia tiene las siguientes ventajas:
La estrategia también tiene sus riesgos:
Puede haber falsas rupturas, lo que hace que la estrategia produzca una señal errónea. Se pueden ajustar los dos parámetros de SMA adecuadamente para reducir la probabilidad de falsas rupturas.
No puede responder a los mercados a corto plazo y solo es adecuado para los inversores a largo plazo. Se puede reducir adecuadamente el ciclo de SMA rápido.
El retiro puede ser mayor. Se puede establecer un punto de parada, o ajustar adecuadamente la administración de la posición.
La estrategia puede seguir optimizándose en las siguientes dimensiones:
Se añaden filtros para otros indicadores, combinación de múltiples condiciones de compra/venta, y disminuye la probabilidad de falsas señales.
Aumentar el mecanismo de suspensión de pérdidas. Si el precio cae por debajo de un determinado nivel, se impone la suspensión de pérdidas.
Optimización de la gestión de posiciones. Por ejemplo, al aumentar la posición con la tendencia, el seguimiento de las paradas, etc. Controlar las retiradas y buscar mayores ganancias.
Optimización de los parámetros. Evaluación de la influencia de los diferentes parámetros en la relación riesgo-beneficio.
La estrategia en general es una estrategia típica de seguimiento de tendencias. Utiliza las ventajas de SMA para capturar de manera sencilla y eficiente las tendencias de la línea larga. Se puede personalizar el espacio de ajuste de acuerdo con su propio estilo y parámetros.
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 30m
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/
// www.tradingview.com/u/TradeFab/
// www.tradefab.com
// ___ __ __ __ __ __
// | |__) /\ | \ |__ |__ /\ |__)
// | | \ /~~\ |__/ |__ | /~~\ |__)
//
// DISCLAIMER: Futures, stocks and options trading involves substantial risk of loss
// and is not suitable for every investor. You are responsible for all the risks and
// financial resources you use and for the chosen trading system.
// Past performance is not indicative for future results. In making an investment decision,
// traders must rely on their own examination of the entity making the trading decisions!
//
// TradeFab's Golden Cross Strategy.
// The strategy goes long when the faster SMA 50 (the simple moving average of the last 50 bars) crosses
// above the SMA 200. Orders are closed when the SMA 50 crosses below SMA 200. The strategy does not short.
//
VERSION = "1.2"
// 1.2 FB 2020-02-09 converted to Pine version 4
// 1.1 FB 2017-01-15 added short trading
// 1.0 FB 2017-01-13 basic version using SMAs
//
strategy(
title = "TFs Golden Cross " + VERSION,
shorttitle = "TFs Golden Cross " + VERSION,
overlay = true
)
///////////////////////////////////////////////////////////
// === INPUTS ===
///////////////////////////////////////////////////////////
inFastSmaPeriod = input(title="Fast SMA Period", type=input.integer, defval=50, minval=1)
inSlowSmaPeriod = input(title="Slow SMA Period", type=input.integer, defval=200, minval=1)
// backtest period
testStartYear = input(title="Backtest Start Year", type=input.integer, defval=2019, minval=2000)
testStartMonth = input(title="Backtest Start Month", type=input.integer, defval=1, minval=1, maxval=12)
testStartDay = input(title="Backtest Start Day", type=input.integer, defval=1, minval=1, maxval=31)
testStopYear = input(title="Backtest Stop Year", type=input.integer, defval=2099, minval=2000)
testStopMonth = input(title="Backtest Stop Month", type=input.integer, defval=12, minval=1, maxval=12)
testStopDay = input(title="Backtest Stop Day", type=input.integer, defval=31, minval=1, maxval=31)
///////////////////////////////////////////////////////////
// === LOGIC ===
///////////////////////////////////////////////////////////
smaFast = sma(close, inFastSmaPeriod)
smaSlow = sma(close, inSlowSmaPeriod)
bullishCross = crossover (smaFast, smaSlow)
bearishCross = crossunder(smaFast, smaSlow)
// detect valid backtest period
isTestPeriod() => true
///////////////////////////////////////////////////////////
// === POSITION EXECUTION ===
///////////////////////////////////////////////////////////
strategy.entry("long", strategy.long, when=bullishCross)
strategy.entry("short", strategy.short, when=bearishCross)
///////////////////////////////////////////////////////////
// === PLOTTING ===
///////////////////////////////////////////////////////////
// background color
nopColor = color.new(color.gray, 50)
bgcolor(not isTestPeriod() ? nopColor : na)
bartrendcolor =
close > smaFast and
close > smaSlow and
change(smaSlow) > 0
? color.green
: close < smaFast and
close < smaSlow and
change(smaSlow) < 0
? color.red
: color.blue
barcolor(bartrendcolor)
plot(smaFast, color=change(smaFast) > 0 ? color.green : color.red, linewidth=2)
plot(smaSlow, color=change(smaSlow) > 0 ? color.green : color.red, linewidth=2)
// label
posColor = color.new(color.green, 75)
negColor = color.new(color.red, 75)
dftColor = color.new(color.blue, 75)
posProfit= (strategy.position_size != 0) ? (close * 100 / strategy.position_avg_price - 100) : 0.0
posDir = (strategy.position_size > 0) ? "long" : strategy.position_size < 0 ? "short" : "flat"
posCol = (posProfit > 0) ? posColor : (posProfit < 0) ? negColor : dftColor
var label lb = na
label.delete(lb)
lb := label.new(bar_index, max(high, highest(5)[1]),
color=posCol,
text="Pos: "+ posDir +
"\nPnL: "+tostring(posProfit, "#.##")+"%" +
"\nClose: "+tostring(close, "#.##"))