Sistema de avance de período cruzado

El autor:¿ Qué pasa?, Fecha: 2023-11-22 15:22:49
Las etiquetas:

img

Resumen general

Esta es una estrategia comercial cuantitativa que utiliza promedios móviles e indicadores MACD para operaciones de avance en ambas direcciones.

Principio de la estrategia

La estrategia utiliza 3 promedios móviles SMMA de diferentes longitudes y 1 promedio móvil EMA para determinar la dirección de la tendencia. Al mismo tiempo, combina el indicador MACD para juzgar las tendencias a corto plazo y las oportunidades de entrada. Específicamente, la condición de activación de compra es: el precio atraviesa todos los promedios móviles hacia arriba, y los promedios más cortos están por encima de los más largos; mientras que la condición de activación de venta es lo contrario, el precio atraviesa todos los promedios móviles hacia abajo, y los promedios más cortos están por debajo de los más largos.

Se puede ver que esta estrategia utiliza promedios móviles para juzgar las direcciones de tendencia a mediano y largo plazo, y MACD para captar mejores oportunidades de entrada al juzgar las reversiones a corto plazo.

Análisis de ventajas

La ventaja de esta operación interperíodo es que puede seleccionar los puntos de reversión a corto plazo adecuados para entrar en la dirección de tendencia de alta probabilidad, obteniendo así una mejor relación riesgo-beneficio.

  1. Los 3 promedios SMMA más el filtrado multilevel de una línea EMA pueden determinar eficazmente la dirección de la tendencia a medio y largo plazo para evitar negociar contra la tendencia.

  2. El indicador MACD que juzga los puntos de reversión a corto plazo para la entrada puede obtener mejores niveles de precios de entrada.

  3. La estricta relación de la secuencia de la media móvil como condición de filtrado puede reducir la probabilidad de operaciones erróneas.

Análisis de riesgos

Los principales riesgos de esta estrategia son:

  1. Las medias móviles tienen propiedades de retraso mayores, que pueden perder oportunidades de inversión de tendencia a corto plazo.

  2. Los indicadores MACD son propensos a generar señales falsas y deben filtrarse en combinación con los niveles de precios.

  3. Los juicios de marcos de tiempo múltiples aumentan la complejidad de la estrategia y son propensos al fracaso.

Para abordar el riesgo 1 y el riesgo 2, podemos optimizar acortando adecuadamente el promedio móvil y el ciclo de señales para responder rápidamente a las inversiones de tendencia a corto plazo. Para el riesgo 3, necesitamos optimizar y probar para diferentes variedades y ciclos para adaptar estrictamente los parámetros de la estrategia a las características de esa variedad.

Direcciones de optimización

Los principales aspectos que pueden optimizar esta estrategia incluyen:

  1. Optimizar los parámetros de las medias móviles y el MACD para que coincidan mejor con las características de diferentes ciclos y variedades, como acortar la longitud de las medias móviles, aumentar el parámetro de señal, etc.

  2. Aumentar las estrategias de stop loss utilizando ATR u otros indicadores para establecer paradas móviles razonables.

  3. Busque mejores indicadores o métodos de filtrado para reemplazar las señales MACD. Por ejemplo, introduzca indicadores de volatilidad y filtre las señales en consecuencia.

  4. Prueba diferentes relaciones de ratio de ganancias y pérdidas para obtener combinaciones de parámetros con mejores ratios riesgo-recompensa.

Resumen de las actividades

En general, se trata de un sistema innovador único con un pensamiento transversal. Utiliza las ventajas tanto de las medias móviles como del MACD para lograr una estrategia de operación de juicio conjunto en múltiples marcos de tiempo. Al optimizar y ajustar los parámetros y los criterios de filtrado, esta estrategia puede convertirse en una solución comercial cuantitativa muy práctica.


/*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)

Más.