Limite diário no MT5

 

Pessoal, boa tarde!

Estou tentando implementar no meu código o limite de ganho e perda diário. Alguém poderia dar alguma dica?

Segue parte do código:


//-----------------------

#include  <Trade\Trade.mqh>

CTrade trade;


input double lote = 1.0;
input double stoploss = 200;
input double takeProfit = 200;



input ulong magicNum = 123456;
input ulong desvPts = 50;
input ENUM_ORDER_TYPE_FILLING preenchimento = ORDER_FILLING_RETURN;

double PRC;
double STL;
double TKP;

MqlTick ultimoTick;

bool posAberta;
bool ordPendente;


//-------------------



void OnTick()


{


if( LogicaCompra() && !posAberta && !ordPendente)  
      {
      PRC = NormalizeDouble(ultimoTick.ask, _Digits);
      STL = NormalizeDouble(PRC - stoploss, _Digits);
      TKP = NormalizeDouble(PRC + takeProfit, _Digits);
      if(trade.Buy(lote, _Symbol, PRC, STL, TKP, ""))
     
         {
         Print ("Ordem de compra - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
         }
       else
         {
         Print ("Ordem de compra - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
         }
      }
   else if( LogicaVenda() && !posAberta && !ordPendente )   
      {
       PRC = NormalizeDouble(ultimoTick.bid, _Digits); 
       STL = NormalizeDouble(PRC + stoploss, _Digits);
       TKP = NormalizeDouble(PRC - takeProfit, _Digits);
       if(trade.Sell(lote, _Symbol, PRC, STL, TKP, ""))
         {
       ;
         Print ("Ordem de venda - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
         }
       else
         {
         Print ("Ordem de venda - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
         }    
      }


}


.... e boas operações para todos!

 
fabriciopduarte:

Pessoal, boa tarde!

Estou tentando implementar no meu código o limite de ganho e perda diário. Alguém poderia dar alguma dica?

Segue parte do código:


//-----------------------

#include  <Trade\Trade.mqh>

CTrade trade;


input double lote = 1.0;
input double stoploss = 200;
input double takeProfit = 200;



input ulong magicNum = 123456;
input ulong desvPts = 50;
input ENUM_ORDER_TYPE_FILLING preenchimento = ORDER_FILLING_RETURN;

double PRC;
double STL;
double TKP;

MqlTick ultimoTick;

bool posAberta;
bool ordPendente;


//-------------------



void OnTick()


{


if( LogicaCompra() && !posAberta && !ordPendente)  
      {
      PRC = NormalizeDouble(ultimoTick.ask, _Digits);
      STL = NormalizeDouble(PRC - stoploss, _Digits);
      TKP = NormalizeDouble(PRC + takeProfit, _Digits);
      if(trade.Buy(lote, _Symbol, PRC, STL, TKP, ""))
     
         {
         Print ("Ordem de compra - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
         }
       else
         {
         Print ("Ordem de compra - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
         }
      }
   else if( LogicaVenda() && !posAberta && !ordPendente )   
      {
       PRC = NormalizeDouble(ultimoTick.bid, _Digits); 
       STL = NormalizeDouble(PRC + stoploss, _Digits);
       TKP = NormalizeDouble(PRC - takeProfit, _Digits);
       if(trade.Sell(lote, _Symbol, PRC, STL, TKP, ""))
         {
       ;
         Print ("Ordem de venda - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
         }
       else
         {
         Print ("Ordem de venda - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
         }    
      }


}


.... e boas operações para todos!

No seu topico de stoploss ti mostraram uma função PrintOnLoss() tu poderia adaptar ela para fazer o que voce quer com limites diarios de perda e ganho dado que ela vasculha o historico de ordens fechadas. Mas pelo visto voce não estudou aquele codigo com atenção.

 

Primeiramente gostaria de agradecer pela dica. 

Segui sua orientação, e vi que no "profit" retorna o resultado de gain ou loss.Então pensei em criar a variável profitLOSS para acumular os valores do profit<0, mas o loop retornou o seguinte

CS    0    00:02:22.982        2024.02.22 09:22:40   profitLOSS..............: 5.0
CS    0    00:02:22.983        2024.02.22 09:22:59   profitLOSS..............: 10.0
CS    0    00:02:22.983        2024.02.22 09:23:00   profitLOSS..............: 15.0

...
CS    0    00:02:23.987    ROBO_FAB_T2_ADX 001 teste combinado Willians03 financeiro (WINJ24,M2)    2024.02.22 12:10:20   profitLOSS..............: -4120.0
CS    0    00:02:23.987    ROBO_FAB_T2_ADX 001 teste combinado Willians03 financeiro (WINJ24,M2)    2024.02.22 12:10:40   profitLOSS..............: -4130.0
CS    0    00:02:23.992    ROBO_FAB_T2_ADX 001 teste combinado Willians03 financeiro (WINJ24,M2)    2024.02.22 12:10:59   profitLOSS..............: -4140.0
...
CS    0    00:30:45.136       >>> RESULTADO totalProfit .............:  -16240.0


A determinado intervalo de segundo, foi somando até chegar em -16240.0


Ainda não entendi bem a lógica do que ocorreu.

Ricardo Rodrigues Lucca
Ricardo Rodrigues Lucca
  • 2023.12.24
  • www.mql5.com
Perfil do Trader
 
fabriciopduarte #:

Primeiramente gostaria de agradecer pela dica. 

Segui sua orientação, e vi que no "profit" retorna o resultado de gain ou loss.Então pensei em criar a variável profitLOSS para acumular os valores do profit<0, mas o loop retornou o seguinte

CS    0    00:02:22.982        2024.02.22 09:22:40   profitLOSS..............: 5.0
CS    0    00:02:22.983        2024.02.22 09:22:59   profitLOSS..............: 10.0
CS    0    00:02:22.983        2024.02.22 09:23:00   profitLOSS..............: 15.0

...
CS    0    00:02:23.987    ROBO_FAB_T2_ADX 001 teste combinado Willians03 financeiro (WINJ24,M2)    2024.02.22 12:10:20   profitLOSS..............: -4120.0
CS    0    00:02:23.987    ROBO_FAB_T2_ADX 001 teste combinado Willians03 financeiro (WINJ24,M2)    2024.02.22 12:10:40   profitLOSS..............: -4130.0
CS    0    00:02:23.992    ROBO_FAB_T2_ADX 001 teste combinado Willians03 financeiro (WINJ24,M2)    2024.02.22 12:10:59   profitLOSS..............: -4140.0
...
CS    0    00:30:45.136       >>> RESULTADO totalProfit .............:  -16240.0


A determinado intervalo de segundo, foi somando até chegar em -16240.0


Ainda não entendi bem a lógica do que ocorreu.

Não entendo o que voce fez simplesmente pela saída, voce teria que postar o código para ajudar melhor. Voce colocar o profit em uma variavel e loss em outra não parece ser problema, seria jeito de escrever o código.
 
Ricardo Rodrigues Lucca #:
Não entendo o que voce fez simplesmente pela saída, voce teria que postar o código para ajudar melhor. Voce colocar o profit em uma variavel e loss em outra não parece ser problema, seria jeito de escrever o código.
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==magicNum)
                        {
                               
                                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);
                                totalProfit = profit + totalProfit;
                                Print(">>> RESULTADO totalProfit .............:  ", totalProfit);
                                }

                                if(reason==DEAL_REASON_SL)
                                {
                                        Print(">>> Trade encerrado com execução no stop loss - preço: ", price);
                                }             
                                return;  
                        }
                }
        }
}
 
fabriciopduarte #:
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==magicNum)
                        {
                               
                                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);
                                totalProfit = profit + totalProfit;
                                Print(">>> RESULTADO totalProfit .............:  ", totalProfit);
                                }

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

