Obter o ticket utilizado no último pedido. - trade.RequestOrder()

 

Pessoal,

Estou tentando obter o nº do ticket de uma ordem logo após o seu envio através da função RequestOrder() da biblioteca padrão CTrade. A ideia é salvar o nº do ticket numa variável para facilitar o acompanhamento, modificação e/ou exclusão dessa ordem. Conforme código abaixo.

    if(!trade.SellStop(volume,open_price,simbolo,SL,TP))
     {
       //--- Mensagem de erro
       Print("SellStop() Falhou. Código de retorno=",trade.ResultRetcode(),
            ". Descrição do código: ",trade.ResultRetcodeDescription());
     }
    else
     {
       nticket=trade.RequestOrder();
       Print("SellStop() executado com sucesso. Código de retorno=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),"). O número do ticket é: ",trade.RequestOrder());

A ordem é enviada com sucesso, mas o RequestOrder() sempre retorna zero. Alguém tem alguma ideia do que pode estar acontecendo? 

Pelo que entendi da documentação o MT5 deveria numerar automaticamente essas ordens, certo?

Caso eu não consiga, pensei em usar o MqlTradeResult para a mesma finalidade. Alguém usa o MqlTradeResult para esse fim?

Att.

Otávio

 
otaviokc:

Pessoal,

Estou tentando obter o nº do ticket de uma ordem logo após o seu envio através da função RequestOrder() da biblioteca padrão CTrade. A ideia é salvar o nº do ticket numa variável para facilitar o acompanhamento, modificação e/ou exclusão dessa ordem. Conforme código abaixo.

A ordem é enviada com sucesso, mas o RequestOrder() sempre retorna zero. Alguém tem alguma ideia do que pode estar acontecendo? 

Pelo que entendi da documentação o MT5 deveria numerar automaticamente essas ordens, certo?

Caso eu não consiga, pensei em usar o MqlTradeResult para a mesma finalidade. Alguém usa o MqlTradeResult para esse fim?

Att.

Otávio

Galera, 

Consegui buscar o ticket com a função OrderGetTicket().

Agora estou tentando verificar o status da ordem (se ela foi cumprida total, parcial ou se está pendente).

Estou usando o seguinte código:

string estadodaordem = EnumToString(ENUM_ORDER_STATE(OrderGetInteger(ORDER_STATE)));
Print("O estado da ordem é: ",estadodaordem,". O número do ticker é: ",nticket);  

Infelizmente não importa a situação real da ordem, o sistema sempre retorna a mesma situação:

"O estado da ordem é: ORDER_STATE_PLACED. O número do ticker é: 2"

Alguém tem alguma ideia do que pode estar acontecendo?

Att.

Otávio 

 
Resolvido. Não é possível fazer um OrderSelect() de uma ordem já preenchida.
 
otaviokc:
Resolvido. Não é possível fazer um OrderSelect() de uma ordem já preenchida.

Olá otaviokc,

Acho que tem algum engano aí ... é possível sim obter todas as informações de todas as ordens já preenchidas... 

Por favor dê uma olhada aqui:

1) https://www.mql5.com/pt/docs/trading/historyorderselect

2) https://www.mql5.com/pt/docs/trading/historyorderstotal

3) https://www.mql5.com/pt/docs/trading/historyordergetticket

4) https://www.mql5.com/pt/docs/trading/historyordergetdouble

5) https://www.mql5.com/pt/docs/trading/historyordergetinteger

6) https://www.mql5.com/pt/docs/trading/historyordergetstring 

Abraços,
Malacarne

Documentação sobre MQL5: Funções de Negociação (Trade) / HistoryOrderSelect
Documentação sobre MQL5: Funções de Negociação (Trade) / HistoryOrderSelect
  • www.mql5.com
Funções de Negociação (Trade) / HistoryOrderSelect - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Rodrigo Malacarne:

Olá otaviokc,

Acho que tem algum engano aí ... é possível sim obter todas as informações de todas as ordens já preenchidas... 

Por favor dê uma olhada aqui:

1) https://www.mql5.com/pt/docs/trading/historyorderselect

2) https://www.mql5.com/pt/docs/trading/historyorderstotal

3) https://www.mql5.com/pt/docs/trading/historyordergetticket

4) https://www.mql5.com/pt/docs/trading/historyordergetdouble

5) https://www.mql5.com/pt/docs/trading/historyordergetinteger

6) https://www.mql5.com/pt/docs/trading/historyordergetstring 

Abraços,
Malacarne

Malacarne,

Minha afirmação foi: "Resolvido. Não é possível fazer um OrderSelect() de uma ordem já preenchida." E não que não era possível obter as informações de ordens já preenchida. 

Pelos meus testes o OrderSelect() retorna false para uma ordem já preenchida, olhando o GetLastError() ele retorna algo como "ordem não localizada". Apesar de já ter contornado a questão a vários dias, peço por gentileza que esclareça por que você entende que há um engano.

Abs,

Otávio 

 
otaviokc:

Malacarne,

