Sistema Rotura Línea de Regresión

Chapulin nos envia la descripción detallada de uno de sus sistemas para que todos podais echarle un vistazo y opinar abiertamente en el Foro. Enhorabuena a Chapulin por sus aportaciones, sin duda son brillantes. Si deseais poneros en contacto con él podeis escribirle a [email protected]

Un saludo
X-Trader
SISTEMA ROTURA LINEA DE REGRESION (RotLinReg)

Nombre del sistema: ROT LIN REG
Tipo: Seguidor de Tendencia
Futuro: ESX – Barras de 30 min
Periodo analizado: Desde 01/2001
Ultima revisión: Junio 2002
 
 
El Sistema RotLinReg es un sistema seguidor de tendencia clásico, que deja posiciones abiertas a fin de día. No obstante, es poco convencional en cuanto a la definición de las reglas o condiciones que se han de cumplir para poder entrar en una operación, lo que no significa que no exista una lógica correctamente calculada detrás de cada operación.

Como casi todo sistema seguidor de tendencia, está en mercado casi la totalidad del tiempo, y los pocos momentos en los que está fuera de mercado, se debe a situaciones poco frecuentes. Opera tanto a largo como a corto y se puede aplicar a distintos periodos de tiempo, como veremos en nuestro análisis.

Fue desarrollado en marzo de 2002 y está siendo aplicado al futuro sobre el índice Eurostoxx 50, cotizado en el mercado de futuros de Eurex. No obstante, otras pruebas históricas realizadas, demuestran el buen comportamiento de la estrategia en otros mercados y sobre otros productos financieros. Nuestra elección del índice Eurostoxx 50, se debe fundamentalmente a la buena relación riesgo/beneficio que se consigue, y a los bajos niveles de garantías exigidos para operar en dicho futuro.

La estrategia trata de aprovechar los grandes movimientos del mercado, y en ese sentido es muy “ágil” a la hora de detectar un movimiento, por lo que no llega a tener grandes posiciones perdedoras en contra. Ello le hace ser acreedor de unos bajos niveles de drawdown históricamente. No obstante, sigue siendo un sistema seguidor de tendencia, y por lo tanto, el dinero lo hará en los grandes movimientos del mercado, consiguiendo una relativamente buena subsistencia en periodos laterales o de tendencia poco clara.

Para poder entrar en una operación se han de cumplir varios tipos de condiciones:

- La primera de ellas busca confirmar un cambio significativo en la dirección del mercado, mediante la utilización de las líneas de regresión de máximos y mínimos.

- La segunda condición busca que dicho cambio venga acompañado de una explosión de volatilidad, calculada esta de su forma más simple, es decir, mediante el porcentaje de variación del precio que se ha producido en un determinado rango de negociación.

- La tercera y cuarta condición intentan evitar la entrada en mercado en situaciones de muy baja direccionalidad o de fuerte direccionalidad. En ambos casos utilizaremos el indicador ADX para medir la fuerza de la tendencia, impidiendo operar cuando el nivel de ADX esté por debajo de unos mínimos determinados por el parámetro NivelADXLow. Así mismo, intentamos evitar una entrada en contratendencia en los pequeños retrocesos dentro de una situación de clara direccionalidad. La utilización una vez más del indicador ADX y de sus variantes DMI+ y DMI- nos permiten imponer esta condición.

Este conjunto de condiciones nos permite evitar un gran número de entradas falsas ocasionadas en periodos laterales de bajo movimiento en el mercado, en el que inicialmente se identifican cambios de dirección del mercado, pero que al no venir acompañado de un movimiento significativo en el precio, no representan verdaderos cambios de tendencia, sino simplemente pequeños movimientos ocasionados en rangos laterales. Así mismo, y tal y como comentamos, evitamos las entradas en los pequeños retrocesos de un movimiento claro al alza o a la baja.

Para la salida de una posición se ha establecido inicialmente un stop de pérdidas que nos salvaguarde de una hipotética catástrofe en la dirección contraria a nuestra entrada.

También se ha establecido una salida de emergencia, en el caso de que no se haya producido el movimiento que esperábamos al cabo de un determinado número de barras desde la entrada. Cuando esto ocurre, cerramos nuestra posición a mercado y esperamos un nuevo movimiento significativo para entrar en una u otra dirección.
 
