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"
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.
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?
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)); } //--- }
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.
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.
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.
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 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.
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.
- 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 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