
Se trata de una estrategia de trading cuantitativa que utiliza medias móviles y MACD para realizar operaciones de ruptura bidireccionales. Tiene características de operación a través de las ejes de tiempo, es decir, en el sentido de determinar la dirección de la tendencia en períodos de tiempo más largos y buscar la ventaja de oportunidades de entrada en períodos de tiempo más cortos.
La estrategia utiliza tres medias SMMA de diferentes longitudes y una media EMA para determinar la dirección de la tendencia. Al mismo tiempo, combina el indicador MACD para determinar la tendencia a corto plazo y el momento de entrada. En concreto, sus condiciones de compra son: el precio atraviesa todas las medias y la media corta se activa cuando está por encima de la media larga; y las condiciones de venta son al revés, el precio atraviesa todas las medias por debajo y la media corta se activa cuando está por debajo de la media larga.
Se puede ver que la estrategia utiliza a la vez las medias móviles para determinar la dirección de la tendencia a medio y largo plazo y el MACD para determinar la inversión a corto plazo para capturar el momento de entrada más favorable. Esta operación conjunta de múltiples ejes de tiempo es una característica importante de la estrategia.
La ventaja de este tipo de operación a través de la línea de tiempo es que se puede elegir el punto de entrada de inversión a corto plazo adecuado en la dirección de la tendencia de alta probabilidad, con lo que se obtiene una mejor rentabilidad del riesgo. En concreto, hay tres ventajas principales:
3 líneas medias de SMMA más 1 línea medias de EMA de múltiples filtraciones, puede determinar con eficacia la dirección de la tendencia a medio y largo plazo, evitar la operación de contrarreloj.
El indicador MACD determina el punto de inflexión a corto plazo para obtener un precio de entrada más favorable.
Las estrictas relaciones de orden de las medias móviles sirven como condiciones de filtración para reducir la probabilidad de error.
Los principales riesgos de esta estrategia son:
Las medias móviles tienen un gran atraso en sí mismas y pueden perder oportunidades de revertir la tendencia a corto plazo.
Los indicadores MACD son propensos a generar falsas señales y requieren un filtro de precio.
Los juicios en múltiples ejes de tiempo aumentan la complejidad de la estrategia y son propensos a fallar.
Para el riesgo 1 y el riesgo 2, se puede optimizar mediante la reducción adecuada del ciclo de la línea media y el ciclo de la señal, respondiendo rápidamente a la reversión de la tendencia a corto plazo. Para el riesgo 3, se requieren pruebas de optimización para diferentes variedades y períodos, para que los parámetros de la estrategia se adapten rigurosamente a las características de la variedad.
La estrategia se puede optimizar principalmente en los siguientes aspectos:
Optimizar los parámetros de las medias móviles y MACD para que se ajusten mejor a los diferentes períodos y características de la variedad. Por ejemplo, reducir la longitud de la línea media, aumentar los parámetros de la señal, etc.
Aumentar las estrategias de stop loss, utilizando ATR u otros indicadores para establecer un stop loss móvil razonable. Esto puede mejorar significativamente el control de riesgo de las estrategias.
Buscar mejores indicadores o formas de filtrado para las señales alternativas de MACD. Por ejemplo, introducir indicadores de fluctuación, filtrar las señales, etc.
Prueba diferentes relaciones de proporciones de stop loss y stop loss para obtener una combinación de parámetros que sean mejores que el riesgo y el retorno.
En general, se trata de un sistema de ruptura con una forma de pensar única a lo largo de los ejes temporales. Utiliza a la vez las ventajas de las medias móviles y el MACD para implementar una estrategia de operación de juzgamiento conjunto en varios períodos de tiempo.
/*backtest
start: 2023-10-22 00:00:00
end: 2023-11-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © SoftKill21
//@version=4
strategy("Koala Script",initial_capital=1000,
commission_type=strategy.commission.cash_per_contract,
commission_value=0.000065,
slippage=3)
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2000, title = "From Year", minval = 1970)
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 8, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2031, title = "To Year", minval = 1970)
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
len = input(3, minval=1, title="Length")
src = input(hl2, title="Source")
smma = 0.0
sma1 = sma(src, len)
smma := na(smma[1]) ? sma1 : (smma[1] * (len - 1) + src) / len
len2 = input(6, minval=1, title="Length")
src2 = input(hl2, title="Source")
smma2 = 0.0
sma2 = sma(src2, len2)
smma2 := na(smma2[1]) ? sma2 : (smma2[1] * (len2 - 1) + src2) / len2
len3 = input(9, minval=1, title="Length")
src3 = input(hl2, title="Source")
smma3 = 0.0
sma3 = sma(src3, len3)
smma3 := na(smma3[1]) ? sma3 : (smma3[1] * (len3 - 1) + src3) / len3
len4 = input(50, minval=1, title="Length")
src4 = input(close, title="Source")
smma4 = 0.0
sma4 = sma(src4, len4)
smma4 := na(smma4[1]) ? sma4 : (smma4[1] * (len4 - 1) + src4) / len4
len5 = input(200, minval=1, title="Length")
src5 = input(close, title="Source")
out5 = ema(src5, len5)
timeinrange(res, sess) => time(res, sess) != 0
london=timeinrange(timeframe.period, "0300-1045")
londonEntry=timeinrange(timeframe.period, "0300-0845")
time_cond = time >= startDate and time <= finishDate and londonEntry
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
srcc = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)
// Calculating
fast_ma = sma_source ? sma(srcc, fast_length) : ema(srcc, fast_length)
slow_ma = sma_source ? sma(srcc, slow_length) : ema(srcc, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
longCond = close > out5 and close > smma4 and close > smma3 and close > smma2 and close > smma and londonEntry and smma > smma2 and smma2>smma3 and smma3>smma4 and smma4>out5
shortCond = close < out5 and close < smma4 and close < smma3 and close < smma2 and close < smma and londonEntry and smma < smma2 and smma2<smma3 and smma3<smma4 and smma4<out5
//longCond2 = crossover(close,out5) and crossover(close,smma4) and crossover(close,smma3) and crossover(close,smma2) and crossover(close,smma) and time_cond
//shortCond2 = crossunder(close,out5) and crossunder(close,smma4) and crossunder(close,smma3) and crossunder(close,smma2) and crossunder(close,smma) and time_cond
length=input(14, title="ATR Length")
mult=input(1.0, title="Percentage Multiplier (for ex., 0.7 = 70%)", step=0.1, minval=0.1, maxval=5.0)
oa=input(false, title="Show actual ATR")
ii=syminfo.pointvalue==0
s=ii?na:oa?atr(length):(syminfo.pointvalue * mult * atr(length))
tp=input(300,title="tp")
sl=input(300,title="sl")
//tp = s*10000
//sl= s*10000
//if(tp>300)
// tp:=300
//if(sl>300)
// sl:=300
//if(sl<150)
// sl:=150
//if(tp<150)
// tp:=150
strategy.initial_capital = 50000
//MONEY MANAGEMENT--------------------------------------------------------------''
balance = strategy.netprofit + strategy.initial_capital //current balance
floating = strategy.openprofit //floating profit/loss
risk = input(3,type=input.float,title="Risk %")/100 //risk % per trade
//Calculate the size of the next trade
temp01 = balance * risk //Risk in USD
temp02 = temp01/sl //Risk in lots
temp03 = temp02*100000 //Convert to contracts
size = temp03 - temp03%1000 //Normalize to 1000s (Trade size)
if(size < 10000)
size := 10000 //Set min. lot size
strategy.entry("long",1,when=longCond )
strategy.exit("closelong","long", profit=tp,loss=sl)
//strategy.close("long",when= crossunder(close[4],smma4) and close[4] > close[3] and close[3]>close[2] and close[2] > close[1] and close[1] > close)
strategy.entry("short",0,when=shortCond )
strategy.exit("closeshort","short", profit=tp,loss=sl)
//strategy.close("short",when= crossover(close[4],smma4) and close[4] < close[3] and close[3]< close[2] and close[2] < close[1] and close[1] < close)
strategy.close_all(when = not london)
maxEntry=input(2,title="max entries")
// strategy.risk.max_intraday_filled_orders(maxEntry)