Pessoal, já tenho o codigo que retorna o valor total que um EA executou no dia.
Porem quando fecho a ordem de forma manual, o magic number fica com valor 0 e a função não conta o valor.
Teria algum exemplo de como consigo capturar os dados de ordens fechadas manualmente que iniciaram a partir de um EA pelo magic number?
Olá
Adan, basta testar também se o DEAL_MAGIC == 0;
O Problema neste caso é saber qual robo originou a ordem.
Preciso, saber o valor gerado por cada entrada feita pelo EA mesmo se foi finalizada manualmente.
obs: tenho mais de 1 EA com magic numbers diferentes rodando com este cenario.
Bom, você comentou o teste correto e inclui um teste incompleto.
Comente o teste incompleto, retire o comentário do teste correto e faça o teste do magic: (DEAL_MAGIC == magic OR DEAL_MAGIC == 0).
Mas, se vc tem mais de um robô rodando sobre mesmo ATIVO, aí lascou não tem jeito.
Resolvido
double retornaValoreDiaFechado() { double Total_Fechadas=0; datetime time_start; time_start = (datetime) (86400*(((ulong)TimeCurrent())/86400)); double position_id; if(HistorySelect(time_start,TimeCurrent())) { int hst = HistoryDealsTotal(); for(int i = hst - 1; i >= 0; i--) { const ulong Ticket = HistoryDealGetTicket(i); if(HistoryDealGetInteger(Ticket, DEAL_MAGIC) == in_magic) Total_Fechadas += HistoryDealGetDouble(Ticket, DEAL_PROFIT); else if(HistoryDealGetInteger(Ticket, DEAL_MAGIC) == 0) { position_id = HistoryDealGetInteger(Ticket, DEAL_POSITION_ID); for(int ii = hst - 1; ii >= 0; ii--) { ulong Ticket2 = HistoryDealGetTicket(ii); if(HistoryDealGetInteger(Ticket2, DEAL_MAGIC) == in_magic && HistoryDealGetInteger(Ticket2, DEAL_POSITION_ID) == position_id) Total_Fechadas += HistoryDealGetDouble(Ticket, DEAL_PROFIT); } } } } return Total_Fechadas; }
Olha, acredito que você terá um melhor resultado se observar o trade como um conjunto, pela ordem. Assim você engloba todos os deals, inclusive os fechados manualmente.
HistorySelect(datainicial,TimeCurrent()); for(int i=0; i<HistoryOrdersTotal(); i++) { long ticket = HistoryOrderGetTicket(i); if(HistoryOrderGetInteger(ticket,ORDER_MAGIC)==Magic) { for(int x=0; x<HistoryDealsTotal(); x++) { long dealticket = HistoryDealGetTicket(x); if(ticket == HistoryDealGetInteger(dealticket,DEAL_POSITION_ID)) { resultado+=HistoryDealGetDouble(dealticket,DEAL_PROFIT)+HistoryDealGetDouble(dealticket,DEAL_SWAP)+HistoryDealGetDouble(dealticket,DEAL_COMMISSION);
Pode ser a solução testar o DEAL_POSITION_ID ?!. Vc. tem certeza que o código está correto?
Testado hoje em ambiente real, resultado positivo, saí de 4 robos no min indice manualmente e retornou cada resultado separado por magic number
O DEAL_POSITION_ID se mantem na entrada e na saida, mesmo saindo de forma manual!
- 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
Pessoal, já tenho o codigo que retorna o valor total que um EA executou no dia.
Porem quando fecho a ordem de forma manual, o magic number fica com valor 0 e a função não conta o valor.
Teria algum exemplo de como consigo capturar os dados de ordens fechadas manualmente que iniciaram a partir de um EA pelo magic number?