Trading Tools: Órdenes enlazadas
Ya vimos en anteriores entradas que mediante el uso de las herramientas COM tenemos la posibilidad de controlar nuestra operativa.
Esto se consigue gracias a la clase COMTraderInterfacesLib. Esta clase tiene acceso a los elementos de intermediación, permitiéndonos desde la aplicación cliente realizar tareas tales como consultar las órdenes abiertas, enviar órdenes a mercado, modificar o cancelar dichas órdenes, etcétera.
Una de las novedades de Visual Chart 5 consiste en la posibilidad de ejecutar órdenes bracket. Este tipo de órdenes nos permiten enlazar una orden de entrada con sus correspondientes órdenes de cierre (objetivo y stop) de manera que la gestión de las mismas se lleva a cabo de manera totalmente automática.
En el siguiente ejemplo, vamos a ver cómo utilizar este tipo de órdenes mediante el objeto VCT_Trader.
ExampleTrading_Brackets
El ejemplo consiste en una hoja Excel mediante la cual configuraremos una lista de órdenes predefinidas, de manera que con sólo pulsar un botón, dichas órdenes se enviarán al mercado. Lógicamente, para poder hacer uso de ésta herramienta, es necesario tener activada la cuenta de intermediación.
Cómo hacer uso de la aplicación
El aspecto de la interfaz es el siguiente:
Acerca de la programación de la aplicación
Como hemos dicho anteriormente, para poder llevar a cabo éste ejemplo, hemos hecho uso de la clase COMTraderInterfacesLib.
Hemos creado un objeto de tipo VCT_Trader y hemos utilizado su método SendBracketOrder.
El método SendBracketOrder es el que se encarga de generar una orden de tipo Bracket, es decir, es el que se encarga de enlazar las tres órdenes correspondientes.
El método solicita como parámetros de entrada tres objetos de tipo VCT_Order los cuales deben ir en un orden específico:
1. Primero la orden de entrada (MainOrder).
2. Segundo la orden limitada o de objetivo de ganancias (LimitOrder).
3. Por último, la orden en stop o de pérdidas (StopOrder).
El proceso para el envío de órdenes se repite cada vez que el usuario pulsa uno de los dos botones, y consiste en los siguientes pasos:
1. Creación de los objetos y variables.
2. Generación de órdenes de compra o venta (según el botón que haya sido pulsado). Para ello, recorremos las filas de órdenes y guardamos los datos de cada fila.
3. Envío de la orden Bracket. Para ello, creamos tres objetos de tipo VCT_Order usando la información previamente guardada para cada fila y seguidamente llamamos al evento SendBracketOrder.
4. Liberamos los objetos y finalizamos el proceso.
Comentario final
Este ejemplo muestra las bases para poder utilizar las órdenes Bracket mediante la clase COMTraderInterfaces. Esta idea puede servirnos para ejemplos más complejos, en los que podamos, por ejemplo, cancelar las órdenes colocadas, crear un stop dinámico para cada una de las órdenes, o bien para crear una hoja donde poder definir órdenes predefinidas que se pongan en marcha con sólo pulsar un botón. Esta idea puede ser incluso la más interesante y en posteriores entradas veremos cómo poder desarrollarla.
Esto se consigue gracias a la clase COMTraderInterfacesLib. Esta clase tiene acceso a los elementos de intermediación, permitiéndonos desde la aplicación cliente realizar tareas tales como consultar las órdenes abiertas, enviar órdenes a mercado, modificar o cancelar dichas órdenes, etcétera.
Una de las novedades de Visual Chart 5 consiste en la posibilidad de ejecutar órdenes bracket. Este tipo de órdenes nos permiten enlazar una orden de entrada con sus correspondientes órdenes de cierre (objetivo y stop) de manera que la gestión de las mismas se lleva a cabo de manera totalmente automática.
En el siguiente ejemplo, vamos a ver cómo utilizar este tipo de órdenes mediante el objeto VCT_Trader.
ExampleTrading_Brackets
El ejemplo consiste en una hoja Excel mediante la cual configuraremos una lista de órdenes predefinidas, de manera que con sólo pulsar un botón, dichas órdenes se enviarán al mercado. Lógicamente, para poder hacer uso de ésta herramienta, es necesario tener activada la cuenta de intermediación.
Cómo hacer uso de la aplicación
El aspecto de la interfaz es el siguiente:
De donde se solicita al usuario los siguientes datos:
- Tipo de orden de entrada: Podemos elegir entre tres opciones: A mercado, orden en stop y orden limitada. Si la orden no es a mercado, tenemos que escribir en la correspondiente fila el precio al que enviaremos la orden.
- Puntos STOPLOSS/TARGET: Cantidad de puntos respecto a la entrada donde queremos colocar los niveles de pérdidas y ganancias.
- Ordenes: Desde la fila siete, podemos añadir tantas órdenes como queramos. Por defecto, si añadimos más de una cuenta, el programa replica la información de la primera orden sobre las demás, suponiendo que lo que se desea es enviar la misma orden sobre distintas cuentas de intermediación. No obstante, podemos cambiar manualmente cada una de las órdenes a enviar.
Para cada orden se solicitan cuatro parámetros: Nombre de la cuenta de intermediación, símbolo sobre el que se quiere lanzar la orden, precio de entrada (a excepción de las órdenes a mercado) y número de contratos a lanzar.
Una vez que hemos rellenado los datos necesarios para enviar las órdenes, pulsamos uno de los dos botones, COMPRAR o VENDER, dependiendo de lo que se desee hacer:
Tras pulsar uno de los dos botones, la aplicación informa si la orden ha sido enviada correctamente o no.Además, desde la interfaz de Visual Chart 5 podremos ver las órdenes lanzadas:
Como hemos dicho anteriormente, para poder llevar a cabo éste ejemplo, hemos hecho uso de la clase COMTraderInterfacesLib.
Hemos creado un objeto de tipo VCT_Trader y hemos utilizado su método SendBracketOrder.
El método SendBracketOrder es el que se encarga de generar una orden de tipo Bracket, es decir, es el que se encarga de enlazar las tres órdenes correspondientes.
El método solicita como parámetros de entrada tres objetos de tipo VCT_Order los cuales deben ir en un orden específico:
1. Primero la orden de entrada (MainOrder).
2. Segundo la orden limitada o de objetivo de ganancias (LimitOrder).
3. Por último, la orden en stop o de pérdidas (StopOrder).
El proceso para el envío de órdenes se repite cada vez que el usuario pulsa uno de los dos botones, y consiste en los siguientes pasos:
1. Creación de los objetos y variables.
Public Sub OnInitCalculate()
OnStopSystem
OnClearCells
IsOk = 0: NumOrders = 0: ReDim ExecuteOrder(0)
'-- Broker connection routine
On Error Resume Next
Set g_Trader = New COMTraderInterfacesLib.VCT_Trader
If Err.Number <> 0 Then
MsgBox "Broker connection is OFF", vbCritical, "ERROR"
Else
IsOk = 1
'-- Create source object
Set g_Objects = New VCDS_DataSourceManager
'-- Select order type
SelectOrdertype = SelectOrderT(CboOrderType.Value)
End If
End Sub
2. Generación de órdenes de compra o venta (según el botón que haya sido pulsado). Para ello, recorremos las filas de órdenes y guardamos los datos de cada fila.
Private Sub GenerateOrders(Ordertype As Integer)
Dim i%, salir%, Account$, Symbol$, Price#, Ncontratos&
Dim ValidateLogin As Boolean
Dim EntryOrder As InfoOrder
Dim MySource As VCDS_DataSerie
salir = 0: i = 7
While Cells(i, 1).Text <> ""
If Cells(i, 3).Text <> "" Then
Account = Cells(i, 1).Text
Symbol = VisualChartType(Cells(i, 3).Text)
If Cells(i, 5).Text <> "" Then Price = CDbl(Cells(i, 5).Text)
Ncontratos = CLng(Cells(i, 7).Text)
'-- Validate symbol
Set MySource = g_Objects.NewDataSerie(Symbol, VCDS_CT_Days, 1)
pip = MySource.GetSymbolInfo.MinMovement
LastPrice = MySource.GetBarValues(MySource.Size).Close
'-- Validate Login
ValidateLogin = False
On Error Resume Next
For Each TraderCuenta In g_Trader.Accounts
If TraderCuenta.Account = Account Then
ValidateLogin = True
End If
Next
3. Envío de la orden Bracket. Para ello, creamos tres objetos de tipo VCT_Order usando la información previamente guardada para cada fila y seguidamente llamamos al evento SendBracketOrder.
Private Sub SendOrder(Order As InfoOrder)
Dim IDBracket() As String
Dim OrdenIN As VCT_Order
Dim OrdenSTOP As VCT_Order
Dim OrdenLIM As VCT_Order
Set OrdenIN = New COMTraderInterfacesLib.VCT_Order
With OrdenIN
.Account = Order.Account
.SymbolCode = Order.SymbolCode
.TimeRestriction = Order.TimeRestriction
.VolumeRestriction = Order.VolumeRestriction
.ValidDate = Date
.MinVolume = 0
.Volume = Order.Volume
.Ordertype = Order.Ordertype
.OrderSide = Order.OrderSide
.Price = Order.Price
.StopPrice = Order.StopPrice
End With
Set OrdenSTOP = New COMTraderInterfacesLib.VCT_Order
With OrdenSTOP
.Account = Order.Account
.SymbolCode = Order.SymbolCode
.TimeRestriction = Order.TimeRestriction
.VolumeRestriction = Order.VolumeRestriction
.ValidDate = Date
.MinVolume = 0
.Volume = Order.Volume
.Ordertype = VCT_OT_StopMarket
If Order.OrderSide = VCT_OS_Buy Then
.OrderSide = VCT_OS_Sell
.StopPrice = PriceIN - CInt(LstBxStop.Text) * pip
.Price = 0 '.StopPrice - 10 * pip
Else
.OrderSide = VCT_OS_Buy
.StopPrice = PriceIN + CInt(LstBxStop.Text) * pip
.Price = 0 '.StopPrice + 10 * pip
End If
End With
Set OrdenLIM = New COMTraderInterfacesLib.VCT_Order
With OrdenLIM
.Account = Order.Account
.SymbolCode = Order.SymbolCode
.TimeRestriction = Order.TimeRestriction
.VolumeRestriction = Order.VolumeRestriction
.ValidDate = Date
.MinVolume = 0
.Volume = Order.Volume
.Ordertype = VCT_OT_Limit
If Order.OrderSide = VCT_OS_Buy Then
.OrderSide = VCT_OS_Sell
.Price = PriceIN + CInt(LstBxTarget.Text) * pip
.StopPrice = 0
Else
.OrderSide = VCT_OS_Buy
.Price = PriceIN - CInt(LstBxTarget.Text) * pip
.StopPrice = 0
End If
End With
'Lanzar orden BRACKET
IDBracket = g_Trader.SendBracketOrder(OrdenIN, OrdenLIM, OrdenSTOP)
ExecuteOrder(NumOrders).ID = IDBracket(0)
ExecuteOrder(NumOrders).IDTARG = IDBracket(1)
ExecuteOrder(NumOrders).IDSTOP = IDBracket(2)
End Sub
4. Liberamos los objetos y finalizamos el proceso.
Public Sub OnStopSystem()
Set g_Trader = Nothing
End Sub
Comentario final
Este ejemplo muestra las bases para poder utilizar las órdenes Bracket mediante la clase COMTraderInterfaces. Esta idea puede servirnos para ejemplos más complejos, en los que podamos, por ejemplo, cancelar las órdenes colocadas, crear un stop dinámico para cada una de las órdenes, o bien para crear una hoja donde poder definir órdenes predefinidas que se pongan en marcha con sólo pulsar un botón. Esta idea puede ser incluso la más interesante y en posteriores entradas veremos cómo poder desarrollarla.
Hola
ResponderEliminarEstoy intentando probar este desarrollo y me da siempre (salvo las órdenes a mercado) que el precio está fuera de rango...
Lo estoy probando con una cuenta demo de proCFD
El lanzamiento de órdenes a través de las TradingTools es similar al que se realiza utilizando los comandos manuales. Quizás el problema esté en que los precios a los que se están lanzando las órdenes de salida estén fuera del rango de precios del producto sobre el que está operando. Haga la siguiente comprobación: Fíjese en la lista de órdenes canceladas y observe el precio que se está asignando a dichas órdenes. Compruebe si el precio tiene lógica o no. Cuando haga la prueba, coméntenos los resultados para seguir ayudándole escribiéndonos un correo a la cuenta sistemas@visualchart.com. Gracias.
ResponderEliminar