Página 1 de 1

AMI Automatico

Publicado: 14 Mar 2007 11:10
por strada
Hola, saludos a todos,
Hacía tiempo que no entraba en el foro, ... hay que entrar más, siempre hay buena compañía y mucha información útil.

Con el ánimo de aportar algo pongo el código de un sistemilla con la automatización de las órdenes, aviso que no funciona fino fino y hay que vigilarlo, aunque está muy lioso y redundante, lo he mejorado algo y veo que hay quien tiene cierto interés.
Ahora, al mismo tiempo que contrata pone un stop a la distancia que quieras, y cuando se cierran las posiciones lo quita.
Funciona casi siempre, pero a veces no sé porqué falla.
Yo lo tengo en un sistema más tranquilo, pero para pruebas lo tengo en este sistemilla y en Tick, a lo mejor por esto falla más, porque entra y sale muy rápido.
Primero hay que bajarse, instalar y autorizar, con una clave que hay que pedir a los de AMI por emilio (X-Tra tiene un artículo), el IB Controller Autotrading Interface desde http://www.amibroker.com/at/ .
Luego abrir una ventana nueva de sistemas, pegar el script que pongo al final, guardar el sistema e insertarlo en el chart.

Hay que usarlo en la cuenta Paper de IB con el contrato de Marzo del EUR, para usarlo en el siguiente hay que cambiar las claves en el script donde pone contrato.
Los que teneis algún interés probadlo y contarnos.

Saludos


////Para probar IBController ////

Ind1=Ref(MACD(11,19),-1);
AMArillo=Ref(MACD(5,10),-1);
Azul=Ind1+0.00001;
Rojo=Ind1-0.00001;

Buy=Cross(AMArillo,Rojo) ;
Short=Cross(Azul,AMArillo) ;
Sell=Cross(AMArillo,azul) ;
Cover=Cross(Rojo,AMArillo) ;

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

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

