Enviar ordenes sofisticadas desde Amibroker a TWS

Foro para tratar todo lo relacionado con AmiBroker y el lenguaje de programación AFL.
Avatar de Usuario
Amosis
Mensajes: 306
Registrado: 31 Ene 2006 18:02

Enviar ordenes sofisticadas desde Amibroker a TWS

Mensaje por Amosis »

Amibroker,
junto a su complementario, "Auto Trading Interface for Interactive Brokers", http://www.amibroker.com/at/ , no solo permite gestionar engorrosos sistemas,
sino tambien simples ordenes, tan sofisticadas como se quiera,
para enviarlas inmediatamente o cuando se cumplan determinadas condiciones.

Esta por ejemplo cierra a Mercado, un contrato del Fesx jun 07-dtb-fut cuando el cierre es menor de la Media(50) y el Macd(12,26) es menor que Signal(12,26,9):

Sell=C<MA(C,50) AND MACD(12,26)<Signal>0)
{
//trasmite la orden
ibc.PlaceOrder("fesx jun 07-dtb-fut","sell",1,"MKT",0,0,"Day",True);
}
}
}


//Instrucciones para graficar la orden

Color=ParamColor("Color",colorRed);
style=ParamStyle("Style",styleLine,maskAll);
arrows= ParamToggle("Display Arrows","No|Yes",1);
Plot(C,"PCompraVenta(1)",colorBlue,Style);
Plot(MA(C,periodo),"PCompraVenta(1)Media",color,style);
if ( arrows)
{
PlotShapes(Buy*shapeUpArrow,colorGreen);
}


Las instrucciones que contienen "ibc", (Interactive broker controler) gestionan el envio de ordenes desde Amibroker a TWS.
Son pocas,sencillas, y estan muy bien explicadas, con la sintaxis y ejemplos en el enlace http://www.amibroker.com/at/

Los que esteis interesados podeis leer el tema "Enviar ordenes desde sistema Amibroker a TWS" (Aunque el sistema de ejemplo habría que depurarlo).

Salud, suerte y forsa al canut.
Avatar de Usuario
Amosis
Mensajes: 306
Registrado: 31 Ene 2006 18:02

Mensaje por Amosis »

Disculpad, al copiar la oden, perdí unas cuantas instrucciones.
La orden correcta es la siguiente:

Sell=C<Ma(C,50) and MACD(12,26)<Signal>0)
{

//Trasmite la orden

ibc.PlaceOrder("fesx jun 07-dtb-fut","sell",1,"MKT",0,0,"Day",True);
}
}
}

//Instrucciones para graficar la orden
Color=ParamColor("Color",colorRed);
style=ParamStyle("Style",styleLine,maskAll);
arrows= ParamToggle("Display Arrows","No|Yes",1);
Plot(C,"PCompraVenta(1)",colorBlue,Style);
Plot(MA(C,periodo),"PCompraVenta(1)Media",color,style);
if ( arrows)
{
PlotShapes(Buy*shapeUpArrow,colorGreen);
}
Avatar de Usuario
Amosis
Mensajes: 306
Registrado: 31 Ene 2006 18:02

Mensaje por Amosis »

Lo siento amigos,
pero al pasar de vista preliminar a enviar,
se pierden las 2 instrucciones que controlan el envio de Amibroker a TWS.
No sé porqué.
Ha pasado 2 veces.

Seguiremos estudiando.
Avatar de Usuario
X-Trader
Administrador
Mensajes: 12800
Registrado: 06 Sep 2004 10:18
Contactar:

Mensaje por X-Trader »

Amosis escribió:Lo siento amigos,
pero al pasar de vista preliminar a enviar,
se pierden las 2 instrucciones que controlan el envio de Amibroker a TWS.
No sé porqué.
Ha pasado 2 veces.

Seguiremos estudiando.
Prueba a encerrar el código entre las etiquetas Code del Foro. 8)

Un saludo
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
Avatar de Usuario
Amosis
Mensajes: 306
Registrado: 31 Ene 2006 18:02

Imposible pasar el codigo

Mensaje por Amosis »

Tampoco sale así, encerrando el codigo entre codes.

Bueno, no importa, era solo un ejemplo.

En el enlace que he puesto hay muchos y bien explicados.

Solo queria manifestar que se pueden hacer simples ordenes de compra/venta sin la correspondiente contrapartida.

Saludos y suerte.

Avatar de Usuario
MARTING
Mensajes: 369
Registrado: 14 Jun 2005 05:21

Mensaje por MARTING »

habeis probado alguno de esos ejemplos que funcione correctamente ?

Esta tarde he tenido conectado varios sistemas copiandolos de esos ejemplos y todos lanzaban un monton de ordenes seguidas .

Si por ejemplo escribes que compre cuando el cierre sea mayor que el cierre anterior, lanzara una orden a mercado cuando se da esto aunque no se haya cerrado la vela. Por eso lanza tantas supongo que habra forma de solucionarlo.

