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 é 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:
@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()?
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
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());
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 !
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
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:
- ao fazer o Buy() é uma operação e,
- ele retorna o valor 0 falando que foi feito e,
- 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?
- 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
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!