Librerías: TradeTransactions

 

TradeTransactions:

Acceso a los datos de OnTradeTransaction en cualquier lugar del programa

Autor: fxsaber

 
Biblioteca - realización de esta idea

OnTradeTransaction, que escribe todas las operaciones en un lugar público (por ejemplo, en un recurso).

  • El Asesor Experto crea este indicador a través de iCustom.
  • En cualquier momento de la ejecución, el Asesor Experto puede ver todas las transacciones que el indicador ha escrito.
  • 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.

     
    • В исходниках библиотеки присутствует (ResourceData.mqh) универсальный класс, позволяющий удобно сохранять/читать данные в/из Ресурсах.
    No funciona en MT4 debido a un error.
     

    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 probador?
     
    Alexey Navoykov:
    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.
    }
     
    fxsaber:
    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?

     
    Andrey Khatimlianskii:

    ¿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.