Aqui dejo un codigo en AFL por si quereis echarle un vistazo a ver si os funciona ok.
Adjuntos
IB Control SISTEMA.afl
(503 Bytes) Descargado 208 veces
Avatar de Usuario
X-Trader
Administrador
Mensajes: 12800
Registrado: 06 Sep 2004 10:18
Contactar:

Mensaje por X-Trader »

MARTING escribió:habeis probado alguno de esos ejemplos que funcione correctamente ?

Esta tarde he tenido conectado varios sistemas copiandolos de esos ejemplos y todos lanzaban un monton de ordenes seguidas .

Si por ejemplo escribes que compre cuando el cierre sea mayor que el cierre anterior, lanzara una orden a mercado cuando se da esto aunque no se haya cerrado la vela. Por eso lanza tantas supongo que habra forma de solucionarlo.

Aqui dejo un codigo en AFL por si quereis echarle un vistazo a ver si os funciona ok.
A mi me pasó eso desde el principio y no logré solucionarlo (le metí booleanas para limitar las ordenes pero ni por esas), de ahi que abandonara AmiBroker para la automatización; no obstante, si conseguis lanzar ordenes de forma aceptable contadlo por aqui ;-)

Un saludo
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
Avatar de Usuario
strada
Mensajes: 71
Registrado: 18 Nov 2004 14:05

Mensaje por strada »

Pienso que el problema es que le "dices" al progama que compre, cuando se cumplan las condiciones y mientras la posición sea 0, claro, la posición no deja de ser 0 hasta que se realiza la operación y esto tarda un tiempo. Durante este tiempo, el AMI "lee" el script de tu sistema varias veces, cada vez que lee manda una orden.
Para solucionarlo, le pones la condición de que no haya ninguna orden pendiente, pero mientras el IBC le dice al AMI que tiene una orden pendiente, al AMI le da tiempo a leer el script alguna vez más, y manda alguna orden más.
Por esto en el "automático" que he hecho le he puesto muchas condiciones que son redundantes, para que AMI tarde algo más en "leer", pero aún así a veces falla, por esto pienso que cada vez que el AMI mande una orden se le debe poner a "dormir" algunos milisegundos. Pero claro, poner a dormir al AMI no al IBC. Yo no he sabido ponersela, pero creo que con eso estaría solucionado.

Saludos
El perro le dijo al hueso:
tú serás duro pero yo no tengo prisa.
Avatar de Usuario
MARTING
Mensajes: 369
Registrado: 14 Jun 2005 05:21

Mensaje por MARTING »

Supongo que sera con esta función, mañana intetaré probar a ver si lo consigo con esto.

# Sleep( number Milliseconds )
(new in 1.0.8)

This is EXPERIMENTAL function.

Suspends the execution for specified number of milliseconds.

Please do NOT use this function unless you really have to, because it locks both IBController and AmiBroker for specified period of time and both applications won't respond to user actions (such as mouse/keyboard input). If you suspend execution for more than few seconds AmiBroker will complain about OLE server not responding.

Example:
ibc.Sleep( 1000 ); // sleep for 1000 milliseconds = 1 second
Avatar de Usuario
Amosis
Mensajes: 306
Registrado: 31 Ene 2006 18:02

Malditas ordenes !

Mensaje por Amosis »

Marting, en este caso concreto a mi me va bien. (en 15 minut)
Me compra cada vez que el cierre de la barra es mayor que el anterior.
Usa la funcion cross, por ejemplo buy=cross(close,ema(close,45))
y sobretodo...ten mucho cuidado de no introducir varias veces el sistema al compilarlo.
yo uso la TWS papertrading, y no la DEmo.

Saludos y suerte
Avatar de Usuario
MARTING
Mensajes: 369
Registrado: 14 Jun 2005 05:21

Mensaje por MARTING »

ok Amosis mañana probare con la funcion cross tambien quizá esta funcione diferente, ya lo estuve pensando porque ademas tambien he leido en el foro que a strada tambien le funcionaba con un sistema continuo, supongo que seria tambien con la funcion cross.

Mañana sabremos algo mas que hoy ( espero)

Un saludo
Avatar de Usuario
MARTING
Mensajes: 369
Registrado: 14 Jun 2005 05:21

Mensaje por MARTING »

Bueno pues he descubierto algo, no mucho pero algo es algo.

Cuando lanza ordenes consecutivas seguidas a mercado suele ser cuando aun no ha acabado de recalcular la vela.
Si le dices Buy = C > Ref( C, -1); entonces estara todo el rato lanzando ordenes mientras el cierre este por encima del cierre anterior aunque no haya cerrado la vela.
Para solucionarlo hay que poner : Buy = Ref( C, -1) >Ref( C, -2 );
Así solo lanza la orden cuando ha finalizado la vela anterior y esta es mayor que la anterior, haciendolo asi únicamente envia una orden y lo hace correctamente.

He hecho un codigo sencillo para probar las funciones que hace lo siguiente:
Si el cierre es mayor que el cierre anterior entonces lanza una orden de compra a mercado pero no la transmite, esta parte del codigo exije que la orden se ejecute manualmente.

