Português
preview
Simulación de mercado: Position View (V)

Simulación de mercado: Position View (V)

MetaTrader 5Probador |
46 0
Daniel Jose
Daniel Jose

Introducción

Hola a todos y bienvenidos a un nuevo artículo de la serie sobre cómo construir un sistema de repetición/simulación.

En el artículo anterior, Simulación de mercado: Position View (IV), comenzamos a unir el indicador de posición con las otras tres aplicaciones base que ya existían en el servicio de repetición/simulador. Aunque, en este primer momento, nos centraremos en usar estas cuatro aplicaciones en una cuenta demo o en una cuenta real. Aun así, no te recomiendo usar estas aplicaciones en una cuenta real. Al menos por ahora, ya que todavía necesitan algunos retoques. El motivo principal por el que no recomiendo usar estas aplicaciones en cuenta real es justamente que el Asesor Experto y el indicador de posición no son lo suficientemente estables como para usarlos con tranquilidad.

En el caso de Chart Trade y del Indicador de Mouse, no hay problema en usarlos en una cuenta real. Aunque Chart Trade, sin un Asesor Experto que lo auxilie, no sirve absolutamente para nada.

Muy bien, en este artículo trataremos un tema que, la mayoría de las veces, es lo que realmente hace un programador. Esto es muy distinto de lo que muchos imaginan que es el trabajo de un programador real. Cuando se habla de programación, pasamos gran parte del tiempo estudiando y analizando datos. Solo una pequeña fracción del tiempo se dedica realmente a programar.

¿Por qué digo esto? El motivo es que muchos tienen la ilusión de que programar es estar escribiendo códigos y más códigos. Cuando, en realidad, esto solo se hace después de haber analizado diversos datos y pensado en una posible solución. No es raro que un programador pase bastante tiempo analizando archivos que él mismo pudo haber creado, con el fin de entender cómo se comporta todo. En algunos momentos, estos archivos, que son archivos de log, se sustituyen por una sesión de debug, cuando existe tal posibilidad.

Pero, cuando la cantidad de datos puede ser grande y el análisis, largo, es preferible usar esos archivos de log. Aquí voy a explicar cómo puedes usar esos archivos para plantear una posible solución a un problema. Primero, entendamos los problemas.


Los primeros problemas

A pesar de lo visto en el artículo anterior, esto parece algo simple. Allí tenemos diversos problemas y muchas cosas por resolver y hacer. Tú, estimado lector, puedes imaginar que todo es fácil y simple. De manera inocente, vas aceptando simplemente lo que se te presenta. Esto es un error del que tú, estimado lector, deberás intentar librarte. Peor que aceptar es simplemente no entender e intentar usar algo sin comprender realmente qué se está usando.

No es raro, entre principiantes, pasar por la fase de copiar y pegar. Si no quieres quedarte siempre en esa fase, conviene aprender a usar ciertas herramientas. Una de las herramientas más utilizadas por los programadores es la documentación. La segunda herramienta son las pruebas y los archivos de log.

Entonces, entendamos el siguiente problema que tenemos entre manos. El Asesor Experto logra, por lo visto en el artículo anterior, colocar el indicador de posición en el gráfico. Este indicador busca los datos de la posición para presentar en el gráfico las líneas donde se encuentran la posición o los precios. Bien, hasta este punto no tenemos problemas a primera vista, ya que todo funciona como se esperaba. Pero existen algunas fallas en el código. O mejor dicho, en la forma en que se está implementando todo.

Supongamos, y esto es algo que muchos buenos programadores hacen: suposiciones, que el operador cierre el Asesor Experto. O que le indique al Asesor Experto, que estaba observando un contrato completo, que ahora desea observar posiciones abiertas en el mini contrato. En ambos escenarios, ¿qué ocurre en el gráfico? Recuerda que apenas estamos empezando con todo esto. Bien, en los dos casos mencionados tendremos problemas con el indicador de posición. Porque, en el primer caso, cuando el Asesor Experto sea eliminado del gráfico, todos los indicadores de posición que estén presentes permanecerán en el gráfico. Esto es una falla, ya que no tenemos el Asesor Experto para auxiliar al sistema si el operador desea cerrar una posición. Todavía no se han implementado los mecanismos para hacerlo al interactuar directamente con el indicador de posición. Pero esto se hará pronto. Tenemos que pensar en esta posibilidad desde ahora. Esto se debe a que, cuando dicha funcionalidad sea realmente implementada, el sistema ya se estará probando en otros aspectos igualmente importantes, como el caso de que el Asesor Experto sea eliminado del gráfico.

En el segundo caso, cuando el operador pide cambiar el tipo de contrato, la falla puede ser aún más grave, ya que lleva al operador a una idea falsa sobre lo que realmente ocurre en la cuenta de trading. La solución para ambos casos consiste, básicamente, en eliminar todos los indicadores de posición en cuanto el Asesor Experto sufra alguna intervención por parte del operador. Dicha intervención hará que MetaTrader 5 dispare un evento DeInit, que será capturado por el Asesor Experto en la función OnDeinit. Así, la solución consiste, básicamente, en cambiar el código anterior del Asesor Experto por uno nuevo. Sin embargo, como gran parte del código debe modificarse, bastará con cambiar el fragmento mostrado a continuación en el código del Asesor Experto para que ambos problemas queden solucionados.

54. //+------------------------------------------------------------------+
55. void OnDeinit(const int reason)
56. {
57.     ulong ul;
58.     
59.     switch (reason)
60.     {
61.         case REASON_REMOVE:
62.         case REASON_INITFAILED:
63.             EventChartCustom(0, evEA_At_ChartTrade, -1, 0, "");
64.             break;
65.     }
66.     if (Terminal != NULL) for (int count = PositionsTotal() - 1; count >= 0; count--)
67.     {
68.         ul = PositionGetTicket(count);
69.         if (PositionGetString(POSITION_SYMBOL) != (*Terminal).GetInfoTerminal().szSymbol) continue;
70.         ChartIndicatorDelete(0, 0, IntegerToString(ul));
71.     }
72.     delete Orders;
73.     delete Terminal;
74. }
75. //+------------------------------------------------------------------+

Fragmento del Asesor Experto

