TWS API: Código fuente sencillo en java

Foro genérico sobre programas relacionados con el trading: gráficos, ejecución de órdenes, automatización, etc.
Responder
hipotrader
Mensajes: 130
Registrado: 24 Nov 2006 15:31

TWS API: Código fuente sencillo en java

Mensaje por hipotrader »

Gracias Suarinver y X-trader.

Me despista ver tanta información para Excel.
No sé si la ponen a modo de ejemplo sencillo para que cada uno pueda mirar el código de la funcionalidad que necesite. ¿Es así?

¿En algún sitio hay un código fuente sencillo en java que haga lo básico: conectarse, dar una orden de entrada, dar una orden salida y desconectarse?

Luego ya tiraría de manual.

Un saludo,
Hipotrader.
Catorpega
Mensajes: 391
Registrado: 04 Abr 2008 10:35
Ubicación: Mallorca

Mensaje por Catorpega »

Yo he probado de utilizar el ExceL para programaer mi sistema,,,
1)es mas complicado que hacerlo con un programa standart,,,
2)es muy lento y se ralentiza a medida que le introduces codigo
3)te lleva mas tiempo crear la interface
Yo utilizo IB como broker y para el suministro de datos,, junto con AMIBROKER, que es un lenguaje que puedes utilizar gratis si asi lo deseas pero estara un tanto limitado,, yo tengo una licencia y no tengo limites, la api para la conexion con IB ya esta hecha y lo unico que tengo que hacer es ,, una vez tengo mi codigo de señales(sistema), incluir las ordenes que se ejecutaran segun las condiciones del sistema.
S te decides por probar AMIBROKER y necesitas algun cable, hazmelo saber y te ayudare encantado.
(que conste que no tengo nunguna afiliacion con AMIBRIKER,.. a mi me va bien ya que el codigo es facil de aprender, el proceso matematico es mas rapido que cualquier otro programa comercial y mis ideas son faciles de insertar en el codigo).
saludos y que les den a los lameculos.
Cator
Lo que uno hace, otro puede hacer, mediante la fuerza de voluntad y las pràcticas correspondientes dia tras dia sin desvanecer.
(Onofre Fuster Valls. 1929-1994)
hipotrader
Mensajes: 130
Registrado: 24 Nov 2006 15:31

Mensaje por hipotrader »

Catorpega escribió:...S te decides por probar AMIBROKER y necesitas algun cable, hazmelo saber y te ayudare encantado...
Muchas gracias Catorpega,

de momento voy a prober al combinación java + API TWS.

Lo de Amibroker lo dejo como una alternativa si no consigo lo de java.

Gracias.
Hipotrader
Última edición por hipotrader el 05 May 2008 00:09, editado 1 vez en total.
AL-G
Mensajes: 189
Registrado: 24 Nov 2007 22:16

Mensaje por AL-G »

esta hecha y lo unico que tengo que hacer es ,, una vez tengo mi codigo de señales(sistema), incluir las ordenes que se ejecutaran segun las condiciones del sistema.
Cator ¿quieres decir que esas órdenes se dispararán solas al mercado? ¿Se pueden hacer sistemas automáticos con Amibroker? Tenia entendido que no . . . .
Catorpega
Mensajes: 391
Registrado: 04 Abr 2008 10:35
Ubicación: Mallorca

Mensaje por Catorpega »

Cator ¿quieres decir que esas órdenes se dispararán solas al mercado? ¿Se pueden hacer sistemas automáticos con Amibroker? Tenia entendido que no . . . .[/quote]

Todo sistema hecho con AMIBROKER se puede automatizar....
Yo tengo un sistema conectado directamente con IB y manda las ordenes segun las condiciones.. estoy trabajando sobre un sistema ya hecho sobre el indicador CCI y que tambien hara lo mismo cuando este listo,,, me queda estudiar e incorporar alrededor de 20 estrategias diferentes para utilizarlas segun las condiciones.

Hay una lista muy extensa de codigo preparado para el uso,,, yo no se apenas hacer codigo,, pero a base de ver lo que hay hecho y juntar codigo de aqui y de alli,,, me estoy haciendo unas plataformas de trading automatico y manual que hacen y haran exactamente lo que yo necesite que hagan.
saludos y que les den a los lameculos.
Cator
Lo que uno hace, otro puede hacer, mediante la fuerza de voluntad y las pràcticas correspondientes dia tras dia sin desvanecer.
(Onofre Fuster Valls. 1929-1994)

Avatar de Usuario
X-Trader
Administrador
Mensajes: 12793
Registrado: 06 Sep 2004 10:18
Contactar:

Mensaje por X-Trader »

Catorpega escribió:Cator ¿quieres decir que esas órdenes se dispararán solas al mercado? ¿Se pueden hacer sistemas automáticos con Amibroker? Tenia entendido que no . . . .

Todo sistema hecho con AMIBROKER se puede automatizar....
Yo tengo un sistema conectado directamente con IB y manda las ordenes segun las condiciones.. estoy trabajando sobre un sistema ya hecho sobre el indicador CCI y que tambien hara lo mismo cuando este listo,,, me queda estudiar e incorporar alrededor de 20 estrategias diferentes para utilizarlas segun las condiciones.

Hay una lista muy extensa de codigo preparado para el uso,,, yo no se apenas hacer codigo,, pero a base de ver lo que hay hecho y juntar codigo de aqui y de alli,,, me estoy haciendo unas plataformas de trading automatico y manual que hacen y haran exactamente lo que yo necesite que hagan.
Interesante, yo aún no lo he conseguido. Podrías mandarme un articulillo explicando cómo automatizar sistemas con Amibroker para subirlo a la web?

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."
Catorpega
Mensajes: 391
Registrado: 04 Abr 2008 10:35
Ubicación: Mallorca

Mensaje por Catorpega »