Cálculo intermedio de las condiciones de entrada

Como hemos comentado con anterioridad, hemos establecido varios tipos de condiciones que se han de satisfacer para poder entrar en mercado. Vamos a continuación a detallar los estudios realizados que nos permiten realizar los cálculos para comprobar si dichas condiciones se cumplen o no.

En primer lugar, vamos a calcular el filtro de volatilidad. Para ello hemos creado un indicador denominado FiltroATR, y cuyo código de programación se adjunta a continuación:

{Indicador: FiltroATR. Calcula el porcentaje de variación del precio dentro de un rango determinado}

inputs:barras(1),FiltroATR(0.1);

value1=Highest(H,Barras);
value2=Lowest(L,Barras);
value3=value1-value2;
value4=(value3/Close)*100;

plot1(value4,"FiltroATR");


Pasamos a comentar parte del código:

value1=Highest(H,Barras);
value2=Lowest(L,Barras);

Como vemos, este indicador determina un rango, mediante el cálculo del mayor de los máximos de las últimas “barras” (siendo barras un parámetro), y el menor de los mínimos en ese mismo periodo de tiempo.

value3=value1-value2;
value4=(value3/Close)*100;

Posteriormente se restan ambas cantidades y se calcula el porcentaje que esa diferencia representa respecto al precio actual.

La representación gráfica del indicador se muestra a continuación:
 



Como vemos, resaltado con los rectángulos de fondo amarillo, en periodos de lateralidad, nuestro indicador (representado en la parte inferior del gráfico en color rojo), toma niveles bajos, aumentando considerablemente cuando se producen fuertes movimientos en una misma dirección. Por ello, utilizamos este filtro para evitar entradas en momentos de bajo movimiento.

El segundo de los filtros, utiliza las líneas de regresión de máximos y mínimos. Para el cálculo de las líneas de regresión y su representación gráfica, utilizamos los indicadores que vienen ya definidos en el programa Tradestation. Vamos a ver la representación gráfica de ambos indicadores por separado, para poder explicar con más detalle que condición se ha de cumplir para poder entrar en una posición.

Se muestran a continuación dos gráficos aplicados a la fuente de datos del futuro de Eurostoxx 50, en el año 2001, en barras de 30 min.

En el primero de los gráficos se representa, mediante una línea roja, la línea de regresión de los máximos de periodo 26. Esta línea la utilizamos para permitir la entrada de operaciones de venta (en corto), cuando se cumplen una serie de condiciones que estudiaremos más adelante.
 

En el segundo gráfico se representa, mediante una línea azul, la línea de regresión de los mínimos de periodo 41. Esta línea la utilizamos para permitir la entrada de operaciones de compra (en largo), cuando se cumplen una serie de condiciones que estudiaremos más adelante.
 
 
También hemos comentado la condición para evitar entrar en contratendencia en situaciones de clara direccionalidad. Hemos de definir en nuestro código dos condiciones distintas: una para inhabilitar los cortos y otra para inhabilitar los largos. Hemos creado un estudio “PaintBar” para poder aplicar sobre el gráfico ambas condiciones y poder pintar de un color distinto aquellas barras en las que no se puede entrar corto o largo por encontrarnos en una situación de fuerte direccionalidad. Vamos a ver el código de dicho estudio:

{Estudio para pintar de distinto color las barras en las que no se puede operar en corto}

inputs: ADXLen(14),NivelADXHigh(30);

If ADX(ADXLen)>NivelADXHigh and
DMIPlus(ADXLen) > DMIMinus(ADXLen) then begin
PlotPaintBar(High,Low,"No Cortos");
end;


Vamos a ver a continuación un gráfico en el que se muestran las barras (en color rojo) en las que no se puede operar en corto por darse las condiciones reflejadas con anterioridad:
 

Para inhabilitar los largos, el código es similar, como vemos a continuación:

{Estudio para pintar de distinto color las barras en las que no se puede operar en largo}

inputs: ADXLen(14),NivelADXHigh(30);

If ADX(ADXLen)>NivelADXHigh and
DMIPlus(ADXLen) < DMIMinus(ADXLen) then begin
PlotPaintBar(High,Low,"No Largos");
end;