Observa que, en este código, se hicieron algunos cambios, como se ve en la línea 63. Originalmente, se indicaba el ID del gráfico para recibir los eventos personalizados. Al consultar la documentación, con el fin de reducir la cantidad de pruebas en el código, se comprobó que, al pasar el parámetro ZERO como ID del gráfico, los eventos personalizados serán dirigidos al gráfico actual, donde se originó la llamada del evento. Con esto, no necesitaremos comprobar el puntero para verificar si fue inicializado o no. Sin embargo, no ocurre lo mismo en la línea 66. En este punto, necesitamos asegurarnos de que el puntero fue inicializado. Si no lo fue, ignoramos el código entre las líneas 66 y 71.

Ahora la pregunta: ¿qué hace este código? Este código resuelve justamente los dos problemas mencionados anteriormente. Observa que, cuando tenemos alguna posición abierta, tendremos un indicador de posición en el gráfico. Cuando el Asesor Experto recibe de MetaTrader 5 un evento DeInit, se llamará a la función que se muestra en el fragmento anterior. En la línea 68, capturamos los datos de la posición a partir de su índice. Hecho esto, en la línea 69, verificamos si el símbolo que contiene la posición es el mismo esperado por el Asesor Experto. Por eso necesitamos que la variable Terminal haya sido inicializada. De lo contrario, no podríamos obtener el nombre correcto del símbolo.

Si el símbolo es el esperado, en la línea 70 le decimos a MetaTrader 5 que elimine del gráfico el indicador cuyo nombre es el valor del ticket de la posición. Pero espera un momento. Al abrir la lista de indicadores, no veo ningún indicador con este nombre. Es decir, no existe ninguno allí cuyo nombre sea el valor del ticket de la posición. Tú tienes razón, mi estimado lector. Lo que ocurre es que, en el indicador de posición, informamos un nombre que MetaTrader 5 entenderá como el del indicador. Es justamente ese mismo nombre el que debemos informar aquí, en la línea 70.

Muy bien, este problema quedó solucionado. Pero, aunque se haya solucionado, debido a un detalle que yo no había notado, tenemos una falla potencial si el operador cambia el tiempo gráfico con el Asesor Experto en el gráfico. Dicha falla disparará un error de RUN TIME, hará que el Asesor Experto sea expulsado del gráfico y se informará un error en el terminal de MetaTrader 5.

Normalmente, y es bastante común, podemos obtener el mismo error en programas C/C++ al usar punteros e intentar usar un puntero que no fue inicializado. Pero espera. En el artículo anterior menciono que los punteros se inicializan con un valor NULL. Sí, se inicializan con dicho valor. Sin embargo, si cambias el tiempo gráfico, la aplicación no se inicia nuevamente desde cero, como cabría esperar. Se inicia en la función OnInit. Al hacerlo, el puntero que se inicializaba en un contexto global ya no será inicializado correctamente.

De esta forma, toda la aplicación corre serios riesgos, porque tenemos un puntero que apunta a una posición desconocida en la memoria. Por eso MQL5 restringe el uso de punteros justamente para evitar este tipo de falla. Pero, como realmente queremos y necesitamos usar punteros, también tenemos que corregir esta falla. Sin embargo, es muy fácil de solucionar, como puede verse en el siguiente fragmento.

13. //+------------------------------------------------------------------+
14. input eTypeContract user00 = MINI;         //Cross order in contract
15. //+------------------------------------------------------------------+
16. C_Orders       *Orders;
17. C_Terminal     *Terminal;
18. //+------------------------------------------------------------------+
19. int OnInit()
20. {
21.     Terminal = NULL;
22.     Orders = new C_Orders(0xC0DEDAFE78514269);
23.     
24.     return INIT_SUCCEEDED;
25. }
26. //+------------------------------------------------------------------+

Fragmento del Asesor Experto

Observa la línea 21. Es justamente esa línea la que corrige el problema. Compara este fragmento anterior con el código original visto en el artículo anterior y entenderás qué cambió aquí. Un detalle: las líneas están en el mismo punto del original. Bien, tres fallas potenciales corregidas. Pero todavía no hemos llegado a los problemas realmente complicados. Para separar un poco los temas, veamos el primero de estos problemas en un nuevo apartado.


Un problema con muchas soluciones

Muy bien, lo visto hasta este punto tiene como objetivo solucionar problemas simples, aunque molestos, por los trastornos que pueden causarnos. Ahora comenzaremos a ver los problemas realmente complicados de solucionar. El primero de ellos implica que una posición puede sufrir cambios en su precio medio. Si no estás familiarizado con este término, voy a explicar qué significa para que entiendas el problema real que tenemos entre manos.

En cuentas de tipo HEDGING, el término precio medio no existe en el servidor de trading. Se aplica solo al operador, ya que puedes tener diversas posiciones abiertas, algunas en modo vendido y otras en modo comprado. Bien. Cada una de estas posiciones puede tener un volumen completamente distinto, así como un precio de apertura de la posición. Al efectuar un cálculo sobre el precio y el volumen de cada una de las posiciones, encontrarás un valor. Este es el valor de precio y volumen medio. Esto debe efectuarlo el operador cuando la cuenta es de tipo HEDGING.

En cambio, en cuentas de tipo NETTING, la situación es un poco diferente. En este caso, el precio medio, así como el volumen medio, son informados y mantenidos por el servidor de trading. Observa el tamaño del problema que tenemos entre manos al intentar crear un sistema de repetición/simulador. Sería mucho más simple crearlo haciendo que todas las operaciones se realizaran en cuentas de tipo NETTING. El hecho de querer cubrir ambos tipos de cuentas nos trae una serie de complicaciones que nos obligan a aplazar la finalización del proyecto.

Pues bien, ¿cuál es el problema aquí? El problema es que, a diferencia de lo que ocurre al abrir una nueva posición en una cuenta HEDGING, cuando hacemos esto en una cuenta NETTING, el precio medio, así como el volumen, cambia. En el caso del volumen, la solución es simple, aunque todavía no la hemos tratado. Pero, para el problema del precio, la situación es un poco más complicada. Esto se debe a que es complicado mantener el indicador de posición anclado a un precio. Tal vez esta frase haya quedado extraña. Pero piensa lo siguiente: cuando el precio medio de la posición cambia en el servidor, el Asesor Experto se entera de ello. Sin embargo, el indicador de posición no. Este es nuestro primer problema.

