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.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
TradeTransactions:
Acesse aos dados do OnTradeTransaction em qualquer lugar com um aplicativo
Autor: fxsaber