Por último tenemos la condición de no operar cuando la direccionalidad es baja. Para ello utilizamos el indicador ADX y no operamos cuando éste se encuentra por debajo de un nivel mínimo, determinado por el parámetro NivelADXLow. Hemos creado también un estudio “PaintBar” que nos muestre cuando no se puede operar por no superarse el nivel mínimo de ADX. Vamos a verlo a continuación:
 
 
Vemos en el gráfico como las barras de color verde nos muestran las zonas en las que no se puede operar, por estar el nivel de direccionalidad en el mercado, medido a través del indicador ADX, por debajo de un determinado nivel.
 
 
Reglas del sistema

En este sistema definimos entradas largas y cortas, así como distintas órdenes de salida. Vamos a estudiarlas cada una por separado.

Permiso de entrada
Como hemos comentado en puntos anteriores, el permiso de entrada lo otorga un conjunto de condiciones:

- La primera de ellas busca confirmar un cambio significativo en la dirección del mercado, mediante la utilización de las líneas de regresión de máximos y mínimos.

- La segunda condición busca que dicho cambio venga acompañado de una explosión de volatilidad, calculada esta de su forma más simple, es decir, mediante el porcentaje de variación del precio que se ha producido en un determinado rango de negociación.

- La tercera y cuarta condición intentan evitar la entrada en mercado en situaciones de muy baja direccionalidad o de fuerte direccionalidad. En ambos casos utilizaremos el indicador ADX para medir la fuerza de la tendencia, impidiendo operar cuando el nivel de ADX esté por debajo de unos mínimos determinados por el parámetro NivelADXLow. Así mismo, intentamos evitar una entrada en contratendencia en los pequeños retrocesos dentro de una situación de clara direccionalidad. La utilización una vez más del indicador ADX y de sus variantes DMI+ y DMI- nos permiten imponer esta condición.

Respecto a la primera, vamos a estudiar el código de programación que calcula si se cumple dicha condición o no. Es el siguiente:


Condición primera para largos (resaltada en negrita)

LineaRegresionH=LinearRegValueFC(High,LenLR,0);

LineaRegresionL=LinearRegValueFC(Low,LenHR,0);

Condition1=Low>LineaRegresionL[1] and Low[1]Lowest(Low,Barras);

Condition2=High=LineaRegresionH[2] and High

Calculamos previamente una variable, a la que llamamos LineaRegresionL (es decir, calculamos la línea de regresión de los mínimos). Para ello utilizamos una función interna del Tradestation (LinearRegValueFC).

Si el mínimo de la barra actual es mayor que el valor que la línea de regresión de los mínimos tenía en la barra anterior y además, el mínimo de la barra anterior era menor o igual que el valor que la línea de regresión de los mínimos tenía hace dos barras y además el mínimo de la barra actual es mayor que el menor de los mínimos de las últimas “barras” (siendo este un parámetro del sistema), entonces se cumplirá una de las condiciones necesarias para entrar largo. Como vemos, lo que buscamos es una penetración, por parte del mínimo de la barra actual en la línea de regresión de mínimos, que teóricamente lo que hace es proyectar el precio futuro de dicho mínimo. En realidad lo que pretendemos es adelantarnos al movimiento que realiza el mercado cuando se produce un cambio de tendencia.

Condición primera para cortos (resaltada en negrita)

LineaRegresionH=LinearRegValueFC(High,LenLR,0);

LineaRegresionL=LinearRegValueFC(Low,LenHR,0);

Condition1=Low>LineaRegresionL[1] and Low[1]Lowest(Low,Barras);

Condition2=High=LineaRegresionH[2] and High



Calculamos previamente una variable, a la que llamamos LineaRegresionH (es decir, calculamos la línea de regresión de los mínimos). Para ello utilizamos una función interna del Tradestation (LinearRegValueFC).