Existen otros, pero vamos a tratar este primero. Puedes pensar: Bien, basta con hacer que el indicador de posición siga lo que ocurre en la posición. Es simple. Sin embargo, mi estimado lector, en la práctica las cosas no son así. Si pones el indicador de posición a seguir lo que ocurre en la posición, tendrás que hacerlo usando el evento OnTimer, que es totalmente desaconsejable, o usando el evento OnCalculate, que también es desaconsejable. No digo que no puedas hacerlo. Solo digo que no es aconsejable, ya que puede producirse alguna falla que deje el indicador bloqueado. Esto podría bloquear todos los demás indicadores del gráfico del símbolo. En resumen: es una pésima elección.

Bien, en este caso, puedes pensar un poco y decir: Podemos acceder al objeto HLINE y cambiar su posición en el código del Asesor Experto. Sería una solución. Lo sería, pero esta solución tiene otro problema. El objeto HLINE es solo uno de los objetos que necesitaremos y usaremos dentro del indicador de posición. Por lo tanto, esta solución debe descartarse. El indicador de posición debe ser quien manipule los objetos, y nadie más.

En este punto, creo que ya estarás pensando: Vamos, sí que eres insistente. ¿Por qué complicarlo tanto? Haz lo simple y listo. A veces incluso considero hacerlo. Pero me gustan los desafíos. Mi propuesta puede hacer que te duela la cabeza, mi estimado lector. Porque ahora vamos a entrar en un mundo diferente para muchos de los que están empezando. Sin embargo, es un mundo familiar para quienes viven de esto. Veamos cómo crear e interpretar archivos de log. La propuesta más simple es usar la función OnTradeTransaction para solucionar nuestro problema. Porque solo se llama cuando algo ocurre. El servidor nos dice exactamente qué ocurrió. Así, no necesitamos investigar qué ocurrió.

Pero, como la función OnTradeTransaction es bastante complicada, necesitamos crear un archivo de log para entender qué ocurre cuando aumentamos una posición. Presta atención a esto. Lo que voy a mostrar ocurre cuando una posición se abre y, poco después, aumentamos su volumen. Al final, cerramos completamente la posición. Todo esto usando el Asesor Experto, el Indicador de Mouse y Chart Trade, que ya hemos desarrollado. En este primer momento, no nos preocuparemos por el indicador de posición.

Sin embargo, el código del Asesor Experto que venimos mostrando no es adecuado para lo que necesitamos hacer. Así, es necesario cambiarlo por el siguiente código.

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. #property icon "/Images/Market Replay/Icons/Replay - EA.ico"
04. #property description "Demo version between interaction"
05. #property description "of Chart Trade and Expert Advisor"
06. #property version   "1.117"
07. #property link "https://www.mql5.com/pt/articles/13176"
08. //+------------------------------------------------------------------+
09. #include <Market Replay\Order System\C_Orders.mqh>
10. #include <Market Replay\Auxiliar\C_Terminal.mqh>
11. //+------------------------------------------------------------------+
12. enum eTypeContract {MINI, FULL};
13. //+------------------------------------------------------------------+
14. input eTypeContract user00 = MINI;         //Cross order in contract
15. //+------------------------------------------------------------------+
16. C_Orders       *Orders;
17. C_Terminal     *Terminal;
18. //+------------------------------------------------------------------+
19. void AddIndicatorPosition(ulong arg)
20. {
21.     int handle = iCustom(_Symbol, PERIOD_CURRENT, "\\Indicators\\Position View.ex5", arg);
22.     ChartIndicatorAdd(0, 0, handle);
23.     IndicatorRelease(handle);
24. }
25. //+------------------------------------------------------------------+
26. int OnInit()
27. {
28.     Print("Initializing the Expert Advisor...");
29.     Terminal = NULL;
30.     Orders = new C_Orders(0);
31.     
32.     return INIT_SUCCEEDED;
33. }
34. //+------------------------------------------------------------------+
35. void OnTick() {}
36. //+------------------------------------------------------------------+
37. void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
38. {
39.     (*Orders).DispatchMessage(id, lparam, dparam, sparam);
40.     switch (id)
41.     {
42.         case CHARTEVENT_CHART_CHANGE:
43.             if (Terminal != NULL) break;
44.             else
45.             {
46.                 ulong ul;
47.                 Terminal = new C_Terminal(0, 0, user00);
48.                 for (int count = PositionsTotal() - 1; count >= 0; count--)
49.                 {
50.                     ul = PositionGetTicket(count);
51.                     if (PositionGetString(POSITION_SYMBOL) != (*Terminal).GetInfoTerminal().szSymbol) continue;
52.                     AddIndicatorPosition(ul);
53.                 }
54.             }
55.         case CHARTEVENT_CUSTOM + evChartTrade_At_EA:
56.             EventChartCustom(0, evEA_At_ChartTrade, user00, 0, "");
57.             break;
58.     }
59. }
60. //+------------------------------------------------------------------+
61. void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result)
62. {
63.     Print(__FUNCTION__);
64. 
65.     MqlTradeTransaction ts[1];
66.     ts[0] = trans;
67.     ArrayPrint(ts);
68. 
69.     MqlTradeRequest tr[1];
70.     tr[0] = request;
71.     ArrayPrint(tr);
72. 
73.     MqlTradeResult rs[1];
74.     rs[0] = result;
75.     ArrayPrint(rs);
76. }
77. //+------------------------------------------------------------------+
78. void OnDeinit(const int reason)
79. {
80.     ulong ul;
81.     
82.     switch (reason)
83.     {
84.         case REASON_REMOVE:
85.         case REASON_INITFAILED:
86.             EventChartCustom(0, evEA_At_ChartTrade, -1, 0, "");
87.             break;
88.     }
89.     if (Terminal != NULL) for (int count = PositionsTotal() - 1; count >= 0; count--)
90.     {
91.         ul = PositionGetTicket(count);
92.         if (PositionGetString(POSITION_SYMBOL) != (*Terminal).GetInfoTerminal().szSymbol) continue;
93.         ChartIndicatorDelete(0, 0, IntegerToString(ul));
94.     }
95.     delete Orders;
96.     delete Terminal;
97. }
98. //+------------------------------------------------------------------+

