Obter o Ticket.

 

Olá boas! Sou novo por aqui, por isso me desculpem por ser coisa básica.

Estou tentando saber como faço para obter o Ticket do deal que a corretora nos retorna. O código que estou usando é um padrão que encontrei na documentação:

void Compra()
{
//--- 3. example of buying at the specified symbol with specified SL and TP
    double volume=0.1;         // specify a trade operation volume
    string symbol="GBPUSD";    //specify the symbol, for which the operation is performed
    int    digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places
    double point=SymbolInfoDouble(symbol,SYMBOL_POINT);         // point
    double bid=SymbolInfoDouble(symbol,SYMBOL_BID);             // current price for closing LONG
    double SL=bid-1000*point;                                   // unnormalized SL value
    SL=NormalizeDouble(SL,digits);                              // normalizing Stop Loss
    double TP=bid+1000*point;                                   // unnormalized TP value
    TP=NormalizeDouble(TP,digits);                              // normalizing Take Profit
//--- receive the current open price for LONG positions
    double open_price=SymbolInfoDouble(symbol,SYMBOL_ASK);
    string comment=StringFormat("Buy %s %G lots at %s, SL=%s TP=%s",
                                symbol,volume,
                                DoubleToString(open_price,digits),
                                DoubleToString(SL,digits),
                                DoubleToString(TP,digits));
    if(!trade.Buy(volume,symbol,open_price,SL,TP,comment))
        {
        //--- failure message
        Print("Buy() c failed. Return code=",trade.ResultRetcode(),
            ". Code description: ",trade.ResultRetcodeDescription());
        }
    else
        {
        Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),") Ticket: ", O_QUE_COLOCO_AQUI);
        }
    //---
}

já tentei com trade.ResultDeal(), trade.Ticket(), enfim ... tudo o que consegui foi obter um 0 como resposta.

Alguém me pode ajudar? Obrigado!

 
Ricardo Lourenço:

Olá boas! Sou novo por aqui, por isso me desculpem por ser coisa básica.

Estou tentando saber como faço para obter o Ticket do deal que a corretora nos retorna. O código que estou usando é um padrão que encontrei na documentação:

já tentei com trade.ResultDeal(), trade.Ticket(), enfim ... tudo o que consegui foi obter um 0 como resposta.

Alguém me pode ajudar? Obrigado!

Busque na documentação do MQL5 por PositionSelectByTicket, PositionGetTicket, OrderGetTicket, HistoryOrderGetTicket, HistoryDealGetTicket,...


Dependendo qual seja a necessidade, uma dessas funções deve atender.

 
Ricardo Lourenço:


Ricardo é trade.ResultDeal() .  O Retorno true na chamada da operação ( trade.buy(...) ou trade.sell(...) ) não significa que a operação foi feita e nesse caso o trade.ResultDeal() retorna 0(zero), o motivo da operação não ter sido executada está em trade.ResultRetCode().

 if(!trade.Buy(volume,symbol,open_price,SL,TP,comment))

           {
            if(trade.ResultDeal()==0)
              {
               Print("#1 BUY Error.  --> Result Retcode: ",trade.ResultRetcode(),
                     ", description of result: ",trade.ResultRetcodeDescription());
              
              }
            else
              {
               Print("#2 BUY Success -->> Result Retcode: ",trade.ResultRetcode(),
                     ", description of result: ",trade.ResultRetcodeDescription(),
                     ", Ticket: ",trade.ResultDeal());
              }
}
 

Olá boa tarde e obrigado pela ajuda aos dois.

@Rogerio essa á a lógica que eu pensava que funcionava, mas sem sucesso. A compra é feita, mas retorna zero:

print

print2


@Vinicius sim via o HistoryDealGetTicket eu consigo chegar lá. A minha dúvida é: Eu tenho que criar uma função para "Loopar" entre todo o histórico e me retornar o último resultado?

Não existe uma forma mais simples de conseguir o ticket do ResultDeal()?

 
Ricardo Lourenço:

Olá boa tarde e obrigado pela ajuda aos dois.

@Rogerio essa á a lógica que eu pensava que funcionava, mas sem sucesso. A compra é feita, mas retorna zero:


@Vinicius sim via o HistoryDealGetTicket eu consigo chegar lá. A minha dúvida é: Eu tenho que criar uma função para "Loopar" entre todo o histórico e me retornar o último resultado?

Não existe uma forma mais simples de conseguir o ticket do ResultDeal()?

O retCode()==10008 significa que a ordem ainda foi foi preenchida,  portanto o ResultDeal()==0, faça um loop  para aguardar o retCode()==10009 

 
Rogerio Giannetti Torres:

