Bibliotecas: TradeTransactions
OnTradeTransaction, que grava todas as transações em um local público (por exemplo, em um recurso).
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.
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?
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. }
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?
É 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.
TradeTransactions:
Acesse aos dados do OnTradeTransaction em qualquer lugar com um aplicativo
Autor: fxsaber