Página 1 de 1

Ordenes automáticas con AMI

Publicado: 10 Ene 2006 14:08
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);
}
}
}

Publicado: 23 Feb 2006 23:19
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);
}
}
}

Publicado: 24 Feb 2006 01:50
por MasoNN
Funciona con IB?

Publicado: 24 Feb 2006 01:51
por MasoNN
Tonto de mi, si que funciona, si comentas que es paper trading de IB.

Thx.!!

Publicado: 24 Feb 2006 07:52
por enki
Como envidio a los que sabeis programar :wink:

Un saludo :smt006

Publicado: 24 Feb 2006 09:24
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

Publicado: 24 Feb 2006 13:43
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

Publicado: 01 May 2007 02:57
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.

Publicado: 01 May 2007 10:25
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

Publicado: 01 May 2007 11:00
por MARTING
:-D :-D :-D :-D

Publicado: 01 May 2007 15:02
por MARTING
Voy a lanzar una inderecta sutil a ver que pasa...

:wink:

Publicado: 07 Jun 2007 23:48
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.

Publicado: 04 Jul 2007 13:50
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