¡Sistema Super Combo Day Trading 2020 rediseñado!

Ago 2, 2022 | EasyLanguage, TradeStation

¡Sistema Super Combo Day Trading 2020 rediseñado!

A continuación te dejamos con el código EasyLanguage para el Sistema Super Combo Day Trading 2020-

Si tienes algo de tiempo disponible y quieres construir tu propio monstruo de Frankenstein a partir de un contenedor de piezas, esta es tu oportunidad. El sistema Super Combo Day Trading fue publicado originalmente en mi libro «Building Winning Trading Systems» en 2001. Lo diseñé para que fuese más un tutorial que un sistema de trading puro. Deberías ser capaz de encontrar las piezas de repuesto que necesitas para crear tu propio sistema de trading intradía. En 2001, quería mostrar cómo controlar y supervisar diferentes técnicas de entrada y salida en un algoritmo completo.

El sistema Super Combo Day Trading fue diseñado para operar en el día con el SP grande y los resultados en ese momento parecían prometedores. Desde la transición al ES y los mayores niveles de volatilidad que hemos visto a lo largo de los años y la adopción de la negociación nocturna, al sistema no le ha ido tan bien, pero los conceptos siguen siendo viables como herramienta de enseñanza tanto hoy como hace 20 años. EasyLanguage ha sido mejorado durante este periodo de tiempo, por lo que la codificación del Super Combo puede aprovechar definitivamente las nuevas mejoras. Estas son las principales premisas de la lógica:

  • Aprovechar una configuración de patrones buyEasier (compra fácil) y shortEasier (venta fácil)
  • Incorporar marcos de tiempo diarios y de 5 minutos en un solo gráfico
  • Incluir técnicas de entrada de operaciones breakOut (rotura), failedBreakOut (falsa rotura) y reverseOnLiquidation (reversión después de una liquidación)
  • Supervisar qué señal está actualmente en línea y aplicar la señal de salida correcta
  • Controlar el beneficio e incorporar un break even stop (stop de equilibrio)
  • Controlar el tiempo e incorporar un trailing stop
  • Proporcionar una interfaz en la lógica a través de las entradas

Bueno, aquí vamos – hay bastante código que ver y entender, así que vamos a dividir y aprovechar examinando sólo un módulo a la vez. Este primer módulo incluye la sección de entradas y variables más los cálculos diarios:

[LegacyColorValue = true]; 

{Super Combo by George Pruitt - redo 2020
 This intra-day trading system will illustrate the multiple data
 handling capabilities of TradeStation.  All pertinent buy and sell
 calculations will be based on daily bars and actual trades will be
 executed on 5-min bars.  I have made most of the parameters input
 variables}

 Inputs:waitPeriodMins(30),initTradesEndTime(1430),liqRevEndTime(1200),
 	thrustPrcnt1(0.30),thrustPrcnt2(0.60),breakOutPrcnt(0.25),
	failedBreakOutPrcnt(0.25),protStopPrcnt1(0.30),protStopPrcnt2(0.20),
	protStopAmt(3.00),breakEvenPrcnt(0.50),avgRngLength(10);
	
Variables:averageRange(0),canTrade(0),buyEasierDay(FALSE),
	sellEasierDay(FALSE),buyBOPoint(0),sellBOPoint(0),longBreakPt(0),
	shortBreakPt(0),longFBOPoint(0),shortFBOPoint(0),barCount(0),buysToday(0),
	sellsToday(0),mp(0),longLiqPoint(0),shortLiqPoint(0),
	longLiqPoint1(0),shortLiqPoint1(0),intraTradeHigh(0),intraTradeLow(999999);


{Just like we did in the psuedo code -- let's start out with the daily 
 bar calculations.  If Date <> Date[1] -- first bar of day}
