Muchos de los sistemas de Larry Williams venden en la primera apertura rentable. Esto es, una vez establecido el precio de entrada se espera a que haya una apertura con ganancias, aunque sea de 1 dólar, y se vende.
Esto es muy sencillo de implementar en muchos lenguajes de programación, p.e. Tradestation, pero no es tan sencillo en Amibroker porque este software está basado en arrays y no en secuencia ordenada de barras, así que el array BuyPrice se puede ver modificado si entran nuevas compras cuando ya estabas comprado. Con una imagen se entenderá mejor:
El precio de compra es 921.50 pero al llegar una compra mientras estábamos comprados el precio cambia a 871 (el cierre de la segunda barra naranja), así que Amibroker piensa que salirse a 905.50 es la primera apertura con ganancias cuando en realidad no lo es, deberíamos salirnos por encima de 921.50.
Esto ocurre porque la forma más sencilla de implementar la salida FPO (First Profitable Opening) es esta:
Sell = Open > ValueWhen(Buy,BuyPrice);
SellPrice = Open;
Pero no es del todo correcta por el problema mencionado. El código que proponemos hoy soluciona el problema sustituyendo lo anterior por un bucle que bloquea el BUYPRICE para que no se mueva hasta que la operación se cierre. También aprovecha el bucle para implementar el Stop Loss. La salida corregida se puede ver a continuación:
CÓDIGO PARA VENDER EN LA PRIMERA APERTURA RENTABLE:
//SALIR CON PRIMERA APERTURA RENTABLE
priceatbuy = 0; bi = BarIndex();
for( i = 0; i < BarCount; i++ )
{
if( priceatbuy == 0 && Buy[ i ] ) //PRIMERA COMPRA
{
priceatbuy = BuyPrice[ i ]; //PRECIO DE COMPRA
stopprice = priceatbuy - nstop * desv_carver[ i ]; //PRECIO DE STOP LOSS
EntryBar = bi[ i ]; //BARRA EN LA QUE COMPRAMOS
}
if( priceatbuy > 0 && bi[ i ] > EntryBar && Open[ i ] > priceatbuy) //SI COMPRADOS Y FPO
{
Sell[ i ] = 1;
SellPrice[ i ] = Open[i];
priceatbuy = 0;
}
else if( priceatbuy > 0 && Low[ i ] < stopprice ) //SI STOP LOSS
{
Sell[ i ] = 1;
Buy [ i ] = 0; //SI TOCA VENDER NO PODEMOS COMPRAR
SellPrice[ i ] = stopprice;
priceatbuy = 0;
}
else
Sell[ i ] = 0;
}
Eres un friki de la programación de algoritmos, sistemas de trading y demás cosas raras? Encuentra aquí el código y herramientas útiles para probar sistemas y gestión de capital. Amibroker Python, Excel...
Suscribirse a:
Enviar comentarios (Atom)
ENTRADAS POPULARES
-
Hoy traigo una aplicación en Amibroker que es a la vez sencilla y práctica. Es una plataforma que sirve para operar acciones y que aprovecha...
-
El primer vídeo que se subió en 2019 al canal YouTube de Onda4 muestra un sistema de trading completo, con su backtesting y con su algoritmo...
-
Vamos a ver un sistema de trading clásico cuya lógica es bien simple. Se trata del sistema de Connors que utiliza un RSI de 2 sesiones para ...
-
Supongamos una acción muy volátil, del mercado americano, cuyo precio es de 20 dólares y cuya desviación estándar anual es de 30 dólares. ...
-
El sistema "Agorero" opera el SP500 abriendo posiciones cortas cuando hay las siguientes señales bajistas: Baja volatilidad Nuevos...
Oscar, no sabes cuanto me ha traído esto de cabeza, menos mal que lo he encontrado!! Ni en el foro de Amibroker sabían solucionarlo. Una cuestión, el sistema FUGAX del libro "Trading con Sistemas Automáticos" vende en la primera apertura rentable después del segundo día, ¿cómo se implementaría esto?
ResponderEliminarMuchas gracias!
añades AND BarsSince(Buy) >= 2, o a través de los settings le puedes forzar a que salga como mínimo después de dos barras "MinBarExit"
EliminarUna pregunta más Oscar, vender a la primera apertura rentable de un corto, sería así?:
ResponderEliminar//SALIR CON PRIMERA APERTURA RENTABLE Bajista
priceatshort = 0; bi = BarIndex();
for( i = 0; i < BarCount; i++ )
{
if( priceatshort == 0 && Buy[ i ] ) //PRIMERA VENTA
{
priceatshort = ShortPrice[ i ]; //PRECIO DE Venta
stopprices = priceatbuy + priceatbuy*0.05; //PRECIO DE STOP LOSS
EntryBar = bi[ i ]; //BARRA EN LA QUE COMPRAMOS
}
if( priceatshort > 0 && bi[ i ] < EntryBar && Open[ i ] < priceatshort) //SI COMPRADOS Y FPO
{
Cover[ i ] = 1;
CoverPrice[ i ] = Open[i];
priceatshort = 0;
}
else if( priceatshort < 0 && Low[ i ] > stopprices ) //SI STOP LOSS
{
Cover[ i ] = 1;
Short [ i ] = 0; //SI TOCA VENDER NO PODEMOS COMPRAR
CoverPrice[ i ] = stopprice;
priceatshort = 0;
}
else
Cover[ i ] = 0;
}
if( priceatshort == 0 && Short[ i ] ) //PRIMER CORTO
ResponderEliminarHay que tener cuidado al hacer la traslación. Puede que tengas que cambiar algo más. Saludos,
Muchas gracias por tu respuesta Oscar!! Tengo un nivel medio de Python pero la sintaxis de AFL me está volviendo loco, entiendo que debería hacerme un curso de sintaxis de c++...
Eliminar