OnTradeTransaction, que escribe todas las operaciones en un lugar público (por ejemplo, en un recurso).
Por lo tanto, existe una enorme flexibilidad.
Por ejemplo, puede enviar un centenar de órdenes Async y esperar su ejecución sin salir de las tripas profundas y seguir ejecutando su código.
Estamos hablando de peticiones, claro. Y el tema mágico no tiene nada que ver.
Aunque sería razonable que los desarrolladores ejecutaran registros de transacciones en un array público. Sin indicador.
Por supuesto, un array público de transacciones desde el momento de la operación del Terminal por parte de los desarrolladores sería una forma lógica de promover la asincronía de las operaciones en MT5. Pero la demanda de tal solución es probablemente cercana a cero. Por ahora la biblioteca cierra esta brecha, si alguien lo necesita, por supuesto.
El valor no está en la biblioteca, sino en dicha funcionalidad, cuando existe un archivo de todas las transacciones de Terminal.
Se hace posible escribir una biblioteca de comercio cuando no es necesario pensar en la asincronía, la espera de resultados, etc. en absoluto. La biblioteca de comercio en sí lo hace todo de forma invisible.
Por ejemplo, hay $1K en una cuenta. Se envían 100 órdenes asíncronas Comprar USDCHF 1 lote. Está claro que 99 de ellas serán rechazadas por el servidor de operaciones (no por el Terminal), sólo la primera será ejecutada. Pero antes de la cancelación y cualquier respuesta del servidor de comercio, la biblia de comercio inteligente puede asumir que 100 posiciones de COMPRA están presentes.
Por ejemplo, debido a la ejecución parcial, pueden estar abiertas muchas posiciones en lugar de una. Cuando se necesita modificar muchas posiciones/órdenes, resulta muy conveniente utilizar el enfoque propuesto.
No necesitas recordar nada a la salida de OnTick, no necesitas escribir OnTradeTransaction y tratar con RequestID allí - de la misma manera. Usted escribe, como de costumbre, sólo en OnTick. Y en él siempre tienes el control total sobre las transacciones asíncronas en cualquier lugar. Consigues modificaciones múltiples a la velocidad del rayo y sin panderetas - ni siquiera necesitas pensar en la asincronía y sus peculiaridades.
Interesante idea, gracias. El rendimiento debería mejorar debido a la paralelización del código, según tengo entendido. ¿Funciona correctamente en el tester?
No lo he probado en el tester. Pero si OnTick multidivisa funciona en el Tester con la misma idea, debería funcionar aquí también.
ZЫ Pero la idea no está en la paralelización. Fue en MT4 que estábamos distribuyendo por flujos de comercio.
// Ejemplo de almacenamiento/intercambio de datos a través de Recursos dentro del Terminal #include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/es/code/22166 void OnStart() { const RESOURCEDATA<int> ResourceINT("::int"); // Recurso para intercambiar ints. const - como prueba de que no se escribe nada en el objeto de clase int ArrayINT[] = {1, 2, 3}; int Num = 5; ResourceINT = ArrayINT; // El recurso almacena un array. ResourceINT += Num; // Añadido otro valor al recurso. ResourceINT += ArrayINT; // Añadido un array. int ArrayINT2[]; ResourceINT.Get(ArrayINT2); // Leer datos del recurso. ArrayPrint(ArrayINT2); // Retirada: 1 2 3 5 1 2 3 ResourceINT.Free(); // Datos borrados del recurso Print(ResourceINT.Get(ArrayINT2)); // Comprueba que no hay datos: 0 const RESOURCEDATA<MqlTick> ResourceTicks("::Ticks"); // Recurso para el intercambio de ticks. const - como prueba de que no se escribe nada en el objeto de clase MqlTick Tick; if (SymbolInfoTick(_Symbol, Tick)) for (int i = 0; i < 3; i++) ResourceTicks += Tick; // Añadido al recurso tiki MqlTick Ticks[]; ResourceTicks.Get(Ticks); // Leer datos del recurso. ArrayPrint(Ticks); // Retirada. // Este es el nombre completo del recurso al que se va a acceder desde otro programa const string NameOut = StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_PATH)) + 5) + "::Ticks"; Print(NameOut); // Imprime el nombre completo del recurso. const RESOURCEDATA<MqlTick> Resource(NameOut); // Recurso para acceder a datos (sólo lectura) de otro programa MqlTick TicksOut[]; Resource.Get(TicksOut); // Leer datos del recurso. ArrayPrint(TicksOut); // Retirada. Resource.Free(); // No hay forma de afectar a los datos de los recursos de sólo lectura. Print(_LastError); // ERR_INVALID_PARAMETER - Parámetro erróneo al llamar a una función del sistema. }
Ejemplo de almacenamiento/intercambio de datos a través de Recursos dentro del Terminal
¿Es posible leer datos que están en proceso de escritura? Es decir, ¿puedo leer información incompleta?
Hasta ahora no se me ocurre ningún uso para esta biblioteca.
Definitivamente no es necesaria en forex, y no hay necesidad de ella en la bolsa de valores.
¿Has probado esta librería en bolsa?
¿En qué caso crees que puede ser útil?
¿Es posible leer datos que están en proceso de escritura? Es decir, ¿leer información no completa?
Hay que experimentar. Creo que la escritura/lectura simultánea de un recurso funciona igual que con las variables globales, porque la escritura en ambos casos es creación: ResourceCreate y GlobalVariableSet. La única diferencia entre un recurso y una global es que ni siquiera teóricamente se puede escribir nada en un recurso al mismo tiempo. Con global - es posible.
De hecho, leer un recurso es obtener un dato de la memoria. Y si la lectura ha comenzado, escribir un recurso no debería afectarla, porque escribir es asignar otro trozo de memoria. Difícilmente pueden solaparse porque lo más probable es que el propio SO lo impida. Por eso, desde mi punto de vista, no debería haber conflictos de carga/guardado con los recursos. Pero, por supuesto, es mejor hacer esta pregunta a los desarrolladores.
- 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
TradeTransactions:
Acceso a los datos de OnTradeTransaction en cualquier lugar del programa
Autor: fxsaber