Asesor Experto para crear log

Al mirar este código, tú, estimado lector, puedes estar pensando: Vamos, estás loco. En este código no se genera ningún dato de diagnóstico para entender qué pasa en la función OnTradeTransaction. Bien, ¿será? Pues, después de ejecutar este código en MetaTrader 5, se generó el siguiente archivo de log.

OK      0       12:05:36.509    Expert Advisor (WDO$,M30)       Initializing the Expert Advisor...
HO      0       12:05:48.773    Chart Trade (WDO$,M30)  Send evChartTradeBuy - Args ( 10?WDO$?WDOU23?D?1?0.00?0.00 )
QH      0       12:05:48.773    Expert Advisor (WDO$,M30)           [action] [magic] [order] [symbol] [volume]  [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time]        [expiration]                             [comment] [position] [position_by] [reserved]
FK      0       12:05:48.774    Expert Advisor (WDO$,M30)       [0]        1       0       0 "WDOU23"    1.000 4975.000       0.000 0.00 0.00        1000      0              2           1 1970.01.01 00:00:00 "Order Generated by Experts Advisor."          0             0        ...
QM      0       12:05:48.797    Expert Advisor (WDO$,M30)       OnTradeTransaction
GF      0       12:05:48.797    Expert Advisor (WDO$,M30)           [deal]    [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type]   [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved]
DS      0       12:05:48.797    Expert Advisor (WDO$,M30)       [0]      0 1612507881 "WDOU23"      0            0             0           0           1 1970.01.01 00:00:00   0.000           0.000      0.000      0.000    1.000          0             0        ...
GQ      0       12:05:48.797    Expert Advisor (WDO$,M30)           [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time]        [expiration] [comment] [position] [position_by] [reserved]
OL      0       12:05:48.797    Expert Advisor (WDO$,M30)       [0]        0       0       0 ""          0.000   0.000       0.000 0.00 0.00           0      0              0           0 1970.01.01 00:00:00 ""                 0             0        ...
CO      0       12:05:48.797    Expert Advisor (WDO$,M30)           [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved]
DL      0       12:05:48.797    Expert Advisor (WDO$,M30)       [0]         0      0       0    0.000   0.000 0.000 0.000 ""                   0                  0        ...
ER      0       12:05:48.797    Expert Advisor (WDO$,M30)       OnTradeTransaction
KK      0       12:05:48.797    Expert Advisor (WDO$,M30)               [deal]    [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type]   [time_expiration]  [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved]
JI      0       12:05:48.797    Expert Advisor (WDO$,M30)       [0] 1191195305 1612507881 "WDOU23"      6            0             0           0           0 1970.01.01 00:00:00 4975.000           0.000      0.000      0.000    1.000 1612507881             0        ...
GI      0       12:05:48.797    Expert Advisor (WDO$,M30)           [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time]        [expiration] [comment] [position] [position_by] [reserved]
OD      0       12:05:48.797    Expert Advisor (WDO$,M30)       [0]        0       0       0 ""          0.000   0.000       0.000 0.00 0.00           0      0              0           0 1970.01.01 00:00:00 ""                 0             0        ...
CG      0       12:05:48.797    Expert Advisor (WDO$,M30)           [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved]
DD      0       12:05:48.797    Expert Advisor (WDO$,M30)       [0]         0      0       0    0.000   0.000 0.000 0.000 ""                   0                  0        ...
EJ      0       12:05:48.797    Expert Advisor (WDO$,M30)       OnTradeTransaction
KQ      0       12:05:48.797    Expert Advisor (WDO$,M30)           [deal]    [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type]   [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved]
PP      0       12:05:48.797    Expert Advisor (WDO$,M30)       [0]      0 1612507881 "WDOU23"      2            0             4           0           1 1970.01.01 00:00:00   0.000           0.000      0.000      0.000    0.000 1612507881             0        ...
CP      0       12:05:48.797    Expert Advisor (WDO$,M30)           [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time]        [expiration] [comment] [position] [position_by] [reserved]
CN      0       12:05:48.797    Expert Advisor (WDO$,M30)       [0]        0       0       0 ""          0.000   0.000       0.000 0.00 0.00           0      0              0           0 1970.01.01 00:00:00 ""                 0             0        ...
GH      0       12:05:48.797    Expert Advisor (WDO$,M30)           [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved]
HM      0       12:05:48.797    Expert Advisor (WDO$,M30)       [0]         0      0       0    0.000   0.000 0.000 0.000 ""                   0                  0        ...
IS      0       12:05:48.797    Expert Advisor (WDO$,M30)       OnTradeTransaction
OH      0       12:05:48.797    Expert Advisor (WDO$,M30)           [deal]    [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type]   [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved]
KI      0       12:05:48.797    Expert Advisor (WDO$,M30)       [0]      0 1612507881 "WDOU23"      3            0             4           0           1 1970.01.01 00:00:00   0.000           0.000      0.000      0.000    0.000 1612507881             0        ...
OG      0       12:05:48.797    Expert Advisor (WDO$,M30)           [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time]        [expiration] [comment] [position] [position_by] [reserved]
GG      0       12:05:48.797    Expert Advisor (WDO$,M30)       [0]        0       0       0 ""          0.000   0.000       0.000 0.00 0.00           0      0              0           0 1970.01.01 00:00:00 ""                 0             0        ...
KR      0       12:05:48.797    Expert Advisor (WDO$,M30)           [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved]
LF      0       12:05:48.797    Expert Advisor (WDO$,M30)       [0]         0      0       0    0.000   0.000 0.000 0.000 ""                   0                  0        ...
MI      0       12:05:48.797    Expert Advisor (WDO$,M30)       OnTradeTransaction
CP      0       12:05:48.797    Expert Advisor (WDO$,M30)           [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type]   [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved]
PM      0       12:05:48.797    Expert Advisor (WDO$,M30)       [0]      0       0 ""           10            0             0           0           0 1970.01.01 00:00:00   0.000           0.000      0.000      0.000    0.000          0             0        ...
OO      0       12:05:48.797    Expert Advisor (WDO$,M30)           [action] [magic]    [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time]        [expiration]                         [comment] [position] [position_by] [reserved]
EQ      0       12:05:48.797    Expert Advisor (WDO$,M30)       [0]        1       0 1612507881 "WDOU23"    1.000   0.000       0.000 0.00 0.00        1000      0              2           1 1970.01.01 00:00:00 "Order Generated by Experts Advi"          0             0        ...
OM      0       12:05:48.797    Expert Advisor (WDO$,M30)           [retcode]     [deal]    [order] [volume]  [price]    [bid]    [ask] [comment] [request_id] [retcode_external] [reserved]
MP      0       12:05:48.797    Expert Advisor (WDO$,M30)       [0]     10009 1191195305 1612507881    1.000 4975.000 4974.500 4975.000 ""          3531297432                  0        ...
EK      0       12:05:53.264    Chart Trade (WDO$,M30)  Send evChartTradeBuy - Args ( 10?WDO$?WDOU23?D?1?0.00?0.00 )
HG      0       12:05:53.264    Expert Advisor (WDO$,M30)           [action] [magic] [order] [symbol] [volume]  [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time]        [expiration]                             [comment] [position] [position_by] [reserved]
RF      0       12:05:53.264    Expert Advisor (WDO$,M30)       [0]        1       0       0 "WDOU23"    1.000 4974.500       0.000 0.00 0.00        1000      0              2           1 1970.01.01 00:00:00 "Order Generated by Experts Advisor."          0             0        ...
EF      0       12:05:53.287    Expert Advisor (WDO$,M30)       OnTradeTransaction
KM      0       12:05:53.287    Expert Advisor (WDO$,M30)           [deal]    [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type]   [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved]
EN      0       12:05:53.287    Expert Advisor (WDO$,M30)       [0]      0 1612507912 "WDOU23"      0            0             0           0           1 1970.01.01 00:00:00   0.000           0.000      0.000      0.000    1.000          0             0        ...
KL      0       12:05:53.287    Expert Advisor (WDO$,M30)           [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time]        [expiration] [comment] [position] [position_by] [reserved]
CI      0       12:05:53.287    Expert Advisor (WDO$,M30)       [0]        0       0       0 ""          0.000   0.000       0.000 0.00 0.00           0      0              0           0 1970.01.01 00:00:00 ""                 0             0        ...
OD      0       12:05:53.287    Expert Advisor (WDO$,M30)           [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved]
PI      0       12:05:53.287    Expert Advisor (WDO$,M30)       [0]         0      0       0    0.000   0.000 0.000 0.000 ""                   0                  0        ...
QO      0       12:05:53.287    Expert Advisor (WDO$,M30)       OnTradeTransaction
GF      0       12:05:53.287    Expert Advisor (WDO$,M30)               [deal]    [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type]   [time_expiration]  [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved]
HF      0       12:05:53.287    Expert Advisor (WDO$,M30)       [0] 1191195326 1612507912 "WDOU23"      6            0             0           0           0 1970.01.01 00:00:00 4974.500           0.000      0.000      0.000    1.000 1612507881             0        ...
KD      0       12:05:53.287    Expert Advisor (WDO$,M30)           [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time]        [expiration] [comment] [position] [position_by] [reserved]
CQ      0       12:05:53.287    Expert Advisor (WDO$,M30)       [0]        0       0       0 ""          0.000   0.000       0.000 0.00 0.00           0      0              0           0 1970.01.01 00:00:00 ""                 0             0        ...
OL      0       12:05:53.287    Expert Advisor (WDO$,M30)           [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved]
PQ      0       12:05:53.287    Expert Advisor (WDO$,M30)       [0]         0      0       0    0.000   0.000 0.000 0.000 ""                   0                  0        ...
QG      0       12:05:53.287    Expert Advisor (WDO$,M30)       OnTradeTransaction
GL      0       12:05:53.287    Expert Advisor (WDO$,M30)           [deal]    [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type]   [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved]
IL      0       12:05:53.287    Expert Advisor (WDO$,M30)       [0]      0 1612507912 "WDOU23"      2            0             4           0           1 1970.01.01 00:00:00   0.000           0.000      0.000      0.000    0.000 1612507881             0        ...
OK      0       12:05:53.287    Expert Advisor (WDO$,M30)           [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time]        [expiration] [comment] [position] [position_by] [reserved]
OK      0       12:05:53.287    Expert Advisor (WDO$,M30)       [0]        0       0       0 ""          0.000   0.000       0.000 0.00 0.00           0      0              0           0 1970.01.01 00:00:00 ""                 0             0        ...
KE      0       12:05:53.287    Expert Advisor (WDO$,M30)           [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved]
LJ      0       12:05:53.287    Expert Advisor (WDO$,M30)       [0]         0      0       0    0.000   0.000 0.000 0.000 ""                   0                  0        ...
ML      0       12:05:53.287    Expert Advisor (WDO$,M30)       OnTradeTransaction
CG      0       12:05:53.287    Expert Advisor (WDO$,M30)           [deal]    [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type]   [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved]
NR      0       12:05:53.287    Expert Advisor (WDO$,M30)       [0]      0 1612507912 "WDOU23"      3            0             4           0           1 1970.01.01 00:00:00   0.000           0.000      0.000      0.000    0.000 1612507881             0        ...
CR      0       12:05:53.287    Expert Advisor (WDO$,M30)           [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time]        [expiration] [comment] [position] [position_by] [reserved]
KL      0       12:05:53.287    Expert Advisor (WDO$,M30)       [0]        0       0       0 ""          0.000   0.000       0.000 0.00 0.00           0      0              0           0 1970.01.01 00:00:00 ""                 0             0        ...
GO      0       12:05:53.287    Expert Advisor (WDO$,M30)           [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved]
HS      0       12:05:53.287    Expert Advisor (WDO$,M30)       [0]         0      0       0    0.000   0.000 0.000 0.000 ""                   0                  0        ...
IR      0       12:05:53.287    Expert Advisor (WDO$,M30)       OnTradeTransaction
OK      0       12:05:53.287    Expert Advisor (WDO$,M30)           [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type]   [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved]
DH      0       12:05:53.287    Expert Advisor (WDO$,M30)       [0]      0       0 ""           10            0             0           0           0 1970.01.01 00:00:00   0.000           0.000      0.000      0.000    0.000          0             0        ...
CJ      0       12:05:53.287    Expert Advisor (WDO$,M30)           [action] [magic]    [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time]        [expiration]                         [comment] [position] [position_by] [reserved]
LE      0       12:05:53.287    Expert Advisor (WDO$,M30)       [0]        1       0 1612507912 "WDOU23"    1.000   0.000       0.000 0.00 0.00        1000      0              2           1 1970.01.01 00:00:00 "Order Generated by Experts Advi"          0             0        ...
CJ      0       12:05:53.287    Expert Advisor (WDO$,M30)           [retcode]     [deal]    [order] [volume]  [price]    [bid]    [ask] [comment] [request_id] [retcode_external] [reserved]
KM      0       12:05:53.287    Expert Advisor (WDO$,M30)       [0]     10009 1191195326 1612507912    1.000 4974.500 4974.000 4974.500 ""          3531297433                  0        ...
JI      0       12:06:04.628    Chart Trade (WDO$,M30)  Send evChartTradeSell - Args ( 11?WDO$?WDOU23?D?2?0.00?0.00 )
GS      0       12:06:04.628    Expert Advisor (WDO$,M30)           [action] [magic] [order] [symbol] [volume]  [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time]        [expiration]                             [comment] [position] [position_by] [reserved]
LR      0       12:06:04.628    Expert Advisor (WDO$,M30)       [0]        1       0       0 "WDOU23"    2.000 4974.000       0.000 0.00 0.00        1000      1              2           1 1970.01.01 00:00:00 "Order Generated by Experts Advisor."          0             0        ...
NS      0       12:06:04.652    Expert Advisor (WDO$,M30)       OnTradeTransaction
DH      0       12:06:04.652    Expert Advisor (WDO$,M30)           [deal]    [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type]   [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved]
HI      0       12:06:04.652    Expert Advisor (WDO$,M30)       [0]      0 1612508010 "WDOU23"      0            1             0           0           1 1970.01.01 00:00:00   0.000           0.000      0.000      0.000    2.000          0             0        ...
LH      0       12:06:04.652    Expert Advisor (WDO$,M30)           [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time]        [expiration] [comment] [position] [position_by] [reserved]
LF      0       12:06:04.652    Expert Advisor (WDO$,M30)       [0]        0       0       0 ""          0.000   0.000       0.000 0.00 0.00           0      0              0           0 1970.01.01 00:00:00 ""                 0             0        ...
PQ      0       12:06:04.652    Expert Advisor (WDO$,M30)           [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved]
OE      0       12:06:04.652    Expert Advisor (WDO$,M30)       [0]         0      0       0    0.000   0.000 0.000 0.000 ""                   0                  0        ...
RH      0       12:06:04.652    Expert Advisor (WDO$,M30)       OnTradeTransaction
HQ      0       12:06:04.652    Expert Advisor (WDO$,M30)               [deal]    [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type]   [time_expiration]  [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved]
OS      0       12:06:04.652    Expert Advisor (WDO$,M30)       [0] 1191195411 1612508010 "WDOU23"      6            0             0           1           0 1970.01.01 00:00:00 4974.000           0.000      0.000      0.000    2.000 1612507881             0        ...
LP      0       12:06:04.652    Expert Advisor (WDO$,M30)           [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time]        [expiration] [comment] [position] [position_by] [reserved]
LN      0       12:06:04.652    Expert Advisor (WDO$,M30)       [0]        0       0       0 ""          0.000   0.000       0.000 0.00 0.00           0      0              0           0 1970.01.01 00:00:00 ""                 0             0        ...
PI      0       12:06:04.652    Expert Advisor (WDO$,M30)           [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved]
OM      0       12:06:04.652    Expert Advisor (WDO$,M30)       [0]         0      0       0    0.000   0.000 0.000 0.000 ""                   0                  0        ...
RP      0       12:06:04.652    Expert Advisor (WDO$,M30)       OnTradeTransaction
HK      0       12:06:04.652    Expert Advisor (WDO$,M30)           [deal]    [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type]   [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved]
MI      0       12:06:04.652    Expert Advisor (WDO$,M30)       [0]      0 1612508010 "WDOU23"      2            1             4           0           1 1970.01.01 00:00:00   0.000           0.000      0.000      0.000    0.000 1612507881             0        ...
HF      0       12:06:04.652    Expert Advisor (WDO$,M30)           [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time]        [expiration] [comment] [position] [position_by] [reserved]
PG      0       12:06:04.652    Expert Advisor (WDO$,M30)       [0]        0       0       0 ""          0.000   0.000       0.000 0.00 0.00           0      0              0           0 1970.01.01 00:00:00 ""                 0             0        ...
DR      0       12:06:04.652    Expert Advisor (WDO$,M30)           [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved]
CG      0       12:06:04.652    Expert Advisor (WDO$,M30)       [0]         0      0       0    0.000   0.000 0.000 0.000 ""                   0                  0        ...
FI      0       12:06:04.652    Expert Advisor (WDO$,M30)       OnTradeTransaction
LR      0       12:06:04.652    Expert Advisor (WDO$,M30)           [deal]    [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type]   [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved]
RN      0       12:06:04.652    Expert Advisor (WDO$,M30)       [0]      0 1612508010 "WDOU23"      3            1             4           0           1 1970.01.01 00:00:00   0.000           0.000      0.000      0.000    0.000 1612507881             0        ...
DM      0       12:06:04.652    Expert Advisor (WDO$,M30)           [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time]        [expiration] [comment] [position] [position_by] [reserved]
DI      0       12:06:04.652    Expert Advisor (WDO$,M30)       [0]        0       0       0 ""          0.000   0.000       0.000 0.00 0.00           0      0              0           0 1970.01.01 00:00:00 ""                 0             0        ...
HK      0       12:06:04.652    Expert Advisor (WDO$,M30)           [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved]
GH      0       12:06:04.652    Expert Advisor (WDO$,M30)       [0]         0      0       0    0.000   0.000 0.000 0.000 ""                   0                  0        ...
JN      0       12:06:04.652    Expert Advisor (WDO$,M30)       OnTradeTransaction
PG      0       12:06:04.652    Expert Advisor (WDO$,M30)           [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type]   [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved]
KG      0       12:06:04.652    Expert Advisor (WDO$,M30)       [0]      0       0 ""           10            0             0           0           0 1970.01.01 00:00:00   0.000           0.000      0.000      0.000    0.000          0             0        ...
DQ      0       12:06:04.652    Expert Advisor (WDO$,M30)           [action] [magic]    [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time]        [expiration]                         [comment] [position] [position_by] [reserved]
IH      0       12:06:04.652    Expert Advisor (WDO$,M30)       [0]        1       0 1612508010 "WDOU23"    2.000   0.000       0.000 0.00 0.00        1000      1              2           1 1970.01.01 00:00:00 "Order Generated by Experts Advi"          0             0        ...
LG      0       12:06:04.652    Expert Advisor (WDO$,M30)           [retcode]     [deal]    [order] [volume]  [price]    [bid]    [ask] [comment] [request_id] [retcode_external] [reserved]
RI      0       12:06:04.652    Expert Advisor (WDO$,M30)       [0]     10009 1191195411 1612508010    2.000 4974.000 4974.000 4974.500 ""          3531297434                  0        ...