Minha afirmação foi: "Resolvido. Não é possível fazer um OrderSelect() de uma ordem já preenchida." E não que não era possível obter as informações de ordens já preenchida. 

Pelos meus testes o OrderSelect() retorna false para uma ordem já preenchida, olhando o GetLastError() ele retorna algo como "ordem não localizada". Apesar de já ter contornado a questão a vários dias, peço por gentileza que esclareça por que você entende que há um engano.

Abs,

Otávio 

Olá otaviokc,

Se me permite, posso tentar descrever onde há o engano.

Correto, você só pode fazer OrderSelect() em ordens pendentes como afirmou antes.

Mas note que você também afirmou, e antes de tudo, que "... estou tentando verificar o status da ordem (se ela foi cumprida total, parcial ou se está pendente).". 

Se também está tentando obter a informação cumprida total ou parcial, então considero a observação do Malacarne pertinente, pois você deverá obrigatoriamente utilizar a HistoryOrderSelect() para selecionar ordens do histórico para isso.

Acredito que foi essa mensagem que ele tentou te passar (por favor me corrijam se eu estiver errado).

Melhores cumprimentos,

Rogério Figurelli


 
Rogerio Figurelli:

Olá otaviokc,

Se me permite, posso tentar descrever onde há o engano.

Correto, você só pode fazer OrderSelect() em ordens pendentes como afirmou antes.

Mas note que você também afirmou, e antes de tudo, que "... estou tentando verificar o status da ordem (se ela foi cumprida total, parcial ou se está pendente).". 

Se também está tentando obter a informação cumprida total ou parcial, então considero a observação do Malacarne pertinente, pois você deverá obrigatoriamente utilizar a HistoryOrderSelect() para selecionar ordens do histórico para isso.

Acredito que foi essa mensagem que ele tentou te passar (por favor me corrijam se eu estiver errado).

Melhores cumprimentos,

Rogério Figurelli

Olá Rogerio Figurelli,

Perfeitamente...

Faço minhas as suas palavras.

Forte abraço!
Malacarne

P.S.: vc andava meio sumido do fórum!!! Bom te ver novamente por aqui!! :-)

 
Rodrigo Malacarne:

Olá Rogerio Figurelli,

Perfeitamente...

Faço minhas as suas palavras.

Forte abraço!
Malacarne

P.S.: vc andava meio sumido do fórum!!! Bom te ver novamente por aqui!! :-)

Rsss.... que confusão. Deixa eu tentar esclarecer.

Sim, o objetivo era verificar o status da ordem, pendente,  preenchida e parcial (post de 14/06/2016). Pela minha lógica de iniciante estava tentando fazer um OrderSelect(). Depois de quebrar a cabeça por vários dias em 30/06/2016 cheguei a conclusão e postei que não é possível selecionar um ordem cumprida via OrderSelect() e passei a estudar as funções que o Malacarne sugeriu posteriormente em 07/06/2016 de forma que entendo que nessa última data o engano já havia sido dissipado.

Agradeço demais o tempo que você e o Malacarne doam para a comunidade MQL5, respondendo o forum. Sempre tento ajudar também com o pouco que sei. E olhando o lado bom, é provável que se alguém tiver essa mesma dúvida e procurar, encontrará esse post.

Obrigado mais uma vez e desculpe a confusão.

Abs

Otávio 

Ps. Nesses 15 dias que fiquei quebrando a cabeça também senti a falta de vocês no forum.. rs...




 
Rodrigo Malacarne:

Olá Rogerio Figurelli,

Perfeitamente...

Faço minhas as suas palavras.

Forte abraço!
Malacarne

P.S.: vc andava meio sumido do fórum!!! Bom te ver novamente por aqui!! :-)

Fala Rodrigo Malacarne, realmente tenho trabalhado bastante e com pouco tempo para o Fórum, mas se vejo muita mensagem aguardando resposta procuro contribuir, na medida do possível e quase sempre de madrugada, como agora ;-)

Abraço! 

 
otaviokc:
Rsss.... que confusão. Deixa eu tentar esclarecer.

Sim, o objetivo era verificar o status da ordem, pendente,  preenchida e parcial (post de 14/06/2016). Pela minha lógica de iniciante estava tentando fazer um OrderSelect(). Depois de quebrar a cabeça por vários dias em 30/06/2016 cheguei a conclusão e postei que não é possível selecionar um ordem cumprida via OrderSelect() e passei a estudar as funções que o Malacarne sugeriu posteriormente em 07/06/2016 de forma que entendo que nessa última data o engano já havia sido dissipado.

Agradeço demais o tempo que você e o Malacarne doam para a comunidade MQL5, respondendo o forum. Sempre tento ajudar também com o pouco que sei. E olhando o lado bom, é provável que se alguém tiver essa mesma dúvida e procurar, encontrará esse post.

Obrigado mais uma vez e desculpe a confusão.

Abs

Otávio 

Ps. Nesses 15 dias que fiquei quebrando a cabeça também senti a falta de vocês no forum.. rs...




Legal Otávio, tenho acompanhado teu esforço aqui, parabéns pela participação e ótimas contribuições.

Abraço!