//StochK(14); Plot(StochK(14,3),"",colorBlack);
Plot(Rojo,"Ind",colorRed);
Plot(Azul,"Ind2",colorBlue);
Plot(AMArillo,"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 //////
Pos=1;
Stop=0.001;
Contrato="6EH7-GLOBEX-FUT";
OrderIDB = StaticVarGetText("OrderIDB"+Contrato);
OrderIDS = StaticVarGetText("OrderIDS"+Contrato );
ORderIDC= StaticVarGetText("OrderIDC"+Contrato );
ORderIDSL= StaticVarGetText("OrderIDSL"+Contrato );

ibc = GetTradingInterface("IB");

////////////////////////////////// BUY ////////////////////////////

if( (LastValue( Buy )==1) AND (ibc.IsOrderPending(OrderIDB) == False) AND (ibc.GetPositionSize( Contrato ) <= 0) )
{
if( ibc.IsConnected() )
{


if(( ibc.GetPositionSize( Contrato ) <= 0 ))
{
if( ibc.GetStatus(ORderIDS) =="PreSubmitted")
{
do{
ibc.CancelOrder(ORderIDS);
}while (1<0>=0) )
{
if( ibc.IsConnected() )
{


if(( ibc.GetPositionSize( Contrato ) >=0 ))
{
if( ibc.GetStatus(ORderIDB) =="PreSubmitted")
{
do{
ibc.CancelOrder(ORderIDB);

}while (1<0);
}
if (ibc.IsOrderPending( ORderIDS) == False)
{
Corto= abs(ibc.GetPositionSize( Contrato ))+Pos;
ParentIDS = ibc.PlaceOrder
( Contrato , "SELL", Corto, "MKT", 0, 0, "GTC", False,1,"ignoreRth" );
stopS=LastValue(ValueWhen(Short==1,O,1),True);
OrderIDS=ibc.PlaceOrder
( Contrato , "BUY", Pos, "STP", 1.2150, stopS+Stop, "GTC", True,1,"ignoreRth",ParentIDS);

StaticVarSetText("OrderIDS"+Contrato , OrderIDS);
}

}
}
}

////////////////////////////// COVER /////////////////////////////
if ( NOT(ibc.GetStatus(ORderIDC) == "PreSubmitted") AND (NOT(ibc.GetStatus(ORderIDC) == "Filled")) )
{
if( (LastValue( Cover )==1) AND (ibc.IsOrderPending( ORderIDC)==False) AND (ibc.GetPositionSize( Contrato )<0) )
{
if ( NOT(ibc.GetStatus(ORderIDC) == "PreSubmitted") AND (NOT(ibc.GetStatus(ORderIDC) == "PendingSubmit") ) )
{

if( ibc.GetPositionSize( Contrato ) <0 )
{ ibc.GetStatus(ORderIDC);
if ( (ibc.IsOrderPending( ORderIDC) == False))
{

Largo=abs(ibc.GetPositionSize( Contrato ));

OrderIDC = ibc.PlaceOrder
( Contrato , "BUY", Largo, "MKT", 0, 0, "GTC", True,1,"ignoreRth" );

StaticVarSetText("OrderIDC"+Contrato , OrderIDC);

if( (ibc.GetStatus(ORderIDS) =="PreSubmitted") )
{
do{
ibc.CancelOrder(ORderIDS);
}while (1<0>0) )
{
if( NOT(ibc.GetStatus(ORderIDSL) == "PreSubmitted") AND (NOT(ibc.GetStatus(ORderIDSL) == "PendingSubmit")) )
{
if (ibc.IsOrderPending( ORderIDSL) == False)


{
if(( ibc.GetPositionSize( Contrato ) >0 ))
{

Corto= abs(ibc.GetPositionSize( Contrato ));
OrderIDSL = ibc.PlaceOrder
( Contrato , "SELL", Corto, "MKT", 0, 0, "GTC", True,1,"ignoreRth" );
StaticVarSetText("OrderIDSL"+Contrato , OrderIDSL);

if( ibc.GetStatus(ORderIDB) =="PreSubmitted")
{

do{
ibc.CancelOrder(ORderIDB);
}while (1<0);

}



}
}
}
}
}
Plot(C,"SB",colorBlack,styleOwnScale);

Publicado: 14 Mar 2007 12:41
por trikero
strada, yo ayer estuve probando con el plug-in de ami para ib que no necesita activarse (almenos el mulero que tengo ) y iba bien, quizas no te haga falta este añadido que esta en beta desde el 2006 y vaya mas fino

no pude probar mucho por que no tengo cuenta en ib y por lo tanto no podia hacer backfill, pero en principio se conectaba sin problemas con la ultima tws en local (activando plugins activex) y declarando en el ami una base de datos con toma de datos desde el plugin de ib (api)

version de ami: 4.8

Publicado: 14 Mar 2007 16:12
por Zubi
Trikero, yo no tengo nada q ver con strada. (tengo 2 nicks este pa cuando toy en Graná y Kuelebre, q utilizo aveces cuando voy a mi querida Asturias o me entra nostalgia.
Por otra parte, no tengo el ami, porq no tengo NPI, ni de ingles ni de programar, jjjj :-D :-D
Salu2.

Publicado: 14 Mar 2007 17:11
por trikero
sorry,zubi, vi el avatar y me parecio el tuyo y ni mire el nick, sorry a veces damos por supuesto muchas cosas.

mis disculpas si te ha molestado

Publicado: 14 Mar 2007 17:44
por Zubi
En absoluto me ha molestado, solo aclarar, ya q con la cantidad de multinicks q algun@s utilizan, pudiera ser q pensases q eramos la misma persona la q esta detras del 'pato lucas' y 'coyote', q si son los dos de la Warner, pero no es el caso. :-D

Salu2.

Publicado: 16 Mar 2007 12:45
por strada
Gracias triquero, pero no es el plugin lo que hay que activar, es el Trading interface que es una pequeña aplicación, creo que es lo que se llama un objeto COM que se abre desde el script del sistema.

Saludos y suerte

Publicado: 16 Mar 2007 17:07
por trikero
pues en este post me estoy cubriendo de gloria, confundo a zubi con strada y ahora esto. cuando coja al aleman se va a enterar.

oye, y p'a que c... sirve este plug-in, por que si no estoy equivocado con el que yo te he mencionado entiendo que tambien se pueden hacer sistemas automaticos en ami operando sobre tws.

me lo aclaras porfi :lol:

Publicado: 17 Mar 2007 13:03
por strada
Pues, que yo sepa el plugin de IB es para conectar AMI con la TWS de manera que se puedan recibir datos y almacenalos sobre todo, desde la TWS hacia AMI.
Pero para que desde AMI se puedan enviar datos a tu TWS se necesita el IB Controller Trading interface. Que lo mismo se puede abrir desde un sistema, como un objeto COM, o manualmente, pero para controlarlo bien hace falta un sistema escrito en AMI.
Recibe también todos los datos de tu cuenta (P&L, ...) , con lo que se pueden diseñar estrategias basadas en estos datos y así utilizar MM en el sistema, automáticamente.
Lo puedes ver en el enlace que he puesto http://www.amibroker.com/at/
Claro es, que para que funcione hay que tener instalado el plugin de IB para AMI, si no no creo que funcione.

Salud y suerte Trikero

Publicado: 18 Mar 2007 21:09
por trikero
dando vueltas a la historia he visto que han puesto una version mas moderna del plugin de datos

no obstante ¿?se pueden tener ambas conexiones abiertas con la tws¿? es que en la version demo me da constantes mensajes preguntanto que si se acepta la conexion, no se porque.

tengo una base de datos creada y conectada con el plugin y despues doy doble clic al brokerib.exe.

bueno, ya veo que la curva de aprendizaje es alta.

saludos.

Publicado: 18 Mar 2007 23:03
por hammer
trikero escribió:es que en la version demo me da constantes mensajes preguntanto que si se acepta la conexion, no se porque.
Poniendo 127.0.0.1 en la IP de confianza de la TWS (Configurar-API), no te preguntará si aceptas la conexión.

Saludos ;-).