O retCode()==10008 significa que a ordem ainda foi foi preenchida,  portanto o ResultDeal()==0, faça um loop  para aguardar o retCode()==10009 

   cTrade.Buy(volume,symbol,open_price,SL,TP,comment);
   if(cTrade.ResultRetcode()!=10008 && cTrade.ResultRetcode()!=10009)
     {
      //--- failure message
      Print("Buy() c failed. Return code=",cTrade.ResultRetcode(),
            ". Code description: ",cTrade.ResultRetcodeDescription());
     }
   while(cTrade.ResultRetcode()!=10009) Sleep(20);
   Print("Buy() method executed successfully. Return code=",cTrade.ResultRetcode(),
         " (",cTrade.ResultRetcodeDescription(),") Ticket: ",cTrade.ResultDeal());
 
Rogerio Giannetti Torres:

Tentei com meu While, com o seu, e o resultado é o mesmo. Ele fica esperando pelo retcode 10009 mas ele não recebe nunca.

Me está a parecer que estamos tentando fazer uma coisa com o método errado.

Amanhã vou tentar fazer através do OpenPosition. Por hoje já estou vendo numeros virgulas e ponto e virgulas a mais rsrsrs

Um abraço e muito obrigado mais uma vez !

 
Ricardo Lourenço:

Tentei com meu While, com o seu, e o resultado é o mesmo. Ele fica esperando pelo retcode 10009 mas ele não recebe nunca.

Me está a parecer que estamos tentando fazer uma coisa com o método errado.

Amanhã vou tentar fazer através do OpenPosition. Por hoje já estou vendo numeros virgulas e ponto e virgulas a mais rsrsrs

Um abraço e muito obrigado mais uma vez !

Ja tentou usando a classe CTrade?

ulong ticket = trade.RequestPosition();

[ ]'s

 
Joscelino Celso de Oliveira:

Ja tentou usando a classe CTrade?

[ ]'s

Oi @Joscelino obrigado pela ajuda. Sim tentei e retorna zero tb.

Sou novato então perdoem por estar talvez a falar besteira, mas aquilo que estou a entender é que:

  1. ao fazer o Buy() é uma operação e,
  2. ele retorna o valor 0 falando que foi feito e,
  3. acaba ae.

Se eu quiser mais detalhes tenho de ir no histórico. Porém uma das coisas que me está a trabalhar na cabeça é que essa forma é tudo menos eficiente. Tudo ok que não vou fazer nenhum HFT mas neh? Fazer um loop em todo o histórico só para ter o Ticket não acredito ser uma boa prática.

Mas pode ser que esteja completamente errado. Como falei sou um mero iniciante por aqui ...

 

Consegui :-)

Caso alguém tenha um prob parecido setem o AsyncMode para false:

trade.SetAsyncMode(false);

dessa forma o ResultDeal() irá aguardar pelo ticket.

Código final é:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  //--- set MagicNumber for your orders identification
    int MagicNumber=123456;
    trade.SetExpertMagicNumber(MagicNumber);
  //--- set available slippage in points when buying/selling
    int deviation=10;
    trade.SetDeviationInPoints(deviation);
  //--- order execution mode
    trade.SetTypeFilling(ORDER_FILLING_RETURN);
  //--- logging mode: it would be better not to declare this method at all, the class will set the best mode on its own
    trade.LogLevel(1);
  //--- what function is to be used for trading: true - OrderSendAsync(), false - OrderSend()
    trade.SetAsyncMode(false);
  //---
    return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Realizar compra com parâmetros especificados pelo socket         |
//+------------------------------------------------------------------+
void Compra()
{
//--- 3. example of buying at the specified symbol with specified SL and TP
    double volume=0.1;         // specify a trade operation volume
    string symbol="GBPUSD";    //specify the symbol, for which the operation is performed
    int    digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places
    double point=SymbolInfoDouble(symbol,SYMBOL_POINT);         // point
    double bid=SymbolInfoDouble(symbol,SYMBOL_BID);             // current price for closing LONG
    double SL=bid-1000*point;                                   // unnormalized SL value
    SL=NormalizeDouble(SL,digits);                              // normalizing Stop Loss
    double TP=bid+1000*point;                                   // unnormalized TP value
    TP=NormalizeDouble(TP,digits);                              // normalizing Take Profit
//--- receive the current open price for LONG positions
    double open_price=SymbolInfoDouble(symbol,SYMBOL_ASK);
    string comment=StringFormat("Buy %s %G lots at %s, SL=%s TP=%s",
                                symbol,volume,
                                DoubleToString(open_price,digits),
                                DoubleToString(SL,digits),
                                DoubleToString(TP,digits));
    if(!trade.Buy(volume,symbol,open_price,SL,TP,comment))
        {
        //--- failure message
        Print("Buy() c failed. Return code=",trade.ResultRetcode(),
            ". Code description: ",trade.ResultRetcodeDescription());
        }
    else
        {
        Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")", trade.ResultDeal());
        }

}

Obrigado pelo vosso tempo e apoio.

[],s


PS: Essa solução não serve para HFT ;-) Só para trades "Normais" já que com o Async Desligado precisa aguardar uma operação para fazer outra ....

 

Não encontrei o botão para marcar o tópico como resolvido, não precisa por aqui?

Razão: