FUNÇÃO PARA TRAVAR OPERAÇÕES APÓS O TAKE PROFIT

 
Pessoal, eu gostaria de saber como eu faço um função que identifica se o meu Take Profit foi atingido. Eu quero que quando o meu take for atingido o meu robô trave as operações no dia.
 

Eu fiz dessa forma.

int OnInit(void)
  {
   CounterRestart();
   return(INIT_SUCCEEDED);
  }

void OnTick(void)
  {
   // não pode abir posições
   if(CounterRead()>=limite)
     {
      return;
     }
   // pode abrir posições
  }

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
   if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
     {
      if(HistoryDealGetInteger(trans.deal,DEAL_ENTRY)==DEAL_ENTRY_IN || HistoryDealGetInteger(trans.deal,DEAL_ENTRY)==DEAL_ENTRY_INOUT)
        {
         CounterIncrement();
        }
     }
  }


bool CounterIsNewDay(void)
  {
   if(!FileIsExist(file_name))
     {
      return true;
     }
   int file = FileOpen(file_name,FILE_READ);
   if(StringFind(FileReadString(file),TimeToString(TimeTradeServer(),TIME_DATE))>=0)
     {
      FileClose(file);
      return false;
     }
   FileClose(file);
   return true;
  }

void CounterCreate(void)
  {
   if(FileIsExist(file_name))
     {
      FileDelete(file_name);
     }
   int file = FileOpen(file_name,FILE_WRITE|FILE_BIN);
   FileWriteString(file,TimeToString(TimeTradeServer(),TIME_DATE));
   FileClose(file);
   file = FileOpen(file_count,FILE_WRITE|FILE_BIN);
   FileWriteInteger(file,0);
   FileClose(file);
  }

int CounterRead(void)
  {
   int file = FileOpen(file_count,FILE_READ|FILE_BIN);
   int count = FileReadInteger(file);
   FileClose(file);
   return count;
  }

int CounterIncrement(void)
  {
   CounterRestart();
   int count = CounterRead();
   FileDelete(file_count);
   count ++;
   int file = FileOpen(file_count,FILE_WRITE|FILE_BIN);
   FileWriteInteger(file,count);
   FileClose(file);
   return count;
  }

bool CounterRestart(void)
  {
   if(CounterIsNewDay())
     {
      report.Add("é um novo dia! Contador de operações reiniciado! ",TimeToString(TimeTradeServer(),TIME_DATE));
      CounterCreate();
      return true;
     }
   return false;
  }
 
No meu caso é pra contar as entradas. Se quiser contar as saídas da operação é só trocar DEAL_ENTRY_IN por DEAL_ENTRY_OUT
 
Também pode fazer de uma forma mais simples. Somente iterando sobre o histórico de negócios, pegando o negócios na mesma data. Fiz da forma acima por que no meu caso, cada negócio tem que ser avaliado o motivo da realização do negócio. Aí nem todos ENTRY_IN ou INOUT são contados.
 

Bom dia!


Para testes:

bool TakeProfitActivated()
  {
//   datetime time_start = (datetime) (86400*(((ulong)TimeCurrent())/86400));
   datetime time_start = iTime(_Symbol, PERIOD_D1, 0);
   ulong    ticket;
   int      cnt;

   if(HistorySelect(time_start, TimeCurrent()))
     {
      for(cnt = HistoryDealsTotal() - 1; cnt >= 0; cnt --)
        {
         ticket = HistoryDealGetTicket(cnt);

         if(HistoryDealGetString(ticket, DEAL_SYMBOL) == _Symbol && HistoryDealGetInteger(ticket, DEAL_MAGIC) == EA_MAGIC && HistoryDealGetInteger(ticket, DEAL_REASON) == DEAL_REASON_TP)
           {
            return(true);
           }
        }
     }
   else
     {
      Print(_Symbol, " - Error getting operations history...");
     }

   return(false);
  }
 
Muito obrigado pela ajuda, rapaziada. Me ajudaram demais.