Página 1 de 1

TWS API: Código fuente sencillo en java

Publicado: 30 Abr 2008 13:38
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.

Publicado: 04 May 2008 18:19
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).

Publicado: 04 May 2008 18:55
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

Publicado: 04 May 2008 21:52
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 . . . .

Publicado: 05 May 2008 10:04
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.

Publicado: 05 May 2008 12:14
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

Publicado: 05 May 2008 15:40
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();

Publicado: 05 May 2008 15:49
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.

Publicado: 05 May 2008 16:06
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);