Si el máximo de la barra actual es menor que el valor que la línea de regresión de los máximos tenía en la barra anterior y además, el máximo de la barra anterior era mayor o igual que el valor que la línea de regresión de los máximos tenía hace dos barras y además el máximo de la barra actual es menor que el mayor de los máximos de las últimas “barras” (siendo este un parámetro del sistema), entonces se cumplirá una de las condiciones necesarias para entrar corto. Como vemos, lo que buscamos es una penetración, por parte del máximo de la barra actual en la línea de regresión de máximos, que teóricamente lo que hace es proyectar el precio futuro de dicho máximo. En realidad lo que pretendemos es adelantarnos al movimiento que realiza el mercado cuando se produce un cambio de tendencia.


Condición segunda, válida tanto para largos como para cortos


value1=Highest(H,Barras);
value2=Lowest(L,Barras);
value3=value1-value2;
value4=(value3/Close)*100;

Condition3=value4>FiltroATR;


Calculamos el mayor de los máximos en un determinado número de barras hacia atrás. Ese número de barras viene determinado por el parámetro que hemos denominado “Barras”. Dicho parámetro es optimizable.

Calculamos el menor de los mínimos en un determinado número de barras hacia atrás. Ese número de barras viene determinado por el parámetro que hemos denominado “Barras”. Dicho parámetro es optimizable.

Calculamos la diferencia entre el mayor de los máximos y el menor de los mínimos en un determinado rango de barras.

Calculamos por último el porcentaje que representa dicha diferencia respecto al precio actual, que viene dado por el valor de cierre de la barra actual.

La condición que se ha de cumplir es que dicho porcentaje sea mayor que una determinada cantidad, que viene dada por el parámetro FiltroATR.


Condición para inhabilitar cortos

Condition4= ADX(ADXLen)>NivelADXHigh and
DMIPlus(ADXLen) > DMIMinus(ADXLen);


Como hemos comentado con anterioridad si el indicador ADX es mayor que una determinada cantidad (que viene dada por el parámetro optimizable “NivelADXHigh”) y el indicador DMIPlus es mayor que el indicador DMIMinus, impedimos la entrada a corto de nuestra estrategia. La razón es bien sencilla. En ocasiones, el mercado entra en zonas de fuerte direccionalidad, que conllevan por lo tanto retrocesos mayores de los normales, pero que no dejan de ser leves descansos para retomar la dirección principal. Por ello, primero identificamos zonas donde existe una clara direccionalidad. Eso lo conseguimos buscando que el indicador ADX sea mayor que un determinado nivel. En esta zona, si el indicador DMIPlus está por encima del indicador DMIMinus, nos está indicando, junto a la condición anterior de que el ADX esté en valores altos, que el mercado se encuentra en una fuerte tendencia alcista. Por ello, evitamos entrar cortos hasta que baje la fuerte tendencia, o los indicadores DMI se crucen, quedando por debajo el DMIPlus del DMIMinus.

Condición para inhabilitar largos


Condition5= ADX(ADXLen)>NivelADXHigh and
DMIPlus(ADXLen) < DMIMinus(ADXLen);

Como hemos comentado con anterioridad si el indicador ADX es mayor que una determinada cantidad (que viene dada por el parámetro optimizable “NivelADXHigh”) y el indicador DMIPlus es menor que el indicador DMIMinus, impedimos la entrada a largo de nuestra estrategia. La razón es bien sencilla. En ocasiones, el mercado entra en zonas de fuerte direccionalidad, que conllevan por lo tanto retrocesos mayores de los normales, pero que no dejan de ser leves descansos para retomar la dirección principal. Por ello, primero identificamos zonas donde existe una clara direccionalidad. Eso lo conseguimos buscando que el indicador ADX sea mayor que un determinado nivel. En esta zona, si el indicador DMIPlus está por debajo del indicador DMIMinus, nos está indicando, junto a la condición anterior de que el ADX esté en valores altos, que el mercado se encuentra en una fuerte tendencia bajista. Por ello, evitamos entrar largos hasta que baje la fuerte tendencia, o los indicadores DMI se crucen, quedando por encima el DMIPlus del DMIMinus.



Entradas a largo
Primeramente identificamos el momento en el que se cumplen las condiciones básicas para generar una oportunidad de entrar a largo.

Condition1=Low>LineaRegresionL[1] and Low[1]Lowest(Low,Barras);

Condition3=value4>FiltroATR;

If Condition1 and Condition3 then begin
LSetupBar=BarNumber;
BuyLevel= Lowest(L,Barras)*FiltroAlcista;
end;


Cuando estas dos condiciones iniciales se cumplen, establecemos un nivel de compra, que viene dado por la variable BuyLevel. Vemos que situamos ese nivel de compra en el menor de los mínimos de las últimas “Barras” (siendo este un parámetro) multiplicado por otro parámetro al que llamamos “FiltroAlcista”.

Utilizamos esta forma de definir el nivel de compra porque queremos que nuestra orden quede vigente varias barras después de que se den las condiciones. De lo contrario, podría darse el caso de que ocurriera el movimiento que esperamos pero que no ocurriera en la inmediata barra posterior a que se den las condiciones. Para evitar eso, dejamos nuestra orden vigente durante un número determinado de barras que viene dado por el parámetro “ActvBar”.

Vamos a ver a continuación el código de programación que realiza esta acción:

Condition1=Low>LineaRegresionL[1] and Low[1]Lowest(Low,Barras);

value1=Highest(H,Barras);
value2=Lowest(L,Barras);
value3=value1-value2;
value4=(value3/Close)*100;

Condition3=value4>FiltroATR;

If Condition1 and Condition3 then begin
LSetupBar=BarNumber;
BuyLevel= Lowest(L,Barras)*FiltroAlcista;
end;

Condition5= ADX(ADXLen)>NivelADXHigh and
DMIPlus(ADXLen) < DMIMinus(ADXLen);

Condition6= ADX(ADXLen)>NivelADXLow;

If BarNumber-LSetupBar < ActvBar and Condition5=False and Condition6 then
Buy at BuyLevel Stop;



Entradas a corto
Primeramente identificamos el momento en el que se cumplen las condiciones básicas para generar una oportunidad de entrar a corto.


Condition2=High=LineaRegresionH[2] and High

Condition3=value4>FiltroATR;

If Condition2 and Condition3 then begin
SSetupBar=BarNumber;
SellLevel= Highest(H,Barras)*FiltroBajista;
end;


Cuando estas dos condiciones iniciales se cumplen, establecemos un nivel de venta, que viene dado por la variable SellLevel. Vemos que situamos ese nivel de venta en el mayor de los máximos de las últimas “Barras” (siendo este un parámetro) multiplicado por otro parámetro al que llamamos “FiltroBajista”.

Utilizamos esta forma de definir el nivel de venta porque queremos que nuestra orden quede vigente varias barras después de que se den las condiciones. De lo contrario, podría darse el caso de que ocurriera el movimiento que esperamos pero que no ocurriera en la inmediata barra posterior a que se den las condiciones. Para evitar eso, dejamos nuestra orden vigente durante un número determinado de barras que vienen dadas por el parámetro “ActvBar”.

Vamos a ver a continuación el código de programación que realiza esta acción:


Condition2=High=LineaRegresionH[2] and High

value1=Highest(H,Barras);
value2=Lowest(L,Barras);
value3=value1-value2;
value4=(value3/Close)*100;

Condition3=value4>FiltroATR;

If Condition2 and Condition3 then begin
SSetupBar=BarNumber;
SellLevel= Highest(H,Barras)*FiltroBajista;
end;

Condition4= ADX(ADXLen)>NivelADXHigh and
DMIPlus(ADXLen) > DMIMinus(ADXLen);

Condition6= ADX(ADXLen)>NivelADXLow;

If BarNumber-SSetupBar < ActvBar and Condition4=False and Condition6 then
Sell at SellLevel Stop;



Entradas de Seguridad

Hemos decidido incorporar dos entradas de seguridad: una para entrar largos y otra para entrar cortos. Estas entradas de seguridad tienen como fundamento el asegurarnos entrar en una posición cuando se producen movimientos bruscos de mercado y no se llegan a dar todas las condiciones mencionadas con anterioridad.

Para ello, definiremos primeramente dos puntos básicos:

- El PivotLow, o nivel mínimo a partir del cual el mercado comienza una recuperación. Para la determinación automática de un PivotLow utilizaremos la función predefinida en el Tradestation llamada PivotLowVS.