if(Date <> Date[1]) then {save time by doing these calculations once per day}
begin
 	averageRange = Average(Range,10) of Data2; {Data 2 points to daily bars}
 	
	canTrade = 0;
    if range of data2 < averageRange then canTrade = 1;

	{use close of data2 - seems to be more accurate than CloseD(1)
	buyEasierDay =Close of Data2 >= Close[1] of Data2;
	sellEasierDay = Close of Data2 <  Close[1] of Data2;

	buyBOPoint = Open + thrustPrcnt1*averageRange;
	sellBOPoint= Open - thrustPrcnt2*averageRange;
	
	if(sellEasierDay) then
	begin
		sellBOPoint= Open - thrustPrcnt1*averageRange;
		buyBOPoint = Open + thrustPrcnt2*averageRange; 
	end;

	longBreakPt = HighD(1) + breakOutPrcnt*averageRange;
	shortBreakPt=  LowD(1) - breakOutPrcnt*averageRange;

	shortFBOPoint = HighD(1) - failedBreakOutPrcnt*averageRange;
	longFBOPoint=  LowD(1) + failedBreakOutPrcnt*averageRange;

{Go ahead and initialize any variables that we may need later on in the day}
	
	barCount = 0;
	buysToday = 0;sellsToday = 0;{You can put multiple statements on one line}	
end;

Primeros módulos de Super Combo Day Trading 2020

Aquí sólo estoy configurando las entradas y variables que necesitaré para ejecutar el algoritmo. Si usted está usando datos D entonces el siguiente código:

si fecha <> fecha[1] entonces

es una verificación válida para la primera barra del día. Una nueva fecha representará el comienzo del siguiente día. El código controlado por esta función if-then sólo se ejecuta una vez al día. Por lo tanto, si puedes poner la mayor parte de los cálculos diarios aquí, entonces esto debería agilizar los procesos. Lo primero que hago es calcular el rango promedio de las últimas 10 barras diarias. Accedo a esta fecha desde data2. Puedes construir un bucle y acumular la diferencia entre las llamadas a la función HighD y LowD:

  1. for i = 1 to 10 begin
  2. suma = suma + (HighD(i) – LowD(i));
  3. fin;

Las funciones HighD() y LowD() son mejoras de EasyLanguage que pueden ayudar a eliminar la necesidad de un gráfico de datos múltiple. Sin embargo, si haces esto, recibirás un mensaje de advertencia de que no tiene sentido. Yo lo he hecho y parece que funciona, pero para estar seguro sólo usa Data2. A continuación, determine si ha habido un rango estrecho o una compresión de rango comparando el rango de ayer con el averageRange.

Si es así, entonces permito la negociación. Este es un viejo filtro que busca la expansión del rango después de la compresión. El concepto de un buyDay y sellDay se originó en la década de 1930 por George W. Cole (corrígeme si me equivoco). Yo uso esta idea comparando las relaciones de cierre de las dos barras anteriores. Si ha habido un cierre alcista, entonces considero que el día siguiente es un día de compra más fácil (buyEasier). Si lo contrario es cierto, entonces es un día de venta fácil (sellEasier).

Este sistema no es unidireccional y permite comprar y vender en la misma sesión, de ahí la palabra más fácil (Easier). A continuación, calculo los niveles que, si el mercado alcanza, se espera que desencadenen una tendencia a corto plazo en esa dirección. Esta es la otrora muy respetada ruptura de rango abierta u ORBO (Open Range Break Out). Esta metodología ha perdido su brillo en los últimos 10 años aproximadamente debido a la negociación nocturna y a que permite que las compras y ventas reprimidas se expresen en las sesiones nocturnas. Hace veinte años todavía era viable. El siguiente fragmento de código crea los niveles de ruptura basados en los días buyEasier o sellEasier. El empuje se calcula multiplicando el rango por thrustPrcnt1 y thrustPrcnt2.

Así que ese es el método 1 – la ruptura. Espero que el mercado rompa y continúe hasta el cierre. Ojalá fuera tan fácil. Como no lo es, se calcula la segunda metodología, FailedBreakOut. Esto también se conoce como el trading «ClearOut». El mercado es empujado para sacar todos los stops de compra y luego se retira para que los profesionales se den un festín con los amateurs. SuperCombo trata de aprovechar esto calculando dos puntos para determinar una ruptura fallida. En el lado largo, son los dos puntos a los que el mercado sube y luego vuelve a caer. Si el mercado rompe el longBreakPt, entonces busca venderShort en el shortFBOPoint.

Aquí está el siguiente módulo:

{Now we are going to trade and manage in 5 minute bars}
barCount = barCount + 1; {count the number of intraday data bars}
if(barCount >= waitPeriodMins/BarInterval and canTrade = 1) then {Have we waited long enough?}
begin
	if(MarketPosition = 1) then buysToday = 1;
	if(MarketPosition =-1) then sellsToday= 1;
	
	if(buysToday = 0 and Time < initTradesEndTime) then
		Buy("LBreakOut") next bar at buyBOPoint stop;
		
	if(sellsToday= 0 and Time < initTradesEndTime) then 
		SellShort("SBreakout") next bar at sellBOPoint stop;
				
	if(highD(0) > longBreakPt and sellsToday = 0 and Time < initTradesEndTime) then
		SellShort("SfailedBO") next bar at shortFBOPoint stop;
	if(lowD(0) < shortBreakPt and buysToday = 0 and Time < initTradesEndTime) then
		Buy("BfailedBO") next bar at longFBOPoint stop;
		

Seguimiento de la acción del mercado y colocación de operaciones correspondientes

if(barCount>= waitPeriodMins/BarInterval y canTrade = 1) then

Obliga a que la lógica fluya sólo si canTrade es 1 y hemos esperado a que se complete la hora amateur, bueno 30 minutos para ser exactos. ¿La primera hora es realmente la hora amateur? No creo que esto se aplique, pero si crees que sí, así es como se controla la negociación antes de la finalización de este período. Dividiendo por BarInterval y contando cada barra se puede generalizar este código para cualquier periodo de tiempo. Si MarketPosition es 1 entonces usted sabe que entró en una posición larga y lo contrario es cierto para las posiciones cortas. Sólo coloque las órdenes de salida si el tiempo es menor que initTradesEndTime.
Si el mercado penetra en los Long y ShortBreakPts, entonces prepárese para aprovechar una ruptura fallida. Sólo se puede ir en corto si no se ha introducido ya una posición corta – lo mismo para los largos. Así, esta lógica coloca las órdenes breakOut y failedBreakOut.

A continuación, pasamos al último módulo:

{The following module keeps track of positions and places protective stops}
mp = marketPosition; if(MarketPosition = 1) then begin longLiqPoint = EntryPrice-protStopPrcnt1*averageRange; longLiqPoint = MinList(longLiqPoint,EntryPrice - protStopAmt); longLiqPoint1 = EntryPrice - protStopPrcnt2*averageRange; longLiqPoint1 = MinList(longLiqPoint1,EntryPrice - protStopAmt); if Maxpositionprofit >= breakEvenPrcnt*averageRange*bigPointValue then begin longLiqPoint = EntryPrice; {Breakeven trade} longLiqPoint1 = EntryPrice; {Breakeven trade} end; if(Time >= initTradesEndTime) then begin longLiqPoint = MaxList(longLiqPoint,Lowest(Low,3)); {Trailing stop} longLiqPoint1 = MaxList(longLiqPoint1,Lowest(Low,3)); {Trailing stop} end; if(Time < liqRevEndTime and sellsToday = 0 and longLiqPoint <> EntryPrice and BarsSinceEntry >= 4) then SellShort("LongLiqRev") next bar at longLiqPoint stop; Sell("LongLiq-BO") from entry("LBreakOut") next bar at longLiqPoint stop; Sell("LongLiq-FBO") from entry("BFailedBO") next bar at longLiqPoint stop; Sell("LongLiq-RLoss") from entry("ShortLiqRev") next bar at longLiqPoint1 stop; end; if(MarketPosition =-1) then begin shortLiqPoint = EntryPrice+protStopPrcnt1*averageRange; shortLiqPoint = MaxList(shortLiqPoint,EntryPrice + protStopAmt); shortLiqPoint1 = EntryPrice + protStopPrcnt2*averageRange; shortLiqPoint1 = MaxList(shortLiqPoint1,EntryPrice + protStopAmt); if maxPositionProfit >= breakEvenPrcnt*averageRange*bigPointValue then begin shortLiqPoint = EntryPrice; {Breakeven trade} shortLiqPoint1 = EntryPrice; end; if(Time >= initTradesEndTime) then begin shortLiqPoint = MinList(shortLiqPoint,Highest(High,3)); {Trailing stop} shortLiqPoint1 = MinList(shortLiqPoint1,Highest(High,3)); {Trailing stop} end; if(Time < liqRevEndTime and buysToday = 0 and shortLiqPoint <> EntryPrice and BarsSinceEntry >= 4) then Buy("ShortLiqRev") next bar at shortLiqPoint stop; BuyToCover("ShortLiq-BO") from entry("SBreakOut") next bar at shortLiqPoint stop; BuyToCover("ShortLiq-FBO") from entry("SFailedBO") next bar at shortLiqPoint stop; BuyToCover("ShortLiq-RLoss") from entry("LongLiqRev") next bar at shortLiqPoint1 stop; end; end; SetExitOnClose;

TradeManagement (¿Ingresar el Stop Loss o no?

Este código parece un poco engorroso, pero no lo es. Vamos a ver sólo la lógica del lado largo para ahorrar tiempo en este punto. Primero calculemos los LongLiqPoints (1 y 2.) Hace veinte años pensé que sería mejor tener un stop más pequeño para las entradas que ocurrieran en una Liquidación-Reversión. Oh sí, ese código también está aquí. En su día quise asegurarme de que el stop fuese de al menos 3 puntos – ja, ja, ja – no, de verdad, lo digo en serio. En serio. ¡Deja de reírte! Ese código podría ser eliminado.
Después de calcular estos dos puntos empiezo a monitorear el beneficio y si llega a un nivel predeterminado saco el longLiqPoints a una parada de BreakEven. Si se tiene la suerte de seguir en una operación después de initTradesEndTime, entonces empiezo a colocar el stop por el mínimo de las últimas 3 barras de cinco minutos – no quiero convertir un pequeño ganador en un perdedor. Ahora esto es lo divertido.

  1. si (Hora < liqRevEndTime y vendeHoy = 0 y
    longLiqPoint <> EntryPrice y BarsSinceEntry >= 4) entonces
  2. SellShort(«LongLiqRev») próxima barra a longLiqPoint stop;

Si el tiempo es menor que liqRevEndTime y BarsSinceEntry, entonces invierta en el mercado y vaya en corto en el precio establecido para el stop de longLiqPoint. Haz esto en lugar de liquidar. Pensé que si el mercado invierte su curso rápidamente, entonces quería aprovechar este movimiento de contra tendencia. Eliminando esto para ver si tiene algún impacto sería donde empezaría a jugar con la plantilla. Bien, ahora las liquidaciones basadas en la Entrada tienen lugar a continuación. Si estoy largo de un «ShortLiqRev», entonces uso longLiqPoint1 en lugar de longLiqPoint. Vale que la última parte era el fregadero de la cocina.

Ahora ya tienes suficiente código para hacer tu propio sistema de trading intradía – realmente demasiado código, pero deberías ser capaz de juntar algo a partir de estas partes. Hazme saber si pudiste crear tu propio monstruo de Frankenstein. Voy a actualizar los parámetros para ver si hay alguna esperanza para el sistema en su conjunto. Sigan revisando para ver los parámetros de rendimiento actualizados. Un saludo a todos y que tengáis cuidado.

Con esto finalizamos el artículo sobre construir tu propio monstruo de Frankenstein a partir de un contenedor de piezas EasyLanguage del Sistema Super Combo Day Trading 2020. Esperamos os haya sido de utilidad esta información.

¡Gracias por visitarnos!

Artículo redactado por George Pruitt

Canal de YouTube de Quantified Models

En nuestro canal de YouTube tenemos varios videos disponibles que pueden resultarle muy útiles para desarrollar sistemas de trading.

Esperamos que esta información te haya sido de utilidad.

Easylanguage | Sistema de trading: Tortugas

Easylanguage | Sistema de trading: Tortugas

He visto una plétora de publicaciones sobre las estrategias de comercio de tortugas donde se proporcionan las reglas y el código. Los códigos van desde una mera ruptura de Donchian hasta una representación bastante cercana. Sin retroalimentación de...

leer más

Subscribe to our Newsletter

Join our mailing list to receive the latest news and updates from Quantified Models team.

Subscribe to our Newsletter

You have Successfully Subscribed!

Ir al contenido