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
- www.mql5.com
Acho que o que busca esta aqui...
https://www.mql5.com/pt/docs/constants/structures/mqltradetransaction
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
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; }
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
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
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
- 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
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?