Ordenes automáticas con AMI

Foro genérico sobre programas relacionados con el trading: gráficos, ejecución de órdenes, automatización, etc.
Responder
Avatar de Usuario
strada
Mensajes: 72
Registrado: 18 Nov 2004 14:05

Ordenes automáticas con AMI

Mensaje por strada »

Hola
Como los ateriores daban problemas de conttrol sobre las órenes los he cambiado.
Este es un pequeño sistema que lleva añadido la automatización de órdenes en AMIB. Es un reverse que siempre está en mercado con un contrato; para utilizar MoneyM habrá que aprender a programar algo más. Por ahora espero que esto os sea de alguna utilidad.

Podeis probarlo en gráficos de un minuto para que cambie de posición rápidamente, en el Paper de IB con Eur Fut.

Solo hay que copiarlo y pegarlo:
(si veis algún fallo por favor comentarlo)


////Para probar IBController ////


Ind=Ref(MACD(12,17),-1);
Ind2=MA(Ind,2);

Buy=Cross(Ind,Ind2);
Short=Cross(Ind2,Ind);
Cover=Buy;
Sell=Short;
SellPrice=O;
BuyPrice = O;
Plot(Ind,"Ind",colorRed);
Plot(Ind2,"Ind2",colorBlue);

PlotShapes(IIf (Buy,shapeUpArrow,shapeNone),colorGreen,0,Graph0,-12);
PlotShapes(IIf(Short,shapeDownArrow,shapeNone),colorRed,0,Graph0,-12);

//// IBController //////

ibc = GetTradingInterface("IB");