Algum moderador vai pegar no seu pé porque precisaria o código ser postado dentro das tags de codigo (fica do lado esquerdo de um botão tipo umas velas e 3 a esquerda do negrito). Mas enfim, eu vi ai que tu tá somando totalProfit, mas voce nunca volta esse valor para zero. Antes de fazer a passagem para contar os valores negativados voce deveria colocar a variavel no estado inicial (zero), se não a cada vez que voce passa nesse código ele vai decrementando com o negativo atual.

Alterei alem da linha da variavel totalProfit, o select do historico para ser o valor do dia com isso cortei o return.

void PrintOnLoss(const string& symbol, uint ea_magic)

{
        if(HistorySelect(iTime(NULL, PERIOD_D1,0),TimeCurrent())==false) return; // LINHA ALTERADA

        int deals_total=HistoryDealsTotal(); // obtém o total de trades do período
        totalProfit = 0; // LINHA INSERIDA
        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==magicNum)
                        {
                               
                                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);
                                totalProfit = profit + totalProfit;
                                Print(">>> RESULTADO totalProfit .............:  ", totalProfit);
                                }

                                /*if(reason==DEAL_REASON_SL)
                                {
                                        Print(">>> Trade encerrado com execução no stop loss - preço: ", price);
                                }             
                                return; */ // REMOVI TODO o bloco
                        }
                }
        }
} 
 