Archivo de Log de las operaciones

Entonces, ¿te gustó lo que estás viendo? Sé que este archivo de log parece un desastre. Algo completamente insano y sin ningún sentido. Pero créeme, aquí estamos haciendo solo tres operaciones, como mencioné anteriormente. Cada uno de estos valores que se ven en este log tiene un significado. Así que, antes de que tú, mi estimado lector y entusiasta, te rindas, veamos cómo se generó este archivo. Observa que la primera línea del log es justamente la línea 28 del código del Asesor Experto. Es decir, se registra todo lo que aparece en el terminal de MetaTrader 5. A pesar de todo, no soy yo quien lo hace, sino MetaTrader 5.

Ahora observa la segunda línea del archivo de log. Nota el origen de los datos. Es decir, es Chart Trade. En este momento, Chart Trade envió un mensaje al Asesor Experto para abrir una posición a mercado. Observa que este mensaje se repite otras dos veces. Entre ellas, aparece lo que el Asesor Experto hace junto al servidor de trading real. Estos datos que ves se generaron en la función OnTradeTransaction mediante las líneas 63, 67, 71 y 75. Mira y aprende.

Cada vez que el servidor devuelve una respuesta a MetaTrader 5, el nombre de la función OnTradeTransaction se mostrará en el log. Observa que existe un patrón en la comunicación. Es decir, el Asesor Experto envía una solicitud al servidor, y este devuelve, enseguida, una respuesta. Cada una de las respuestas es capturada por la función OnTradeTransaction, y los valores se imprimen en el siguiente orden: primero, los datos de la estructura MqlTradeTransaction; luego, los datos de la estructura MqlTradeRequest; finalmente, los datos de la estructura MqlTradeResult. Esto se repite mensaje a mensaje desde el servidor.

