Lanzar Órdenes Manuales con AmiBroker

Si bien por el momento no nos ha dado tiempo a terminar el artículo sobre el lanzamiento de ordenes automático con AmiBroker, si podemos avanzaros cómo se pueden lanzar órdenes de forma manual teniendo el gráfico delante, esto es, sin tener que cambiar de ventana para introducir la orden. Los pasos a seguir son los siguientes:

1. Descargar un plugin denominado IBController desde http://www.amibroker.com/at/at1007beta.exe (si bien se encuentra en la versión 1.0.7. regularmente se actualiza corrigiendo algunos bugs. Para estar al tanto de nuevas versiones, visitad http://www.amibroker.com/at/). Se trata un controlador en fase beta si bien lo he estado probando y parece que funciona perfectamente. Una vez descargado lo ejecutamos, seguimos los pasos de instalación y ya tendremos instalado el plugin

2. Ahora debemos crear un bloque de botones en AmiBroker para disparar las órdenes. Para ello, debemos crear un indicador para lo que iremos a Analysis -> Formula Editor. Ahi debemos copiar y pegar el código que teneís al final de este artículo; seguidamente lo guardaremos con el nombre de TWS Trigger

3. Bien, ya sólo tenemos que ir a la sección Custom dentro de la pestaña Charts y ahi nos aparecerá el indicador. Simplemente debemos insertarlo como un indicador más sobre el gráfico con el que queramos operar. En ese momento la TWS nos pedirá aceptar la conexión entrante; le decimos que sí y nos saltará una ventana sobre el gráfico como la que pueden ver en la siguiente imagen:


Asimismo, os saltará una ventana con el IB Controller, en la que os aparecerá toda la información acerca de las órdenes que hayais enviado, asi como los errores que se produzcan.

La primera vez que realiceis este proceso tendreís que introducir un código de Unlock (desbloqueo) gratuito en el IB Controller pues de lo contrario no os dejará lanzar las ordenes a la TWS; se trata de un procedimiento que garantiza al autor del programa que no le demandareis cuando perdais 1000 euros por culpa de su software ;-). Para obtenerlo, debeis dirigiros a http://www.amibroker.com/at/agreement.php y en la parte inferior indicar vuestro nombre y e-mail. Eso si, para ahorraros tiempo, podeis probar con el mio que es IB-349-WXP-94-AW

Una vez que tenemos todo configurado, veamos ahora qué hace cada una de las líneas de la ventana de la imagen anterior:

Place Order: si hacemos click en Click here to place order nos lanzará la orden que hayamos configurado en las líneas inferiores; por tanto, este es el último botón que debemos pulsar tras verificar que todo es correcto.

Mode: permite decidir si queremos modificar una orden existente (Modify existing) o poner una orden nueva (Always place a new order)

Action: no creo que necesite mucha descripción. Buy = Compra / Sell = Venta / SShort = venta en descubierto para acciones

Order Type: tampoco necesita mucha explicación. MKT = A Mercado / LMT = Limitada / STP = Stop

Time In Force: duración de la orden. DAY = hasta el final de la sesión / GTC = Válida hasta su cancelación / IOC = Immediate Or Cancel - Permite que la parte no ejecutada en el momento de introducir la orden se cancele.

Ticker: el correspondiente al gráfico sobre el que estemos trabajando, aunque podemos modificarlo

Number of Shares: número de contratos o acciones

Limit Price Offset: número de ticks que queremos sumar al precio actual para calcular el precio de la orden limitada

Stop Price Offset: lo mismo pero para el precio de la orden stop

Transmit: este parámetro es quizás el más importante. Si ponemos que no transmita la orden, al lanzarla ésta aparecerá en la TWS pero no será ejecutada lo que puede venir bien para hacer experimentos; por el contrario, si seleccionamos Transmit cualquier orden que lancemos será ejecutada.

Cancel Order: para cancelar órdenes

Si en algún momento nos cansaramos de la ventana para cerrar ordenes simplemente debemos cerrar la subventana que le corresponde como indicador; posiblemente esto se vea más claro en la siguiente imagen: al pasar el ratón por la zona sombreada en rojo les aparecerá el menu que les permitirá cerrar el TWS Trigger. De lo contrario, si intentan cerrar la ventana de IB Controller, ésta volverá a aparecer continuamente porque sigue insertando un indicador en el gráfico que lo ejecuta.


A la vuelta de las vacaciones, espero poder contarles cómo lanzar ordenes automatizadas, sin intervención manual, desde AmiBroker y también desde Visual Chart.

Un cordial saludo (y que pasen unas felices vacaciones)
X-Trader




CÓDIGO PARA TWS TRIGGER

// Param block
TriggerOrder=
ParamTrigger("Place order","Click here to place order");
Mode=
ParamToggle("Mode","Modify existing|Always place new order");
ACT =
ParamList("Action", "BUY|SELL|SSHORT");
OT =
ParamList("Order Type", "MKT|LMT|STP");
TIF =
ParamList("Time In Force", "DAY|GTC|IOC");
Ticker =
ParamStr("Ticker",Name());
NumShares =
Param("Number of Shares",10,10,100,10);
LimitPrice =
LastValue(C) + Param("Limit Price offset",0,-0.1,0.1,0.01);
StopPrice =
LastValue(C) + Param("Stop price offset",0,-0.1,0.1,0.01);
Transmit =
ParamToggle("Transmit","Do NOT transmit|Transmit",0);
TriggerCancel =
ParamTrigger("Cancel Order","Click here to Cancel order");

Msg =
""; // this variable stores error message text

// create instance of trading interface
ibc =
GetTradingInterface("IB");

// retrieve orderID from previous run, will be empty if no order was placed before
OrderID =
StaticVarGetText("OrderID"+Ticker);

if( TriggerOrder )
{
// check if we are connected OK
if( ibc.IsConnected() )
{
if( Mode == 1 ) OrderID = ""; // if mode set to 'always new' then clear orderid

// place orders only if we do not have already open position on this symbol
// place or modify the order - don't transmit yet
OrderID = ibc.ModifyOrder( OrderID, Ticker,
ACT, NumShares, OT, LimitPrice, StopPrice, TIF, Transmit);


// store orderID for next run so we know which order to modify

StaticVarSetText("OrderID"+Ticker, OrderID);

if( Mode == 1 )
Msg =
"New order has been placed with ID = ";
else
Msg =
"Order placed/modified with ID = ";

Msg = Msg + OrderID +
" on " + Now();
}
else
{
Msg =
"Placing order failed because of no connection to TWS";
}
}

if( TriggerCancel )
{
if( OrderId != "" )
{
if( ibc.CancelOrder( OrderId ) )
Msg =
"Request to cancel order " + OrderID + " sent successfully";
else
Msg =
"Request to cancel order " + OrderID + " failed.";
}
else
Msg =
"Can not cancel order becase OrderID is empty";

}

// monitoring code
Title =
Msg +
"\nLast TWS message: "+ ibc.GetLastError(0) +
"\nAvailable funds: " + ibc.GetAccountValue("AvailableFunds")+
"  Gross Pos. Value: " + ibc.GetAccountValue("GrossPositionValue")+
"\nOrderID = "+OrderId+
"\nTicker = "+Ticker+
"\nAction = "+ACT+
"\nShares = "+NumToStr(NumShares,1.0)+
"\nOrderType = "+OT+
"\nLimitPrice = "+NumToStr(LimitPrice,1.3)+
"\nStopPrice = "+NumToStr(StopPrice,1.3)+
"\nTimeInForce= "+TIF+
"\nTransmit = "+NumToStr(Transmit,1.0)+"\n"+
"\nGetStatus = "+ibc.GetStatus( OrderID )+
"\nGetPositionSize = "+ibc.GetPositionSize( Ticker )+
"\nIsConnected = "+NumToStr(ibc.IsConnected(),1.0);


 

 

 



Si te ha gustado este articulo, ¡compártelo en redes!