identificação de fechamento da ordem anterior

Para adicionar comentários, por favor Faça o login ou registrar
Evandro Pinho
38
Evandro Pinho  
Boa tarde, sou iniciante em MQL, estou desenvolvendo um EA que lança ordem conforme a ordem anterior, se ela atingiu TP ou SL, qual a melhor forma de fazer isso?
double verificaLucro()
{
   for (int i = HistoryDealsTotal() ; i >= 0; i--)
   {
      ulong          ticket    = HistoryDealGetTicket(i);
      ENUM_DEAL_TYPE dealType  = (ENUM_DEAL_TYPE) HistoryDealGetInteger(ticket,DEAL_TYPE);
      ENUM_DEAL_REASON dealReason= (ENUM_DEAL_REASON) HistoryDealGetInteger(ticket, DEAL_REASON);
      double         dealProfit = HistoryDealGetDouble(ticket, DEAL_PROFIT);
      if ( dealType == DEAL_TYPE_BUY  ) return dealProfit;
      if ( dealType == DEAL_TYPE_SELL ) return dealProfit;
   }
   return 0.0;
}

esse código está errado? debuguei para saber o valor de dealReason e só tenho o retorno de : DEAL_REASON_CLIENT
ai resolvi trabalhar com o lucro/prejuízo, mas ainda não obtive sucesso. Alguma sugestão?

[]'s

Nelson Silva
1889
Nelson Silva  
Evandro Pinho:
Boa tarde, sou iniciante em MQL, estou desenvolvendo um EA que lança ordem conforme a ordem anterior, se ela atingiu TP ou SL, qual a melhor forma de fazer isso?

esse código está errado? debuguei para saber o valor de dealReason e só tenho o retorno de : DEAL_REASON_CLIENT
ai resolvi trabalhar com o lucro/prejuízo, mas ainda não obtive sucesso. Alguma sugestão?

[]'s

    Oi, como vai?


    Eu vou te ajudar, porém precisamos clarificar a questão.

    Deseja o retorno do motivo do fechamento ou o resultadoFinanceiro da operação?

Rogerio Giannetti Torres
3155
Rogerio Giannetti Torres  
Evandro Pinho:

Olá,

bem está faltando o comando abaixo. Antes de varrer o histórico de posições é necessário obtê-lo.

bool  HistorySelect(
   datetime  from_date,     // a partir da data
   datetime  to_date        // até à data
   );


Uma solução mais otimizada é usar o evento OnTradeTrasnsaction(), segue um modelo para usar.


void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
	ulong                deal_magic=0;
	ENUM_DEAL_TYPE       deal_type;
	ENUM_DEAL_ENTRY      deal_entry;
	ENUM_DEAL_REASON     deal_reason;
	double               deal_profit=0;
   if(trans.type==TRADE_TRANSACTION_DEAL_ADD && trans.symbol==_Symbol)
     {
      if(HistoryDealSelect(trans.deal))
        {
	 deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
         deal_entry=(ENUM_DEAL_ENTRY) HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_reason=(ENUM_DEAL_REASON) HistoryDealGetInteger(trans.deal,DEAL_REASON);
         if(deal_magic==inpMagicNumber)
           {
            if(deal_entry!=DEAL_ENTRY_IN)
              {
              if((ENUM_DEAL_REASON) deal_reason==DEAL_REASON_TP || (ENUM_DEAL_REASON) deal_reason==DEAL_REASON_SL) 
		deal_profit=HistoryDealGetDouble(trans.deal,DEAL_PROFIT);
              }
            if((ENUM_DEAL_ENTRY)deal_entry==DEAL_ENTRY_IN)
              {
              // --- 
              }
           }
         }
    }
}
Evandro Pinho
38
Evandro Pinho  
Nelson Silva:

    Oi, como vai?


    Eu vou te ajudar, porém precisamos clarificar a questão.

    Deseja o retorno do motivo do fechamento ou o resultadoFinanceiro da operação?

gostaria que fosse identificado se a operação foi fechada em SL ou TP para prosseguir com a estratégia.

Evandro Pinho
38
Evandro Pinho  
Rogerio Giannetti Torres:

Olá,

bem está faltando o comando abaixo. Antes de varrer o histórico de posições é necessário obtê-lo.

bool  HistorySelect(
   datetime  from_date,     // a partir da data
   datetime  to_date        // até à data
   );


Uma solução mais otimizada é usar o evento OnTradeTrasnsaction(), segue um modelo para usar.


e para garantir apenas sobre a última ordem ? também é necessário fazer o HistorySelect? eu queria apenas saber se a última ordem foi TP ou SL que fez ela parar.
Rogerio Giannetti Torres
3155
Rogerio Giannetti Torres  
Evandro Pinho:
e para garantir apenas sobre a última ordem ? também é necessário fazer o HistorySelect? eu queria apenas saber se a última ordem foi TP ou SL que fez ela parar.

Evandro,

eu já te respondi é só ler.  Se ainda tem duvida leia a documentação do MQL5 referente ao comando.

Para adicionar comentários, por favor Faça o login ou registrar