Ricardo Rodrigues Lucca #:

Algum moderador vai pegar no seu pé porque precisaria o código ser postado dentro das tags de codigo (fica do lado esquerdo de um botão tipo umas velas e 3 a esquerda do negrito). Mas enfim, eu vi ai que tu tá somando totalProfit, mas voce nunca volta esse valor para zero. Antes de fazer a passagem para contar os valores negativados voce deveria colocar a variavel no estado inicial (zero), se não a cada vez que voce passa nesse código ele vai decrementando com o negativo atual.

Alterei alem da linha da variavel totalProfit, o select do historico para ser o valor do dia com isso cortei o return.

Preciso entender melhor como funcionam as regras por aqui.

Anteriormente inclui a variável como sugeriu, mas ficava retornando 0.0. Muito provável que fiz isso no local errado do código. Sua orientação funcionou perfeitamente.  Muito obrigado pela dica!!!
Você oferece curso de MQL5 ou poderia sugerir um curso? Tem alguns na internet, mas o conteúdo era fraco.

Hoje fui para conta real, e apresentou erro na abertura das ordens. É recomendado abrir novo tópico ou devo seguiu o assunto por aqui?


 
fabriciopduarte #:

Preciso entender melhor como funcionam as regras por aqui.

Anteriormente inclui a variável como sugeriu, mas ficava retornando 0.0. Muito provável que fiz isso no local errado do código. Sua orientação funcionou perfeitamente.  Muito obrigado pela dica!!!
Você oferece curso de MQL5 ou poderia sugerir um curso? Tem alguns na internet, mas o conteúdo era fraco.

Hoje fui para conta real, e apresentou erro na abertura das ordens. É recomendado abrir novo tópico ou devo seguiu o assunto por aqui?


Segue o assunto por aqui, provavelmente foi erro de requote ou invalid stop/price/etc. Basicamente faltaria arredondar os valores de preço que voce informa da maneira a estarem alinhados corretamente. Poderia estudar CSymbol::NormalizePrice para ver como normaliza certinho o preço.

Sobre a outra pergunta, organizar o material de maneira logica é bem complicado e as vezes o iniciante é bem... iniciante. Ao inves de perguntar sobre algum termo que falta ele fica calado e joga no google pra ver. Dai não da pra melhorar o fluxo... Outras vezes da impressão que o cara ta fazendo so pra irritar, dai não sirvo não nem pra video no youtube kkkk. Se procurar acho que disseram no forum algo sobre um tal de vilella, nunca vi. Mas talvez te ajude.

Razão: