Bibliotecas: TradeTransactions

 

TradeTransactions:

Acesse aos dados do OnTradeTransaction em qualquer lugar com um aplicativo

Autor: fxsaber

 
Biblioteca - realização desta ideia

OnTradeTransaction, que grava todas as transações em um local público (por exemplo, em um recurso).

  • O Expert Advisor cria esse indicador por meio do iCustom.
  • Em qualquer ponto da execução, o Expert Advisor pode ver todas as transações que o indicador gravou.
  • Portanto, há uma enorme flexibilidade.

    Por exemplo, você pode enviar uma centena de ordens assíncronas e aguardar sua execução sem sair das entranhas profundas e continuar executando seu código.


    Estamos falando de solicitações, é claro. E o tema mágico não tem nada a ver com isso.


    Embora seja razoável fazer com que os desenvolvedores executem registros de transações em uma matriz pública. Sem um indicador.

    É claro que uma matriz de transações disponível publicamente a partir do momento da operação do Terminal pelos desenvolvedores seria uma maneira lógica de promover a assincronia de negociação no MT5. Mas a demanda por essa solução provavelmente está próxima de zero. Por enquanto, a biblioteca preenche essa lacuna, se alguém precisar dela, é claro.

     

    O valor não está na biblioteca, mas nessa funcionalidade, quando há um arquivo de todas as transações do Terminal.

    Torna-se possível escrever uma biblioteca de negociação quando você não precisa pensar em assincronia, espera por resultados, etc. A própria biblioteca de negociação faz tudo de forma invisível.


    Por exemplo, há US$ 1.000 em uma conta. São enviadas 100 ordens assíncronas Buy USDCHF 1 lot. É claro que 99 delas serão rejeitadas pelo servidor de negociação (não pelo Terminal), apenas a primeira será executada. Mas antes do cancelamento e de qualquer resposta do servidor de negociação, a ferramenta de negociação inteligente pode presumir que há 100 posições de COMPRA.

     
    • В исходниках библиотеки присутствует (ResourceData.mqh) универсальный класс, позволяющий удобно сохранять/читать данные в/из Ресурсах.
    Não funciona no MT4 por causa de um bug.
     

    Por exemplo, devido à execução parcial, muitas posições podem estar abertas em vez de uma. Quando você precisa modificar muitas posições/ordens, é muito conveniente usar a abordagem proposta.

    Você não precisa se lembrar de nada ao sair do OnTick, não precisa escrever OnTradeTransaction e lidar com RequestID lá - da mesma forma. Você escreve, como de costume, apenas no OnTick. E nele você sempre tem controle total sobre as transações assíncronas em qualquer lugar. Você obtém várias modificações rápidas como um raio, sem pandeiros - você nem precisa pensar em assincronia e suas peculiaridades.

     
    Ideia interessante, obrigado. O desempenho deve melhorar devido à paralelização do código, pelo que entendi. Ele funciona corretamente no testador?
     
    Alexey Navoykov:
    Ideia interessante, obrigado. O desempenho deve melhorar devido à paralelização do código, pelo que entendi. Ele funciona corretamente no testador?

    Não experimentei no testador. Mas se o OnTick de várias moedas funciona no testador com a mesma ideia, deve funcionar aqui também.


    ZЫ Mas a ideia não é a paralelização. Era no MT4 que estávamos distribuindo por fluxos comerciais.

     
    // Exemplo de armazenamento/troca de dados por meio de recursos dentro do terminal
    #include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/pt/code/22166
    
    void OnStart()
    {  
      const RESOURCEDATA<int> ResourceINT("::int"); // Recurso para troca de ints. const - como uma prova de que nada é gravado no objeto de classe
      
      int ArrayINT[] = {1, 2, 3};
      int Num = 5;
      
      ResourceINT = ArrayINT;  // O recurso armazena uma matriz.
      ResourceINT += Num;      // Adicionado outro valor ao recurso.
      ResourceINT += ArrayINT; // Adicionado um array.
      
      int ArrayINT2[];  
      ResourceINT.Get(ArrayINT2); // Ler dados do recurso.
      ArrayPrint(ArrayINT2);      // Retirado: 1 2 3 5 1 2 3
    
      ResourceINT.Free();                // Dados excluídos do recurso
      Print(ResourceINT.Get(ArrayINT2)); // Verificar se não há dados: 0
    
      const RESOURCEDATA<MqlTick> ResourceTicks("::Ticks"); // Recurso para troca de ticks. const - como prova de que nada é gravado no objeto da classe
      MqlTick Tick;
      
      if (SymbolInfoTick(_Symbol, Tick))
        for (int i = 0; i < 3; i++)
          ResourceTicks += Tick; // Adicionado ao recurso tiki
    
      MqlTick Ticks[];
      ResourceTicks.Get(Ticks); // Ler dados do recurso.
      ArrayPrint(Ticks);        // Retirado.
      
      // Esse é o nome completo do recurso a ser acessado de outro programa
      const string NameOut = StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_PATH)) + 5) + "::Ticks";  
      Print(NameOut); // Imprima o nome completo do recurso.
      
      const RESOURCEDATA<MqlTick> Resource(NameOut); // Recurso para acessar dados (somente leitura) de outro programa
      
      MqlTick TicksOut[];
      Resource.Get(TicksOut); // Ler dados do recurso.
      ArrayPrint(TicksOut);   // Retirado.
      
      Resource.Free();   // Não há como afetar dados de recursos somente leitura.
      Print(_LastError); // ERR_INVALID_PARAMETER - Parâmetro incorreto ao chamar uma função do sistema.
    }
     
    fxsaber:
    Exemplo de armazenamento/troca de dados por meio de Recursos dentro do Terminal

    É possível ler dados que estão em processo de gravação? Ou seja, posso ler informações incompletas?

     

    Até o momento, não consigo pensar em nenhum uso para essa biblioteca.

    Definitivamente, ela não é necessária no forex, e não há necessidade dela na bolsa de valores.

    Você já testou essa biblioteca na bolsa de valores?

    Em que casos você acha que ela pode ser útil?

     
    Andrey Khatimlianskii:

    É possível ler dados que estão em processo de gravação? Ou seja, ler informações não completas?

    Você precisa fazer experiências. Acho que a gravação/leitura simultânea de um recurso funciona da mesma forma que com as variáveis globais, porque a gravação em ambos os casos é criação: ResourceCreate e GlobalVariableSet. A única diferença entre um recurso e uma global é que, teoricamente, você não pode escrever nada em um recurso ao mesmo tempo. Com o global, isso é possível.


    De fato, ler um recurso é obter um dado da memória. E se a leitura foi iniciada, a gravação de um recurso não deve afetá-la, pois a gravação está alocando outra parte da memória. Eles dificilmente podem se sobrepor porque o próprio sistema operacional provavelmente os impedirá de fazer isso. É por isso que, do meu ponto de vista, não deve haver conflitos de carregamento/salvamento com os recursos. Mas é claro que é melhor fazer essa pergunta aos desenvolvedores.