Trading bidireccional y cobertura (hedging) de posiciones en MetaTrader 5 usando el panel HedgeTerminal, Parte 1
Índice
- INTRODUCCIÓN
- CAPÍTULO 1. TEORÍA DE ORGANIZACIÓN DEL TRADING BIDIRECCIONAL
- 1.1. Posibilidades de MetaTrader 5 en la organización del trading bidireccional
- 1.2. Enlazados de las órdenes – la base de la cobertura y estadística
- 1.3. Correlación de las posiciones netas de MetaTrader 5 y posiciones de HedgeTerminal
- 1.4. Requerimientos a los algoritmos que implementan el trading bidireccional
- CAPÍTULO 2. INSTALACIÓN DE HEDGE TERMINAL, EL PRIMER INICIO
- 2.1. Instalación del HedgeTerminal
- 2.2. Instalación en tres pasos. Esquema de instalación y solución de posibles problemas
- 2.3. Conocimiento de HedgeTerminal, el primer inicio
- 2.4. Cobertura y cálculo de operaciones financieras
- 2.5. Trading con un clic
- 2.6. Colocación de StopLoss y TakeProfit, Trailing Stop
- 2.7. Generación del informe
- 2.8. Presentación de swaps de divisas
- 2.9. Línea final
- 2.10. Cambio de apariencia de las tablas de HedgeTerminal
- 2.11. Posibilidades no realizadas para las versiones futuras
- CAPÍTULO 3. DEBAJO DEL CAPÓ DE HEDGE TERMINAL, ESPECIFICACIONES Y PRINCIPIOS DEL FUNCIONAMIENTO
- 3.1. Concepto del contorno global y local. Contexto, transferencia y almacenamiento de información
- 3.2. Almacenamiento de la información local y global
- 3.3. Niveles Stop Loss y Take Profit, problemas del sistema de órdenes y órdenes tipo OCO
- 3.4. ¿Pueden las órdenes tipo OCO solucionar los problemas de la protección de posiciones bidireccionales?
- 3.5. Almacenamiento de las referencias a las órdenes iniciadoras
- 3.6. Limitaciones durante el trabajo con HedgeTerminal
- 3.7. Mecanismo del enlazado de las órdenes y determinismo de las acciones
- 3.8. División y combinación de las transacciones como la base de la aritmética de órdenes
- 3.9. Virtualización de las órdenes y transacciones
- 3.10. Mecanismo para ocultar las órdenes
- 3.11. Mecanismos de adaptación
- 3.12. Rendimiento y uso de memoria
- CONCLUSIÓN
Introducción
Durante el último año y medio, MetaQuotes ha realizado un trabajo de gran envergadura con el fin de unificar la plataforma comercial MetaTrader 4 y MetaTrader 5 en un ecosistema de trading único. Ahora para ambas plataformas existe el mercado común de soluciones de software, Market, que ofrece diferentes productos programados por desarrolladores externos. Los compiladores para ambas plataformas también han sido unificados. Ahora ambas plataformas tienen el mismo compilador a base de MQL5 y el mismo lenguaje de programación (MQL) con diferentes conjuntos de funciones dependiendo de la plataforma que se utiliza. Todos los códigos fuente disponibles públicamente en Code Base también han sido sometidos a la revisión, y algunos de ellos han sido corregidos para su total compatibilidad con el nuevo compilador.
Sin embargo, esta unificación global de las plataformas ha dejado al lado la unificación de sus partes comerciales. Los modelos de trading de MetaTrader 4 y MetaTrader 5 siguen siendo esencialmente incompatibles a pesar de compartir la mayor parte del entorno comercial. MetaTrader 4 posibilita la gestión individual de las posiciones comerciales a través de un sistema de “órdenes” −unas entidades especiales de programación que hacen el trading bidireccional más fácil y más cómodo. El terminal MetaTrader 5 está orientado al trabajo bursátil donde la representación principal de las obligaciones del trader es su posición neta agregada. Mientras que las órdenes en el terminal son simplemente unas instrucciones de compra o venta de un instrumento financiero.
La diferencia de la representación comercial entre estas plataformas causaba muchas discusiones y debates apasionantes. No obstante, las discusiones se han quedado discusiones. Lamentablemente, desde el primer lanzamiento de MetaTrader 5 no fue presentada ninguna solución operativa que podía demostrar con el hecho de su existencia la posibilidad de representar las obligaciones de los traders como posiciones bidireccionales independientes igual que en MetaTrader 4. Sin duda alguna, han sido publicados numerosos artículos sobre este tema proponiendo varias soluciones. Pero lamentablemente, estas soluciones eran y siguen siendo insuficientemente flexibles para poder utilizarlas con conveniencia y a gran escala. Además, ninguna de estas soluciones conviene para el trading en la bolsa donde hay un montón de detalles que hay que tomar en cuenta.
Este artículo tiene que dirimir las controversias entre los aficionados a la quinta o la cuarta versión de MetaTrader, y ofrecer por fin una solución universal en forma de las especificaciones detalladas y una solución de programación concreta que pueda implementar estas especificaciones. En este artículo también hablaremos sobre el panel visual y la biblioteca de visualización de HedgeTerminal que harán posible la representación de nuestras obligaciones como posiciones bidireccionales igual que en MetaTrader 4. Al mismo tiempo, el modelo integrado en HedgeTerminal toma en cuenta el carácter específico de ejecución de las órdenes comerciales. Eso significa que se podrá utilizarlo con éxito tanto en el mercado extrabursátil FOREX, como en las plataformas bursátiles centralizadas (por ejemplo, para tradear con instrumentos derivados en la Sección de Derivados de la Bolsa de Moscú).
HedgeTerminal es un terminal de trading totalmente funcional dentro del terminal MetaTrader 5. Usando el mecanismo de virtualización él cambia la representación de las posiciones actuales de tal manera que el trader o robot comercial pueda gestionar sus posiciones comerciales personales, sin que importe en absoluto el número de estas posiciones ni su dirección. Voy a realzar que estamos hablando sobre la virtualización. Es un mecanismo especial que transforma la representación de las obligaciones del trader y no su característica cualitativa.
No se trata de la distorsión de los resultados de la actividad financiera del trader sino de la transformación de la representación de esta actividad. HedgeTerminal se basa en el entorno comercial MetaTrader 5 y el lenguaje de programación MQL5. No aporta la nueva información comercial al terminal, sólo representa el entorno comercial actual desde otro ángulo. Eso significa que HedgeTerminal es esencialmente MetaTrader 5 y es su aplicación nativa (native). Así, se puede poner el signo de identidad entre ellos, o para ser más exacto, el signo de inclusión, ya que HedgeTerminal representa sólo una de muchas pequeñas aplicaciones para MetaTrader 5.
La posibilidad de virtualización y la existencia de HedgeTerminal se basa en tres paradigmas:
- Conceptualmente, la convertibilidad completa y garantizada de la representación neta de la posición en las transacciones de trading bidireccionales individuales es posible. Esta afirmación demuestra el hecho de que en algunas plataformas comerciales externas, incluyendo las que han sido diseñadas para tradear en la bolsa, existe la posibilidad de gestionar las posiciones bidireccionales;
- El modelo comercial MetaTrader 5 a nivel del usuario permite crear las referencias (links) unidireccionales de una orden a la otra. Los cálculos matemáticos han mostrado que los links diseñados de una manera especial serán resistentes ante la aparición de cualquiera colisión. Es más, incluso en caso de la destrucción del historial u otras situaciones de fuerza mayor, las transacciones bidireccionales pueden ser corregidas retrospectivamente y ajustadas al resultado financiero calculado durante la representación neta:
- Los medios avanzados API en MQL5 permiten poner el signo de identidad entre MQL5 y el terminal MetaTrader 5. En otras palabras, casi todo lo que tiene MetaTrader 5 está disponible en él a través de la interfaz y el lenguaje de programación MQL5. Por ejemplo, se puede escribir su versión personalizada del terminal dentro del terminal MetaTrader 5, lo que ha sido demostrado a base del ejemplo de HedgeTerminal.
Después de leer este artículo, va a saber cómo está organizado el panel de HedgeTerminal y qué algoritmos contiene detrás de su apariencia. Usted conocerá al detalle las especificaciones y algoritmos del trabajo que permiten organizar un trading bidireccional seguro. Independientemente de que si decida usar HedgeTerminal o crear su propia biblioteca para gestionar sus algoritmos comerciales, este artículo y su continuación le facilitarán mucha información interesante y útil.
Puede leer este artículo incluso si Usted no es programador. El código fuente MQL no ha sido incluido en el artículo a propósito. En vez de eso he sustituido todos los códigos fuente por los esquemas, tablas e imágenes que ilustran visualmente el principio operativo y organización de datos. Puedo decir, basándose en mi experiencia, que incluso teniendo conocimientos de programación es mucho más fácil echar un vistazo a un esquema del trabajo del código que ponerse a analizarlo.
En la segunda parte del artículo, cuando vamos a hablar sobre la integración de los Asesores Expertos con la biblioteca de virtualización HedgeTerminalAPI, ya no podremos evitar la programación. Pero incluso en este caso, se ha hecho todo para facilitar la percepción del código, sobre todo para los programadores principiantes. Por ejemplo, en el artículo no se utilizan deliberadamente las construcciones orientadas a objetos, (por ejemplo, las clases) aunque HedgeTerminal es una aplicación orientada a objetos.
¿Cómo leer este artículo?
Este artículo ha salido muy extenso. Por un lado, eso está bien porque prácticamente a cualquier pregunta se puede encontrarle su respuesta correspondiente. Por otro lado, a muchos usuarios que no tienen ganas de meterse en honduras de la organización del trading les gustaría leer lo más importante, y luego si hace falta, leer el apartado que les interese. No obstante, el género del artículo requiere la exposición consecuente del material. Al mismo tiempo, el material tiene que ser expuesto en su totalidad. De la misma manera como se hace en muchos libros, vamos a dar un breve resumen de cada capítulo que puede ayudarle a decidir si necesita leerlo o no.
- Parte 1, Capítulo 1. Teoría de organización del trading bidireccional. Este capítulo contiene las ideas principales del HedgeTerminal (HT). Si no le interesa meterse en honduras de la organización del trading bidireccional, este capítulo le será suficiente para estudiar los momentos y principios generales del funcionamiento de HT. Este capítulo se recomienda para todas la categorías de los lectores.
- Parte 1, Capítulo 2. Instalación de HedgeTerminal, el primer inicio. Este capítulo está dedicado al inicio y configuración del panel visual de HedgeTerminal. Si no tiene previsto utilizar el panel visual de HedgeTerminal en su trabajo, puede saltar este capítulo. Sin embargo, si utiliza la biblioteca HedgeTerminalAPI, necesitará leer los apartados 2.1 y 2.2 de este capítulo. Están dedicados al instalador del HedgeTerminal. El instalador es un componente común para todos los productos de HT.
- Parte 1, Capítulo 3. Debajo del capó de Hedgeterminal, especificaciones y principios del funcionamiento Este capítulo está dedicado a la estructura interna del HedgeTerminal, sus algoritmos y la organización interna de datos. Este capítulo va a ser útil para todos quienes se interesan por las cuestiones del trading bidireccional. También va a ser interesante a los traders profesionales de algoritmos que desarrollan sus bibliotecas de virtualización o utilizan muchos robots simultáneamente.
- Parte 2, Capítulo 1. Interacción de los EAs con HedgeTerminal y su panel. Este capítulo va a interesar tanto a los que hacen sus primeros pasos en este tema, como a los que se dedican al trading algorítmico profesionalmente. Aquí se describen los principios generales del trabajo con la biblioteca de HedgeTerminal y la arquitectura general del robot comercial.
- Parte 2, Capítulo 2. Documentación para API HedgeTerminal. Contiene la documentación para utilizar las funciones de la biblioteca HedgeTerminalAPI. El capítulo está escrito como la lista de documentación a la que sería conveniente dirigirse de vez en cuando. Aquí no encontrará ningunas discusiones innecesarias ni texto excesivo. Sólo contiene los prototipos de las funciones, estructuras y enumeraciones, así como los breves ejemplos de su uso.
- Parte 2, Capítulo 3. Principios de las operaciones comerciales asincrónicas. HedgeTerminal utiliza en su trabajo las operaciones asincrónicas. Este capítulo abarca la experiencia de su uso. Este capítulo ha sido incluido para que cualquier lector pueda sacar alguna información útil independientemente de que si planea utilizar HT en su trabajo o no.
- Parte 2, Capítulo 4. Principios de la programación multihilo (multithreading) en el entorno MetaTrader. En este capítulo sabrá qué significa el concepto “multihilo”, cómo organizarlo y qué sistemas de organización de datos se puede utilizar. Igual que el capítulo 3, aquí se comparte la experiencia del desarrollo de una aplicación multihilo con todos los usuarios de MetaTrader.
Espero que el material expuesto en este artículo sea lo suficientemente interesante para que el estimado lector lo lea hasta el final.
Capítulo 1. Teoría de organización del trading bidireccional
1.1. Posibilidades de MetaTrader 5 en la organización del trading bidireccional
En el artículo “Principios de formación de precios en el mercado bursátil tomando de ejemplo la Sección de Derivados de la Bolsa de Moscú” se describen detalladamente los matices de la formación de precios en el mercado bursátil y los métodos del cálculo de resultados financieros de los participantes del mercado. En este artículo se muestra que la formación de precios y el cálculo en la Bolsa de Moscú se diferencia sustancialmente de los conceptos y métodos de cálculos que se utilizan para el trading en FOREX.
En total, la representación del precio bursátil es más compleja, pero al mismo tiempo contiene una gran cantidad de importantes detalles, invisibles durante el trading en Forex y en el mismo terminal MetaTrader 4.
Por ejemplo, en MetaTrader 4 no se ven las transacciones que han ejecutado la orden del trader, en MetaTrader 5 esta información está disponible. Por otro lado, la información comercial detallada no siempre es necesaria en MetaTrader 5. Incluso puede causar malentendidos y dificultar el trabajo a un usuario inexperto (sobre todo si se trata de un programador novato). Por ejemplo, para saber el precio de una orden ejecutada, en MetaTrader 4 sólo tienen que mirar el valor correspondiente en la columna “Precio”. En el lenguaje de programación MQL4 para eso sólo hay que llamar a la función OrderOpenPrice(). En MetaTrader 5, primero hay que encontrar todas las operaciones que han ejecutado la orden, luego revisarlas y calcular su precio medio ponderado. Precisamente este valor será el precio de ejecución de la orden.
Hay otras situaciones cuando la representación ampliada del entorno comercial en MetaTrader 5 requiere esfuerzos adicionales durante para analizar esta información. Debido a eso, surgen las preguntas razonables:
¿Hay alguna manera de hacer el proceso comercial en MetaTrader 5 igual de sencillo y claro como en MetaTrader 4, y al mismo tiempo tener un cómodo acceso a todos los detalles comerciales necesarios? ¿Si se puede organizar el trading bidireccional en la bolsa a través de MetaTrader 5 de la misma sencilla manera como se hace en MetaTrader 4? La respuesta a estas preguntas es positiva: “sí, es posible”.
Para comprender por qué existe esta posibilidad, vamos a ver el esquema de las posibilidades de MetaTrader 4 y MetaTrader 5:
Fig. 1. Posibilidades de MetaTrader 4 y MetaTrader 5
Como podemos ver, el conjunto “MetaTrader 5” incluye el subconjunto “MetaTrader 4”. Eso quiere decir que todo lo que es posible en MetaTrader 4 se puede hacer en MetaTrader 5, aunque probablemente sea al revés. No obstante, las nuevas posibilidades de MetaTrader 5 aumentan inevitablemente la cantidad y la complejidad de representación de la información comercial. Pero estas dificultades se puede delegar a los programas de asistencia especial que trabajan en el entorno de MetaTrader 5. Los programas de este tipo pueden “procesar” estos procesos complejos dejando las capacidades del terminal en el mismo nivel. Este capítulo está dedicado a uno de estos programas: HedgeTerminal, o abreviando HT.
HedgeTerminal representa un terminal de trading totalmente funcional dentro del terminal MetaTrader 5. Utiliza el entorno comercial MetaTrader 5, lo transforma mediante el lenguaje MQL5 y lo representa como una cómoda interfaz gráfica — el panel HedgeTerminalUltimate y la interfaz especial HedgeTerminalAPI para la interacción con los algoritmos independientes (Asesores Expertos, scripts e indicadores).
Puesto que en MetaTrader 4 se puede utilizar las posiciones bidireccionales o las órdenes bloqueadas, la misma posibilidad existe en MetaTrader 5. Sin embargo, en MetaTrader 5 esta posibilidad es explícita, pero se puede activarla usando un programa incorporado especial, lo que esencialmente es HedgeTerminal. HedgeTerminal está incorporado en MetaTrader 5 y utiliza su entorno reuniendo la información sobre las transacciones y órdenes en posiciones integradas que parecen mucho a las órdenes en MetaTrader 4 pero que poseen todas las posibilidades de MetaTrader 5.
Estas posiciones pueden estar en una orden bloqueada completa o parcial (cuando las posiciones activas largas y cortas existen al mismo tiempo). No obstante, la posibilidad de mantener estas posiciones no es el objetivo propio para HedgeTerminal. Su tarea principal consiste en reunir la información en grupos unificados (posiciones) que podrían ser fáciles de analizar, controlar y acceder a ellos. Las posiciones bidireccionales pueden existir en HedgeTerminal sólo porque eso es realmente muy cómodo. Pues, si varios traders tradean en la misma cuenta o se utilizan varias estrategias, igualmente va a ser necesario solucionar la cuestión de separación de acciones comerciales.
Además, durante el trading en la bolsa hay que tomar en consideración varios detalles: por ejemplo, ejecución parcial de las órdenes, rellover de las posiciones, cálculo del margen de variación, estadísticas, etc. HedgeTerminal ha sido desarrollado precisamente para responder a estos desafíos. Ofrece al usuario o al robot comercial una interfaz habitual de alto nivel parecido a MetaTrader 4, pero que trabaja al mismo tiempo de forma correcta en las condiciones del entorno bursátil.
1.2. Enlazado de las órdenes – la base de la cobertura y estadística
Para ser capaz de manejar sus técnicas comerciales o algoritmos de forma segura, primero es necesario saber con certeza qué acción comercial a qué algoritmo pertenece. He resaltado la frase “con certeza” intencionadamente porque si existe incluso la mínima probabilidad del fallo, el fracaso de administración de las posiciones tarde o temprano será inevitable. En su lugar, causará la destrucción completa de la estadística, y al final llevará al desorden y el fracaso completo de la idea de gestionar diferentes algoritmos en la única cuenta.
La separación segura de las acciones comerciales se basa en dos posibilidades fundamentales:
- La posibilidad de unir o “enlazar” dos órdenes comerciales juntas para que siempre se pueda determinar cuál de estas dos órdenes es la orden que abre la posición individual (virtual) y cuál es la que cierra esta posición;
- El algoritmo que analiza las órdenes con motivo de su enlazado tiene que ser completamente determinista y unificado para todos los módulos de programa.
Más tarde hablaremos con más detalles sobre el segundo requerimiento respecto al determinismo del algoritmo, ahora vamos a ver el primer punto.
La orden es una instrucción comercial de venta o de compra. La orden representa una entidad definida que incluye muchos otros “campos” informativos aparte de la información principal (identificador único o número de la orden, precio requerido y condiciones de apertura).
Uno de estos campos en MetaTrader 5 se llama “Order Magic”. Es un campo especial que sirve para que un robot comercial o Asesor Experto (EA) pueda marcar esta orden con su número personal único también llamado el “número mágico” del EA. Este campo no se utiliza durante el trading manual. Sin embargo, es muy importante para los algoritmos comerciales porque cuando el algoritmo analiza su valor, siempre puede ver si esta orden ha sido colocada por él o por otro algoritmo.
Supongamos que necesitamos abrir una clásica posición larga y luego cerrarla dentro de un tiempo. Para eso necesitamos colocar dos órdenes: la primera orden abrirá esta posición y la segunda orden la cerrará dentro de un tiempo.
Fig. 2. Órdenes que forman una posición neta histórica
¿Y qué pasará si ponemos el número único de la primera orden en el campo “Order Magic” de la segunda orden en el momento de su envío al mercado?
Más tarde podremos leer este campo, y si su valor coincide con el número de la primera orden, podremos decir con total seguridad que la segunda orden está relacionada con la primera y representa la orden opuesta del cierre de la posición.
Pues, así podríamos reflejar este enlazado esquemáticamente:
Fig. 3. Enlazado de las órdenes
Relativamente hablando, se puede llamar estas órdenes como enlazadas puesto que la segunda orden contiene el enlace a la primera. La primera orden que abre la nueva posición se puede llamar la orden iniciadora o de apertura. La segunda orden la vamos a llamar la orden de cierre.
El enlace entre estas dos órdenes lo llamaremos la posición. Para que no haya confusiones con el concepto “posición” en MetaTrader 5, vamos a llamar estas posiciones enlazadas bidireccionales, de cobertura (hedging) o posiciones de HedgeTerminal. Las posiciones en MetaTrader 5 las vamos a llamar las posiciones netto o posiciones clásicas de MetaTrader 5.
Es evidente que el número y la dirección de las posiciones en HedgeTerminal puede ser cualquiera, a diferencia de las posiciones clásicas. ¿Pero si existe alguna orden ejecutada a la que no se refiere ninguna otra orden? Se puede representar esta orden como una posición bidireccional activa. Es verdad, si en el futuro colocamos una orden de dirección opuesta que contiene la referencia a esta orden, entonces será la orden que cierra la primera orden. Estas órdenes se enlazarán formando una posición bidireccional cerrada, ya que el volumen de dos órdenes coincide y su dirección es opuesta.
Pues bien, vamos a dar una definición a lo que HedgeTerminal considera como una posición:
Si a una orden ejecutada no se refiere ninguna otra orden, HedgeTerminal considera esta orden como una posición bidireccional activa.
Si a una orden ejecutada se refiere otra orden ejecutada, estas dos órdenes forman un enlace entre sí, y desde el punto de vista de HedgeTerminal se consideran como una posición bidireccional histórica o cerrada.
En realidad, el enlazado de las órdenes en HedgeTerminal es algo más complejo porque cada orden genera como mínimo una operación, y en las condiciones del trading bursátil puede haber un montón de estas operaciones. En total, el proceso del trading puede ser reflejado de la siguiente manera: el trader envía a través del MetaTrader 5 la orden para abrir una nueva posición. La bolsa ejecuta esta orden mediante una o varias operaciones.
Igual que las órdenes, las operaciones contienen los campos para la información adicional. Uno de estos campos contiene el identificador de la orden a base de la cual ha sido ejecutada la operación. Al leer este campo, se puede informarse a qué orden pertenece esta operación. Pero lo contrario no es cierto. La orden “no sabe” qué operaciones le pertenecen. Eso ocurre por que en el momento de colocación de la orden todavía no se sabe qué operaciones van a ejecutarla, y si será ejecutada o no.
De esta manera, se respeta la causalidad y el determinismo de las acciones. Las operaciones se refieren a las órdenes, las órdenes se refieren a las órdenes. Se puede representar esta estructura como la lista simple enlazada .
La ejecución de la operación de la orden de apertura genera una posición clásica en MetaTrader 5, las operaciones que pertenecen a la orden de cierre, al revés, cierran esta posición. En el esquema de abajo se muestran estos enlaces:
Fig. 4. Esquema de correlación entre las órdenes, operaciones y la bolsa
Ya volveremos a analizar este esquema más detenidamente porque la dirección de los enlaces es sumamente importante para construir un sistema estrictamente determinizado del registro de las acciones del trader, que es HedgeTerminal.
1.3. Correlación de las posiciones netas de MetaTrader 5 y posiciones de HedgeTerminal
Desde el punto de vista de HedgeTerminal, dos órdenes con direcciones opuestas y el mismo volumen pueden representar dos posiciones diferentes. En este caso su posición neta total será igual a cero. Por esa razón, HedgeTerminal de ninguna manera utiliza la información sobre las posiciones netas realiza que están abiertas en MetaTrader 5. Por eso, las posiciones en HedgeTerminal no están relacionadas con las posiciones en MetaTrader 5. El único momento cuando se realiza la comprobación de las posiciones netas actuales es cuando se inicia HedgeTerminal. Los volúmenes totales de las posiciones bidireccionales activas tienen que coincidir estrictamente con los valores de las posiciones netas reales.
Si no es así, en el panel de HedgeTerminal aparece el aviso en forma del signo exclamatorio dentro de un marco: que indica en que las posiciones de HedgeTerminal y las posiciones de MetaTrader 5 no son iguales. Esta asimetría no afecta de ninguna manera la eficacia de trabajo de HT. Sin embargo, habría que solucionarla para un correcto trabajo en el futuro.
En la mayoría de los casos, puede surgir cuando los usuarios cometen errores durante la edición del archivo de órdenes excluidas ExcludeOrders.xml. No obstante, la destrucción del historial de órdenes y operaciones en el servidor también puede provocar la aparición de este signo. En cualquier caso, todas estas discrepancias se eliminan gracias al mecanismo de exclusión implementado a través del archivo ExcludeOrders.xml.
1.4. Requerimientos a los algoritmos que implementan el trading bidireccional
A los algoritmos que implementan el trading bidireccional se les imponen bastante estrictos requerimientos. Tienen que cumplirse cuando se desarrolla HedgeTerminal. De lo contrario, HedgeTerminal se convertirá rápidamente en un programa que va a funcionar de vez en cuando. El programa sería una “de las soluciones más que podría funcionar o fallar con el mismo grado de probabilidad”.
Pues bien, aquí tenemos algunos requerimientos que se planteaban durante su desarrollo:
- La representación de las posiciones bidireccionales de los traders tiene que ser segura. Cualquier idea implementada en HedgeTerminal no debe llevar a la ambigüedad o causar errores potenciales en la lógica de negocio. Si alguna propiedad o posibilidad no satisface estos requerimientos, no se puede utilizar esta posibilidad a pesar de su conveniencia y su demanda;
- Todos los algoritmos tienen que basarse en el entorno de MetaTrader 5 a lo máximo posible. El almacenamiento de la información adicional en los archivos se permite sólo en los casos cuando eso es extremadamente necesario. Los algoritmos de virtualización tienen que recibir la mayor parte de la información desde el entorno comercial. Debido a esta propiedad se aumenta el nivel total de seguridad, la mayoría de los cambios en el entorno comercial se transmiten a través del servidor y por eso están disponibles a nivel global desde cualquier parte del mundo;
- Todas las acciones de transformación del entorno comercial tienen que realizarse “entre bastidores”. No tiene que ser necesaria una complicada configuración o inicialización de la biblioteca API HedgeTerminal. El usuario ha de iniciar la aplicación “desde la caja” y obtener el resultado esperado;
- El panel visual de HedgeTerminal tiene que encajarse en la interfaz general de MetaTrader 5 de una manera máximamente orgánica ofreciendo las herramientas visuales simples y claras para el trabajo con las posiciones bidireccionales con las que están familiarizados todos los usuarios de MetaTrader 4 y 5. En otras palabras, el panel visual tiene que ser intuitivamente comprensible y simple para todos los usuarios;
- El panel visual de HedgeTerminal tiene que diseñarse tomando en cuenta altas exigencias de los traders algorítmicos. Por ejemplo, el panel tiene que ser ajustable, el usuario debe tener la posibilidad de cambiar su apariencia e incluso conectar los módulos personalizados;
- Tiene que ofrecer una interfaz intuitivamente comprensible y sencilla (API) de interacción con los EAs externos. La parte informática de interacción entre los EAs externos y los algoritmos de HedgeTerminal debe encajarse al máximo con el estándar existente de interacción informática de los EAs personalizados con las funciones de sistema de MetaTrader 4/5. Ahora se puede decir que API HedgeTerminal parece a un híbrido entre API MetaTrader 4 y API MetaTrader 5;
- HedgeTerminal tiene que trabajar con seguridad el entorno bursátil tomando en consideración todos los matices de ejecución de las órdenes bursátiles. HedgeTerminal ha sido escrito a base del artículo canónico “Principios de formación de precios en el mercado bursátil tomando de ejemplo la Sección de Derivados de la Bolsa de Moscú”. Inicialmente, este artículo ha sido una parte de un largo artículo sobre HedgeTerminal que luego ha sido dividido en varios artículos independientes debido a su gran volumen. Se puede decir que HedgeTerminal es la implementación informática de todas las ideas expuestas en aquel trabajo.
Muchos de estos puntos se compaginan mal uno con otro. Por ejemplo, la abundancia de la información bursátil que hay que reflejar durante el trading en la bolsa es difícil de compaginar con la simplicidad de la representación de esta información.
Además, fue difícil de crear el panel que, por un lado, fuera fácil de usar para los novatos, y por otro lado, pudiera ofrecer las posibilidades considerables a los traders profesionales de algoritmos. A pesar de eso, después de analizar el resultado del trabajo realizado, se puede afirmar con seguridad que ha sido posible reunir estas dos propiedades incompatibles.
Capítulo 2. Instalación de HedgeTerminal, el primer inicio.
2.1. Instalación del HedgeTerminal
Bien, ya sabemos que todas las órdenes ejecutadas en HedgeTerminal se consideran como posiciones. Las posiciones pueden componerse de dos órdenes enlazadas que forman una posición histórica cerrada; si la orden no está enlazada con la otra, entonces esta orden se considera como una posición activa o abierta.
Si antes de la instalación de HedgeTerminal en la cuenta comercial se realizaban algunas acciones y el historial del trading contiene varias órdenes ejecutadas, desde el punto de vista de HedgeTerminal todas estas órdenes van a ser posiciones abiertas debido a que los enlaces entre ellas no han sido creados. No hay ningún problema si el historial contiene 2-3 órdenes ejecutadas. Pero si son miles, HedgeTerminal creará miles de posiciones abiertas. ¿Qué vamos a hacer con ellas? Claro que se puede “cerrar” estas órdenes colocando en la bolsa a través de HedgeTerminal las órdenes opuestas que contienen las referencias a las órdenes iniciadoras. Pero si para el momento de la instalación de HT hay demasiadas órdenes, eso puede arruinar al trader porque tendrá que pagar las comisiones al broker y sufrir gastos debido al deslizamiento.
Para evitarlo, antes de su instalación HedgeTerminal inicia un asistente especial en el que se proponen las opciones para resolver este problema. Vamos a iniciar HedgeTerminal, llamar a este asistente y describir más detalladamente su funcionamiento. Para eso descargamos e instalamos HedgeTerminalDemo desde la tienda de aplicaciones de MetaTrader 5.
Igual que HedgeTerminalUltimate, está implementado en forma de un Asesor Experto (EA) y para iniciarlo, sólo hay que arrastrar su icono disponible en la pestaña “Navegador” a cualquier gráfico libre.
A continuación, aparece una ventana estándar que propone iniciar el EA en el gráfico:
Fig. 5. La ventana de HedgeTerminal antes del incio
En esta fase bastará con colocar la bandera “Allow AutoTrading” que permite al EA realizar las operaciones comerciales. Desde luego, HedgeTerminal va a seguir exclusivamente sus instrucciones, ya que no posee su propia lógica comercial. Sin embargo para realizar estas acciones, va a necesitar este permiso.
Para que cualquier EA empiece a tradear, aparte de su permiso personal para tradear en MetaTrader 5, el permiso general para el trading con los EAs tendría que estar activado en el panel.
Fig. 6. Activación del trading automático
HedgeTerminal ha sido diseñado de tal manera que el usuario pueda evitar la configuración larga y compleja.
Por eso todas sus posibles configuraciones están incluidas en un archivo especial de texto en el formato XML. El único parámetro explícito para HedgeTerminal es el nombre del archivo de estos ajustes:
Fig. 7. Ventana de ajustes del panel HedgeTerminal
Ya hablaremos más tarde sobre la naturaleza de estos ajustes y el modo de su edición.
Después de pulsar el botón “OK”, se iniciará el asistente de instalación de HedgeTerminal proponiendo iniciar el proceso de instalación. La instalación consiste en la creación de algunos archivos en la carpeta compartida para todos los terminales MetaTrader 4 y MetaTrader 5.
HedgeTerminal va a solicitar el permiso para la instalación de estos archivos:
Fig. 8. Diálogo del inicio de la instalación
Si no quiere instalar algunos de los archivos en su ordenador, pulse “Cancelar”. En este caso HedgeTerminal terminará su trabajo. Para continuar el proceso de la instalación, pulse “OK”.
La apariencia del siguiente diálogo va a depender de la cuenta en la que se inicia HedgeTerminal. Si en la cuenta comercial todavía no se han ejecutado transacciones, HedgeTerminal finalizará su trabajo inmediatamente.
Si en la cuenta ya han sido ejecutadas algunas transacciones, HedgeTerminal mostrará el siguiente diálogo:
Fig. 9. El diálogo que detecta el primer inicio de HedgeTerminal
En la imagen de arriba HedgeTerminal ha identificado 5 órdenes activas. En su caso, este número puede ser diferente (lo más probable que va a ser muy elevado e igual al número total de las órdenes ejecutadas durante la existencia de la cuenta). Estas órdenes no forman el par con la orden de cierre por eso, desde el punto de vista de HedgeTerminal, son las posiciones activas.
HedgeTerminal propone varias opciones.
- Eliminar estas órdenes de HedgeTerminal: "You can hide them in HedgeTerminal... To hide these orders, click 'YES' and go into the next step". Si elige esta opción y pulsa “YES”, HedgeTerminal las colocará en una lista especial y no va a tomar en cuenta su aportación en la posición neta sumaria en el futuro, ni tampoco su resultado financiero. No obstante, podrá colocar estas órdenes en esta lista sólo si no tiene abierta ninguna posición neta en en este momento. Si ya tiene abierta una posición para uno o varios símbolos, HedgeTerminal abrirá un diálogo adicional que propone cerrar las posiciones existentes.
- Dejar las órdenes como están y cerrarlas más tarde si hace falta: "You can… close manually later... Click 'No' if you want close these orders manually later. In this case, you have to perform 5 trades of opposite direction". En este caso, si pulsa el botón "No", después de su inicio HedgeTerminal mostrará todas estas órdenes como posiciones abiertas en su pestaña "Active" (posiciones activas). Luego Usted podrá cerrar estas órdenes con otras órdenes a través del panel de HedgeTerminal. Después de eso, se convertirán en las posiciones cerradas y pasarán a la pestaña "History" (posiciones históricas). Pero si estas órdenes son demasiadas, es mejor ocultar su visualización que volver a cerrar todas las órdenes ejecutadas pagando las comisiones.
- Parar la instalación: "If you are not ready continue press Cancel. In this case HedgeTerminal complete its work". Si elige esta opción y pulsa “Cancelar”, HedgeTerminal terminará su trabajo.
Si no hay posiciones activas para el momento de la instalación de HedgeTerminal, la instalación se finaliza en este etapa.
Si ha elegido la segunda opción y en el momento actual tiene una o varias posiciones abiertas, HedgeTerminal llamará el diálogo adicional sugiriendo cerrarlas:
Fig. 10. Diálogo que propone cerrar todas las posiciones netas automáticamente
HedgeTerminal exige cerrar todas las posiciones existentes porque necesita colocar todas las órdenes ejecutadas en la lista de las órdenes excluidas. Si no hay posición neta, cualquier siguiente orden inicializa la nueva posición neta. La dirección y el volumen en este caso coincidirán con la representación en HedgeTerminal y no habrá desincronización alguna de las posiciones netas con el total de las posiciones en HedgeTerminal.
HedgeTerminal puede cerrar automáticamente todas las posiciones netas por Usted: "The HedgeTerminal can automatically close all active positions". Si está de acuerdo, pulse “OK”. En este caso, va a tratar de cerrar las posiciones, y si sale bien, terminará su trabajo. Si por alguna razón no se puede cerrar las posiciones, pasará al diálogo del cierre manual. Si elige la opción de cerrar las posiciones manualmente: "Click 'Cancel' if you want to close a position manually", pulse "Cancel".
El diálogo del cierre manual de las posiciones se invoca en caso de elegir el tipo correspondiente del cierre en el cuadro anterior, o si no se puede cerrar las posiciones automáticamente:
Fig. 11. Diálogo que propone cerrar todas las posiciones netas manualmente
Aquí hay que cerrar manualmente todas las posiciones activas a través de MetaTrader 5, o detener la instalación pulsando el botón “Cancel”. Después de cerrar todas las posiciones, pulse “Retry”.
2.2. Instalación en tres pasos. Esquema de instalación y solución de posibles problemas
Si simplificamos al máximo el proceso de instalación, se puede reducirlo a tres pasos:
- Antes de instalar HedgeTerminal, cierre todas las posiciones netas existentes en el terminal MetaTrader 5;
- Inicie HedgeTerminal en el gráfico y pulse el botón “Sí” en la ventana del asistente de instalación que aparece y propone iniciar la instalación. En este caso, HedgeTerminal instalará todos los archivos necesarios para su trabajo;
- En la siguiente ventana (si aparece) elija la segunda opción y pulse el botón “Sí”. En este caso, las posiciones activas no aparecen cuando se inicia HedgeTerminal y la información sobre las órdenes ejecutadas anteriormente pasará automáticamente al archivo ExcludeOrders.xml porque no habrá las posiciones activas que requieren el cierre.
La manera aún más simple para describir este proceso es la siguiente: cerrar todas las posiciones antes del inicio de HT, luego pulsar dos veces el botón “Sí” en el asesor para la instalación de HedgeTerminal.
El esquema completo del asesor para la instalación se muestra en la imagen de abajo. Le ayudara con las respuestas a sus preguntas y ejecutar la instalación de forma correcta:
Fig. 12. Esquema del Asesor para la instalación
¿Qué hago si la instalación ha sido realizada de forma incorrecta o necesito eliminar HT de mi ordenador? Si la instalación ha sido realizada de forma incorrecta, simplemente elimine todos los archivos instalados. Para eso abra la carpeta en la que los programas para MetaTrader guardan la información compartida (habitualmente se encuentra en: c:\Users\<su_nombre_de_usuario>\AppData\Roaming\MetaQuotes\Terminal\Common\Files\). Si desea eliminar la información sobre la instalación de HedgeTerminal de todas las cuentas por completo, encuentre en este directorio la carpeta con el nombre “HedgeTerminal” y bórrela. Si desea eliminar la información sobre la instalación de HedgeTerminal sólo para una cuenta determinada, abra el directorio \HedgeTerminal\Brokers y seleccione la carpeta en cuyo nombre figura el nombre de su broker y el número de su cuenta en el formato “Nombre del broker - número de la cuenta”. Elimine esta carpeta. La próxima vez, cuando se inicie HedgeTerminal en esta cuenta, el asistente para la instalación volverá a iniciarse.
Instalación en el terminal conectado a una cuenta que ya trabaja con HedgeTerminal. Puede surgir la situación cuando necesitaremos instalar HT en el terminal conectado a la cuenta en la que HT ya trabaja. Como ya sabe, el proceso de instalación consiste en la creación y configuración de los archivos de sistema. Si estos archivos ya han sido creados en otro ordenados y han sido configurados de la manera apropiada, entonces no hace falta instalas HedgeTerminal. Normalmente, estos archivos se guardan en c:\Users\<su_nombre_de_usuario>\AppData\Roaming\MetaQuotes\Terminal\Common\Files\HedgeTerminal. Simplemente copie esta carpeta al mismo lugar en su ordenador. Después de copiar la carpeta, vuelva a iniciar HedgeTerminal. El asesor para la instalación no se abrirá ya que todos los archivos existen y están configurados. La visualización de las posiciones activas en este caso va a ser la misma que en otros terminales y ordenadores.
Instalación de HedgeTerminalAPI y uso de la biblioteca en modo de prueba. HedgeTerminal está implementado tanto en forma del panel visual, como en forma de la biblioteca de funciones de programa – HedgeTerminalAPI. La biblioteca contiene el asistente similar para la instalación al que se llama durante el primer inicio de HedgeTerminalAPI en tiempo real. La instalación de los archivos durante el uso de la biblioteca es la misma. Durante la primera llamada a cualquier función desde el EA aparece la ventana correspondiente MessageBox que propone empezar la instalación. En este caso el usuario tiene que realizar las mismas acciones: cerrar todas las posiciones antes de llamar a HedgeTerminalAPI y realizar la instalación en tres pasos.
Cuando la biblioteca se inicia en modo de prueba, no hace falta instalar HedgeTerminal. Puesto que en el modo de prueba el EA empieza a trabajar cada vez con una nueva cuenta virtual, no hay necesidad de ocultar las órdenes ejecutadas anteriormente ni instalar los archivos. Los ajustes que se almacenan en el archivo Settings.xml, en la biblioteca pueden ser definidos lógicamente a través de la llamada a las funciones correspondientes.
2.3. Conocimiento de HedgeTerminal, el primer inicio
Después de que HedgeTerminal haya instalado todos los archivos necesarios para su trabajo, se iniciará en el gráfico y mostrará su panel:
Fig. 13. El primer inicio de HedgeTerminal, apariencia
Puesto que todas las órdenes existentes han sido ocultadas, entonces no hay posiciones activas a mostrar. El panel de arriba contiene el botón HT ubicado a la izquierda y los iconos especiales que muestran el estado del panel. Vamos a describir las funciones de estos iconos:
- — Indica en que ha sido iniciada la versión demo del panel. No soporta el trading con las cuentas reales y visualiza las posiciones sólo para los símbolos AUDCAD y VTBR*. Además, en este modo el historial de las posiciones estará limitado con 10 últimas posiciones cerradas.
- — Indica en que las posiciones en HedgeTerminal no son iguales a la posición neta total en MetaTrader 5. No es un error crítico pero hay que solucionarlo. Si la instalación de HedgeTerminal ha sido realizada de forma correcta, lea el apartado correspondiente de este artículo que describe el proceso de solución de este problema.
- — Indica en que el trading es imposible. Acerque el cursor del ratón a este icono y lea la descripción emergente que explica la razón del problema. Las posibles razones pueden ser las siguientes: el EA no tiene permiso para tradear; el trading con EAs está prohibido en MetaTrader 5.
- — Este icono significa que el trading está permitido; HedgeTerminal puede ejecutar acciones comerciales.
Ahora cuando HedgeTerminal ha sido iniciado y está listo para el trabajo, vamos a ejecutar algunas acciones comerciales y veremos cómo las va a mostrar. Si HedgeTerminal ha sido iniciado en Forex, hay que ejecutar las acciones comerciales con el instrumento AUDCAD. Para este momento no tenemos que tener ningunas posiciones netas abiertas, ya que la instalación de HedgeTerminal podía terminarse con éxito sólo en este caso. Si por alguna razón no es así, cierre todas las posiciones activas.
Si HT ha sido iniciado en la cuenta conectada a la Bolsa de Moscú, el trading tiene que ejecutarse con uno de los futuros del grupo VTBR*, por ejemplo VTBR-13.15 o VTBR-06.15. Como ejemplo, vamos a comprar en Forex 0,4 lotes de AUDCAD por el precio actual a través de la ventana estándar “NewOrder”. Instantáneamente, la orden y la transacción ejecutadas aparecerá en el historial de las órdenes del terminal en el modo “Órdenes y transacciones”:
Fig. 14. Orden histórica y su transacción en MetaTrader 5
La pestaña de las posiciones activas va a contener la posición larga correspondiente con el volumen de 0,4 lotes:
Fig. 15. Posición neta activa en MetaTrader 5
Al mismo tiempo, HedgeTerminal mostrará la orden histórica como una posición activa:
Fig. 16. Posición bidireccional activa en HedgeTerminal y su transacción
Como vemos, los resultados son idénticos debido a que 1 posición en HT corresponde a 1 posición neta en MetaTrader 5.
Preste atención en que la posición en HT, aparte de la orden, también contiene la transacción que ha ejecutado esta posición (para verla, hay que desplegar la línea de la posición pulsando el icono )
Podemos cerrar una parte de la posición activa. Para eso sólo hay que introducir el nuevo valor del volumen en el campo "Vol." (Volume). El nuevo valor tiene que ser menor que el actual. La diferencia entre el volumen actual y el nuevo será cubierta por con nueva orden que forma la posición histórica y se muestra en la pestaña correspondiente de las posiciones históricas. Introducimos en este campo el valor 0,2 y pulsamos Enter. Dentro de un rato el volumen de la posición activa será 0,2 y en la pestaña de posiciones históricas aparecerá nuestra primera transacción histórica con el volumen de 0,2 lotes (0,4 - 0,2 = 0,2):
Fig. 17. Posición bidireccional histórica en HedgeTerminal
En otras palabras, hemos cerrado la mitad de nuestra posición activa. El resultado financiero total de la posición histórica y activa va a ser igual al resultado en el terminal.
Ahora vamos a intentar cerrar el resto de la posición activa completamente. Para eso pulsamos el botón del cierre de la posición en HedgeTerminal:
Fig. 18. Botón del cierre de la posición bidireccional en HedgeTerminal
Una vez pulsado el botón, la posición tiene que cerrarse con la orden opuesta y pasar a la pestaña de posiciones históricas. De esta manera, las posiciones activas (tanto en MetaTrader 5, como en HedgeTerminal) serán cerradas.
2.4. Cobertura y cálculo de operaciones financieras
En esta sección vamos a describir brevemente los métodos de trabajo con HedgeTerminal usando varias posiciones bidireccionales como ejemplo.
Pues, por ahora no tenemos posiciones activas. Abrimos la nueva posición larga con el volumen de 0,2 lotes para AUDCAD. Voy a recordar que para eso sólo hay que abrir la ventana de diálogo “Nueva orden” y colocar una orden correspondiente por el mercado. Una vez abierta la nueva posición, vamos a bloquearla con una posición opuesta: vendemos 0,2 lotes a través del terminal MetaTrader 5.
En este caso, el resultado del trading en HedgeTerminal y en la ventana del terminal MetaTrader 5 va a ser diferente. HT mostrará dos posiciones:
Fig. 19. Posiciones bidireccionales opuestas en HedgeTerminal (lock)
Mientras que en MetaTrader 5 no están presentes en absoluto:
Fig. 20. Ausencia de la posición neta activa en MetaTrader 5
Vamos a analizar los resultados obtenidos. Hemos ejecutado 4 operaciones, están marcadas en rojo en la imagen de abajo:
Fig. 21. Resultado de operaciones ejecutadas en MetaTrader 5
Reflejaremos estas operaciones en una tabla:
Tipo | Dirección | Precio | Volumen | Beneficio, pips |
---|---|---|---|---|
buy | in | 0,98088 | 0,2 | |
sell | out | 0,98089 | 0,2 | 1 |
buy | in | 0,98207 | 0,2 | |
sell | out | 0,98208 | 0,2 | 1 |
Tabla 1. Visualización de transacciones en el terminal MetaTrader 5
Se ve que hemos ganado 2 puntos con 4 operaciones. El coste de cada punto se iguala aproximadamente a 0,887 dólares tradeando con 1 lote. Entonces, el resultado financiero asciende a 0,18 dólares por posición (0,887*0,2*1) o 34 céntimos para ambas posiciones. La columna “Profit” muestra que nuestros cálculos son correctos. En total tenemos 34 céntimos del beneficio neto.
Ahora veremos los resultados de la posición en HedgeTerminal:
Fig. 22. Resultado de posiciones bidireccionales históricas en HedgeTerminal
A primera vista se diferencian considerablemente. Sin embargo, vamos a calcular el resultado para nuestras dos posiciones bidireccionales:
Dirección | Precio de entrada | Precio de salida | Beneficio, pips | Beneficio, $ |
---|---|---|---|---|
buy | 0,98088 | 0,98208 | 0,00120 | 21,28 |
sell | 0,98089 | 0,98207 | -0,00118 | -20,92 |
Tabla 2. Visualización de posiciones en HedgeTerminal
Se ve que la diferencia entre ellas es de 0,34$ (21,28$ - 20,92$), lo que coincide exactamente con el resultado obtenido en el trading neto.
2.5. Trading con un clic
En HedgeTerminal se utiliza un sistema de gestión especial. Se basa en la introducción directa de los valores necesarios directamente en la línea de la posición activa. La gestión alternativa no existe.
Por ejemplo, para establecer Stop-Loss para la posición activa, sólo hay que introducir el nivel necesario de stop loss en el campo S/L y pulsar la tecla Enter:
Fig. 23. Introducción del nivel StopLoss directamente en la tabla
De la misma manera se puede modificar el volumen, poner o cambiar TakeProfit, editar el comentario de salida.
En general, la línea de la posición en HedgeTerminal parece a la representación de la posición en MetaTrader 4/5. Las columnas de la tabla de posiciones tienen los mismos nombres y valores que se utilizan los terminales MetaTrader. Pero también hay diferencias. Pues, una posición en HedgeTerminal tiene dos comentarios, en vez de uno como en MetaTrader. Es que en HedgeTerminal una posición se forma con dos órdenes y cada una de ellas tiene su campo para el comentario. Puesto que HedgeTerminal no utiliza estos comentarios para almacenar la información técnica, existe la posibilidad de crear una posición con un comentario de apertura y de cierre.
En HedgeTerminal se puede activar las columnas que no se muestran por defecto. Por ejemplo, se puede conectar una columna que refleja el nombre del EA al que pertenece la posición. Sobre cómo hacerlo hablaremos en el apartado dedicado a la configuración del archivo Settings.xml.
2.6. Colocación de StopLoss y TakeProfit, Trailing Stop
HedgeTerminal permite cerrar las órdenes por los niveles stop-loss y take-profit.
Para ver como funciona, vamos a introducir los niveles stop-loss y take-profit directamente en la posición actual, y luego esperaremos hasta que uno de estos niveles se active. En nuestro ejemplo se ha activado el nivel take-profit. Ha cerrado la posición y la ha pasado a la lista de transacciones históricas:
Fig. 24. Posición bidireccional histórica y sus niveles StopLoss y TakeProfit
La marca verde en el campo T/P indica que se ha activado take-profit y la posición ha sido cerrada por este nivel. Aparte del nivel take-profit, la posición contiene la información sobre el nivel stop-loss que también se utilizaba cuando la posición estaba activa. Análogamente, si se activase el nivel del stop, la casilla S/L con su nivel estaría marcada con el color rosado, y la casilla T/P en este caso no estaría coloreada.
HedgeTerminal soporta el Trailing Stop. En las versiones futuras incluso habrá la posibilidad de escribir un módulo especial personalizado que va a contener la lógica del traspaso del stop. Sin embargo, ahora el trabajo con Trailing Stop en HedgeTerminal se diferencia de la lógica del trabajo con él en MetaTrader. Para activarlo, primero hace falta introducir el nivel stop-loss en la casilla S/L de la posición correspondiente. Una vez colocado el stop-loss, se puede poner la bandera del seguimiento del precio en la casilla marcada con el signo :
Fig. 25. Colocar Trailing Stop en HedgeTerminal
Una vez puesta la bandera, HedgeTerminal fijará la distancia entre el precio actual y el nivel stop-loss. Si va a aumentarse, moverá el stop-loss tras el precio de tal manera que esta distancia se mantenga la misma. La función de Trailing Stop trabaja sólo si HedgeTerminal está iniciado y se anula al salir del programa.
En HedgeTerminal stop-loss se implementa a través de las órdenes BuyStop y SellStop. Cada vez que se coloque este nivel, se coloca también la orden correspondiente cuyo número mágico está enlazado con la posición activa. Si eliminamos esta orden pendiente en el terminal MetaTrader, el nivel S/L en HedgeTerminal simplemente desaparecerá. El cambio del precio de la orden pendiente causará también el cambio del precio del Stop Loss en HedgeTerminal.
TakeProfit trabaja de una manera un poco diferente. Él es virtual y oculta del broker su nivel de activación. Eso significa que HedgeTerminal cierra la posición por TakeProfit de manera autónoma. Por eso si quiere que su Take-Profit tenga efecto, necesita mantener HedgeTerminal en funcionamiento.
2.7. Generación del informe
HedgeTerminal permite guardar la información sobre sus posiciones bidireccionales en los archivos especiales que luego pueden ser cargados en los programas estadísticos externos, por ejemplo, en Microsoft Excel.
Ahora, cuando HT no dispone de su propio sistema del análisis y recopilación de estadísticas, esta posibilidad adquiere aún más importancia. Actualmente, se soporta sólo un formato para guardar el informe: CSV (Comma-Separated Values). Vamos a ver como funciona eso. Para guardar todas las posiciones bidireccionales en el archivo CSV, después de iniciar HT hay que seleccionar en su menú la opción "Save CSV Report":
Fig. 26. Guardar el informe usando el menú "Save CSV Report"
Después de que haya seleccionado esta opción en el menú, HT generará dos archivos especiales en el formato CSV. Uno de ellos va a contener la información sobre las posiciones activas, el otro, sobre las posiciones terminadas históricas. Se generan dos archivos diferentes porque cada uno de ellos va a tener su propio conjunto de columnas. Además, el número de posiciones activas se cambia constantemente por eso va a ser más conveniente analizarlas por separado. Los archivos generados estarán disponibles según la ruta relativa la .\HedgeTerminal\Brokers\<Nombre del broker – número de cuenta> \. Al final, tienen que ser dos archivos: History.csv y Active.csv. El primero contiene la información sobre las posiciones históricas, el segundo, sobre las posiciones activas.
Se puede cargar estos archivos en los programas estadísticos del análisis. Vamos a ver este procedimiento tomando de ejemplo Microsoft Excel. Iniciamos este programa y seleccionamos el menú “Datos” --> “Desde texto”. En el asistente para exportar los datos que ha aparecido seleccionamos el modo con separadores. En la siguiente ventana, seleccionamos punto y coma como separador. Pulsamos “continuar”. En la siguiente ventana vamos a cambiar el formato general de representación de números con coma flotante. Para eso pulsamos el botón “Detalles”. En la ventana que aparece seleccionamos el separador de la parte entera y fraccionada en forma del punto:
Fig. 27. Exportar el informe CSV a Microsoft Excel
Pulse “OK”, y a continuación, el botón “Hecho”. En la tabla que aparece tenemos la información sobre las posiciones activas:
Fig. 28. Información sobre las posiciones activas exportada a Excel
De la misma manera, se puede cargar en la siguiente hoja la información sobre las posiciones históricas. El número de columnas va a corresponder al número real de columnas en HT. Si quitamos una de las columnas del panel de HT, no será incluida en el informe. Es una manera cómoda de generar el informe basándose sólo en los datos que necesita el usuario.
En las siguientes versiones habrá la posibilidad de guardar los informes en los formatos XML y HTML. Además, el informa guardado en HTML por su estructura va a recordar el informe HTML en MetaTrader 5, aunque va a componerse completamente de las posiciones bidireccionales terminadas.
2.8. Presentación de swaps de divisas
El swap de divisas es una combinación de dos operaciones opuestas de conversión por el mismo importe con fechas valor diferentes.
Para ser más claro, el swap es una transacción derivada del cómputo de la diferencia de las tasas de intereses pagadas por el mantenimiento de dos divisas que forman la posición neta.
En MetaTrader 5 no hay historial de posiciones netas. Pero hay órdenes y transacciones históricas que formaban y cerraban las posiciones netas históricas. Puesto que no hay posiciones históricas, el swap se asigna a la orden que cierra la posición histórica:
Fig. 29. Swap de divisas como una transacción independiente
Sin embargo, sería más correcto presentar el swap como una operación derivada independiente que aparece como resultado de prolongación de la posición neta.
La versión actual de HedgeTerminal no soporta la representación de los swaps. No obstante, las siguientes versiones van a tener esta opción. El swap va a mostrarse en la pestaña de posiciones históricas como una transacción histórica separada. El identificador del swap va a corresponder al identificador de la posición neta a la que va a devengarse. Además, el swap va a incluir el nombre de su par de divisas y su resultado financiero.
2.9. Línea final
Igual que MetaTrader, HedgeTerminal visualiza en la tabla de transacciones la línea final con las características comunes para toda la cuenta. Para la tabla de posiciones activas e históricas estas características y sus valores se listan a continuación:
- Balance – Balance total. Es igual al valor similar “Beneficio” en la ventana de posiciones activas en MetaTrader. No toma en consideración la ganancia o pérdida flotantes de las posiciones abiertas.
Floating P/L – Floating profit/loss o la ganancia o pérdida flotantes. Corresponde a la suma de las ganancias de todas las posiciones activas en este momento.
Margin – Contiene la parte de fondos prendarios respecto al balance de la cuenta en por cientos. Se expresa de 0% a 100%. Muestra el grado de la carga de la cuenta.
Total P/L – Contiene la suma de todas las ganancias/pérdidas para las posiciones cerradas.
Pos.:# - Muestra el número de posiciones históricas.
Para una correcta visualización de la línea final, necesita instalar una fuente adicional "Arial Rounded MT Bold".
2.10. Cambio de apariencia de las tablas de HedgeTerminal
Como ya hemos dicho, HedgeTerminal tiene sólo un parámetro explícito en la ventana del inicio del EA. Se trata del nombre del archivo de configuraciones. Es así porque resulta imposible situar los ajustes de HedgeTerminal en la ventana de configuraciones del EA. Hay muchos ajustes y son demasiado específicos para este tipo de ventana. Por esa razón todos los ajustes han sido colocados en el archivo especial de configuraciones Settings.xml. Para cada versión iniciada de HedgeTerminal puede haber su propio archivo de configuraciones. Gracias a eso, se puede configurar cada versión iniciada de HedgeTerminal de una manera individual.
La versión actual de HedgeTerminal no permite editar este archivo a través de las ventanas visuales de los ajustes. Por eso el único modo de cambiar el comportamiento de HedgeTerminal es editar este archivo manualmente. Por defecto, el archivo está configurado de manera óptima, por eso en mayoría de los casos no es necesario editar su contenido. No obstante, pueden surgir situaciones cuando estos cambios van a ser necesarios. Esta edición es necesaria para el ajuste más fino y personalización de la apariencia del panel “para sus necesidades”. Por ejemplo, editando el panel se puede quitar de la tabla las columnas innecesarias, o al revés, insertar las columnas que no se muestran por defecto.
Vamos a estudiar el contenido de este archivo y aprender a personalizarlo según nuestras preferencias. Para eso encontramos este archivo en la carpeta donde HedgeTerminal ha instalado sus archivos. Como ya hemos dicho, esta carpeta se ubica en la siguiente ruta: c:\Users\<su nombre de usuario>\AppData\Roaming\MetaQuotes\Terminal\Common\Files\HedgeTerminal. El archivo Settings.xml tiene que estar dentro de ella. Lo abrimos usando cualquier editor de textos que tenemos:
<!--This settings valid for HedgeTerminal only. For settings HedgeTerminalAPI using API function and special parameters.--> <Hedge-Terminal-Settings> <!--This section defines what columns will be showed on the panel.--> <Show-Columns> <!--You can change the order of columns or comment not using columns.--> <!--You can change the value of 'Width' for a better scaling of visual table.--> <!--You can change the value of 'Name' to install your column name.--> <!--This columns for tab 'Active'--> <Active-Position> <Column ID="CollapsePosition" Name="CollapsePos." Width="20"/> <!-- Unset this comment if you want auto trading and want see name of your expert: <Column ID="Magic" Name="Magic" Width="100"/>--> <Column ID="Symbol" Name="Symbol" Width="70"/> <Column ID="EntryID" Name="Entry ID" Width="80"/> <Column ID="EntryDate" Name="Entry Date" Width="110"/> <Column ID="Type" Name="Type" Width="80"/> <Column ID="Volume" Name="Vol." Width="30"/> <Column ID="EntryPrice" Name="EntryPrice" Width="50"/> <Column ID="TralStopLoss" Name="TralSL" Width="20"/> <Column ID="StopLoss" Name="S/L" Width="50"/> <Column ID="TakeProfit" Name="T/P" Width="50"/> <Column ID="CurrentPrice" Name="Price" Width="50"/> <Column ID="Commission" Name="Comm." Width="40"/> <Column ID="Profit" Name="Profit" Width="60"/> <Column ID="EntryComment" Name="Entry Comment" Width="100"/> <Column ID="ExitComment" Name="Exit Comment" Width="100"/> </Active-Position> <!--This columns for tab 'History'--> <History-Position> <Column ID="CollapsePosition" Name="CollapsePos." Width="20"/> <!-- Unset this comment if you want auto trading and want see name of your expert: <Column ID="Magic" Name="Magic" Width="100"/>--> <Column ID="Symbol" Name="Symbol" Width="70"/> <Column ID="EntryID" Name="Entry ID" Width="80"/> <Column ID="EntryDate" Name="Entry Date" Width="110"/> <Column ID="Type" Name="Type" Width="40"/> <Column ID="EntryPrice" Name="Entry Price" Width="50"/> <Column ID="Volume" Name="Vol." Width="30"/> <Column ID="ExitPrice" Name="Exit Price" Width="50"/> <Column ID="ExitDate" Name="Exit Date" Width="110"/> <Column ID="ExitID" Name="Exit ID" Width="80"/> <Column ID="StopLoss" Name="S/L" Width="50"/> <Column ID="TakeProfit" Name="T/P" Width="50"/> <Column ID="Commission" Name="Comm." Width="40"/> <Column ID="Profit" Name="Profit" Width="50"/> <Column ID="EntryComment" Name="Entry Comment" Width="90"/> <Column ID="ExitComment" Name="Exit Comment" Width="90"/> </History-Position> </Show-Columns> <Other-Settings> <Deviation Value="30"/> <Timeout Seconds="180"/> <!-- If your computer is not fast enough - set a value 'Milliseconds' greater than 200, such as 500 or 1000. --> <RefreshRates Milliseconds="200"/> </Other-Settings> </Hedge-Terminal-Settings>
Este archivo contiene el documento especial escrito en el lenguaje de marcado especial xml que describe el comportamiento y la apariencia de HedgeTerminal.
Lo más importante que tiene que hacer antes de ponerse a editarlo es crear una copia de seguridad por si lo dañe sin querer. El archivo tiene una estructura jerárquica y se compone de varias secciones insertadas una en otra. La sección principal se llama <Hedge-Terminal-Settings> y contiene dos subsecciones principales: <Show-Columns> y <Other-Settings>. Como podemos deducir fácilmente de sus nombres, la primera sección ajusta las columnas a mostrar y su ancho condicional, la segunda sección contiene los ajustes para el trabajo del panel y la biblioteca HedgeTerminalAPI.
Cambiar el tamaño y el nombre de las columnas. Vamos a ver la sección <Show-Columns> y estudiar su estructura. En realidad, esta sección contiene dos conjuntos de columnas: uno para la tabla de las posiciones activas en la pestaña “Active” y el otro para la tabla de las posiciones históricas en la pestaña “History”. Cada columna en uno de los conjuntos tiene el siguiente aspecto:
<Column ID="Symbol" Name="Symbol" Width="70"/>
La columna debe incluir el identificador (ID="Symbol"), nombre de la columna (Name="Symbol") y el ancho condicional (Width="70").
El identificador contiene el nombre único interno de la columna. Gracias a él, HedgeTerminal sabe de qué manera visualizar esta columna y qué valor colocar dentro. No se puede cambiar el identificador, tiene que soportarse por HedgeTerminal.
El nombre de la columna determina con qué nombre va visualizarse en la tabla. Si cambiamos el nombre por otro, por ejemplo: Name="Currency Pair", después del siguiente inicio de HedgeTerminal, el nombre de la columna que muestra el símbolo se cambiará:
Fig. 30. Cambio de los nombre de las columnas en el panel HedgeTerminal
Gracias a esa propiedad se puede crear la versión localizada del panel donde el nombre de cada columna va a mostrarse en nuestro idioma natal, por ejemplo en ruso (o español):
Fig. 31. Localización del panel HedgeTerminal
La siguiente etiqueta contiene el ancho condicional de la columna. Es que el motor gráfico del panel ajusta automáticamente el tamaño de la tabla según el ancho de la ventana en la que ha sido iniciado el panel. Cuanto más ancha sea la ventana, más ancha será cada columna. Por esa razón no se puede fijar el ancho de la columna con precisión, pero se puede establecer las proporciones fijando el ancho básico de la columna. El ancho básico es el ancho de la columna en píxeles si el ancho de la ventana corresponde a 1280 píxeles.
Si el ancho de su pantalla es mayor, el tamaño real de la columna va a ser más grande. Para ver cómo funciona el escalamiento proporcional, vamos a poner el ancho de la columna Symbol a 240 píxeles condicionales: Width="240", luego guardamos el archivo y reiniciamos el panel:
Fig. 32. Ancho de la columna Symbol fijada en 240 píxeles.
Se nota que el ancho de la columna de los símbolos se ha extendido. Sin embargo no es ningún milagro, este ancho ha sido el resultado de la compresión de otras columnas ("Entry ID" y "Entry Date").
Otras columnas ahora se ven peor, los últimos valores ya no caben en el ancho destinado y se cortan. Por eso hay que tener cuidado cuando se cambian los tamaños de las columnas, ajustando con precisión el tamaño de cada una de ellas. Los ajustes estándar ya tienen los valores precisos para la mayoría de las pantallas por eso normalmente no es necesario modificar su tamaño.
Eliminar las columnas. Aparte del cambio del tamaño de las columnas y edición de sus cabeceras, se puede añadir y eliminar las columnas. Por ejemplo, intentaremos eliminar la columna "Symbol" de la lista. Para eso simplemente hacemos el comentario de la etiqueta de esta columna en el archivo Settings.xml (marcado en amarillo):
<Column ID="CollapsePosition" Name="CollapsePos." Width="20"/> <!-- Unset this comment if you want auto trading and want see name of your expert: <Column ID="Magic" Name="Magic" Width="100"/>--> <!--<Column ID="Symbol" Name="Symbol" Width="70"/>--> <Column ID="EntryID" Name="Entry ID" Width="80"/>
Para el comentario en xml sirve una etiqueta especial <!-- contenido del comentario --> dentro de la cual debe ubicarse la columna comentada. Una vez guardados los cambios en el archivo y reiniciado HedgeTerminal, su conjunto de columnas para las posiciones historicas ha cambiado. Ahora no contiene la columna para el símbolo:
Fig. 33. Eliminación de la columna Symbol de la tabla de posiciones activas
Se puede eliminar varias columnas a la vez.
Vamos a comentar todas las columnas salvo el nombre del símbolo y el tamaño del beneficio y luego reiniciamos HedgeTerminal en el gráfico:
Fig. 34. Eliminación de las columnas principales del panel de HedgeTerminal
Como vemos, la tabla de HedgeTerminal se ha reducido sustancialmente. Pero hay que tener cuidado con la eliminación de las columnas ya que algunas de ellas tienen incorporados los elementos de gestión de las posiciones. Por ejemplo, en nuestro caso hemos eliminado la columna que permite extender las posiciones y ver sus transacciones. Incluso se puede eliminar la columna “Profit” de la tabla de posiciones activas. Pero esta columna contiene el botón del cierre de la posición. En este caso ya no podremos cerrar la posición porque el botón del cierre ya no existe.
Añadir las columnas y mostrar los alias de los EAs. Se puede no sólo eliminar las columnas mediante su edición sino también añadir las nuevas si HedgeTerminal está programado para trabajar con ellas. En el futuro, el usuario podrá crear sus propias columnas y calcular sus propios parámetros en ellas. El usuario podrá conectar estas columnas a través de la interfaz del indicador externo iCustom y el manifiesto de interacción con los módulos de extensión también escritos en xml.
Por ahora esta posibilidad no existe y sólo están disponibles las columnas que HedgeTerminal soporta. La única columna que se soporta por el panel pero no se muestra en los ajustes por defecto es la que visualiza el número mágico del EA.
La posición puede ser abierta no sólo manualmente sino también usando el robot. En este caso, para cada posición se puede mostrar también el identificador del robot que la ha colocado. La etiqueta que incluye la visualización del número del EA ya está presente en el archivo de configuración en forma comentada. Vamos a quitarle el comentario:
<Column ID="Magic" Name="Magic" Width="100"/>
Vamos a guardar los cambios y reiniciar el panel:
Fig. 35. Añadir la columna Magic en la tabla de HedgeTerminal
En la imagen de arriba se ve que ha aparecido una nueva columna con el nombre “Magic”. Contiene el identificador del EA que ha abierto la posición. La posición ha sido abierta manualmente por eso el identificador es igual a cero. Normalmente, la posición abierta por un robot tiene el identificador distinto a cero. En este caso, en la columna se mostrará el número mágico correspondiente del EA.
Pero es mucho más cómodo ver los nombres de los EAs en vez de sus números. HedgeTerminal soporta esta opción. Coge los alias (nombres) de los EAs del archivo ExpertAliases.xml y los visualiza en vez de los números mágicos que les corresponden.
Por ejemplo, si Usted tiene el EA con el nombre "ExPro 1.1" que opera bajo el número mágico 123847, sólo tiene que colocar la siguiente etiqueta en el archivo ExpertsAliases.xml en la sección <Expert-Aliases>:
<Expert Magic="123847" Name="ExPro 1.1"></Expert>
A partir de ahora, cuando su robot abra una nueva posición, será marcada con su nombre:
Fig. 36. Visualización del nombre del EA en la coliumna Magic
El número de los robots y su cantidad no se limita. Lo importante que todos sus números sean diferentes.
Otros ajustes de HedgeTerminal. Hemos descrito todos los ajustes del panel visual que están disponibles para este momento. La siguiente sección <Other-Settings> contiene los ajustes que determinan el trabajo interno del terminal. Cabe mencionar que la biblioteca de las llamadas de programa HedgeTerminalAPI utiliza estos ajustes como valores predefinidos. No obstante, el EA puede cambiar los valores actuales de estos ajustes utilizando las funciones especiales Set.... Para obtener los valores de estos ajustes, el EA sólo tiene que llamar a las funciones especiales Get.... Vamos a describir las etiquetas con los ajustes más detalladamente.
<Deviation Value="30"/>
Contiene el valor de la desviación extrema respecto al precio solicitado en unidades del cambio mínimo del precio. Entonces, para el par EURUSD, que se cotiza hasta el quinto dígito va a ser 0,0003 punto. Para el futuro del índice РТС este valor va a ser de 300 puntos porque el paso mínimo del cambio del precio para él es igual a 10 puntos. Si la desviación del precio va a ser más grande, el comando del cierre o cambio del precio no se ejecutará. Se hace para protegerse contra el deslizamiento desfavorable.
<Timeout Seconds="180"/>
Esta etiqueta contiene el valor máximo permitido de la espera de la respuesta del servidor. Es que HedgeTerminal trabaja en el modo asincrónico. Eso quiere decir que cuando se envía una orden comercial al servidor, HedgeTerminal no espera la respuesta a ella. En vez de eso, HedgeTerminal controla la llegada de los eventos que indican en que la orden se haya colocado con éxito. El evento puede no llegar en absoluto. Por eso es importante fijar un plazo límite de espera durante el cual HT va a esperar la respuesta del servidor. Si durante este tiempo la respuesta no ha llegado, la tarea será cancelada, HedgeTerminal desbloqueará la posición y seguirá con su trabajo.
Se puede reducir o aumentar el tiempo límite de espera. Por defecto, es igual a 180 segundos.
Es importante comprender que en el proceso del trading real esta limitación casi nunca se alcanza. Las respuestas a las órdenes comerciales llegan rápido, la mayoría de ellas se ejecuta dentro de 150-200 milisegundos.
Puede encontrar más detalles sobre el trabajo de HedgeTerminal y sobre las particularidades que existen durante el trabajo en el modo asincrónico en el tercer capítulo del presente artículo: “Debajo del capó de HedgeTerminal”.
<RefreshRates Milliseconds="200"/>
Esta etiqueta ajusta la frecuencia de actualización del panel. Contiene el tiempo en milisegundos entre dos actualizaciones consecutivas del panel. Cuanto menos sea este tiempo, más alta será la frecuencia de actualización del panel y más recursos van a ser necesarios para CPU. Por eso, si su CPU no es muy potente y no da abasto con la frecuencia de actualización de 200 milisegundos (es un valor predefinido), puede aumentarla hasta 500, e incluso hasta 1000 milisegundos editando esta etiqueta.
En este caso, la carga de CPU se reducirá considerablemente. No se recomienda fijar un valor menos de 100 milisegundos. Con el aumento de la frecuencia de actualización, la carga de CPU va a aumentarse de una manera no-lineal. Sin embargo, es importante entender que la frecuencia de actualización determina la discreción del terminal. Algunas de sus acciones son definidas por este temporizador y ocurren sólo con una determinada velocidad.
2.11. Posibilidades no realizadas para las versiones futuras
HedgeTerminal posee una arquitectura flexible y expansible gracias a la cual se hace posible la aparición de nuevas características no triviales en este programa. Por ahora estas posibilidades no están implementadas. Sin embargo, si es necesario, pueden ser creadas en el futuro. Hablaremos de las más importantes:
Uso de los esquemas de colores o temas (skins en inglés). HedgeTerminal utiliza su propio motor gráfico que se basa en los primitivos gráficos como las etiquetas rectangulares o texto común. La gráfica a base de las imágenes no se utiliza en absoluto. Gracias a eso se hace posible cambiar el color, tamaño, fuente para todos los elementos que se visualizan en HedgeTerminal. De esta manera, no hay ningún problema para crear la descripción de las fuentes y del esquema de color en forma de una skin y cargarla cuando se inicia HedgeTerminal, cambiando su apariencia externa.
Conexión de los módulos personalizados de Trailing Stop. Cada EA, lo que es en realidad HedgeTerminal, puede inicializar el cálculo del indicador aleatorio a través de una interfaz especial (función iCustom()). Ella puede llamar el cálculo del indicador que depende del conjunto de parámetros aleatorios. Trailing Stop es un algoritmo que fija el nuevo o mantiene el antiguo nivel de precios, dependiendo del precio actual. Este algoritmo y sus niveles de precios pueden ser implementadas en forma del indicador. Si los parámetros que se le pasan, se aceptan, HedgeTerminal puede llamar a este indicador y calcular con su ayuda el nivel de precios necesario. HT se encarga de la mecánica de la transferencia de Trailing Stop. Así, cualquier usuario de HedgeTerminal puede escribir su propio (incluso el más sofisticado) módulo de gestión de Trailing Stop.
Conexión de las nuevas columnas para la tabla de posiciones (también personalizadas). Las tablas de HedgeTerminal están diseñadas de tal manera que permiten insertar las nuevas columnas. El soporte de las nuevas columnas puede programarse dentro de HedgeTerminal o realizarse de la manera ya conocida a través de la interfaz iCustom(). Puesto que cada celda en la línea de la posición representa algún parámetro (por ejemplo, precio de apertura o nivel de Take Profit), se puede calcular este parámetro usando el indicador. Entonces, se puede escribir una cantidad ilimitada de indicadores cada uno de los cuales calcularía algún parámetro para la posición. Si coordinamos la transferencia de estos parámetros para estos indicadores, en HedgeTerminal se hace posible insertar en la tabla una cantidad ilimitada de las columnas personalizadas.
Conexión de los módulos de extensión. A través de los mecanismos de la llamada de los indicadores personalizados se puede conectar también otros algoritmos de cálculo. Por ejemplo, el sistema del informe incluye muchos parámetros de calculo, tales como expectativas matemáticas del beneficio o el ratio de Sharpe. Se puede obtener muchos de estos parámetros pasando su bloque de cálculo al indicador personalizado.
Copiador de transacciones, recepción y transmisión de transacciones de otras cuentas. En realidad, HedgeTerminal es un administrador de posiciones. A su base se puede crear con facilidad un copiador de transacciones porque las capacidades funcionales principales ya han sido implementadas. Este copiador va a poseer las capacidades no triviales para copiar las posiciones bidireccionales de MetaTrader 4 al terminal MetaTrader 5. Con su ayuda, estas posiciones serán representadas igual que en MetaTrader 4: es decir, van a ser bidireccionales con la posibilidad del control individual de cada una de las posiciones.
Informes y estádísticas. Gráfico “Equity” y la pestaña “Summary”. El cálculo de las posiciones bidireccionales permite analizar la contribución en el resultado total de cada una de las estrategias o trader. Junto con el cálculo común de la estadística, se puede realizar el análisis de cartera. Este informe puede diferenciarse sustancialmente del informe en MetaTrader 5 y completarlo. En el informe ubicado en la pestaña Summary, aparte de los parámetros habituales, tales como expectativas matemáticas del beneficio (expected payoff), reducción máxima (maximum drawdown), factor del beneficio (profit factor), etc., también van a figurar otros parámetros cuyos nombres y valores pueden ser obtenidos desde los módulos de extensión personalizados. En vez del gráfico del balance acostumbrado en forma de la imagen, el usuario podrá usar el gráfico Equity visualizado en forma del gráfico bursátil personalizado de velas.
Ordenación de columnas. Normalmente, al hacer clic en la cabecera de la tabla, las filas se ordenan en orden ascendiente o descendiente (el segundo clic). La versión actual de HedgeTerminal no soporta esta opción porque la ordenación está relacionada con el filtro de las transacciones y el conjunto personalizado de las columnas, que no están disponibles por el momento. No obstante, está opción estará en las versiones futuras.
Envío de la cuenta comercial vía e-mail, ftp. Notificaciones Push. HedgeTerminal puede utilizar las funciones del sistema para enviar los mensajes de correo electrónico, archivos ftp, e incluso las notificaciones push. Por ejemplo, puede generar el informe html una vez al día y enviarlo según la lista de los usuarios especificados. Puesto que HedgeTerminal es un administrador de los EAs y conoce todas las acciones comerciales de otros EAs, puede avisar a los usuarios sobre las acciones comerciales de estos EAs. Por ejemplo, si uno de los EAs abre una nueva posición, HT puede enviar la notificación push avisando que el EA con un determinado nombre ha entrado en la nueva posición. HT especificará también la dirección de la entrada, su fecha, hora y el volumen. Ni siquiera hace falta configurar el EA, sólo hay que introducir su nombre en el archivo de los alias.
Filtración de las posiciones usando la consola de las expresiones constantes. Ésta es una de las novedades más potentes. Sacará el trabajo en HT a un nivel de calidad principalmente nuevo. Se puede utilizar las expresiones constantes para filtrar las posiciones históricas o activas de tal manera que se visualicen sólo las que satisfacen las condiciones del filtro. Se puede combinar las expresiones constantes e introducirlas en una línea de consola especial por encima de la tabla de las posiciones activas o históricas. Este aspecto podrá tener esta consola en las futuras versiones de HedgeTerminal:
Fig. 37. Consola de solicitudes en la futura versión del panel HedgeTerminal
Usando las expresiones constantes se puede formar las condiciones increíblemente flexibles para la filtración de las posiciones con el posterior cálculo de la estadística para ellas. Por ejemplo, para mostrar las posiciones históricas sólo para el símbolo AUDCAD, basta con introducir en la celda de la consola de expresiones “Symbol” el valor "AUDCAD". También habrá la posibilidad de combinar las condiciones. Por ejemplo, se puede mostrar las posiciones para AUDCAD por el período desde 01.09.2014 hasta 01.10.2014 que han sido ejecutadas por un determinado robot. Para eso sólo necesitamos rellenar las condiciones en las celdas correspondientes. Después de que el filtro muestre los resultados, el informe ubicado en la pestaña “Summary” también se cambiará de acuerdo con las nuevas condiciones del filtro.
Las expresiones constantes van a componerse de un pequeño número de simples operadores. No obstante, su uso conjunto permitirá crear los filtros increíblemente flexibles.
La presencia de los siguientes operadores es necesaria y suficiente en la consola de expresiones constantes:
Operador = — Igualdad estricta. Si en el campo “Symbol” se introduce AUDСAD, serán encontrados todos los símbolos que contienen esta subcadena, por ejemplo, AUDCAD_m1 o AUDCAD_1. O sea, va a usarse el operador de inserción implícito. La igualdad estricta “=” requiere la coincidencia absoluta de la expresión, por eso todos los símbolos, salvo AUDCAD, (por ejemplo AUDCAD_m1 o EURUSD) serán excluidos.
Operador > — Muestra sólo los valores mayores del valor introducido.
Operador < — Muestra sólo los valores menores del valor introducido.
Operador ! — Negación lógica. Muestra sólo los valores que no son iguales al valor introducido.
Operador | — “O” lógico. Permite indicar en una línea dos o mas condiciones a la vez. Al mismo tiempo, para satisfacer el criterio será suficiente cumplir por lo menos una condición. Por ejemplo, la expresión "> 10106825|=10106833" introducida en la celda “Entry Order” de la consola de expresiones mostrará todas las posiciones cuyo identificador de la orden de entrada es más de 10106825 o igual a 10106833.
Operador & — “Y” lógico.Permite indicar en una línea dos o mas condiciones a la vez y cada una de ellas tiene que cumplirse. Por ejemplo, la expresión ">10106825&<10105939" introducida en la celda "Entry Order" mostrará todas las posiciones cuyo identificador de entrada es más de 10106825 y menos de 10105939. Las posiciones con los identificadores entre estos dos números (por ejemplo, 10106320) serán excluidas.
Corrección y administración de las posiciones usando los comandos especiales. Se puede introducir en las casillas los símbolos adicionales que reflejan el volumen o los niveles sl/tp, aplicando de esta manera la gestión más compleja de sus posiciones. Por ejemplo, para cerrar la mitad del volumen de la posición actual se puede introducir el valor “50%” en el campo “Volume” de la posición correspondiente.
En vez de fijar los niveles stop loss y take profit, se puede introducir, por ejemplo, el valor “1%” en estas casillas. HT calculara automáticamente el nivel de sl o tp de tal manera que se coloque a 1% del precio de entrada. En estas casillas se puede introducir los números con el postfijo “p”. Por ejemplo, “200p” va a significar la siguiente orden: “fijar los niveles tp/sl a 200 puntos del precio de entrada”. En el futuro, si introducimos el signo “menos” antes del volumen en la columna “Volume”, el volumen se cerrará por el valor indicado después de este signo. Por ejemplo, si tenemos una posición con el volumen 1,0 y queremos cerrar una parte del volumen (por ejemplo, 0,3), será suficiente introducir “-0,3” en la casilla del volumen.
Capítulo 3. Debajo del capó de HedgeTerminal, especificaciones y principios del funcionamiento
3.1. Concepto del contorno global y local. Contexto, transferencia y almacenamiento de información
La apariencia de HedgeTerminal y el proceso del trading en él parece mucho al terminal muy bien conocido MetaTrader 4. Eso es posible gracias a la virtualización y transformación de la visualización de datos cuando la información comercial disponible a través MetaTrader 5 se visualiza de un modo más conveniente mediante el panel. En este capítulo vamos a describir los mecanismos que permiten crear esta virtualización, así como los mecanismos del procesamiento de datos en grupo.
Como ya sabemos, HedgeTerminal está representado en varios productos diferentes. Los más importantes son dos: el panel visual y la biblioteca con la interfaz de programa. La última permite implementar la gestión de las posiciones bidireccionales en cualquier EA externo, ella también lo integra en el panel visual de HT. Por ejemplo, se puede cerrar la posición activa del EA directamente desde el panel y él se enterará de eso después de procesar la situación del modo apropiado.
Es evidente que esta estructura requiere la interacción en grupo entre los EAs. El panel (siendo un Asesor Experto) tiene que saber sobre todas las acciones comerciales que se realizan. También es cierto lo contrario, cada EA que utiliza la biblioteca de HT tiene que saber sobre las acciones comerciales que se realizan manualmente (por los programas externos o mediante el panel HT).
En general, se puede obtener la información sobre las acciones comerciales desde el entorno comercial. Por ejemplo, si el usuario ha abierto una posición nueva, el número de las órdenes va a cambiar. Después de analizar la última orden, se puede averiguar para qué instrumento y con qué volumen ha sido abierta la posición. La información sobre las órdenes y transacciones se guarda en el servidor. Por eso está disponible para cualquier terminal conectado a la cuenta comercial. Se puede llamar esta información como global, es que está disponible para todos y se distribuye a través los canales de comunicación globales. La interacción con el servidor comercial se realiza según el estilo “Petición - respuesta”.
De esta manera, podemos representar esta interacción como un contorno global. El “contorno” es un concepto que viene de la teoría de grafos. En simples palabras, es una línea cerrada en la que se incorporan varios nodos que interactúan entre sí. Puede que esta definición no sea de todo correcta pero vamos a dejar la polémica sobre este tema para los matemáticos. A nosotros lo que nos importa es representar el proceso de trading como una secuencia cerrada de acciones.
Sin embargo, no toda la información para el trading se puede pasar a través del contorno global. Una parte de la información no se pasa porque MetaTrader 5 no soporta este traspaso, además esta información no existe explícitamente. Mostraremos el proceso del trading consecuentemente:
- El trader emite una orden de compra.
- Dentro de un tiempo la orden se ejecuta.
- Se cambia el entorno comercial. La orden correspondiente aparece en la lista las órdenes históricas. La posición sumaria del instrumento se cambia.
- El trader o el EA detecta el cambio ocurrido del entorno comercial y toma la siguiente decisión.
Entre la primera y la cuarta acción pasa un tiempo. Puede ser considerable. Si en la cuenta opera un trader, él sabe qué acciones realiza y va a esperar la respuesta del servidor que corresponda a sus acciones. Pero si en la cuenta operan varios traders o EAs al mismo tiempo, pueden surgir los errores en la administración.
Por ejemplo, el segundo trader que opera en esta cuenta puede intentar enviar la orden de cierre de una posición todavía existente en el momento entre el primer y el cuarto paso. ¿Nota el problema? La segunda orden será enviada en el momento de ejecución de la primera. En otras palabras, la orden de cierre de la posición será enviada dos veces por dos traders diferentes.
Este ejemplo puede parecer imaginado y poco probable. Es cierto, si el trader opera en su cuenta por sí mismo y manualmente, así como utiliza los métodos sincrónicos del envío de las órdenes. Pero cuando en la cuenta operan simultáneamente varios robots ejecutando las operaciones comerciales independientes, surge una posibilidad muy considerable de aparición de semejantes errores.
Puesto que HedgeTerminal es un gestor de posiciones que trabaja en un modo asincrónico y asegura el trabajo simultáneo y paralelo entre varios EAs, puede estar muy cerca a estos errores. Para evitar esta situación, HedgeTerminal sincroniza las acciones entre todas sus copias iniciadas (sea la biblioteca HedgeTerminalAPI o el panel visual) usando el mecanismo del contorno local implementado como la lectura multiflujo y el cambio del archivo ActivePositions.xml. La interacción con el archivo ActivePositions.xml es el núcleo del contorno local, la parte más importante del terminal HT. Por esa razón vamos a describir este mecanismo con todos los detalles.
De modo simple, el trabajo de HedgeTerminal se reduce a la interacción con el contorno local y global, aproximadamente tal como se describe en el esquema de abajo:
Fig. 38. Esquema simplificado del intercambio de la información entre el contorno global y local
Cualquier acción comercial (marca start en el diagrama) en HedgeTerminal empieza con la escritura de una etiqueta especial en ActivePositions.xml que bloquea la posición a cambiar para futuras modificaciones.
Después de que el bloqueo de la posición haya sido establecido y el contorno local haya sido pasado con éxito, HedgeTerminal envía la orden comercial al servidor (por ejemplo, la orden opuesta para cerrar la posición). Dentro de un tiempo la orden se ejecuta y el entorno comercial se cambia. HedgeTerminal procesa este cambio y detecta que el contorno global ha sido pasado con éxito y y la orden ha sido ejecutada. Quita el bloqueo de la posición y vuelve al estado inicial (marca finish en el diagrama).
Puede surgir la situación cuando resulta imposible ejecutar la orden. En este caso HedgeTerminal también quita el bloqueo de la posición y registra la causa del fallo en el log del terminal MetaTrader 5.
En realidad, el esquema del traspaso de la información es más complicado. Como ya hemos dicho antes, en un terminal MetaTrader 5 se puede iniciar varias copias de HedgeTerminal a la vez. Pueden tener la forma del biblioteca o del panel visual. Cada una de las copias puede desempeñar el papel del oyente o del escritor. Cuando HedgeTerminal ejecuta una acción comercial, es escritor porque bloquea la posición para los cambios mediante la escritura de una etiqueta xml especial. Todas las demás copias de HT son oyentes porque leen con una periodicidad determinada el archivo ActivePositions.xml y también bloquean la posición para los cambios cuando encuentran la etiqueta de bloqueo.
Este mecanismo asegura la distribución de la información entre los flujos independientes. Gracias a él se hace posible el trabajo paralelo entre varios paneles y EAs que utilizan la biblioteca HedgeTerminalAPI.
Abajo se encuentra el esquema bastante real que muestra el trabajo de HedgeTerminal en las condiciones de la interacción multiflujo:
Fig. 39. Esquema real del intercambio de la información entre las copias de HedgeTerminal
La eficacia de esta organización de datos es muy alta. En mayoría de los casos las operaciones de lectura y escritura del archivo ActivePositions.xml ocupan menos de 1 milisegundo, mientras que el paso del contorno global con la ejecución de la orden puede ocupar 150-200 milisegindos. Para ver la diferencia entre las escalas de estos valores, mostraremos sus escalas en el esquema.
El ancho del rectángulo verde muestra el tiempo del paso del contorno local, el ancho del rectángulo azul, el tiempo de ejecución de la orden comercial:
Fig. 40. Escala de tiempo entre la escritura en el archivo y el tiempo necesario para la ejecución de la orden
Como podemos observar, el rectángulo verde prácticamente se ve como una línea vertical. En realidad, la diferencia de las escalas es aún mayor.
Gracias a las operaciones rápidas de la lectura/escritura se puede organizar el intercambio complejo entre los EAs y crear los sistemas distribuidas de alta frecuencia.
3.2. Almacenamiento de la información local y global
Relativamente hablando, toda la información comercial que utiliza HedgeTerminal puede ser dividida en dos tipos:
- Información local. Se almacena en los archivos del ordenador y se traspasa exclusivamente a través del contorno local;
- Información global. Se almacena en el servidor comercial. Se traspasa a través del contorno global y está disponible desde cualquier terminal conectado a la cuente.
Las órdenes, transacciones y la información sobre la cuenta pertenecen a la información global. Esta información está disponible a través de las funciones especiales de MetaTrader 5, como HistoryOrderGetInteger() o AccountInfoInteger(). HedgeTerminal suele utilizar precisamente esta información. Debido a ella, HT muestra los siguientes datos:
- Las posiciones activas e históricas de HT;
- Los niveles Stop Loss de las posiciones activas e históricas;
- Los niveles Take Profit activados de las posiciones históricas;
- El comentario entrante de las posiciones activas, el comentario entrante y saliente de las posiciones históricas;
- Las demás propiedades de las posiciones activas e históricas no incluidas en la lista de la información local.
Puesto que estas propiedades son globales, su visualización es única para todas las copias de HedgeTerminal iniciadas incluso en diferentes ordenadores. Por ejemplo, si en uno de los terminales se cierra una posición, en otro terminal HedgeTerminal esta posición también se cierra, incluso si este otro terminal ha sido iniciado en otro ordenador.
Aparte de los datos globales, HedgeTerminal utiliza la información local en su trabajo. La información local está disponible sólo dentro de un ordenador. En esta información se basan las siguientes propiedades de HedgeTerminal:
- Los niveles Take Profit de las posiciones activas;
- Los niveles Take Profit no activados de las posiciones históricas;
- El comentario saliente de la posición activa;
- La bandera de servicio que bloquea el cambio de la posición bidireccional.
Los niveles Take Profit no activados se guardan en el archivo HistoryPositions.xml. El resto de la información local se guarda en el archivo ActivePositions.xml.
El almacenamiento local de datos significa que si Usted, por ejemplo, coloca el nivel Take Profit, estará visible sólo dentro de las copias de HedgeTerminal iniciadas en su ordenador. Nadie más sabrá sobre este nivel.
3.3. Niveles Stop Loss y Take Profit, problemas del sistema de órdenes y órdenes tipo OCO
En MetaTrader 5, igual que en MetaTrader 4, existen los conceptos de Stop Loss y Take Profit. Son las paradas de protección. Igual que en MetaTrader 4, ellos cierran la posición si se ha alcanzado el nivel límite de perdidas (Stop Losss) o de ganancias (Take Profit). Sin embargo, en MetaTrader 4 estas paradas actúan para cada orden abierta personalmente. En MetaTrader 5 estas paradas actúan en la posición neta agregada entera.
El problema es que la posición neta no está conectada con las posiciones bidireccionales de los EAs y HedgeTerminal en particular. Eso significa que no se puede utilizar los niveles Stop Loss y Take Profit habituales para las posiciones bidireccionales. Pero se puede representar estos niveles como las órdenes pendientes separadas. Supongamos que si tenemos abierta una posición larga, entonces dos órdenes pendientes (una de ellas es SellLimit colocada por encima del precio de apertura de esta posición, y la otra es SellStop colocada por debajo de este precio) van a emular el trabajo de Take Profit y Stop Loss, respectivamente.
Es verdad, si después de la apertura el precio alcanza SellLimit, esta orden cierra la posición con ganancias, si el precio alcanza SellStop, cierra la posición con pérdidas. El problema es que después de que una de las órdenes se active, la segunda orden no dejará de existir, y si después de la activación de una de ellas el precio da la vuelta, la segunda orden puede activarse tras la primera.
Puesto que la posición ya no existe, la activación de la segunda orden abrirá una nueva posición neta en vez de cerrar la anterior.
El esquema de abajo muestra este problema tomando de ejemplo el uso de las paradas de protección de una posición larga:
Fig. 41. Emulación de los niveles Stop Loss y Take Profit usando las órdenes SellStop y SellLimit
Para evitar esta incoherencia, en el trading bursátil se usan las órdenes OCO ("One Cancels the Other", o "una cancela la otra").
Se trata de dos órdenes pendientes enlazadas entre sí de tal manera que la activación de una de ellas cancela la otra. En nuestro ejemplo de arriba, después de que una orden se haya activado, la segunda orden se cancela por el servidor comercial. Las nuevas posiciones no van a abrirse, y eso es exactamente lo que necesitamos. El trabajo de estos tipos de órdenes se muestra en la imagen de abajo:
Fig. 42. Las órdenes OCO como las paradas de protección StopLoss y TakeProfit
No obstante, MetaTrader 5 no soporta las órdenes OCO. Por eso no se puede utilizar al mismo tiempo el enlace de tres órdenes. Es decir, el uso de las órdenes que actúan simultáneamente como Stop Loss y Take Profit no es apropiado. ¡Pero se puede usar el enlace de dos órdenes! O sea, se puede usar o Stop Loss o Take Profit.
En efecto, si después de la ejecución de la orden que inicializa una posición bidireccional se coloca una orden pendiente enlazada con ésta (por ejemplo, Stop Loss), esta construcción va a ser segura. Por que no habrá la segunda orden pendiente y ella no podrá abrir la nueva posición bidireccional. Prácticamente, tendremos sólo tres escenarios:
- La orden pendiente será cancelada por alguna razón (por el broker u otro usuario);
- La orden pendiente será activada;
- La orden pendiente no será activada.
No hay otras opciones. Si la orden pendiente se cancela, esto equivale a la cancelación del nivel Stop Loss o Take Profit. Si la orden pendiente se activa, ella cierra la posición. Si la orden no se activa, la posición bidireccional seguirá siendo activa con el nivel Stop Loss establecido.
Incluso si en el momento de la activación de la orden HedgeTerminal se encuentra desactivado, al iniciarse más tarde, él podrá procesar correctamente su activación y entender que la posición ha sido cerrada por esta orden. Es posible entender que la posición ha sido cerrada por el nivel Stop Loss o Take Profit si el campo magic con la referencia a la orden iniciadora también contiene la información especial de servicio que indica qué tipo tiene la orden de cierre: orden común, Take Profit o Stop Loss. En el siguiente apartado se explica con detalles cómo se guarda la referencia y la información de servicio en el campo magic.
Puesto que no se puede utilizar dos paradas reales a la vez, durante el diseño de HedgeTerminal ha sido encontrado un compromiso:
Las posiciones bidireccionales en HedgeTerminal se protegen con las órdenes reales BuyStop y SellStop que actúan como las paradas de protección Stop Loss. Los niveles Take Profit son virtuales. Se soportan a nivel de las copias de HedgeTerminal iniciadas en el mismo ordenador y no están disponibles a nivel global.
La elección ha sido hecha a favor de los niveles Stop Loss porque principalmente de estos niveles se requiere una alta fiabilidad de activarse. Si Take Profit no se activa, no será ninguna catástrofe: la cuenta no será cerrada por margin call. Pero el Stop que no se ha activado puede causar la quiebra total de la cuenta.
Sin embargo, existe una posibilidad algorítmica de elegir el modo de seuimiento de la posición. Se puede elegir entre el nivel de Stop Loss real y el nivel Take Profit virtual o Stop Loss virtual y el nivel Take Profit real. Además, los niveles StopLoss y TakeProfit pueden ser virtuales. Por ahora esta opción no está implementada pero si hay demanda, puede aparecer.
La virtualización del nivel Take Profit reduce su fiabilidad general, pero no de una manera significante. Los niveles Take Profit se distribuyen de forma local y están disponibles a cualquiera desde las copias de HedgeTerminal. Es suficiente tener por lo menos una copia de HedgeTerminal iniciada en forma del EA que utiliza la biblioteca o panel HT para que este nivel sea ejecutado. Cuando hay varias copias de HT, sólo una de ellas ejecutará Take Profit: la que será la primera en colocar la etiqueta de bloqueo en la posición bidireccional. En este sentido las copias de HT compiten entre sí en el modo multiflujo de la escritura/lectura de datos.
Para un usuario habitual que tradea manualmente a través del panel HT o que utiliza la biblioteca de virtualización en sus EAs, el trabajo con Take Profit no se diferencia en nada del trabajo con Stop Loss. Todas las diferencias reales entre estos dos niveles están escondidas entre bastidores de HedgeTerminal. El trader sólo tiene que introducir "TakeProfit" y "StopLoss" (los niveles de toma de beneficios y parada protectora). Estos niveles estarán presentes simultáneamente y tendrán la indicación de colores idéntica que avisa sobre la activación de uno de los niveles.
3.4. ¿Pueden las órdenes tipo OCO solucionar los problemas de la protección de posiciones bidireccionales?
Gracias a las órdenes OCO se puede utilizar los niveles Stop Loss y Take Profit simultáneamente. ¿Pero si realmente son tan universales en la organización del trading bidireccional? Vamos a examinar detenidamente las propiedades que poseen. Pues, ya sabemos que las órdenes OCO permiten cancelar una orden cuando se activa la otra.
En apariencia, eso podría proteger completamente nuestra posición bidireccional por ambos lados, ya que en este caso tanto Stop-Loss, como Take-Profit podrán ser órdenes reales que no requieren que HedgeTerminal esté iniciado en el ordenador. Pero el hecho es que en las condiciones de la ejecución bursátil de las órdenes será necesario tomar en cuenta la ejecución parcial de las órdenes. Esta propiedad puede destruir completamente la lógica de negocio de la aplicación. Vamos a ver un simple ejemplo:
- Se ha abierto una posición larga con el volumen de 10 contratos. Hemos colocado dos órdenes OCO enlazadas que implementan los niveles Stop Loss y Take Profit;
- Al alcanzar el nivel TakeProfit, nuestra orden SellLimit se ha ejecutado parcialmente. Ha cerrado 7 de 10 contratos, 3 contratos restantes siguen abiertos como una posición larga;
- La orden SellStop que implementa el nivel Stop Loss será cancelada porque la orden enlazada SellLimit se ha activado, aunque parcialmente.
- La posición de 3 contratos se quedará sin la parada protectora.
Un escenario parecido se muestra en la siguiente imagen:
Fig. 43. Ejecución parcial de las paradas protectoras
El lector atento puede replicar que si proyectamos las órdenes OCO de tal manera que tomen en consideración la ejecución parcial, entonces va a ser posible evitar estos anulaciones de las paradas protectoras. Por ejemplo, el volumen de dos órdenes OCO puede estar enlazado. En este caso, la ejecución parcial realmente estará prevista. Pero eso complicará aún más la lógica compleja del sistema de órdenes que se utiliza durante el trading neto.
El principal problema consiste en que, incluso tomando en cuenta la ejecución parcial, las órdenes OCO no podrán ofrecer las posibilidades a las que los usuarios de MetaTrader 4 ya están acostumbrados. Por ejemplo, va a ser complicado colocar una orden pendiente con los niveles protectores TakeProfit y StopLoss. La razón es que dos órdenes enlazadas no podrán tomar en consideración la ejecución de la orden iniciadora.
Para escribir un algoritmo realmente universal que permite usar la gestión de las posiciones igual a la gestión en MetaTrader 4, las órdenes OCO tienen que poseer las siguientes características:
- Cada orden enlazada tiene que corregir su volumen en función del grado de activación de la orden enlazada con ella. Por ejemplo, si Take Profit ha ejecutado 7 de 10 contratos, Stop Loss enlazada debe cambiar su volumen de 10 a 3 (10 - 7 = 3);
- Cada una de las órdenes enlazadas debe de alguna manera tomar en cuenta el volumen de ejecución de la orden iniciadora. Si el usuario coloca una orden pendiente del tipo BuyLimit y la protege con SL/TP en forma de las órdenes, eso no significa que BuyLimit podrá ejecutar con seguridad todo su volumen. Las órdenes enlazadas deben tomar en cuenta estas situaciones también.
- Una orden enlazada, aparte de la condición de cancelación, debe tener la condición adicional de activación. Tiene que activarse sólo en el caso si la orden enlazada con ella se ha activado. Es decir, una orden OCO tiene que tener las referencias a dos órdenes. La primera referencia es la orden con la activación de la cual debe activarse la orden actual. La segunda referencia es la orden cuya activación cancela la orden actual. Este mecanismo permite crear la posición cuya orden iniciadora va a ser pendiente;
Estos mecanismos, incluso si aparecen, van a ser muy complicados para un usuario con poca experiencia. Su introducción es muy dudosa. Es mucho más fácil utilizar la virtualización en el lado del cliente, por ejemplo, la que se usa en HT actualmente.
Como alternativa a las órdenes OCO, la empresa MetaQuotes podría considerar la posibilidad de introducir unos especiales niveles algorítmicos Take Profit y Stop Loss que garanticen la protección de una determinada orden comercial. Claro que es sólo una proposición pero tal vez tenga un núcleo racional. Estos niveles algorítmicos pueden ocultar la mayor parte de implementación y configuración en el lado del servidor ofreciendo al usuario final un mecanismo de protección sencillo y listo para usar.
Pues bien, vamos a hacer el resumen de nuestro pequeño razonamiento lógico respecto a las perspectivas de integración de las órdenes OCO en la plataforma MetaTrader 5:
Las órdenes OCO no son eficaces en las condiciones de la ejecución parcial. No tienen la fiabilidad suficiente y son muy complicadas para un usuario común de la plataforma.
3.5. Almacenamiento de las referencias a las órdenes iniciadoras
En este apartado se describe detalladamente la estructura del almacenamiento interno de las referencias a otras órdenes y el mecanismo del enlazado entre ellas. Como ya hemos dicho antes, el campo “Order Magic” contiene el identificador del Asesor Experto (EA) que ha colocado la orden. Eso significa que usando el lenguaje de programación MQL5 cualquier trader puede escribir en este campo prácticamente cualquier valor de números enteros. En este caso, existe la posibilidad de aparición de la colisión cuando la orden que inicializa la nueva posición va a contener el identificador de un EA que coincide con el identificador de una orden ya existente. En este caso aparece una referencia incorrecta a la orden.
Si el trader va a utilizar los números-identificadores cercanos a cero durante el trabajo de sus EAs, por ejemplo "1", "7" o "100", y los números de las órdenes van a ser mucho más grandes que estos números, por ejemplo "10002384732" o algo parecido, entonces no habrá lugar para la colisión, los números de los EAs no van a coincidir con los números de las órdenes. Pero sería un poco ingenuo creer que los traders van a tenerlo en la mente. Por eso HedgeTerminal, primero, almacena las referencias a las órdenes de una manera especial que reduce la posibilidad de aparición de la colisión, y segundo, sus algoritmos no permiten la ambigüedad y eliminan las colisiones automáticamente si han aparecido.
El campo “Order Magic” que guarda la referencia ocupa 64 bits. Gracias a su ancho, este campo puede contener un número increíblemente grande. En realidad, el rango funcional de los identificadores de las órdenes es mucho menor. Debido a eso, Hedge Terminal utiliza con seguridad los dígitos mayores de este campo para sus necesidades formando la referencia a la orden de una manera especial. Vamos a ver el esquema que muestra cómo Hedge Terminal almacena una referencia a la orden iniciadora:
Fig. 44. Esquema de almacenamiento de la referencia a una orden iniciadora en Hedge Terminal
El dígito mayor 63 del campo siempre se marca con 1. Gracias a eso se puede repasar rápidamente todas las órdenes. Es que si este dígito no es igual a 1, entonces esta orden no puede contener la referencia a otra orden y se puede soltarla. Además, la asignación del valor 1 al dígito mayor hace que magic number sea muy grande, aumentando de esta manera la distancia entre el rango funcional de los identificadores de las órdenes y el rango funcional de los enlaces en HedgeTerminal, lo que minimiza la posibilidad de la colisión.
HedgeTerminal puede rellenar los siguientes tres bits con la información de servicio. A diferencia del identificador de la orden, HT guarda en este campo los identificadores de las órdenes al revés. Primero, rellena los dígitos mayores, y luego los menores, en lo que indica la dirección de la flecha azul direction SI (service inforamtion) en la Fig. 44. Gracias a este almacenamiento, el rango de la información de servicio y el rango de identificadores de las órdenes van al encuentro. Eso significa que si hace falta, se puede cambiar su composición e incluso aumentar el tamaño de la información de servicio a través de los dígitos para el almacenamiento del identificador de la orden. Gracias a esa información, se puede identificar el tipo de la orden de cierre.
El hecho es que en MetaTrader 4 las órdenes activas pueden cerrarse por los niveles TakeProfit o StopLoss. Son marcas especiales de precios al nivel de los cuales se realiza el cierre de la orden con el registro de ganancias o pérdidas, respectivamente. En MetaTrader 5 los niveles TakeProfit y StopLoss pueden aplicarse sólo a las posiciones netas y ellos no valen para las órdenes enlazadas. No obstante, las órdenes pendientes comunes pueden desempeñar el papel de las órdenes TakeProfit y StopLoss.
HedgeTerminal asigna a estas órdenes los identificadores especiales que indican el tipo de la orden: Take Profit o Stop Loss. Magic number se guarda en el servidor comercial por eso la información del servidor está disponible para todos los traders que están conectados a la cuenta comercial. De esta manera, incluso varios terminales HT iniciados en diferentes ordenadores tendrán la información sobre los tipos de las órdenes ejecutadas y mostrarán la información sobre las posiciones cerradas de forma correcta.
La información sobre el identificador de la orden a la que se hace la referencia se guarda en el rango de 0 a 59 dígito. Se guarda en la dirección estándar ocupando los dígitos de derecha a izquierda (la flecha azul direction order id). Para evaluar el tamaño de la memoria asignada para el almacenamiento, vamos a calcular el tamaño necesario para almacenar el rango de todas las órdenes que han llegado a la Bolsa de Moscú durante un año.
En el informe de mi broker para 13.06.2013 figura la orden con el identificador 10 789 965 471. Este número ocupa 33,3297 bits de información (log2(10 789 965 471)) o 34 de 64 dígitos. El identificador de una de las órdenes colocadas el día 25.09.2014 es igual a 13 400 775 716. Este número ocupa 33.6416 bits. De esta manera, en 1 año y 4 meses han sido colocadas 2,6 mil millones de órdenes (!). Sin embargo, el tamaño del identificador ha crecido a 0,31263 bits, lo que incluso es menos que un dígito. Yo no puedo afirmar que nuestro Sol se apagará antes de que el tamaño del identificador de la orden alcance el dígito 59, pero podría apostar que estos dos acontecimientos tendrán lugar no antes de que pasen unos millones de años.
HedgeTerminal no guarda la referencia de forma abierta. Para eso él codifica el campo OrderMagic dejando el dígito mayor intacto. El código de HedgeTerminal se basa en la desordenación reversible de los dígitos implementada por una función especial de cifrado que trabaja basándose en la clave variable. Después de este cifrado, la información de servicio y el identificador de la orden se encuentran mezclados entre sí y cubiertos bajo una máscara especial de tal manera que en la salida representan la distribución uniforme de ceros y unos. El cifrado se realiza por dos razones. En primer lugar, la desordenación de los dígitos reduce la probabilidad del solapamiento de los rangos funcionales de las referencias e identificadores. En segundo lugar, eso protege los algoritmos internos de HT del impacto externo premeditado o casual.
Este procedimiento es absolutamente seguro, reversible y no expuesto a las colisiones. Gracias a eso, cualesquiera que sean las acciones que realice el usuario usando sus EAs, puede estar seguro de que no afectarán la fiabilidad de los algoritmos internos de HT. Eso es muy importante, porque en la situación real la gestión de estas referencias es imposible sin usar los algoritmos especiales y bastante complicados.
Sin embargo, si nos limitamos sólo a controlar las referencias, el fallo de la lógica de negocio será inevitable. Después de estudiar los siguientes apartados dedicados a la descripción de estos algoritmos, los lectores podrán entender el por qué. El cifrado se utiliza también para evitar este fallo. El reverso de la medalla de esta limitación es que no existe ninguna otra manera de gestionar las posiciones de HedgeTerminal sin utilizar el propio terminal.
3.6. Limitaciones durante el trabajo con HedgeTerminal
De la particularidad de la estructura de almacenamiento de la referencia se puede deducir que HedgeTerminal almacena las referencias a las órdenes uniformemente usando los números de 9223372036854775808 a 18446744073709551615. Si el campo de 64 dígitos se representa como un número con el signo del tipo long, van a ser los valores negativos. Entonces, surgen tres limitaciones para trabajar con HedgeTerminal.
La primera limitación concierne al robot comercial que trabaja con HedgeTerminal. No es estricta y puede considerarse como una recomendación:
El robot comercial o EA que trabaja con HedgeTerminal debe tener un identificador (número mágico del EA) que no supera el valor de 9223372036854775808.
En situaciones reales, los EAs habituales nunca se encontrarán con estas limitaciones porque los identificadores con más de 5-6 dígitos se utilizan muy raramente (el identificador más corriente para los EAs es “12345”, o algo por estilo). Lo único que estas limitaciones pueden ser aplicadas a los robots que guardan en los números mágicos la información de servicio, por ejemplo, las referencias a otras órdenes. HedgeTerminal no es compatible con estos EAs y no puede trabajar junto con ellos.
Si por alguna razón el límite mencionado se supera, aparece la probabilidad no nula de la colisión. Es muy pequeña porque es difícil obtener una coincidencia en este rango. Incluso en este caso, HedgeTerminal solucionará esta colisión utilizando sus algoritmos. Sin embargo, esto ralentizará su trabajo porque va a necesitar el tiempo adicional para descifrar la referencia, comparar esta referencia con las órdenes existentes y analizar la capacidad de esta orden para el enlazado con el otro. Para evitar todo eso, es mejor no utilizar los números largos con el signo negativo, además, no es tan complicado.
La segunda limitación es más estricta pero concierne sólo al broker y la bolsa al que va a conectarse HedgeTerminal:
Los números de las órdenes tienen que usar los números de 0 a 2^59 o 576 460 752 303 423 488.
Es evidente porque para el almacenamiento del identificador de la orden se utilizan 59 dígitos en vez de 64. Por eso si su broker utiliza los identificadores más grandes que este valor, Usted no podrá utilizar Hedge Terminal en su trabajo.
La tercera limitación se desprende de su modo de representación de la posición:
Hedge Terminal no está compatible con ningún otro sistema de gestión de posiciones. No está compatible con los paneles comerciales externos que ofrecen la función del cierre de la posición y no puede trabajar junto con ellos.
3.7. Mecanismo del enlazado de las órdenes y determinismo de las acciones
Hemos considerado al detalle la representación de las posiciones en HedgeTerminal, así como la estructura de sus referencias (enlaces). Ahora vamos a pasar a la descripción de los algoritmos que controlan estas órdenes enlazadas. Supongamos que necesitamos enlazar dos órdenes seleccionadas de la multitud de otras órdenes. Si no vamos a contar con la regla que la referencia a la orden tiene que ser única y pertenecer sólo a una orden, todas las posibles situaciones se reducen a tres grupos:
- A la orden no se refiere ninguna de otras órdenes;
- A la orden se refiere sólo una orden;
- A la orden se refieren dos y más órdenes.
Con la primera situación no hay problemas, esta orden va a considerarse como una posición abierta. Con la segunda situación también está claro, el enlazado de dos órdenes forma una posición cerrada. ¿Pero cómo resolver la tercera situación? Supongamos que a una orden se refieren dos órdenes al mismo tiempo, ¿cuál de ellas hay que enlazar con la primera, y qué hacer con la segunda orden? En realidad, es fácil responder a esa pregunta si presentamos el proceso del enlazado como una secuencia:
- Encontramos la orden que no tiene referencia a otra orden. La orden pasa a la sección de órdenes (posiciones) activas, luego el repaso de las órdenes continúa;
- Encontramos la orden que tiene la referencia a la primera. Se realiza la búsqueda de la orden a la que se refiere en la sección de órdenes activas. Si se encuentra en esta sección, se enlaza a la orden actual y ambas pasan a la sección de transacciones completadas en forma de las posiciones históricas;
- Durante el siguiente repaso, se encuentra otra orden que se refiere a la orden descrita en el primer punto. Se realiza la búsqueda de la orden a la que se refiere en la sección de órdenes activas. Sin embargo, ahora la búsqueda no tendrá éxito porque la orden necesaria ya ha sido pasada de esta sección a la sección de transacciones completadas. ¡Si la orden (cuya referencia tiene la orden actual) no ha sido encontrada, a pesar de su referencia la orden actual es una orden activa y pasa a la sección de posiciones activas!
Puesto que los identificadores de las órdenes se rellenan sucesivamente y su lista está ordenada por el tiempo, se puede realizar su repaso sucesivo. Entonces, la orden iniciadora siempre será enlazada sólo con la primera orden que tenga la referencia a ella independientemente del número de las órdenes con la misma referencia. Todas las demás órdenes que tengan referencia a ella pasarán a la sección de las posiciones activas iniciadoras.
Como ya hemos dicho antes, el algoritmo que realiza este repaso tiene que ser completamente determinista o consecutivo. Precisamente este algoritmo de repaso utiliza HedgeTerminal. En realidad, no es un simple repaso, sino la repetición de todas las acciones comerciales que han sido realizadas a partir de la primera transacción. Prácticamente, durante cada inicio HedgeTerminal construye sucesivamente la cadena completa de las acciones comerciales desde el principio hasta este momento. Gracias a eso, su representación actual de la posición es el resultado de su trading retrospectivo en el momento del inicio.
Puesto que el repaso de todas las órdenes en el historial se realiza consecutivamente, también es necesario realizar las acciones comerciales de manera consecutiva. Eso determina un cierto carácter específico de la ejecución de las órdenes en HedgeTerminal. Supongamos que necesitamos cerrar una posición bidireccional activa en HedgeTerminal que está protegida con Stop Loss. Ya sabemos que esta posición bidereccional va a componerse de dos órdenes: una orden ejecutada que inicializa la posición activa y una orden pendiente buy-stop o sell-stop que actúa como la orden Stop Loss. Para cerrar esta posición, es necesario eliminar la orden pendiente y cerrar la posición bidireccional activa con una orden opuesta del mismo volumen. Prácticamente, hay que realizar dos acciones comerciales. HedgeTerminal ejecuta todas las órdenes comerciales de manera asincrónica.
Con este modo de ejecución, las órdenes pueden ejecutarse en paralelo: es decir, la primera orden se envía para cancelar la orden pendiente y a la vez se envía la segunda para ejecutar la orden opuesta que cerrará nuestra posición. No obstante, HedgeTerminal no puede hacerlo porque en este caso se altera el determinismo de las acciones. Si por alguna razón la orden pendiente no llega a cancelarse y la posición se cierra con la orden opuesta, surgirá la ambigüedad: la posición va a cerrarse pero su Stop Loss no dejará de existir. Al final, la orden que implementa Stop Loss podrá activarse y generar una nueva posición bidireccional, y eso no tiene que pasar. Por eso HedgeTerminal primero cancelará Stop Loss y sólo luego colocará la orden opuesta. Desde luego, en el segundo paso la orden opuesta puede no ejecutarse o ejecutarse parcialmente. No obstante, en este caso no habrá ninguna ambigüedad porque la orden opuesta ejecutada incluso parcialmente cerrará una parte de la posición activa. Es una situación absolutamente ordinaria.
Hay una secuencia de acciones más complicada que realiza HedgeTerminal. Vamos a ver un ejemplo parecido al anterior pero en este caso intentaremos cerrar sólo una parte de la posición. Eso significa que HedgeTerminal tendrá que ejecutar tres acciones al mismo tiempo:
- Eliminar la orden pendiente que ejecuta la función de Stop Loss;
- Ejecutar la orden opuesta que cierra una parte del volumen de la posición bidireccional;
- Colocar una nueva orden Stop con el volumen nuevo que protege el resto de la posición activa.
Todas estas acciones van a realizarse consecutivamente para no alterar el determinismo de las acciones. Desde luego, nos gustaría que la velocidad de las órdenes sea más alta debido al envío en paralelo. Pero en este caso es imposible asegurar la ejecución consecutiva de las operaciones comerciales, y eso significa que puede aparecer la ambigüedad. Con el procesamiento consecutivo de las órdenes no hay lugar a ninguna ambigüedad.
3.8. División y combinación de las transacciones como la base de la aritmética de órdenes
El procesamiento consecutivo de las órdenes no es suficiente. Además de eso, hay que tener en cuenta dos momentos:
- A una orden le puede pertenecer varias transacciones a la vez. Su cantidad puede ser aleatoria;
- Es importante tomar en cuenta la ejecución parcial de las órdenes, y una situación más común, cuando el volumen de la orden de cierre puede ser diferente del volumen de la orden iniciadora;
La orden puede ser ejecutada por varias transacciones al mismo tiempo, así como puede ser ejecutada parcialmente. Si no sabe por qué puede pasar eso, lea el artículo dedicado a la descripción de la formación de precios en el mercado bursátil: “Principios de formación de precios en el mercado bursátil tomando de ejemplo la Sección de Derivados de la Bolsa de Moscú”. La respuesta respecto al segundo momento representa el mayor interés, ¿porqué el volumen de la orden de cierre puede ser diferente del volumen de la orden de appertura? ¿Qué hacer en este caso?
En realidad, sus volúmenes pueden ser diferentes si suponemos la posibilidad del cierre parcial de la posición activa. En efecto, si se abre una posición activa con el volumen de 50 contratos y dentro de un tiempo se cierra una parte de esa posición por la orden opuesta con el volumen de 20 contratos, pues la posición activa parece que se divide en dos partes: la primera forma con la orden opuesta una nueva posición histórica con el volumen de 20 contratos y la segunda parte seguirá existiendo, pero su volumen se bajará siendo igual a 30 contratos.
Precisamente este algoritmo del cierre parcial de las posiciones está implementado en HedgeTerminal. Si en el campo “Volume” del panel HT introducimos un nuevo volumen que va a ser menos que el volumen actual, tendrá lugar el cierre parcial. En la pestaña “History” aparecerá la nueva posición y el volumen de la posición actual será igual al valor nuevo que hemos introducido. ¡Pero HedgeTerminal es capaz de procesar la situación incluso cuando el volumen de la orden de cierre supera el volumen de la orden iniciadora! Esta situación puede surgir si por alguna razón HT coloca un volumen incorrecto de la orden de cierre o el broker cancela retrospectivamente varias transacciones que forman parte de la orden iniciadora cambiando así su volumen ejecutado por el menor.
Para tener en cuenta la diferencia potencial de los volúmenes, hace falta utilizar un algoritmo universal basado en el cálculo del volumen total de todas las transacciones referentes a la orden. En este caso, la voz cantante tienen las transacciones en vez de las órdenes. El volumen de una orden es el volumen de sus transacciones. El precio de una orden ejecutada es el precio medio ponderado de sus transacciones.
HedgeTerminal utiliza el algoritmo que enlaza las órdenes, o al revés, las separa. Se basa en la suma o la resta de las transaciones. Todo su trabajo consiste en la combinación de las transacciones entre la orden de apertura o de cierre, con la posterior formación de la posición histórica.
Para comprender cómo funciona este algoritmo, vamos a experimentar. Supongamos que necesitamos enlazar dos órdenes formando una posición histórica. Su número de transacciones y su volumen ejecutado va a ser igual. El número de las transacciones va a ser de tres dígitos (para que sea más fácil):
Order #1 (in order) | Volume (10/10) |
---|---|
deal #283 | 3 |
deal #288 | 2 |
deal #294 | 5 |
Tabla 3. Orden №1 y su transacción
Order #2 (out order) | Volume (10/10) |
---|---|
deal #871 | 1 |
deal #882 | 3 |
deal #921 | 6 |
Tabla 4. Orden №2 y su transacción
Colocamos sus transacciones con los volúmenes en frente:
Tabla 5. Colocación de las órdenes juntos
Seleccionamos dos últimas transacciones de cada columna: №294 y №921. En caso general, pueden no encontrarse en el mismo nivel una respecto a la otra (como en este ejemplo).
Seleccionamos la transacción con el menor volumen. Es la transacción №294 con el volumen 5. Dividimos la transacción opuesta №921 en dos: la primera transacción va a ser igual al volumen de la transacción №294 (5 contratos), la segunda va a contener el volumen restante: 1 contrato (6 contratos – 5 contratos = 1 contrato). Combinamos la transacción #294 con el volumen 5 con la primera transacción №921 con el mismo volumen:
Tabla 6. Resta de volúmenes
Pasamos esta parte combinada a una columna nueva que contiene las transacciones de la posición histórica.
Se muestra con el color verde. La segunda parte restante de la transacción #921 con el volumen1 la dejaremos en la columna inicial de la posición activa, se muestra con el color gris:
Tabla 7. Split y traspaso de las transacciones
Hemos hecho el primer paso en la combinación de las transacciones de dos órdenes y su traspaso en la posición histórica. Vamos a visualizar nuestra secuencia de acciones de una manera más breve:
Tabla 8. Split y traspaso de las transacciones. Paso 1
El volumen de la transacción №294 ha sido pasado completamente a la sección de la posición histórica. Se puede decir que esta transacción ha sido aniquilada completamente. Hemos hecho el split (división) de la transacción con su posterior traspaso en la sección de las transacciones históricas. Por eso en el siguiente paso podemos pasar a la siguiente transacción №288 con el volumen 2. La transacción №921 todavía existe y su volumen es igual a la parte restante de la transacción. En el siguiente paso este volumen va a interactuar con el volumen de la transacción №288.
En el segundo paso vamos a repetir el procedimiento con las transacciones №288 y №921. Esta vez el volumen restante de la transacción №921 (1 contrato) se unirá con el volumen de la transacción №288 pasando a la columna de las posiciones históricas. El volumen restante de la transacción №288 será igual a 1 contrato y se quedará en la columna de la posición activa:
Tabla 9. Split y traspaso de las transacciones. Pasos 1-2
Vamos a repetir las mismas acciones con las transacciones №288 y №882.
Tabla 10. Split y traspaso de las transacciones. Pasos 1-3
Ejecutamos los pasos IV y V de la misma manera:
Tabla 11. Split y traspaso de las transacciones. Pasos 1-5
Después del paso V, el volumen de las transacciones de la orden de cierre será igual al volumen de las transacciones de la orden de apertura. Las transacciones que han pasado a la columna de la posición histórica forman una transacción histórica completada. Las transacciones restantes de la posición activa forman una posición activa. En este caso, en la columna de la posición activa no hay transacciones. Eso significa que después de esta unión la posición activa dejará de existir. En vez de ella aparece una posición histórica nueva que incluye todas las transacciones de la posición activa.
Después del traspaso de las transacciones, la mayoría de ellas serán divididas en varias partes ocupando varias líneas. Para evitarlo, se puede añadir la opción adicional de reunión de las transacciones en el algoritmo de combinación/separación de las transacciones. Simplemente vamos a unir los volúmenes de las transacciones con identificadores iguales en los niveles unificados:
Tabla 12. Unión de las transacciones en un nivel
Es obvio que después de la unión, el número de las transacciones y su volumen coincide exactamente con las transacciones y los volúmenes iniciales. Pero eso se debe al hecho de que sus volúmenes coincidían desde el principio. Si los volúmenes fueran diferentes, entonces después del procedimiento de la combinación estas transacciones tendrían otros volúmenes.
El algoritmo es universal, por eso no necesita el mismo número de transacciones para la orden de apertura y de cierre. Vamos a ver otro ejemplo basado en esta propiedad paso a paso:
Tabla 13. Combinación de las órdenes con cantidad diferente de transacciones
Como podemos ver, la combinación de dos órdenes en una posición histórica vuelve a salir con éxito. A pesar de la cantidad diferente de las transacciones, su volumen ha coincidido de nuevo.
Ahora imaginemos que el volumen total de las transacciones de la orden de cierre (12 contratos) es menos que el volumen de las transacciones de la orden iniciadora (22 contratos). ¿Cómo va a pasar la combinación en este caso?
Tabla 14. Combinación de las órdenes con volumen diferente
Se ve que en el segundo paso el volumen de las transacciones de la orden de cierre se ha igualado a cero, mientras que la orden iniciadora contiene todavía dos transacciones №321 con el volumen 4 y №344 con el volumen 6. De esta manera, se ha formado el exceso de las transacciones de la orden activa. Este exceso seguirá existiendo como una posición bidireccional activa. No obstante, también se ha formado una posición histórica con las transacciones que han sido traspasadas a la columna verde. Su volumen de entrada y de salida ha coincidido de nuevo, siendo de 12 contratos.
Nos queda la tercera situación, cuando el volumen de la orden de cierre es más que el de la orden iniciadora. Igualmente que en el ejemplo anterior se forma un exceso, pero en este caso de parte de la orden de cierre:
Tabla 15. Combinación de las órdenes con volumen diferente
Como podemos ver, la orden de entrada con el volumen 4 y la orden de cierre con el volumen 6 han formado dos posiciones. La primera es la posición histórica con el volumen 4 y las transacciones №625 de la orden de entrada y №719, №720 de la orden de salida. La segunda posición se ha formado como el exceso de la unión de las transacciones de estas órdenes. Contiene la transacción №719 con el volumen 2. Esta transacción y la orden a la base de la cual ha sido ejecutada forma una posición activa en la pestaña “Active” del panel de HedgeTerminal.
El algoritmo dividirá las transacciones y las órdenes en las posiciones históricas y activas. Estos volúmenes pueden ser diferentes. Lo importantes es que el algoritmo permite combinar los volúmenes de la orden iniciadora y de cierre formando una posición histórica con el mismo volumen de entrada y de salida. Gracias a eso, la situación cuando estos volúmenes no van a ser iguales es imposible, con lo cual son imposibles los errores de representación de las posiciones que causan la asimetría de la posición.
Imaginemos que en el primer ejemplo el broker ha cancelado una de las transacciones que entra en la orden de cierre:
Tabla 16. Simulación de la eliminación de una transacción del historial
Se forma una nueva posición neta con el volumen de 6 contratos. Será igual al volumen de las transacciones canceladas. Veremos como va a actuar HedgeTerminal en este caso:
Tabla 17. Recuperación de la integridad de la representación
Como vemos, en el segundo paso se forma el exceso de 6 contratos (3+2+1). Este exceso se convertirá en una posición activa, y así el volumen y la dirección de la posición bidireccioenal coincidirá con la posición neta.
Resumiendo se puede decir que el algoritmo de combinación de las transacciones asegura la igualdad de los volúmenes de la orden iniciadora y de cierre en la posición histórica debido a la formación del exceso en forma de las transacciones que no han sido combinadas. Este exceso de las transacciones forma una posición bidireccional activa que iguala la posición neta de MetaTrader 5 con la posición neta de todas las posiciones abiertas de HedgeTerminal.
Este mecanismo trabaja tanto retrospectivamente, como en tiempo real. Eso significa que va a igualar las posiciones netas de Hedge Terminal con la posición neta de MetaTrader 5 independientemente de las acciones del broker en cuanto a la cancelación de las acciones comerciales. Puede haber cualquier combinación del cambio de la posición neta y cancelación de las transacciones, entre la posición neta del terminal y la posición neta de HT no habrá ninguna asimetría.
El mecanismo del cierre parcial de la posición se basa precisamente en las capacidades de este algoritmo para combinar varios volúmenes. Este algoritmo es una de las partes esenciales de HT que asegura su trabajo estable sin ajustes como un sistema autoadaptable.
3.9. Virtualización de las órdenes y transacciones
A cada orden y transacción en HT le corresponde un prototipo real con el mismo identificador. A pesar de eso, desde el punto de vista de HT la misma orden puede formar una posición activa y ser al mismo tiempo una parte de una posición histórica. En MetaTrader 5 las transacciones y las órdenes son entidades indivisibles. En la plataforma una orden puede ser pendiente o ejecutada. Una operación puede tener un volumen constante siendo una transacción ejecutada.
En HedgeTerminal las mismas órdenes y transacciones pueden estar presentes en diferentes posiciones bidireccionales. La misma orden o la transacción puede formar tanto la posición activa, como histórica. Es decir, en HedgeTerminal las órdenes y las transacciones se dividen en varias virtuales. Esta representación se diferencia mucho de la representación de datos en MetaTrader 5. No obstante, esta representación permite adaptarse con flexibilidad al cambio retrospectivo de la información comercial y combinar las órdenes y transacciones.
3.10. Mecanismo para ocultar las órdenes
Ya hemos mencionado el mecanismo para ocultar las órdenes en el apartado que describe la instalación de HedgeTerminal. HedgeTerminal puede ignorar la existencia de algunas órdenes. Para que alguna orden y las transacciones ejecutadas a su base dejen de existir para HedgeTerminal, sólo hay que introducir su identificador en el archivo especial ExcludeOrders.xml.
Imaginemos que tenemos unas órdenes ejecutadas de compra y de venta para un instrumento. El volumen total de todas las órdenes de venta es igual al volumen total de todas las órdenes de compra. Así, no importa la cantidad de órdenes que haya, su posición total será igual a cero. Si los identificadores de estas órdenes no figuran en el archivo ExcludeOrders.xml, HedgeTerminal visualizará cada una de ellas como una posición bidireccional. No obstante, su posición total va a ser igual a cero. Entonces, si la posición neta en MetaTrader 5 también es cero, la contribución de este conjunto de órdenes en la posición neta simplemente puede ser ignorada.
Ahora imaginemos que en el momento de tiempo t tenemos una posición neta nula para el instrumento S y varias órdenes N ejecutadas para este instrumento hasta este momento. Puesto que no hay ninguna posición para el instrumento, el volumen total del conjunto de órdenes N pierde su importancia. Es verdad, ¿qué más da cuántas órdenes hay y qué volumen tienen?Pues, si la posición no existe, estas órdenes no aportan nada a la posición neta total. Eso significa que se puede ignorar estas órdenes y no representarlas como posiciones bidireccionales.
Precisamente este mecanismo utiliza HedgeTerminal en el momento de su instalación. Si la posición neta no existe, en el momento de la instalación t, HedgeTerminal mete el conjunto de órdenes N en la lista de exclusiones. Su volumen total y la cantidad no tiene importancia porque la posición neta no existe. Si hay una posición neta en el momento de la instalación de HT, simplemente va a rechazar instalarse en el ordenador hasta que la posición se cierre. Después de la instalación, las órdenes nuevas cambiarán el estado de la posición neta. Sin embargo, este estado va a ser sincronizado con el volumen neto de las posiciones bidireccionelas en HT.
Claro que podríamos no insertar las órdenes ejecutadas en la lista de excepciones para el momento de instalación de HedgeTerminal. Pero, en primer lugar, para el momento de instalación puede haber una gran cantidad de ellas, y desde el punto de vista de HedgeTerminal todas ellas serán posiciones bidirecionales. Y segundo, su volumen total por alguna razón puede diferenciarse del volumen neto en MetaTrader 5.
El mecanismo para ocultar las órdenes puede ser eficaz incluso ante la destrucción del historial de la cuenta. Eso funciona así. Imaginemos que tenemos un historial de órdenes. Cuando HedgeTerminal se inicie en esta cuenta, hará el repaso de todas las órdenes y construirá a su base las posiciones bidireccionales. Si en la cuenta están disponibles todas las órdenes desde el momento de su apertura y los datos no están corrompidos, la posición neta de estas órdenes va a corresponder a la posición neta en MetaTrader 5. Es evidente que la posición neta de HedgeTerminal también va a ser igual a la suma de todas estas órdenes. Esta situación se muestra en la imagen de abajo:
Fig. 45. Esquema del historial integral
Por alguna razón, una parte del historial puede faltar o la información sobre las órdenes va a ser incorrecta.
No importa si falta una o varias órdenes, tampoco importa dónde se encuentran las órdenes ausentes: al principio del historial y en el medio. La posición neta de HedgeTerminal iniciado en esta cuenta va a ser igual a la posición neta de todas las órdenes disponibles. Pero la posición neta de las órdenes no va a ser igual a la posición neta real del terminal debido a la parte del historial que falta. Esta situación se muestra la siguiente imagen B:
Fig. 46. Esquema del historial parcialmente corrompido
Para sincronizar la posición neta de HedgeTerminal con la posición neta real de MetaTrader 5, no necesitamos saber qué órdenes han desaparecido o han sido dañados, sólo necesitamos calcular la diferencie entre estas posiciones netas. En el ejemplo de arriba, en el terminal MetaTrader 5 tenemos abierta una posición de compra con el volumen de 5 contratos. En el terminal HT se muestra una posición larga total con 8 contratos. La diferencia entre estas dos posiciones será de 3 contratos de compra porque 8 BUY – 5 BUY = 3 BUY.
Una vez calculada la diferencia de los contratos, es necesario colocar la orden correspondiente de compra o de venta con el volumen de la diferencia correspondiente. En nuestro caso hay que enviar la orden de compra de 3 contratos de mercado. Cuando la orden se ejecute, HedgeTerminal la mostrará en la pestaña de posiciones activas, mientras que su posición neta total aumentará a 3 contratos y será igual a 11 contratos de compra.
La posición en MetaTrader 5 también aumentará y llegará a 8 contratos. Ahora hace falta introducir el identificador de esta orden en la lista de excepciones ExcludeOrders.xml y luego reiniciar el terminal. Pues, si el identificador de nuestra orden es 101162513, en el archivo hay que escribir la siguiente etiqueta:
<Orders-Exclude> ... <Order AccountID="10052699" ID="101162513"></Order> </Orders-Exclude>
Después del reinicio de HT, la posición bidireccional formada por esta orden desaparecerá. De esta manera, la posición neta en MetaTrader 5 va a coincidir con la posición neta de HedgeTerminal y en ambos casos será de 5 contratos de compra (buy). La secuencia de estas acciones se muestra en la imagen de abajo:
Fig. 47. Esquema de recuperación de la integridad de datos
El resultado financiero de la posición desaparecida también desaparecerá de la estadística de HedgeTerminal. Lamentablemente, las posiciones bidireccionales ocultadas no participan en la estadística comercial.
En realidad, la situación cuando una parte del historial no está disponible o está corrompido es poco probable. La mayoría de los usuarios de MetaTrader 5 nunca se enfrentará con esta situación, pero aún así este mecanismo es necesario. Al fin y al cabo, tampoco hay que descartar los errores de programa de HedgeTerminal. Incluso en este caso es necesaria una herramienta segura para resolver estos errores.
3.11. Mecanismos de adaptación
Hemos examinado detenidamente los mecanismos que permiten a HedgeTerminal representar con seguridad las posiciones bidireccionales en el entorno neto de MetaTrader 5. Son tres mecanismos:
- Repaso consecutivo de las transacciones;
- Mecanismo de división y combinación de las transacciones;
- Mecanismo para ocultar las órdenes.
Cada uno de estos mecanismos se encarga de sus tarea y permite evitar ambigüedades y errores a su nivel. En la tabla de abajo se muestran estos problemas y sus soluciones. La primera columna contiene los problemas y posibles errores del enlazado, en la segunda, los mecanismos que los solucionan:
Problemas, errores, ambigüedades que aparecen durante la organización del trading bidireccional | Mecanismos de solución de errores |
---|---|
Errores en las referencias a las órdenes de apertura; Colisión de referencias; Uso de números mágicos por los EAs; Eliminación de órdenes del historial; Errores de ejecución de operaciones comerciales. | Repaso consecutivo de las órdenes. Determinismo de acciones. |
Errores en los volúmenes; Combinación de órdenes con diferentes volúmenes; Ejecución parcial de las órdenes; Eliminación de las órdenes del historial; Cierre del volumen menor con el mayor. | Mecanismo de división y combinación de las transacciones. |
Instalación de HedgeTerminal en la cuenta con un número grande de órdenes ejecutadas; Destrucción del historial; Errores de HedgeTerminal durante el trabajo con las órdenes. | Mecanismo para ocultar las órdenes. |
Tabla 18. Posibles errores y mecanismos de su solución
Estos tres mecanismos junto con el sistema de almacenamiento de referencias aseguran la representación estable de los datos. En realidad, estos mecanismos cubren todas los posibles casos de fallos fortuitos por eso HedgeTerminal es capaz de combinar su posición neta con la posición neta de MetaTrader 5.
3.12. Rendimiento y uso de memoria
HedgeTerminal representa una aplicación orientada a objetos. Gracias a los principios de la POO introducidos en su arquitectura, el terminal tiene un alto rendimiento y bajos requerimientos hacia la memoria ocupada. La única tarea que consume muchos recursos es la extracción del historial de transacciones y órdenes en la memoria del ordenado en el momento del inicio del terminal en el gráfico.
Después de la extracción de todas las transacciones necesarias en la memoria, el terminal muestra el mensaje sobre el tiempo gastado para esta operación y el uso de la memoria operativa. El panel de HedgeTerminal iniciado en la cuenta que contiene más de 20 000 de transacciones en el ordenador con el procesador Intel i7 se ha iniciado en menos de 30, y eso ha requerido 118 Mb de memoria operativa:
2014.11.20 16:26:19.785 hedgeterminalultimate (EURUSD,H1) We begin. Parsing of history deals (22156) and orders (22237) completed for 28.080 sec. 118MB RAM used.
La biblioteca HedgeTerminalAPI trabaja aún más rápido y ocupa mucha menos memoria ya que no hace falta mostrar la representación gráfica de las transacciones. Es su resultado después de iniciarse en la misma cuenta:
2014.11.20 16:21:46.183 TestHedgeTerminalAPI (EURUSD,H1) We are begin. Parsing of history deals (22156) and orders (22237) completed for 22.792 sec. 44MB RAM used.
Es fácil de calcular que para procesar una posición, se tarda aproximadamente de 1 a 1,26 milisegundos dependiendo del tipo del programa. El almacenamiento de una transacción ocupa: (22 156 transacciones + 22 237 órdenes) / 44 Мб = 1 Kb de memoria operativa. El almacenamiento de la representación gráfica adicional de una transacción ocupa apromadamente: (118 Mb – 44 Mb) * 1024 / (22 156 transacciones + 22 237 órdenes) = 1,71 Kb.
El proceso del perfilado del código muestra que la mayor parte de tiempo es quitada por el único bloque del análisis de las órdenes cuya parte esencial es la llamada a las funciones de sistema. La optimización de este bloque en las versiones futuras permitirá aumentar el rendimiento en el momento del inicio a unos 10-15%.
Conclusión
Hemos analizado los momentos principales del trabajo con el panel visual de HedgeTerminal En su ejemplo hemos mostrado que se puede crear una nueva clase de paneles con la posibilidad de configuración flexible.
Con los ejemplos de los esquemas y especificaciones hemos conocido a fondo los principios de organización del trading bidireccional. Si Usted desarrolla sus propias bibliotecas de virtualización, la segunda parte de este artículo le será de gran ayuda en el diseño de esta biblioteca.
El carácter específico de la ejecución bursátil requiere tomar en cuenta los momentos importantes en el proceso de representación de las transacciones y órdenes como posiciones bidireccionales. Se ha demostrado que esta representación no es posible sin la virtualización de las transacciones y las órdenes. La virtualización es un mecanismo que permite “fraccionar” el volumen de las transacciones ejecutadas, así como clonar las órdenes reales de tal manera que la misma orden pueda ser parte de varias transacciones a la vez.
Estas manipulaciones con el entorno comercial son bastante atrevidas. Sin embargo, debido a que la mayor parte de la información necesaria durante la virtualización se guarda en el servidor comercial, este tipo de representación puede considerarse seguro.
Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/1297
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso