Discussão do artigo "Biblioteca para criação simples e rápida de programas para MetaTrader (Parte XXII): classes de negociação - classe básica de negociação, controle de restrições"
Artem, preciso obter as propriedades de uma posição no mql4 depois de abri-la ou ativar uma ordem. Descobri como obter o índice do evento
ENUM_TRADE_EVENT engine.LastTradeEvent()
e, nesse momento, preciso obter as propriedades disponíveis.
Até encontrei o enum, mas como obter... não consigo encontrar nada.
Artem, preciso obter as propriedades de uma posição no mql4 depois de abri-la ou ativar uma ordem. Descobri como obter o índice do evento
e, nesse momento, preciso obter as propriedades disponíveis.
Até encontrei o enum, mas como obter... não consigo encontrar nada.
Se o último evento for a abertura de uma posição? Precisamos obter a última posição aberta e acessar todas as suas propriedades? Certo?
Se sim, é fácil (sem verificar os resultados da obtenção da lista e do objeto):
Estou chegando a algum lugar. Obrigado, a biblioteca é muito útil.
Próxima pergunta (não estúpida): temos duas ordens pendentes. Recebemos um evento na ativação de uma delas e, em seguida, a segunda foi ativada.... E não há nenhuma alteração no evento. Como fazer com que o vigia retorne após receber o evento? Tentei
last_event = WRONG_VALUE;
depois de processar o evento, mas obtive um resultado sem sentido...
Estou chegando a algum lugar. Obrigado, a biblioteca é muito útil.
Próxima pergunta (não estúpida): temos duas ordens pendentes. Recebemos um evento na ativação de uma delas e, em seguida, a segunda foi ativada.... E não há nenhuma alteração no evento. Como fazer com que o vigia retorne após receber o evento? Eu tentei
depois de processar o evento, mas obtive um resultado sem sentido...Não estou controlando os eventos corretamente. A biblioteca captura todos eles e, em seguida, o EA de teste verifica a diferença entre o evento passado e o atual. E você tem dois eventos idênticos.
Em princípio, depois de enviar um evento, a biblioteca redefine o próprio evento. Tente receber o evento novamente depois de recebê-lo - deve ser gravado na variável que não há evento e, em seguida, o próximo evento deve ser capturado.
Mas há muito tempo escrevi em meus planos que os eventos de negociação devem ser feitos da mesma forma que os eventos de símbolos ou conta - eles apenas retornam um sinalizador de que há um evento. E então, no programa, podemos ver qual é o evento. Tudo já está preparado para isso no Expert Advisor, apenas para os eventos de negociação há um obstáculo na função OnDoEasyEvent() do Expert Advisor, porque o sinalizador ainda não é retornado - não consigo colocá-lo em minhas mãos:
//--- Processamento de eventos comerciais else if(idx>TRADE_EVENT_NO_EVENT && idx<TRADE_EVENTS_NEXT_CODE) { event=EnumToString((ENUM_TRADE_EVENT)ushort(idx)); int digits=(int)SymbolInfoInteger(sparam,SYMBOL_DIGITS); }
O controle de eventos está errado aqui. A biblioteca captura todos eles e, em seguida, o EA de teste verifica a diferença entre o evento passado e o atual. E você tem dois eventos idênticos.
Em princípio, depois de enviar um evento, a biblioteca redefine o próprio evento. Tente receber o evento novamente depois de recebê-lo - deve ser gravado na variável que não há evento e, em seguida, o próximo evento deve ser capturado.
Mas há muito tempo escrevi em meus planos que os eventos de negociação devem ser feitos da mesma forma que os eventos de símbolos ou contas - eles apenas retornam um sinalizador de que há um evento. E então, no programa, podemos ver qual é o evento. Tudo já está preparado para isso no Expert Advisor, apenas para os eventos de negociação há um obstáculo na função OnDoEasyEvent() do Expert Advisor, porque o sinalizador ainda não é retornado - não consigo colocá-lo em minhas mãos:
Isso é certo, a manhã é mais sábia à noite.... Se um evento for recebido, no meu caso específico, devemos reagir a ele de alguma forma. Em particular, colocar outra ordem pendente. Isso é o que acontece com o novo evento.
O controle de eventos está errado aqui. A biblioteca captura todos eles e, em seguida, o EA de teste verifica a diferença entre o evento passado e o atual. E você tem dois eventos idênticos.
Em princípio, depois de enviar um evento, a biblioteca redefine o próprio evento. Tente receber o evento novamente depois de recebê-lo - deve ser gravado na variável que não há evento e, em seguida, o próximo evento deve ser capturado.
Mas há muito tempo escrevi em meus planos que os eventos de negociação devem ser feitos da mesma forma que os eventos de símbolos ou conta - eles apenas retornam um sinalizador de que há um evento. E então, no programa, podemos ver qual é o evento. Tudo já está preparado para isso no Expert Advisor, apenas para os eventos de negociação há um obstáculo na função OnDoEasyEvent() do Expert Advisor, porque o sinalizador ainda não é retornado - não consigo colocá-lo em minhas mãos:
Mas event é uma variável disponível somente em OnChartEvent, e não é processada no testador.
Quero fazer algo parecido com isso em OnTick():
//--- Se o último evento de negociação foi alterado if(engine.LastTradeEvent() != last_event) { switch(last_event) { case TRADE_EVENT_PENDING_ORDER_PLASED : // chamar a função correspondente break; case TRADE_EVENT_PENDING_ORDER_REMOVED : // chamar a função correspondente break; case TRADE_EVENT_PENDING_ORDER_ACTIVATED : // chamar a função correspondente break; case TRADE_EVENT_POSITION_OPENED : // chamar a função correspondente break; case TRADE_EVENT_POSITION_CLOSED : // chamar a função correspondente break; default : break; }
Mas event é uma variável disponível somente em OnChartEvent, e não é processada no testador.
Quero fazer algo parecido com isso em OnTick():
Então, depois de processar o evento - no final do módulo de verificação do tipo de evento, o que você tem na variável last_event? Essa variável deve ser redefinida no Expert Advisor. Em vez de chamar à força o método de redefinição do último evento da biblioteca, a própria biblioteca o chama logo após enviar o evento para o gráfico e gravá-lo na lista de eventos.
Mas event é uma variável disponível somente em OnChartEvent, e não é processada no testador.
Quero fazer algo parecido com isso em OnTick():

- 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
Novo artigo Biblioteca para criação simples e rápida de programas para MetaTrader (Parte XXII): classes de negociação - classe básica de negociação, controle de restrições foi publicado:
Para testar o trabalho dos métodos de verificação de restrições de negociação, é preciso criá-las artificialmente.
Por exemplo:
E tentamos clicar no botão para abrir uma posição no painel de negociação do EA. Como resultado, obtemos uma entrada no log:
Removemos as restrições uma a uma.
Ativamos a Internet e ao tentar abrir uma posição, obtemos:
Ativamos no terminal a negociação automática clicando no botão Autotrading e, ao tentar abrir uma posição, obtemos
Pressionamos F7 e nas configurações do EA, permitiremos que ele negocie. Ao tentar abrir uma posição, obtemos uma posição aberta:
As restantes restrições podem ser verificadas no testador ou numa conta demo, criando uma situação em que uma das restrições funciona, por exemplo, uma restrição no número máximo de ordens pendentes na conta.Autor: Artyom Trishkin