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:


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:



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.

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.


Comentarios

  1. Hola

    Estoy 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

    ResponderEliminar
  2. 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

Publicar un comentario

Entradas populares de este blog

El indicador Relative Strength Mansfield with Index

Trading Tools: Descarga de históricos para Visual Chart 6

KDJ - Indicador Stochastic %J