- El PivotHigh, o nivel máximo a partir del cual el mercado comienza un retroceso. Para la determinación automática de un PivotHigh utilizaremos la función predefinida en el TradeStation llamada PivotHighVS.

El código de programación que utilizamos para definir nuestras entradas de seguridad es el siguiente:

{Entrada de seguridad para largos}
If marketposition1 and BarNumber-LSetupBar < BarrasAtras then Buy at PivotLowVS(1,Low,4,2,20)*FiltroLargoSeg Stop;

{Entrada de seguridad para cortos}
If marketposition-1 and BarNumber-SSetupBar < BarrasAtras then Sell at PivotHighVS(1,High,4,2,20)*FiltroCortoSeg Stop;
Ordenes de salida
Como hemos comentado con anterioridad, contamos con dos tipos de ordenes de salida.

La primera de ellas se trata de la salida en caso de que la posición no vaya a nuestro favor a partir de un determinado número de barras.

Es decir, si entramos en una posición y dicha entrada no ha generado un mínimo beneficio un determinado número de barras después de la entrada, saldremos de dicha posición a mercado y volveremos a entrar cuando se den las condiciones definidas en nuestra estrategia.

De esta manera evitamos estar en mercado en aquellos momentos en los que no se produzca el movimiento esperado en la posición.

El código de programación que realiza esta acción es el siguiente:


If BarsSinceEntry>BarEntrada and MaxPositionProfit

If marketposition=1 then ExitLong at market;

If marketposition=-1 then ExitShort at market;
end;


Como vemos, utilizamos la función BarsSinceEntry que tiene definida el Tradestation. Esta función nos devuelve el número de barras que han transcurrido desde nuestra entrada en la posición.

Si dicho número es superior a una determinada cantidad, que viene reflejada por el parámetro “BarEntrada” y además el máximo beneficio que hemos llegado a tener en esa posición es menor que una determinada cantidad, que viene dada por un nuevo parámetro al que llamamos “Benef”, entonces, si estábamos comprados procederemos a cerrar el largo a mercado, y si estábamos vendidos, cerraremos el corto a mercado.

El segundo tipo de salida con el que contamos es con el stop de pérdidas convencional, y se establece en el momento en el que entramos en una posición. Para ello, utilizamos la siguiente rutina, donde “stp” es un parámetro:

SetStopLoss(stp);

Diseño y desarrollo del código de programación
Esta parte explica detalladamente el código de programación, desarrollado utilizando la plataforma de análisis Omega Research Tradestation 2000i, en el lenguaje Easy Language (ELA) utilizado por dicha plataforma.

{Definición de parámetros y variables}

inputs:LenLR(6), LenHR(6), FiltroATR(2.5), Barras(5), BarEntrada(5), Benef(200), stp(500), BarrasAtras(5), FiltroAlcista(1.05), FiltroBajista(0.95), ActvBar(5), FiltroLargoSeg(1.015), FiltroCortoSeg(0.985), ADXLen(14), NivelADXHigh(40), NivelADXLow(15);

vars:LineaRegresionL(0),LineaRegresionH(0),LSetupBar(0),SSetupBar(0),
BuyLevel(0),SellLevel(0);

{Asignación de valores a las variables}
LineaRegresionH=LinearRegValueFC(High,LenLR,0);
LineaRegresionL=LinearRegValueFC(Low,LenHR,0);

{Permiso de entrada. Cálculo de condiciones}
Condition1=Low>LineaRegresionL[1] and Low[1]Lowest(Low, Barras);

Condition2=High=LineaRegresionH[2] and High

value1=Highest(H,Barras);
value2=Lowest(L,Barras);
value3=value1-value2;
value4=(value3/Close)*100;

Condition3=value4>FiltroATR;
Condition4= ADX(ADXLen)>NivelADXHigh and
DMIPlus(ADXLen) > DMIMinus(ADXLen);

Condition5= ADX(ADXLen)>NivelADXHigh and
DMIPlus(ADXLen) < DMIMinus(ADXLen);

Condition6= ADX(ADXLen)>NivelADXLow;


{Generación de señales de compra y venta}

If Condition1 and Condition3 then begin
LSetupBar=BarNumber;
BuyLevel= Lowest(L,Barras)*FiltroAlcista;
end;

If Condition2 and Condition3 then begin
SSetupBar=BarNumber;
SellLevel=Highest(H,Barras)*FiltroBajista;
end;

{Activación orden de compra}
If BarNumber-LSetupBar < ActvBar and Condition5=False and Condition6 then Buy at BuyLevel Stop;

{Activación orden de venta}
If BarNumber-SSetupBar < ActvBar and Condition4=False and Condition6 then Sell at SellLevel Stop;

{Entrada de Seguridad a largo}
If marketposition1 and BarNumber-LSetupBar < BarrasAtras then Buy at PivotLowVS(1, Low, 4, 2, 20)*FiltroLargoSeg Stop;

{Entrada de Seguridad a corto}
If marketposition-1 and BarNumber-SSetupBar < BarrasAtras then Sell at PivotHighVS(1, High, 4, 2, 20)*FiltroCortoSeg Stop;

{Salida por no conseguir el movimiento esperado}
If BarsSinceEntry>BarEntrada and MaxPositionProfit
If marketposition=1 then ExitLong at market;
If marketposition=-1 then ExitShort at market;
end;

{Salida por Stop de Pérdidas}
SetStopLoss(stp);
 
Inputs
En la siguiente tabla mostramos los parámetros utilizados en nuestra estrategia y un breve comentario sobre cada uno de ellos:
 

Parámetro

Valor por defecto

Comentario

LenLR

25

Número de barras utilizadas en el cálculo de la línea de regresión de los mínimos

LenHR

40

Número de barras utilizadas en el cálculo de la línea de regresión de los máximos

FiltroATR

1

Porcentaje de filtro, por encima del cual consideramos que existe la suficiente volatilidad en el mercado para permitir la entrada de nuestra estrategia

Barras

5

Número de barras utilizadas para el cálculo del mayor de los máximos y el menor de los mínimos para la determinación del rango sobre el cual se calcula el filtro de volatilidad

BarEntrada

5

Número de barras desde la entrada en el que permitimos que el negocio "madure" para conseguir que se mueva a nuestro favor

Benef

20

Número de puntos que hemos de tener a favor en las "BarEntrada" barras desde la entrada en la posición. Es el mínimo beneficio que hemos de conseguir para considerar que la operación puede continuar a nuestro favor

stp

80

Número de puntos que arriesgamos nada más entrar en la posición en caso de que el mercado vaya en nuestra contra. Define por lo tanto el Stop de pérdidas inicial.

BarrasAtras

5

Número de barras que permanecen activas las entradas de seguridad

FiltroAlcista

1.05

Porcentaje por el que hemos de multiplicar al menor de los mínimos de las últimas "barras" para obtener el Nivel de Compra.

FiltroBajista

0.95

Porcentaje por el que hemos de multiplicar al mayor de los máximos de las últimas "barras" para obtener el Nivel de Venta.

ActvBar

5

Número de barras que permanecerá activa la orden, una vez que se cumplen las condiciones iniciales

FiltroLargoSeg

1.015

Cantidad por la que hemos de multiplicar al anterior PivotLow para definir nuestro nivel de entrada de seguridad a largo

FiltroCortoSeg

0.985

Cantidad por la que hemos de multiplicar al anterior PívotHigh para definir nuestro nivel de entrada de seguridad a corto

ADXLen

14

Periodo para el cálculo del indicador ADX

NivelADXHigh

40

Nivel por encima del cual no permitimos operar por encontrarnos en situación de clara direccionalidad

NivelADXLow

15

Nivel por debajo del cual no permitimos operar por encontrarnos en situación de baja direccionalidad

 
Variables
En la siguiente tabla mostramos las variables utilizadas en nuestra estrategia y un breve comentario sobre cada una de ellas.
 

Variable

Comentario

LineaRegresionH(0)

Calcula la línea de regresión de los máximos

LineaRegresionL(0)

Calcula la línea de regresión de los mínimos

LsetupBar(0)

Variable auxiliar que utilizamos para el cálculo del número de barras en las que la orden de compra permanece activa

Ssetupbar(0)

Variable auxiliar que utilizamos para el cálculo del número de barras en las que la orden de venta permanece activa

BuyLevel(0)

Nivel de compra

SellLevel(0)