if( LastValue( Buy ) )
{

// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) <= 0 )AND (ibc.IsOrderPending(OrderId ) == False) )
{

// transmit order
OrderID = ibc.PlaceOrder( "6EH6-GLOBEX-FUT", "Buy", 1, "MKT", 0, 0.02, "Day", True,1 );
// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}

if( LastValue( Short) )
{

// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) >=0 )AND (ibc.IsOrderPending(OrderId) == False) )
{

// transmit order
OrderID = ibc.PlaceOrder("6EH6-GLOBEX-FUT", "sell", 1, "MKT", 0, 0.02, "Day", True,1 );

// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}
El perro le dijo al hueso:
tú serás duro pero yo no tengo prisa.
Avatar de Usuario
strada
Mensajes: 72
Registrado: 18 Nov 2004 14:05

Mensaje por strada »

Bueno, pues este es otro sistemilla para probar órdenes automáticas con AMI, pero con este te puede dejar fuera de mercado, es decir controla las órdenes Sell y Cover.

A mí me funciona correctamente escepto el stop, se supone que debería saltar a 2 pipos pero no salta. Habrá que estudiar más. ;-)

También es para el EUR.
Saludos y suerte.

////Para probar IBController ////


Ind=Ref(MACD(8,17),-1);
Ind3=Ref(MACD(3,10),-1);
Ind2=Ind+0.0001;


Buy=Cross(Ind3,Ind);
Short=Cross(Ind2,Ind3);
Sell=Cross(Ind3,Ind2) ;
Cover=Cross(Ind,ind3) ;

CoverPrice=O;
ShortPrice=O;
SellPrice=O;
BuyPrice = O;

Buy=ExRem(Buy,Short);
Short=ExRem(Short, Buy);
Cover=ExRem(Cover,Short);
Sell=ExRem(Sell,Buy);

Plot(Ind,"Ind",colorRed);
Plot(Ind2,"Ind2",colorBlue);
Plot(Ind3,"I3",colorYellow);

PlotShapes(IIf (Cover,shapeUpArrow,shapeNone),colorWhite,0,Graph0,-12);
PlotShapes(IIf(Sell,shapeDownArrow,shapeNone),colorYellow,0,Graph0,-12);
PlotShapes(IIf (Buy,shapeUpArrow,shapeNone),colorGreen,0,Graph0,-12);
PlotShapes(IIf(Short,shapeDownArrow,shapeNone),colorRed,0,Graph0,-12);

//// IBController //////

ibc = GetTradingInterface("IB");

if( LastValue( Buy ) )
{

// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) <= 0 )AND (ibc.IsOrderPending(OrderId ) == False) )
{

// transmit order
OrderID = ibc.PlaceOrder( "6EH6-GLOBEX-FUT", "Buy", 1, "MKT", 0, 0.0002, "Day", True,1 );
// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}

if( LastValue( Short) )
{

// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) >=0 )AND (ibc.IsOrderPending(OrderId) == False) )
{

// transmit order
OrderID = ibc.PlaceOrder("6EH6-GLOBEX-FUT", "sell", 1, "MKT", 0, 0.0002, "Day", True,1 );

// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}

if( LastValue( Cover ) )
{

// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) < 0 )AND (ibc.IsOrderPending(OrderId ) == False) )
{

// transmit order
OrderID = ibc.PlaceOrder( "6EH6-GLOBEX-FUT", "Buy", 1, "MKT", 0, 2, "Day", True,1 );
// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}

if( LastValue( Sell) )
{

// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) >0 )AND (ibc.IsOrderPending(OrderId) == False) )
{

// transmit order
OrderID = ibc.PlaceOrder("6EH6-GLOBEX-FUT", "sell", 1, "MKT", 0, 2, "Day", True,1 );

// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}
El perro le dijo al hueso:
tú serás duro pero yo no tengo prisa.
MasoNN
Mensajes: 41
Registrado: 16 Ene 2006 02:47

Mensaje por MasoNN »

Funciona con IB?
Ni más ni menos... Ni más ni menos...
MasoNN
Mensajes: 41
Registrado: 16 Ene 2006 02:47

Mensaje por MasoNN »

Tonto de mi, si que funciona, si comentas que es paper trading de IB.

Thx.!!
Ni más ni menos... Ni más ni menos...
Avatar de Usuario
enki
Mensajes: 589
Registrado: 17 Sep 2004 21:39

Mensaje por enki »

Como envidio a los que sabeis programar :wink:

Un saludo :smt006
Avatar de Usuario
X-Trader
Administrador
Mensajes: 11071
Registrado: 06 Sep 2004 10:18
Contactar:

Mensaje por X-Trader »

Pues yo Strada por más que lo intento no me sale. Intento hacer un sistema tonto para lanzar las ordenes en modo prueba y se vuelve loco lanzando mil ordenes por segundo. Éste es el último código que usé, a ver si ves algo raro (y, por cierto, a ver si saco un rato para probar el tuyo). Como puedes ver uso una booleana para evitar la locura de las ordenes pero nada, es como si cogiera una orden por segundo cada vez que se mueve el precio:
LastPosition=0;
Buy=C > Ref(C, -1);
Sell=C < Ref(C, -1);
Buy = ExRem(Buy,Sell);
Sell = ExRem(Sell,Buy);

if( LastValue( Buy ) )
{
ibc = GetTradingInterface("IB");

if( ibc.IsConnected() )
{
if(LastPosition==0)
{
ibc.PlaceOrder( Name(), "Buy", 1, "MKT", 0, 0, "Day", False);
LastPosition=1;
}
}

else
{
if( LastPosition==-1)
{
ibc.PlaceOrder( Name(), "Buy", 2, "MKT", 0, 0, "Day", False );
LastPosition=1;
}
}
}

if( LastValue( Sell ) )
{
ibc = GetTradingInterface("IB");
if( ibc.IsConnected() )
{
if( LastPosition==0 )
{
ibc.PlaceOrder( Name(), "Sell", 1, "MKT", 0, 0, "Day", False );
LastPosition=-1;
}
}

else
{
if( LastPosition==1 )
{
ibc.PlaceOrder( Name(), "Sell", 2, "MKT", 0, 0, "Day", False );
LastPosition=-1;
}
}
}
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: 72
Registrado: 18 Nov 2004 14:05

Mensaje por strada »

Hola
No puedo decir que sepa programar pero probando aquí y allá van saliendo cosas, es cuestion de dedicarle tiempo. La verdad es que este AFL es bastante sencillo. Lo que no entindo bien es las órdenes IF- ELSE
ó DO - While y tampoco sé dónde aprender algo más sobre esto, no sé de qué lenguaje se trata, si Visual, c++ o qué. :smt102

Me parece que el Controller no va muy fino, me imagino que lo irán mejorando. Como lo necesito para mi sistema lo iré perfeccionando para que haga lo que yo quiero, que funcionen los stops y al gún tipo de MM.

X , A mí me pasaba lo mismo, para que no ocurra esto hay que meter las órdenes en una "hipotética" lista:

// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);


Y antes de abrir una orden hay que chequear esta lista y comprobar que no queden órdenes pendientes:


// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) <= 0 )AND (ibc.IsOrderPending(OrderId ) == False) )

De esta forma cada órden me queda así:


ibc = GetTradingInterface("IB");

if( LastValue( Buy ) )
{

// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) <= 0 )AND (ibc.IsOrderPending(OrderId ) == False) )
{

// transmit order
OrderID = ibc.PlaceOrder( "6EH6-GLOBEX-FUT", "Buy", 1, "MKT", 0, 0.0002, "Day", True,1 );
// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}

Las claves para que me funcionara están en los comandos: StaticVarGetText y StaticVarSetText. Y utilizar PlaceOrder en lugar de TansmitOrder. O sea que es nuy "delicadito" hay que darle todo bien masacado, incluso el contrato en el que quieres que trabaje...

De todas formas el Stop que dicen que debería funcionar a mí no me funciona y no sé porqué. En fin, todo se andará.

Bueno espero que te funcione.
Saludos y suerte
El perro le dijo al hueso:
tú serás duro pero yo no tengo prisa.
Avatar de Usuario
MARTING
Mensajes: 370
Registrado: 14 Jun 2005 05:21

Mensaje por MARTING »

Segun lo que he entendido hasta ahora el Amibroker chekea el codigo entero cada 5 segundos y lo hace desde arriba hasta abajo, si despues de una orden le das valor a la variable 1 y en la entrada del codigo ( arriba del todo ) le das valor 0 identificara que siempre vale 0, por eso da error el codigo.

Para solucionar esto con ordenes a mercado hay que usar la funcion ibc.GetPositionSize( Name() ) == X así chekea la posicion que hay en la TWS antes de lanzar la orden.
Haciendolo asi con ordenes a mercado funciona perfecto, ese era el error que tenia el codigo.

Yo ahora estoy con un error nuevo ( ordenes a stop) que son mucho mas dificiles que las mkt y ademas no hay nada de informacion en la red, al menos yo no he encontrado nada.
Avatar de Usuario
X-Trader
Administrador
Mensajes: 11071
Registrado: 06 Sep 2004 10:18
Contactar:

Mensaje por X-Trader »

MARTING escribió:Segun lo que he entendido hasta ahora el Amibroker chekea el codigo entero cada 5 segundos y lo hace desde arriba hasta abajo, si despues de una orden le das valor a la variable 1 y en la entrada del codigo ( arriba del todo ) le das valor 0 identificara que siempre vale 0, por eso da error el codigo.

Para solucionar esto con ordenes a mercado hay que usar la funcion ibc.GetPositionSize( Name() ) == X así chekea la posicion que hay en la TWS antes de lanzar la orden.
Haciendolo asi con ordenes a mercado funciona perfecto, ese era el error que tenia el codigo.

Yo ahora estoy con un error nuevo ( ordenes a stop) que son mucho mas dificiles que las mkt y ademas no hay nada de informacion en la red, al menos yo no he encontrado nada.
No, si al final me haceis ponerme de nuevo con al AmiBroker!!! :-D

Saludos,
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
MARTING
Mensajes: 370
Registrado: 14 Jun 2005 05:21

Mensaje por MARTING »

:-D :-D :-D :-D
Avatar de Usuario
MARTING
Mensajes: 370
Registrado: 14 Jun 2005 05:21

Mensaje por MARTING »

Voy a lanzar una inderecta sutil a ver que pasa...

:wink:
Adjuntos
SISTEMA CIERRES.afl
(2.49 KiB) Descargado 191 veces
Avatar de Usuario
trikero
Mensajes: 743
Registrado: 24 Ago 2006 23:44

Mensaje por trikero »

aprovechando este hilo quisiera, antes de dar mil vueltas, preguntaros algo:

estoy empezando a programar mi operativa en el AMIbroker ,pero cuando lo pongo en el ami me genera mil y un entradas,siempre que se cumple la condicion en cada barra, cuando lo que suiero es que se ejecute en la primera barra que se de la condicion (que tal media sea mayor que tal otra)

no puedo poner la condicion getposition o similar por que es para hacer backtest, no para papertrading o real, que es lo que "cortaria" la reiteracion de la orden de compra o venta.

antes de leerme cada una de las 800 paginas del manual y unos cientos de foros ¿?algun alma caritativa tiene la solucion a esto¿?

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
strada
Mensajes: 72
Registrado: 18 Nov 2004 14:05

Mensaje por strada »

Hola Trikero,

Supongo que ya lo habrás encontrado, pero por si acaso, mira la función (ExRem) que es para evitar exceso de señales.

P.D. Hace tiempo que no miraba el Foro, por esto no he contestado antes.
saludos
El perro le dijo al hueso:
tú serás duro pero yo no tengo prisa.
Si te ha gustado este articulo, ¡compártelo en redes!
Responder

Volver a “Software”