Como obter o preço do ùltimo dea_price, na compra e na venda....

 
A função abaixo me fornece o preço do ultimo Deal. Até aqui OK, funciona.
A questão é como filtar para que apareça o preço por tipo de operação.

- DealPrice do último DEAL do tipo BUY
- DealPrice do último DEAL do tipo SELL

Minha dificuldade é que hoje consigo puxar a ultima e descobrir se é buy ou sell, mas precisava que ele obtesse o ultimo buy ou ultimo sell.
Exemplo:
- A ultima Deal for Buy - ok aparece correto
- Porem se for pra buscar o Deal Price da ultima Sell, sendo que a ultima Deal foi Buy, ele retorna a ultima e nao a ultima Sell
if (HistorySelect(0, TimeCurrent()) && (HistoryDealsTotal() > 0))
                                     {
LastPrice = HistoryDealGetDouble(HistoryDealGetTicket(HistoryDealsTotal() - 1), DEAL_PRICE); 
Tentei filtrar no HistorySelect com HistoryDealGetInteger....mas não consegui....

Alguma sugestão?
 
Coladel:
A função abaixo me fornece o preço do ultimo Deal. Até aqui OK, funciona.
A questão é como filtar para que apareça o preço por tipo de operação.

- DealPrice do último DEAL do tipo BUY
- DealPrice do último DEAL do tipo SELL

Minha dificuldade é que hoje consigo puxar a ultima e descobrir se é buy ou sell, mas precisava que ele obtesse o ultimo buy ou ultimo sell.
Exemplo:
- A ultima Deal for Buy - ok aparece correto
- Porem se for pra buscar o Deal Price da ultima Sell, sendo que a ultima Deal foi Buy, ele retorna a ultima e nao a ultima Sell
Tentei filtrar no HistorySelect com HistoryDealGetInteger....mas não consegui....

Alguma sugestão?

Acho que o que busca esta aqui...


https://www.mql5.com/pt/docs/constants/structures/mqltradetransaction

Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Estruturas de Dados / Estrutura de uma Transação de Negociação
Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Estruturas de Dados / Estrutura de uma Transação de Negociação
  • www.mql5.com
Ao realizar algumas ações específicas em uma conta de negociação, seu estado muda. Tais ações includem: Envio de uma solicitação de negociação a partir de algum aplicativo MQL5 no terminal usando as funções OrderSend e OrderSendAsync e sua posterior execução.Envio de uma solicitação de negociação por meio da interface gráfica do terminal e sua...
 
Jonathan Pereira:

Acho que o que busca esta aqui...


https://www.mql5.com/pt/docs/constants/structures/mqltradetransaction

Obrigado pela resposta!

Desculpe a insistência, tem os parâmetros la, mas não sei como buscar as Deals com eles....:-(
No caso:
A Ultima Deal que seja Venda e retornar Price_Open
A Ultima Deal que seja Compra e retornar Price_Open

Grato
 
Coladel:
Obrigado pela resposta!

Desculpe a insistência, tem os parâmetros la, mas não sei como buscar as Deals com eles....:-(
No caso:
A Ultima Deal que seja Venda e retornar Price_Open
A Ultima Deal que seja Compra e retornar Price_Open

Grato
string TransactionDescription(const MqlTradeTransaction &trans) 
  { 
//---  
   string desc=EnumToString(trans.type)+"\r\n"; 
   desc+="Ativo: "+trans.symbol+"\r\n"; 
   desc+="Bilhetagem (ticket) da operação: "+(string)trans.deal+"\r\n"; 
   desc+="Tipo de operação: "+EnumToString(trans.deal_type)+"\r\n"; 
   desc+="Bilhetagem (ticket) da ordem: "+(string)trans.order+"\r\n"; 
   desc+="Tipo de ordem: "+EnumToString(trans.order_type)+"\r\n"; 
   desc+="Estado da ordem: "+EnumToString(trans.order_state)+"\r\n"; 
   desc+="Ordem do tipo time: "+EnumToString(trans.time_type)+"\r\n"; 
   desc+="Expiração da ordem: "+TimeToString(trans.time_expiration)+"\r\n"; 
   desc+="Preço: "+StringFormat("%G",trans.price)+"\r\n"; 
   desc+="Gatilho do preço: "+StringFormat("%G",trans.price_trigger)+"\r\n"; 
   desc+="Stop Loss: "+StringFormat("%G",trans.price_sl)+"\r\n"; 
   desc+="Take Profit: "+StringFormat("%G",trans.price_tp)+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",trans.volume)+"\r\n"; 
//--- retorna a string obtida 
   return desc; 
  } 
 
Carissimos, se alguem puder ajuda, com base no meu codigo, onde incluo esse filtro?
Quero saber o Price_Open do ultimo Deal do tipo Buy (*Mesmo que a ultima deal seja do tipo sell)
Quero saber o Price_Open do ultimo Deal do tipo Sell (*Mesmo que a ultima deal seja do tipo buy)

if (HistorySelect(0, TimeCurrent()) && (HistoryDealsTotal() > 0))
                                     {
LastPrice = HistoryDealGetDouble(HistoryDealGetTicket(HistoryDealsTotal() - 1), DEAL_PRICE); 

Como eu faço pra obter essas informações, passei o final de semana pesquisando...

Me desculpem a ignorância estou aprendendo a programar....meu EA faz tudo que eu queria que fizesse mas não consigo aplicar esse filtro....ele sempre usa o ultimo e não o ultimo do tipo que eu escolher (buy or sell)

O mais próximo que cheguei foi o:

HistoryPositionSelectByPosition, mas não consegui entender como usa-lo....

Grato
 
Coladel:
Carissimos, se alguem puder ajuda, com base no meu codigo, onde incluo esse filtro?
Quero saber o Price_Open do ultimo Deal do tipo Buy (*Mesmo que a ultima deal seja do tipo sell)
Quero saber o Price_Open do ultimo Deal do tipo Sell (*Mesmo que a ultima deal seja do tipo buy)


Como eu faço pra obter essas informações, passei o final de semana pesquisando...

Me desculpem a ignorância estou aprendendo a programar....meu EA faz tudo que eu queria que fizesse mas não consigo aplicar esse filtro....ele sempre usa o ultimo e não o ultimo do tipo que eu escolher (buy or sell)

O mais próximo que cheguei foi o:

HistoryPositionSelectByPosition, mas não consegui entender como usa-lo....

Grato

Olá @Coladel

Você tem que fazer um loop verificando cada negócio realizado. Se você começar pelo último e for em direção ao primeiro, o primeiro negócio do tipo DEAL_TYPE_BUY que vc encontrar será a última compra e o primeiro do tipo DEAL_TYPE_SELL será a última venda.

Escrevi o código abaixo, que acredito que resolva o seu problema (importante: apenas escrevi, não cheguei a testar, deixo pra você a tarefa de testá-lo e corrigir eventuais erros):

int OnStart(void)
{
   double lastBuyPrice  = 0.0;
   double lastSellPrice = 0.0;
   
   for ( int i = HistoryDealsTotal()-1 ; i >= 0 && lastBuyPrice * lastSellPrice == 0.0 ; i-- )
   {
      ulong          ticket    = HistoryDealGetTicket(i);
      double         dealPrice = HistoryDealGetDouble(ticket,DEAL_PRICE);
      ENUM_DEAL_TYPE dealType  = (ENUM_DEAL_TYPE) HistoryDealGetInteger(ticket,DEAL_TYPE);
      if ( dealType == DEAL_TYPE_BUY  ) lastBuyPrice  = dealPrice;
      if ( dealType == DEAL_TYPE_SELL ) lastSellPrice = dealPrice;
   }
   
   PrintFormat ( "Preco da ultima compra: %9.3f" , lastBuyPrice  );
   PrintFormat ( "Preco da ultima venda : %9.3f" , lastSellPrice );

   return(0);
}

O código acima, que eu acredito que corresponda ao que você queria fazer, me parece uma solução boa para verificar "off-line" os negócios realizados (fora do contexto de um EA operando no mercado).

Se o seu objetivo for utilizar essas informações dentro da estratégia de negociação de um EA operando em tempo real no mercado, o código acima poderia ser inserido dentro da função OnTick(), mas creio que, nesse contexto, uma solução mais eficiente seria você declarar lastBuyPrice e lastSellPrice no início do programa (como variáveis globais) e simplesmente atualizá-las a cada evento OnTradeTransaction(), em vez de fazer o loop. Seria mais ou menos assim:

void OnTradeTransaction
(
   const MqlTradeTransaction &trans, 
   const MqlTradeRequest     &request, 
   const MqlTradeResult      &result
) 

{ 
   if ( trans.type == TRADE_TRANSACTION_DEAL_ADD )
   {
      if ( trans.deal_type == DEAL_TYPE_BUY  ) lastBuyPrice  = trans.price;
      if ( trans.deal_type == DEAL_TYPE_SELL ) lastSellPrice = trans.price;
   }
}

Vale a mesma observação para o código acima (não testei, apenas escrevi a ideia, vc provavelmente precisará fazer ajustes/correções).

Espero ter ajudado.

Abraços

 
Trader_Patinhas:

Olá @Coladel

Você tem que fazer um loop verificando cada negócio realizado. Se você começar pelo último e for em direção ao primeiro, o primeiro negócio do tipo DEAL_TYPE_BUY que vc encontrar será a última compra e o primeiro do tipo DEAL_TYPE_SELL será a última venda.

Escrevi o código abaixo, que acredito que resolva o seu problema (importante: apenas escrevi, não cheguei a testar, deixo pra você a tarefa de testá-lo e corrigir eventuais erros):

O código acima, que eu acredito que corresponda ao que você queria fazer, me parece uma solução boa para verificar "off-line" os negócios realizados (fora do contexto de um EA operando no mercado).

Se o seu objetivo for utilizar essas informações dentro da estratégia de negociação de um EA operando em tempo real no mercado, o código acima poderia ser inserido dentro da função OnTick(), mas creio que, nesse contexto, uma solução mais eficiente seria você declarar lastBuyPrice e lastSellPrice no início do programa (como variáveis globais) e simplesmente atualizá-las a cada evento OnTradeTransaction(), em vez de fazer o loop. Seria mais ou menos assim:

Vale a mesma observação para o código acima (não testei, apenas escrevi a ideia, vc provavelmente precisará fazer ajustes/correções).

Espero ter ajudado.

Abraços

Obrigado!! Funcionou perfeitamente! Demorei um pouco pra conseguir encaixar no código (devido minha inexperiência) mas funcionou!
Razão: