Valor do fechamento da ordem.

 

Prezados.

Preciso implementa no meu código um "se ocorrer um stop loss" informe o valor do preço de fechamento da ordem.

Alguém poderia indicar alguma artigo ou passar alguma exemplo de código?


Obrigado!

 

... no MQL5.

 

Não sei a estrutura do seu código, então o código poderia ser otimizado, mas poderia ser algo mais ou menos assim:


void PrintOnLoss(const string& symbol, uint ea_magic)

{

        if(HistorySelect(0,TimeCurrent())==false) return; // seleciona todo o período dentro do histórico de trades

        int deals_total=HistoryDealsTotal(); // obtém o total de trades do período
        
        for(int i = deals_total-1; i >=0; --i) // loop por todo o histórico, desde o trade mais atual, até achar o último trade no símbolo e com o magic number do EA
        {
                ulong ticket = HistoryDealGetTicket(i);
                string tmp_symbol=HistoryDealGetString(ticket,DEAL_SYMBOL);

                if(tmp_symbol==symbol)
                {
                        ulong magic = HistoryDealGetInteger(ticket,DEAL_MAGIC);

                        if(magic==ea_magic)
                        {
                                double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT); // obtém o lucro do trade de index i
                                int reason=HistoryDealGetInteger(ticket,DEAL_REASON); // obtém a razão de execução do trade de index i
                                double price=HistoryDealGetDouble(ticket,DEAL_PRICE); // obtém o preço de saída

                                if(profit<0)
                                {
                                        Print(">>> Trade encerrado com prejuízo: R$ ", profit, " - preço: ", price);
                                }

                                if(reason==DEAL_REASON_SL)
                                {
                                        Print(">>> Trade encerrado com execução no stop loss - preço: ", price);
                                }             
                                return;  
                        }
                }
        }
}


Você pode obter tanto o lucro quanto a razão de execução. Veja que é possível que um trade dê loss, mas ainda assim seja executado no take profit (quando você faz trailing stop e o preço de execução do TP é abaixo do preço de entrada numa operação de venda, por exemplo), assim como é possível que o trade dê loss sem execução do TP/SL (fechamento pelo usuário, por exemplo). Aí vai de você qual informação você pretende obter.


Quando você seleciona o histórico, todos os negócios (deals, que consistem basicamente na execução de uma compra ou venda) são obtidos para aquele período, ou seja, todos os trades de entrada e saída da operação. Se você quiser, ainda pode inserir a linha

ENUM_DEAL_ENTRY entry_type = HistoryDealGetInteger(ticket,DEAL_ENTRY);

para identificar se o negócio foi de entrada ou saída. Os negócios de entrada sempre retornam 0 como lucro, enquanto os de saída podem retornar qualquer valor (positivo para lucro ou negativo para prejuízo). É o mais adequado, tendo em vista a possibilidade de sair no breakeven. Não coloquei no exemplo porque normalmente não uso breakeven nos meus EAs, então como sei que não tem a possibilidade de sair no 0, não preciso checar nos meus códigos (mas acho que é bom, até porque você elimina a possibilidade de continuar parte do loop com antecedência, tornando o código mais eficaz). 

 
Obrigado pela dica!!!