Yo lo que tengo es para utilizar con IB controler 1.11 el cual se activa automaticamente si tienes las ordenes para ib el el codigo...por poner un pequeño ejemplo, podemos asignar las siguientes condiciones a compra, venta y cerrar posicion..
BUY= cross(ma(avg,12),ma(avg,26)); // lo que viene a decir que si la media simple de 12 periodos sobre (max+min+cierre) cruza por encima de la otra media que es de 26 periodos el valor BUY(compra) se activara. del mismo modo damos la condicion para que se active SELL(venta) que sria lo inverso de lo anterior,, asi,,,
SELLSHORT=cross(ma(avg,26),ma(avg,12); y añadiremos el codigo para la salida de la posicion,,,
EXIT=C==entryprice+10 or C<stoploss; aqui el codigo de EXIT seria si el precio es igual al precio de entrada mas 10 puntos o si el precio baja por debajo de stoploss establecido. yo he utilizado la variable EXIT, que puede ser Cover(ya definida) o SELL(ya definida) pero puede ser definida por el usuario para que ejecute las ordenes que se requieran.
como ves es un sistema muy simple pero que puede ser un primer paso para el aprendizaje...
una vez tenemos nuestro sistema bien estudiado y deseamos conectarlo a IB,,, cojemos el codigo que nos abilita el envio de las señales recibidas por nuestro sistema a nuestro broker, en este caso a IB.
este es el codigo para el automatismo de ordenes,,, es bastante simple pero se le puede añadir mas codigo por ejemplo BracketOrders, OCA, , o simplemente el codigo para que solo transmita las ordenes durante el dia, o cerrar posiciones desde tal hora a tal otra.. y mil cosas mas....

Ya sabes que debes descargarte el controlador de IB desde amibroker.


Filename = StrLeft(_DEFAULT_NAME(),StrLen(_DEFAULT_NAME())-2);

_SECTION_BEGIN("ER2 auto trade");



// next 4 lines are for ER2 futures

PointValue = 100;

NumContracts = 1;

MarginDeposit = 100;

PositionSize = NumContracts * MarginDeposit;



Range1=Optimize("range1",7,1,10,1);

Range2=Optimize("range2",6,1,10,1);





Plot(EMA( Close,range1), "Stopline", colorYellow );

Buy = Ref(Cross((Close),(EMA(Close,range1))),-1);

Buystop = Ref(EMA(Close,range1),-1);

BuyPrice = Max(Buystop,Open);

Sell = Ref(Cross(EMA(Close,range2),(Close)),-1);

Sellstop = Ref(EMA(Close,range1),-1);

SellPrice = Min(sellstop,Open);

Short = Sell;

ShortPrice = SellPrice;

Cover = Buy;

CoverPrice = BuyPrice;



/////////////////// Automation Code //////////////////



PrevDT = StaticVarGet("DateTime");

DT = LastValue(DateTime());

NewBar = DT != PrevDT;

StaticVarSet("DateTime",DT);

if( NewBar )

{

StaticVarSetText("OrderID","");

Plot(1,"",colorYellow,styleArea|styleOwnScale,0,1);

}



AutoTrading = StaticVarGet("AutoTrading");

if( IsNull( AutoTrading ) ) StaticVarSet("AutoTrading",0);

ATonTrigger = ParamTrigger("Start AutoTrading","START");

AToffTrigger = ParamTrigger("Stop AutoTrading","STOP");

if( ATonTrigger ) StaticVarSet("AutoTrading",1);

else if( AToffTrigger ) StaticVarSet("AutoTrading",0);

AutoTrading = StaticVarGet("AutoTrading");





CancelALL = ParamTrigger("Cancel All Orders","CANCEL ALL");

CloseALL = ParamTrigger("Close All Positions","CLOSE ALL");

MAnualBuy = ParamTrigger("Manual Buy","BUY");

MAnualSell = ParamTrigger("Manual Sell","SELL");

LastBuy = LastValue(Buy) OR MAnualBuy;

LastSell = LastValue(Sell) OR MAnualSell;



ibc = GetTradingInterface("IB");

IBcStatus = ibc.IsConnected();

IBcStatusString = WriteIf(IBCStatus==0,"TWS Not Found", WriteIf(IBCStatus==1,"Connecting to TWS", WriteIf(IBCStatus==2,"TWS OK", WriteIf(IBCStatus==3,"TWS OK (msgs)",""))));



if( CancelAll )

{

ibc.CancelAllPendingOrders();

StaticVarSetText("OrderID","");

}

else if ( CloseAll )

{

ibc.CancelAllPendingOrders();

ibc.CloseAllOpenPositions();

StaticVarSetText("OrderID","");

}



if( IBcStatus AND AutoTrading )

{

OrderID = StaticVarGetText("OrderID");

IBPosSize = ibc.GetPositionSize( Name() );

if(IBPosSize == 0 )

{

if( LastBuy AND OrderID == "" )

{

OID = ibc.PlaceOrder( Name(), "Buy", 1, "MKT", 0, 0,

"DAY", True );

StaticVarSetText("OrderID",OID);

Plot(1,"",colorBrightGreen,styleArea|styleOwnScale|styleNoLabel,0,1);

_TRACE("# Pos: 0, PrevOID: "+OrderID+", Buy 1, NewOID: "+OID);

}

else if( LastSell AND OrderID == "" )

{

OID = ibc.PlaceOrder( Name(), "Sell", 1, "MKT", 0, 0, "DAY", True );

StaticVarSetText("OrderID",OID);

Plot(1,"",colorRed,styleArea|styleOwnScale|styleNoLabel,0,1);

_TRACE("# Pos: 0, PrevOID: "+OrderID+", Sell 1, NewOID: "+OID);

}

}

else if( IBPosSize <0> 0 )

{

if( LastSell AND OrderID == "" )

{

OID = ibc.PlaceOrder( Name(), "Sell", 2, "MKT", 0, 0, "DAY", True );

StaticVarSetText("OrderID",OID);

Plot(1,"",colorRed,styleArea|styleOwnScale|styleNoLabel,0,1);

_TRACE("# Pos: >0, PrevOID: "+OrderID+", Sell 1, NewOID: "+OID);

}

}

LastOrderID = StaticVarGetText("OrderID");

ORderStatus = ibc.GetStatus( LastOrderID , True );

if( ORderStatus != "" ) StaticVarSetText("OrderStatus",ORderStatus);

}

else IBPosSize = 0;



LastOrderID = StaticVarGetText("OrderID");

ORderStatus = StaticVarGetText("OrderStatus");

Title = "\n"+Filename+"\n"+

" Trading Mode: "+WriteIf( AutoTrading,"ON","OFF")+"\n"+

" Last Signal: "+WriteIf(LastBuy,"BUY",WriteIf (LastSell,"SELL","NoSignal"))+"\n"+

" IB Status: "+IBcStatusString+"\n"+

" Last OrderID: "+LastOrderID+"\n"+

" OrderStatus: "+ORderStatus+"\n"+

" IBPosSize: "+NumToStr(IBPosSize,1.0)+" shares";



Plot(C,"",1,128);

PricesOnInclude = ParamToggle("Plot Trade Prices","HIDE|SHOW",1);

ArrowsOnInclude = ParamToggle("Plot Trade Arrows","HIDE|SHOW",1);



if( PricesOnInclude )

{

PlotShapes(IIf(Buy, shapeSmallCircle,shapeNone),5,0,BuyPrice,0);

PlotShapes(IIf(Sell, shapeHollowCircle,shapeNone),4,0,SellPrice,0);

PlotShapes(IIf(Cover, shapeHollowCircle, shapeNone),5,0,CoverPrice,0);

PlotShapes(IIf(Short, shapeSmallCircle, shapeNone),4,0,ShortPrice,0);

}

if( ArrowsOnInclude )

{

PlotShapes(IIf(Buy, shapeUpArrow, shapeNone), 5,0,L, -20);

PlotShapes(IIf(Sell, shapeDownArrow, shapeNone), IIf(Sell==3, 6, IIf(Sell==2, 7, 4)),0,H, -20);

PlotShapes(IIf(Short, shapeHollowDownArrow, shapeNone), 4,0,H, -38);

PlotShapes(IIf(Cover, shapeHollowUpArrow, shapeNone), IIf(Cover==3, 6, IIf(Cover==2, 7, 5)),0,L, -38);

}

_SECTION_END();
saludos y que les den a los lameculos.
Cator
Lo que uno hace, otro puede hacer, mediante la fuerza de voluntad y las pràcticas correspondientes dia tras dia sin desvanecer.
(Onofre Fuster Valls. 1929-1994)
Catorpega
Mensajes: 391
Registrado: 04 Abr 2008 10:35
Ubicación: Mallorca

Mensaje por Catorpega »

PD al post anterior..
el codigo para las condiciones para el envio de ornenes ya esta definido en BUY, SELL, COVER, etc para que se pueda ver el efecto,,,
OJO!! no lo pongais en marcha con la tws ejencutandose ya que esta preparada para el envio de ordenes automaticamente....
se puede ejecutar sin que mande las ordenes,,, para que mande las ordenes se pulsa al boton correspondiente en los parametros,,,,de la misma manera tambien se pueden mandar ordenes manuales desde la ventana de parqametros.
el codigo para señales es solo un ejemplo,,, no lo utilices para hacer trading.
saludos y que les den a los lameculos.
Cator
Lo que uno hace, otro puede hacer, mediante la fuerza de voluntad y las pràcticas correspondientes dia tras dia sin desvanecer.
(Onofre Fuster Valls. 1929-1994)
Catorpega
Mensajes: 391
Registrado: 04 Abr 2008 10:35
Ubicación: Mallorca

Mensaje por Catorpega »

Para facilitar el cambio de MODO (barras en periodos temporales,, ticks, rango o volumen) y poder cambiar las cantidades en las barras, yo le añado el siguente codigo al principio de todos mis formularios,,,

modo=Param("Modo= 0 horario, 1 ticks, 2 volumen, 3 rango)",3,0,3);
TimeFrameMode(modo);
tics=Param("tics",25,1,1000);
TimeFrameSet(tics);
saludos y que les den a los lameculos.
Cator
Lo que uno hace, otro puede hacer, mediante la fuerza de voluntad y las pràcticas correspondientes dia tras dia sin desvanecer.
(Onofre Fuster Valls. 1929-1994)
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Software”