Una vez que la orden esta fijada si se da la condicion que cierre es menor que le cierre anterior entonces cancela la orden.

Lo he tenido un buen rato funcionando y trabaja ok.
Aqui os dejo el codigo por si alguien quiere verlo.
Adjuntos
FIJAR UNA ORDEN Y CANCELARLA.afl
(1.57 KiB) Descargado 244 veces
Avatar de Usuario
trikero
Mensajes: 739
Registrado: 24 Ago 2006 23:44

Mensaje por trikero »

perdonad si pongo pseudo codigo, pero es que todavia no me he metido con el afl.

creo que aparte del tema de cierre de velas/barras que seguro hay alguna condicion que indique si la barra esta cerrada o no o podremos definirla de alguna manera como ha hecho marting, el tema de lanzar ordenes podria ser asi.

definir una variable multi estado por ejemplo estadoOrden con valores 1 - lanzada / 2 - recibida / 3 - ejecutada /4 - time-out y otra variable tipo segundos o tiempo horaDisparo =segundo actual

logica del sistema

if "tal cual me es igual" entonces
estadoorden=1
horaDisparo=segundo actual
lanzar orden a la tws segun lo que tengamos pensado
fin if
esperar x milisegundos (o hacer un bucle for i=1 to 1000000 por ejemplo) algo que tarde un poco para darle tiempo a la tws a recibir y "darse por enterado"hasta que se procese

"comprobar" si se ha recibido la orden en la tws//(sorry, eso lo supongo, por que como digo no me he estudiado la api, pero casi seguro que existe o intentanlo por medios indirectos)

si (hora actual - horaDisparo) >15 segundos ->ojo algo va mal en el enlaze ami-tws, comprobar conexiones y demas, cancelar orden o lo que sea

si es que si
estadoorden=2

si es que no
esperar x milisegundos
volver a "comprobar"

"mientras" estadoorden=2

si ( lahoraactualsistema-horaDisparo) >5 minutos ->ojo, no se ha ejecutado entonces
estadoorden=4
mandarordencandelacion u otra accion que consideremos
salir del bucle "mientras" superior
//esto es opcional, solo para tratar casos de error o ordenes a mercado o limitadas que no se hayan ejecutado y ya sean "viejas" en fin, condiciones de error

comprobar si se ha ejecutado // (idem punto anterior)
si se ha ejecutado
estadoorden=3
salir de "mientras"
si no se ha ejecutado
esperar x milisegundos
volver a "mientras"

y seguro que aun falta algo que me dejo.al fin y al cabo todo lo anterior sirve para "transaccionalizar" una operacion. con este palabro informatico quiero decir que hay que hacer un proceso/procedimiento en el que cada paso/fase de una orden (disparo,envio, recepcion broker, ejecucion o fallo por mil causas) tengamos algo de informacion sobre su estado tanto desde el punto de vista del ami como de la tws para operar en consecuencia.

pero esto es indiferente de si es ami, m4 o vc, siempre que desde un programa o sub programa se lanza una orden a otro hay que comprobar en todos los extremos/puntos cual es el estado de la orden y si se ha ejecutado bien o no. y mas si es una orden critica como lanzar una orden al mercado

por experiencia se que la regla de pareto se cumple en informatica, el 80% del codigo es para comprobacion de errores propios o ajenos y solo el 20% es el que realmente contiene la "inteligencia"


saludos.
las gacelas tambien tenemos derecho a pasto
Es probable que Dios no exista. Ahora, deja de preocuparte y disfruta de la vida
Avatar de Usuario
MARTING
Mensajes: 369
Registrado: 14 Jun 2005 05:21

Mensaje por MARTING »

Amigos esto es tecnologia punta Alemana , funciona perfecto.

Este sistema lanza una orden de compra a mercado y la transmite cuando el cierre es mayor que el cierre anterior.
Si una vez que la posicion esta abierta se da la condicion que el cierre es menor o igual que el cierre anterior , entonces lanza una orden de venta y liquida la posicion.

Me he dado cuenta que cuando conectas el sistema por primera vez hay que fijarse en el IBC que no haya ordenes pendientes por transmitir, si las hay entonces nada mas activar el sistema lanzara las que deba mas las que esten en cola. ( por esto a veces lanza 2 o 3 ordenes seguidas ).

Aqui va el codigo:
Adjuntos
Abrir largo y cerrar largo.afl
(1.71 KiB) Descargado 242 veces
Avatar de Usuario
Amosis
Mensajes: 306
Registrado: 31 Ene 2006 18:02

Felicidades

Mensaje por Amosis »

Felicidades MartinG,
La he observado yo tambien y funciona perfectamente.
Me he permitido añadirle el codigo para graficarla.

De todas formas, para utilizar "en real" el IBControler, deberiamos informarnos antes en el soporte o algun foro de los probables fallos.

Lo ideal sería que alguien que sepa suficiente ingles escribiera al soporte o entrara en algun foro.

En fin iremos poco a poco.

Salud.
Adjuntos
Martin-Buena.afl
(1.81 KiB) Descargado 228 veces
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “AmiBroker”