Nivel de venta

 
 
Resultados históricos
Aunque todos los parámetros que se han utilizado son optimizables, no hemos querido sobre-optimizar la curva de precios histórica, para evitar que el comportamiento futuro del sistema no se asemeje al pasado. Así pues, hemos utilizado una combinación de parámetros estable, que se detallan en la siguiente tabla (haga click aquí para ver las operaciones realizadas por el sistema - Hoja de Excel - 34 kB):
 

Parámetro

Valor por defecto

Comentario

LenLR

28

Número de barras utilizadas en el cálculo de la línea de regresión de los mínimos

LenHR

37

Número de barras utilizadas en el cálculo de la línea de regresión de los máximos

FiltroATR

0.5

Porcentaje de filtro, por encima del cual consideramos que existe la suficiente volatilidad en el mercado para permitir la entrada de nuestra estrategia

Barras

4

Número de barras utilizadas para el cálculo del mayor de los máximos y el menor de los mínimos para la determinación del rango sobre el cual se calcula el filtro de volatilidad

BarEntrada

4

Número de barras desde la entrada en el que permitimos que el negocio "madure" para conseguir que se mueva a nuestro favor

Benef

21

Número de puntos que hemos de tener a favor en las "BarEntrada" barras desde la entrada en la posición. Es el mínimo beneficio que hemos de conseguir para considerar que la operación puede continuar a nuestro favor

stp

100

Número de puntos que arriesgamos nada más entrar en la posición en caso de que el mercado vaya en nuestra contra. Define por lo tanto el Stop de pérdidas inicial.

BarrasAtras

14

Número de barras que permanecen activas las entradas de seguridad

FiltroAlcista

1.008

Porcentaje por el que hemos de multiplicar al menor de los mínimos de las últimas "barras" para obtener el Nivel de Compra.

FiltroBajista

0.994

Porcentaje por el que hemos de multiplicar al mayor de los máximos de las últimas "barras" para obtener el Nivel de Venta.

ActvBar

2

Número de barras que permanecerá activa la orden, una vez que se cumplen las condiciones iniciales

FiltroLargoSeg

1.04

Cantidad por la que hemos de multiplicar al anterior PivotLow para definir nuestro nivel de entrada de seguridad a largo

FiltroCortoSeg

0.97

Cantidad por la que hemos de multiplicar al anterior PívotHigh para definir nuestro nivel de entrada de seguridad a corto

ADXLen

11

Periodo para el cálculo del indicador ADX

NivelADXHigh

45

Nivel por encima del cual no permitimos operar por encontrarnos en situación de clara direccionalidad

NivelADXLow

14

Nivel por debajo del cual no permitimos operar por encontrarnos en situación de baja direccionalidad


Artículos Relacionados


Automatizar Sistemas con TradeStation

Automatizar Sistemas con TradeStation

Tal y como comentábamos en el artículo del pasado 20 de Julio, era posible automatizar sistemas mediante la escritura de un archivo de texto por parte de Visual Chart y la utilización de TSim+, API...

Optimax

Optimax

¿Cansado de pasar demasiadas horas optimizando estrategias en el ordenador? Estamos de enhorabuena: Optimax resuelve este problema y algunos más.

Portfolio Maestro

Portfolio Maestro

Nuevo artículo de Sergi Sánchez de SerSan Sistemas. En esta ocasión Sergi nos habla de Portfolio Maestro, una excelente herramienta integrada en TradeStation que nos permite trabajar con carteras de...

Novedades TradeStation: Version 9.5

Novedades TradeStation: Version 9.5

Recientemente TradeStation ha liberado la versión 9.5 de su plataforma de trading, en este artículo repasamos las novedades más importantes.

Optimización en TradeStation

Optimización en TradeStation

¿Cómo optimizar una estrategia en TradeStation? En este artículo os damos todas las claves y os explicamos cómo programar vuestras propias optimizaciones aprovechando la API de TradeStation.

Cómo Medir la Robustez de tu Sistema

Cómo Medir la Robustez de tu Sistema

Sergi Sánchez, de SerSan Sistemas, nos explica en este excelente artículo cómo medir la robustez de un sistema utilizando el Walk Forward Optimizer de TradeStation.