Pero volvamos al código del Asesor Experto para entender cómo hice esto. Observa que los datos de las estructuras se imprimen usando ArrayPrint. Pero ¿cómo es eso? ¿Estás usando ArrayPrint para imprimir los datos en el terminal? Vamos, realmente estás muy loco. Pensé que sería necesario declarar todos aquellos campos de cada una de las estructuras. Pero realmente superaste el nivel de complicación y uso de MQL5. Yo aquí escribiendo código tras código, y tú vienes con esto.

Bien, como dije, resolverlo todo de forma simple no tiene gracia. La gracia está en forzar el lenguaje a un nuevo nivel de utilización. Pero ahora, ¿todos aquellos valores del log tienen algún sentido para ti, mi estimado lector? Si aun así resulta difícil de entender, podemos volcarlos en una base de datos SQL y tendremos una estructura un poco más simple. Para ello, usaremos tres tablas diferentes dentro de la base de datos. Pero esto queda como tarea para casa. No pensarías que te lo daría todo en bandeja así. ¿O sí?

Cuando observes estos datos, notarás que el valor de algunos campos indica lo que hace el servidor. En un momento determinado, el servidor creará una orden que se ejecutará a mercado. Cuando esto ocurra, se creará el ticket: 1612507881, con un volumen de 1 y la operación de tipo cero. Es decir, una compra a mercado. Hasta este momento, todavía no tenemos ninguna posición abierta. El valor en el campo de la posición es cero. Esto permanecerá así hasta que el campo type de la estructura MqlTradeTransaction pase a tener el valor seis. Es decir, el servidor habrá disparado la enumeración TRADE_TRANSACTION_DEAL_ADD a MetaTrader 5. En este momento, el campo posición dejará de ser cero y pasará a tener el mismo valor que la orden creada en el servidor.

