Discussão do artigo "Guia prático do MQL5: O Histórico de transações e a biblioteca de função para obter propriedades de posição"

 

Novo artigo Guia prático do MQL5: O Histórico de transações e a biblioteca de função para obter propriedades de posição foi publicado:

É hora de brevemente resumir a informação fornecida nos artigos anteriores sobre as propriedades de posição. Neste artigo, criaremos algumas funções adicionais para obter propriedades que podem apenas serem obtidas após acessar o histórico de transações. Também nos familiarizaremos com estruturas de dados que nos permitirá acessar propriedades de posição e símbolo de forma mais conveniente.


Autor: Anatoli Kazharski

 
O artigo é bom, gostei dele. Muitas vezes acontece de a posição atual consistir em várias transações e, além da primeira e da última, eu gostaria de saber os parâmetros de 2, 3, etc. transações. Essa função enriqueceria o artigo.
 
paladin800:
O artigo é bom, gostei dele. Muitas vezes acontece de a posição atual consistir em várias negociações e, além da primeira e da última, eu gostaria de saber os parâmetros de 2, 3 etc. negociações. Esse recurso enriqueceria o artigo.
Que seja um dever de casa por enquanto. Mas tentarei escrever algo mais sobre esse tópico mais tarde.
 

Pergunta ao autor do artigo.

Como posso obter o ID da posição na qual a negociação estava envolvida imediatamente após a abertura da posição?



 
denkir:

Pergunta ao autor do artigo.

Como obter o identificador da posição, na qual a negociação estava envolvida, imediatamente após a abertura da posição?

Selecione a posição usando a função PositionSelect() e obtenha seu identificador usando a função PositionGetInteger() e o identificador mql5 - POSITION_IDENTIFIER.

Exemplo da Ajuda:

//+------------------------------------------------------------------+
//| Função comercial|
//+------------------------------------------------------------------+
void OnTrade()
  {
//--- verifique se a posição está disponível e imprima a hora de sua alteração
   if(PositionSelect(_Symbol))
     {     
//--- obter o identificador de posição para trabalhar mais com ele
      ulong position_ID=PositionGetInteger(POSITION_IDENTIFIER);
      Print(_Symbol," postion #",position_ID);
//--- obter o tempo de formação da posição em milissegundos desde 01.01.1970
      long create_time_msc=PositionGetInteger(POSITION_TIME_MSC);
      PrintFormat("Position #%d  POSITION_TIME_MSC = %i64 milliseconds => %s",position_ID,
                  create_time_msc,TimeToString(create_time_msc/1000));
//--- obter o tempo da última mudança de posição em segundos desde 01.01.1970
      long update_time_sec=PositionGetInteger(POSITION_TIME_UPDATE);
      PrintFormat("Position #%d  POSITION_TIME_UPDATE = %i64 seconds => %s",
                  position_ID,update_time_sec,TimeToString(update_time_sec));
//--- obtém o tempo da última mudança de posição em milissegundos desde 01.01.1970
      long update_time_msc=PositionGetInteger(POSITION_TIME_UPDATE_MSC);
      PrintFormat("Position #%d  POSITION_TIME_UPDATE_MSC = %i64 milliseconds => %s",
                  position_ID,update_time_msc,TimeToString(update_time_msc/1000));
     }
//---
  }
 
tol64:

Selecione uma posição usando a função PositionSelect() e obtenha seu identificador usando a função PositionGetInteger() e o identificador mql5 - POSITION_IDENTIFIER.

Exemplo da Ajuda:

Obrigado, tol64! Em princípio, você está certo.

E peço desculpas porque a primeira pergunta foi breve... apesar do fato de eu ter fornecido uma referência ao identificador de posição.

O problema é o seguinte. É necessário, após a abertura de uma posição, capturar essa abertura no histórico de transações com a ajuda da classe CDealInfo usando o método ::PositionId(). E, de preferência, com o menor intervalo de tempo entre o momento da abertura e o momento em que uma transação do tipo DEAL_ENTRY_IN ou DEAL_ENTRY_INOUT aparece no histórico.

É possível fazer isso dessa forma? Não por meio da lista de posições ativas, mas por meio da lista de transações no histórico...
 
denkir:

Obrigado, tol64! Em princípio, a verdade é sua.

E peço desculpas pela brevidade da primeira pergunta... apesar do fato de eu ter fornecido um link para o ID da posição.

O problema é o seguinte. Depois que uma posição é aberta, é necessário capturar essa abertura no histórico de transações usando a classe CDealInfo com o método ::PositionId(). E, de preferência, com o menor intervalo de tempo entre o momento da abertura e o momento em que uma transação do tipo DEAL_ENTRY_IN ou DEAL_ENTRY_INOUT aparece no histórico.

É possível fazer isso dessa forma? Não por meio da lista de posições ativas, mas por meio da lista de negociações no histórico...

Na minha opinião, rastrear o evento em OnTrade(), como no exemplo acima, é bastante adequado para isso. Mas eu acho que, de repente, uma posição não pode ser selecionada por um evento de negociação, e a próxima não será tão cedo. Então, você precisa rastrear o ambiente por meio de um cronômetro. Até mesmo milissegundos podem ser definidos agora.

Bem, ou em vez de rastrear a posição aberta, examine o histórico de negociações (número de negociações). Lembramos a anterior e a comparamos com a atual. Você também pode fazer isso no cronômetro. Há muitas variantes. Tudo depende da tarefa específica.

 

Anatoly, encontrei um problema aqui. Por favor, compartilhe sua experiência. Ou há um bug ao trabalhar com funções ou estou fazendo algo "errado". Mas acho que fiz tudo corretamente....

Tenho uma pergunta sobre as variantes de função em que a segunda não "funciona".

Por exemplo:

1)

double  HistoryOrderGetDouble(
   ulong                       ticket_number,     // bilhete
   ENUM_ORDER_PROPERTY_DOUBLE  property_id        // identificador de propriedade
   );

2)

bool  HistoryOrderGetDouble(
   ulong                       ticket_number,     // bilhete
   ENUM_ORDER_PROPERTY_DOUBLE  property_id,       // identificador de propriedade
   double&                     double_var         // aqui pegamos o valor da propriedade
   );

Anexei o código-fonte.

Arquivos anexados:
 
denkir:

Anatoly, encontrei um problema aqui. Por favor, compartilhe sua experiência. Ou há um bug ao trabalhar com funções ou estou fazendo algo "errado". Mas acho que fiz tudo corretamente....

A pergunta é sobre variantes de função em que a segunda não "funciona".

...

O que você vê no registro? Não tenho problemas ao executar o script.
 
tol64:
O que você vê no registro? Não vejo nenhum problema ao executar o script.

Vejo que, com as configurações padrão do script, há uma entrada do tipo "Failure to return HistoryOrderGetDouble() function".

Ou seja, a versão booleana da função não obtém o valor da propriedade.

 
denkir:

Vejo que, com as configurações de script padrão, há um registro como "Failure to return HistoryOrderGetDouble() function".

Ou seja, a versão booleana da função não obtém o valor da propriedade.

Tudo é aprovado com êxito para mim. Observe tudo com mais detalhes (saída para o registro) para descobrir o motivo. Número de pedidos, tíquetes, número de erro etc.