Después de esto, el servidor dispara un evento 2, que es un TRADE_TRANSACTION_ORDER_DELETE. En ese momento, la orden creada por el servidor dejará de existir. Luego, un evento 3, que es un TRADE_TRANSACTION_HISTORY_ADD, registra en el historial lo que se hizo en el servidor. Finalmente, se genera un evento 10, que es un TRADE_TRANSACTION_REQUEST. Este evento finaliza la apertura de la posición. Pero quiero que prestes atención al valor del ticket creado. Esto es importante porque, en el siguiente ciclo de ejecución de la solicitud proveniente de Chart Trade, este valor volverá a aparecer. Observa que el valor de la orden creada por el servidor es diferente. Sin embargo, el valor de la posición permanece.

Al final del segundo ciclo, tendremos un lote con volumen 2 en el servidor. Ahora necesitamos cerrar la posición. Esto ocurre en el tercer ciclo mostrado en el log. Observa nuevamente que el valor del ticket de la posición permanece inalterado durante todo el procedimiento.

Aquí aparece una cuestión interesante: puedes notar que, en ningún momento, tuvimos el tipo 8 devuelto por el servidor. Si esto llegara a ocurrir, indicaría un TRADE_TRANSACTION_DEAL_DELETE, que sería el equivalente al tipo dos. Este tipo dos se ve con frecuencia, justamente porque es una orden a mercado. Entonces, podemos usar estos datos del log para implementar el uso de la función OnTradeTransaction, ya que no tendríamos que recorrer constantemente la lista de órdenes o posiciones. En el caso de las posiciones, tal vez esto no tenga el menor sentido si estamos en una cuenta NETTING. Pero, como queremos generalizar el sistema de manejo, necesitamos que el Asesor Experto pueda lidiar bien con todos los escenarios posibles. Aunque algunos de estos escenarios nos den un poco más de trabajo en la implementación.

Muy bien. A estas alturas, puedes pensar lo siguiente: Bien. Mostraste todos estos números y formas de obtener datos que podemos utilizar para programar el Asesor Experto. Pero todavía no consigo entender cómo todo esto se usará realmente para poner en práctica una forma de controlar e implementar la comunicación entre el Asesor Experto y el Indicador de posición. Para mí, lo que estás haciendo no tiene el menor sentido. Si yo fuera tú, haría las cosas de una manera mucho más simple. Si pensaste así, mi estimado lector, debo estar de acuerdo contigo. Sí, sería mucho más simple hacerlo de otra manera. No quiero hacer lo obvio. Quiero hacerlo de una forma totalmente inexplorada, pero que sea completamente funcional en cualquier tipo de situación que pueda surgir en el futuro.

Recuerda una cosa: aquí no estamos desarrollando una aplicación que siempre funcionará junto al servidor de trading. Estamos desarrollando algo que realmente simulará el servidor de trading. Algo que necesita una forma totalmente diferente de implementar lo que tú, muy probablemente, ya has visto implementado. No podemos seguir usando funciones tipo PositionsTotal para saber lo que ocurre. Cuando usemos el sistema de repetición/simulador, no podremos contar con la ayuda o el soporte de esas funciones. Necesitamos ir por caminos totalmente ajenos a lo que muchos consideran lo más prudente.


Consideraciones finales

Hace un tiempo, escribí un artículo sobre cómo usar esta función OnTradeTransaction. Bien, desde entonces, muchas cosas cambiaron en mi comprensión de MetaTrader 5 y MQL5. Por eso, aquí estoy mostrando aspectos que, en aquel momento, no había pensado mostrar. Esto se debe a que noté que más personas principiantes o entusiastas se han interesado por el tema y han intentado entender por qué mis códigos tienen esta apariencia tan exótica y poco convencional. Espero sinceramente que estos artículos estén ayudando a estas personas a ver que podemos hacer mucho más de lo que muchos creen posible.

Ahora que se presentó el primero de los grandes problemas que necesitamos solucionar, en el próximo artículo podremos poner la máquina a funcionar de verdad y crear un código del Asesor Experto para que el Indicador de posición pueda, al menos, trabajar de manera más adecuada. Como lo que se implementará implica una explicación más profunda, para que tú, mi estimado lector y entusiasta, puedas entender lo que realmente ocurrirá, no mostraré en este artículo el código del Asesor Experto ya modificado para permitir retirar el indicador de posición cuando se cierre una posición o colocarlo en el gráfico cuando se abra una posición. Aunque hacerlo no es algo tan complicado como pueda parecer.

El problema, en realidad, es que entiendas por qué el código funciona cuando no usa elementos que esperabas utilizar en un código convencional. Pero esto se verá en el próximo artículo. Por ahora, estudia lo visto en este artículo, porque programar no es nada más que entender el problema y encontrar una solución matemática para él.

ArchivoDescripción
Experts\Expert Advisor.mq5
Muestra la interacción entre Chart Trade y el Asesor Experto (Es necesario usar Mouse Study para la interacción)
Indicators\Chart Trade.mq5Crea la ventana para configurar la orden que se va a enviar (Es necesario usar Mouse Study para la interacción)
Indicators\Market Replay.mq5Crea los controles para la interacción con el servicio de repetición/simulador (Es necesario usar Mouse Study para la interacción)
Indicators\Mouse Study.mq5Permite la interacción entre los controles gráficos y el usuario (Necesario tanto para operar el servicio de repetición/simulador como en el mercado real)
Indicators\Order Indicator.mq5Responsable de la indicación de órdenes de mercado, permitiendo interactuar con ellas y controlarlas
Indicators\Position View.mq5Responsable de la indicación de posiciones de mercado, permitiendo interactuar con ellas y controlarlas
Services\Market Replay.mq5Crea y mantiene el servicio de repetición y simulación de mercado (Archivo principal de todo el sistema)

Traducción del portugués realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/pt/articles/13176

Archivos adjuntos |
Anexo.zip (779.24 KB)
Del básico al intermedio: Acceso aleatorio (II) Del básico al intermedio: Acceso aleatorio (II)
En este artículo, veremos cómo dos enfoques ligeramente diferentes pueden impactar de manera considerable en toda una metodología de implementación, tanto desde el punto de vista del rendimiento como desde el punto de vista de cómo deben pensarse los accesos al disco, con el fin de evitar problemas de compatibilidad entre distintas aplicaciones.
Del básico al intermedio: Acceso aleatorio (I) Del básico al intermedio: Acceso aleatorio (I)
En este artículo tendremos nuestra primera experiencia con el acceso aleatorio al contenido de un archivo. Esto apunta tanto a la escritura como a la lectura de información y datos almacenados en un archivo. Sin embargo, como este tema es bastante extenso para explicarlo en un único artículo, aquí solo haremos una introducción a esta cuestión del acceso aleatorio.
Particularidades del trabajo con números del tipo double en MQL4 Particularidades del trabajo con números del tipo double en MQL4
En estos apuntes hemos reunido consejos para resolver los errores más frecuentes al trabajar con números del tipo double en los programas en MQL4.
Simulación de mercado: Position View (IV) Simulación de mercado: Position View (IV)
Aquí comenzaremos a unir diversos componentes o aplicaciones que antes estaban completamente aisladas entre sí. Aunque Chart Trade, el Indicador de Mouse y el Asesor Experto ya mantenían cierta relación, todavía no había una forma de observar directamente en el gráfico las posiciones abiertas en el servidor de trading, muchas veces usando un sistema de órdenes cruzadas. A partir de este momento, esto empieza a ser posible, abriendo diversas puertas a nuevas ideas e implementaciones futuras. Aunque apenas estamos comenzando a poner estos componentes en funcionamiento, ya tendremos un rumbo que seguir.