Encerrar posição - página 2

 
Na Onda #seria exatamente isso que estou precisando, mas nao estou conseguindo deixar ele atualizando so na variavel flagstopdiario sou novato rsrs poderia me auxiliar? todas as mudanças que viz faz ele para de operar nei abrir operação mais rsrs novato e f*** ne

Opa, considerando que o seu EA esteja funcionando de acordo com a sua descrição na abertura do tópico, se você deseja implementar essa alteração de permanecer com as posições abertas até o encerramento pelos stops, acho que o mais simples seria apenas inibir os comandos de encerramento das mesmas, deixando a função EncerraPosicao() apenas atualizando a variável flagStopDiario (melhor também pensar noutro nome pra função...😊):

//=============================================================
void EncerraPosicao(double Pontos_History)
  {
//ulong Ticket = 0;
// if(Pontos_History < ((-1)*((perdaDiaria/100)*balanceAccount)) && perdaDiaria>0)
   if(Pontos_History < ((-1)*perdaDiaria) && perdaDiaria>0)
     {
      /*for(int i = 0; i <= PositionsTotal(); i++)
        {
         Ticket = PositionGetTicket(i);
         if(Ticket > 0)
           {
            ulong magic = PositionGetInteger(POSITION_MAGIC);
            if(magicNumber == magic)
              {
               if(PositionGetSymbol(i)==_Symbol)
                  trade.PositionClose(_Symbol,ULONG_MAX);
              }
           }
        }*/
      flagStopDiario = true;
     }
//if(Pontos_History>((ganhoDiario/100)*balanceAccount) && ganhoDiario>0)
   if(Pontos_History>ganhoDiario && ganhoDiario>0)
     {
      /*for(int i = 0; i <= PositionsTotal(); i++)
        {
         Ticket = PositionGetTicket(i);
         if(Ticket > 0)
           {
            ulong magic = PositionGetInteger(POSITION_MAGIC);
            if(magicNumber == magic)
              {
               if(PositionGetSymbol(i)==_Symbol)
                 {
                  trade.PositionClose(_Symbol,ULONG_MAX);
                 }
              }
           }
        }*/
      flagStopDiario = true;
     }
  }
//==========================================================================================

Estou considerando também, claro, que em algum outro local do seu código, a cada novo dia, a variável flagStopDiario retorna para o seu valor inicial false...

Se com essa pequena alteração o EA não funcionar conforme o esperado, descreva o problema claramente, anexe possíveis mensagens de erros das abas Diário e Experts, que ficam na Caixa de Ferramentas, dentre outras ações que você julgar que poderão facilitar a compreensão do problema...

 
Vinicius de Oliveira #:

Opa, considerando que o seu EA esteja funcionando de acordo com a sua descrição na abertura do tópico, se você deseja implementar essa alteração de permanecer com as posições abertas até o encerramento pelos stops, acho que o mais simples seria apenas inibir os comandos de encerramento das mesmas, deixando a função EncerraPosicao() apenas atualizando a variável flagStopDiario (melhor também pensar noutro nome pra função...😊):

Estou considerando também, claro, que em algum outro local do seu código, a cada novo dia, a variável flagStopDiario retorna para o seu valor inicial false...

Se com essa pequena alteração o EA não funcionar conforme o esperado, descreva o problema claramente, anexe possíveis mensagens de erros das abas Diário e Experts, que ficam na Caixa de Ferramentas, dentre outras ações que você julgar que poderão facilitar a compreensão do problema...

Acredito que ele não expressou bem o problema original e que ele não tem haver com esse código, ele estaria querendo incluir stops para operação, mas esta fazendo a gerencia com os stops diários. Remover os stops diários pode não ser a ajuda que ele quer realmente.
 
Vinicius de Oliveira #:
//============================================================= void EncerraPosicao(double Pontos_History)   { //ulong Ticket = 0; // if(Pontos_History < ((-1)*((perdaDiaria/100)*balanceAccount)) && perdaDiaria>0)    if(Pontos_History < ((-1)*perdaDiaria) && perdaDiaria>0)      {       /*for(int i = 0; i <= PositionsTotal(); i++)         {          Ticket = PositionGetTicket(i);          if(Ticket > 0)            {             ulong magic = PositionGetInteger(POSITION_MAGIC);             if(magicNumber == magic)               {                if(PositionGetSymbol(i)==_Symbol)                   trade.PositionClose(_Symbol,ULONG_MAX);               }            }         }*/       flagStopDiario = true;      } //if(Pontos_History>((ganhoDiario/100)*balanceAccount) && ganhoDiario>0)    if(Pontos_History>ganhoDiario && ganhoDiario>0)      {       /*for(int i = 0; i <= PositionsTotal(); i++)         {          Ticket = PositionGetTicket(i);          if(Ticket > 0)            {             ulong magic = PositionGetInteger(POSITION_MAGIC);             if(magicNumber == magic)               {                if(PositionGetSymbol(i)==_Symbol)                  {                   trade.PositionClose(_Symbol,ULONG_MAX);                  }               }            }         }*/       flagStopDiario = true;      }   } //==========================================================================================

Muito obrigado foi exatamente isso, porem deixe  o stop como estava antes, pq ele nao estava contabilizando, em um teste chegou a 1000 pontos negativo e nao encerrou a posição que estava configurado para uma perca de 50reais


Porem mesmo antes de eu querer mudar isso, nos backteste se eu coloco 2 dias ou mais pra testar, ele opera em um dia e no outro nao opera, nao estou conseguindo saber onde posso mecher para arrumar isso, voce ou alguem pode me ajudar

desde ja agradeço

 
Na Onda #:

Muito obrigado foi exatamente isso, porem deixe  o stop como estava antes, pq ele nao estava contabilizando, em um teste chegou a 1000 pontos negativo e nao encerrou a posição que estava configurado para uma perca de 50reais


Porem mesmo antes de eu querer mudar isso, nos backteste se eu coloco 2 dias ou mais pra testar, ele opera em um dia e no outro nao opera, nao estou conseguindo saber onde posso mecher para arrumar isso, voce ou alguem pode me ajudar

desde ja agradeço

Revise se no fim do dia ou inicio do dia, voce esta voltando as variaveis envolvidas pro valor inicial.
 
Ricardo Rodrigues Lucca #Acredito que ele não expressou bem o problema original e que ele não tem haver com esse código, ele estaria querendo incluir stops para operação, mas esta fazendo a gerencia com os stops diários. Remover os stops diários pode não ser a ajuda que ele quer realmente.

Realmente, e pelo comentário na sequência, parece ser exatamente isso...

 
Na Onda #Muito obrigado foi exatamente isso, porem deixe  o stop como estava antes, pq ele nao estava contabilizando, em um teste chegou a 1000 pontos negativo e nao encerrou a posição que estava configurado para uma perca de 50reais Porem mesmo antes de eu querer mudar isso, nos backteste se eu coloco 2 dias ou mais pra testar, ele opera em um dia e no outro nao opera, nao estou conseguindo saber onde posso mecher para arrumar isso, voce ou alguem pode me ajudar

desde ja agradeço

Infelizmente, por esses trechos do código que você postou e pela narrativa, eu não consegui identificar devidamente o problema... Você pode esperar pra ver se alguém consegue compreender e lhe passar alguma orientação válida, ou também pode postar o código completo e tentar melhorar a exposição do problema, dentre outras possibilidades... Boa sorte!! 👍

 
Vinicius de Oliveira #:

Infelizmente, por esses trechos do código que você postou e pela narrativa, eu não consegui identificar devidamente o problema... Você pode esperar pra ver se alguém consegue compreender e lhe passar alguma orientação válida, ou também pode postar o código completo e tentar melhorar a exposição do problema, dentre outras possibilidades... Boa sorte!! 👍

tesntando aqui e realmente ate mesmo na conta real, ele opera um dia outro nao, o que eu percebe so ocorre isso nos backteste quando coloco meta diaria, se eu deixar sem a meta diaria, ele opera normalmente todos os dias

porem não achei conflito se puderem me ajudar novamente 


//=============================================================================  
bool HorarioEntrada()
{
   TimeToStruct(TimeCurrent(), DiaHoraAtual);
   if(DiaHoraAtual.hour >= HorarioInicial.hour &&  DiaHoraAtual.hour <= HorarioTermino.hour  )
   {
      if(DiaHoraAtual.hour == HorarioInicial.hour)
         if(DiaHoraAtual.min >= HorarioInicial.min)
            return true;
         else
            return false;
      if(DiaHoraAtual.hour == HorarioTermino.hour)
         if(DiaHoraAtual.min <= HorarioTermino.min)
            return true;
      else
         return false;
      return true;
   }
   else
      return false;   
}
//===========================================================================================================
bool HorarioFechamento()
{

   TimeToStruct(TimeCurrent(), DiaHoraAtual);
   if(DiaHoraAtual.hour >= HorarioEncerramento.hour)
   {
      if(DiaHoraAtual.hour == HorarioEncerramento.hour)
         if(DiaHoraAtual.min >= HorarioEncerramento.min)
         {
            trade.PositionClose(_Symbol,ULONG_MAX);
            int TotalDeOrdens = OrdersTotal();
            flagStopDiario = false;
            for(int i = (TotalDeOrdens - 1); i >= 0; i--)
            {
               if(OrderGetTicket(i) > 0) trade.OrderDelete(OrderGetTicket(i));
               
            }
           return true;
         }
      else 
      {
         return false;
      }
   return true;
   }
   return false;
}
//======================================================================================
double CalculoDiario()
{
   double Entrega = 0;
   double Pontos_History = 0;
   double LoteHistory = 0;
   double ProfitHistory = 0;
   double ProfitSoma = 0;
   double  Balanco = 0;
   ulong Ticket = 0;
   double Pontos_Totais = 0;
   double Volume_Balanco = 0;
   datetime DataFinal=StringToTime(TimeToString(TimeCurrent(), TIME_DATE) + " " + "23:59"); 
   datetime DataInicial = StringToTime(TimeToString(TimeCurrent(), TIME_DATE) + " " + "00:01");                                                                                                                     
   HistorySelect(DataInicial,DataFinal);
   for(int i = 0; i <= HistoryDealsTotal(); i++)
   {     
      ulong magic = 0;
      Ticket = HistoryDealGetTicket(i);
      if(Ticket > 0)
      {  
         magic = HistoryDealGetInteger(Ticket,DEAL_MAGIC);
         if(magicNumber == magic)
         { 
            ENUM_DEAL_ENTRY tipo_entrada = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(Ticket,DEAL_ENTRY);   
            ProfitHistory = HistoryDealGetDouble(Ticket,DEAL_PROFIT);
            LoteHistory = HistoryDealGetDouble(Ticket,DEAL_VOLUME);
            if(LoteHistory*valorPonto != 0)
            {
               ProfitSoma = ProfitSoma + ProfitHistory;
               Pontos_History = ((ProfitHistory)/(LoteHistory*valorPonto)) + Pontos_History;        
            }
         }
      }                  
   }    
   if(ProfitSoma>salvaProfit)
   {
      salvaProfit = ProfitSoma;
      multiplicador = 1;
      contadorMartingale = 0;
   }   
   if(ProfitSoma<salvaProfit)
   {
      salvaProfit = ProfitSoma;
      multiplicador = martingaleMultiplicar;
      contadorMartingale++;
   }     
   for(int i = 0; i <= PositionsTotal(); i++)
   {     
      ulong magic = 0;
      Ticket = PositionGetTicket(i);
      if(Ticket > 0)
      {        
         magic = PositionGetInteger(POSITION_MAGIC);
         if(magicNumber == magic)
         { 
            ProfitHistory = PositionGetDouble(POSITION_PROFIT);
            LoteHistory = PositionGetDouble(POSITION_VOLUME);
            if(LoteHistory*valorPonto != 0)
            {
               ProfitSoma = ProfitSoma + ProfitHistory;             
               Pontos_History = ((ProfitHistory)/(LoteHistory*valorPonto)) + Pontos_History;        
            }               
         }
      }                  
   } 
   if(ganhoDiario!=0 || perdaDiaria!=0) EncerraPosicao();
   return(ProfitSoma);
}
//=============================================================
void EncerraPosicao()
{
   ulong Ticket = 0;
  // if(Pontos_History < ((-1)*((perdaDiaria/100)*balanceAccount)) && perdaDiaria>0)
   if( perdaDiaria>0)
   {
      for(int i = 0; i <= PositionsTotal(); i++)
      {     
         Ticket = PositionGetTicket(i);
         if(Ticket > 0)
         {  
            ulong magic = PositionGetInteger(POSITION_MAGIC);
            if(magicNumber == magic)
            { 
               if(PositionGetSymbol(i)==_Symbol)
                  trade.PositionClose(_Symbol,ULONG_MAX);
            }
         }                  
      }
      flagStopDiario = true; 
   }
   //if(Pontos_History>((ganhoDiario/100)*balanceAccount) && ganhoDiario>0)
   if( ganhoDiario>0)
   {
      for(int i = 0; i <= PositionsTotal(); i++)
      {     
         Ticket = PositionGetTicket(i);
         if(Ticket > 0)
         {  
            ulong magic = PositionGetInteger(POSITION_MAGIC);            
            if(magicNumber == magic)
            { 
               if(PositionGetSymbol(i)==_Symbol)
               {               
                  trade.PositionClose(_Symbol,ULONG_MAX);
               }
            }
         }                  
      }
      flagStopDiario = true; 
   }   
}
//==========================================================================================
void CalculoPontosDinheiro()
{
   double valordotick = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE);
   double tamanhodotick = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
   valorPonto = valordotick/tamanhodotick;
}
//============================================================================
double NormalizeTick(double num)
{
   return ceil(num/tickSize)*tickSize;
}
//============================================================================
void TrailingStop(double preco)
{
   for(int i = PositionsTotal()-1; i>=0; i--)
   {
      string symbol = PositionGetSymbol(i);
      ulong magic = PositionGetInteger(POSITION_MAGIC);
      if(symbol == _Symbol)
      {
         if(magicNumber == magic)
         {
            ulong PositionTicket = PositionGetInteger(POSITION_TICKET);
            double StopLossCorrente = PositionGetDouble(POSITION_SL);
            double TakeProfitCorrente = PositionGetDouble(POSITION_TP);
            double pontos = SymbolInfoDouble (symbol, SYMBOL_POINT);
            if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
            {
               if(preco >= (StopLossCorrente + NormalizeTick(TrailingStopStart)))
               {
                  double novoSL = NormalizeTick(StopLossCorrente) + NormalizeTick(AjusteTrailingStop);
                  if(StopLossCorrente!=novoSL)
                     if(trade.PositionModify(PositionTicket, novoSL, TakeProfitCorrente))
                     {
                        Print("TrailingStop - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                     }
                     else
                     {
                        Print("TrailingStop - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                     }
                  }
               }
            else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
            {
               if(preco <= (StopLossCorrente - NormalizeTick(TrailingStopStart)))
               {
                  double novoSL = NormalizeTick(StopLossCorrente) - NormalizeTick(AjusteTrailingStop);
                  if(StopLossCorrente!=novoSL)
                     if(trade.PositionModify(PositionTicket, novoSL, TakeProfitCorrente))
                     {
                        Print("TrailingStop - sem falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                     }
                     else
                     {
                        Print("TrailingStop - com falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
                     }
               }
            }
         }
      }
   }
}
//======================================================================================
bool PosicaoTotal()
  {
   for(int i=PositionsTotal(); i>=0; i--)
   {
      string symbol = PositionGetSymbol(i);
      if(symbol == _Symbol)
        {
           if(magicNumber==PositionGetInteger(POSITION_MAGIC))
           {
              return true;
           }
        }
   }
   return false;
  }
//=============================================================================  

coloca mais um trecho aqui


   CalculoPontosDinheiro();
   ArraySetAsSeries(rates,true);
   TimeToStruct(StringToTime(hor_ini1),HorarioInicial1);
   TimeToStruct(StringToTime(hor_ter1),HorarioTermino1);
   TimeToStruct(StringToTime(hor_ini),HorarioInicial);
   TimeToStruct(StringToTime(hor_ter),HorarioTermino);
   TimeToStruct(StringToTime(hor_enc),HorarioEncerramento);   
   trade.SetExpertMagicNumber(magicNumber);
   trades.SetExpertMagicNumber(magicNumber);
   magicNumberExt =magicNumber;
   EventSetTimer(1);
   balanceAccount = AccountInfoDouble(ACCOUNT_BALANCE);
   loteExt = lote;
   tpExt = takeProfit;
   slExt = stopLoss;
   tickSize=SymbolInfoDouble(NULL,SYMBOL_TRADE_TICK_SIZE);
   //AjusteSM = tickSize;
   //AjusteTrailingStop = tickSize;
   if(!TradePanel.Create(ChartID(),"ProScalper")) {
      return (INIT_FAILED);
   }   
   TradePanel.Run();  
//---
   return(INIT_SUCCEEDED);

desde ja agradeços a todos

 
Na Onda #:
bool HorarioFechamento() {    TimeToStruct(TimeCurrent(), DiaHoraAtual);    if(DiaHoraAtual.hour >= HorarioEncerramento.hour)    {       if(DiaHoraAtual.hour == HorarioEncerramento.hour)          if(DiaHoraAtual.min >= HorarioEncerramento.min)          {             trade.PositionClose(_Symbol,ULONG_MAX);             int TotalDeOrdens = OrdersTotal();             flagStopDiario = false;             for(int i = (TotalDeOrdens - 1); i >= 0; i--)             {                if(OrderGetTicket(i) > 0) trade.OrderDelete(OrderGetTicket(i));                            }            return true;          }       else       {          return false;       }    return true;    }    return false; }

Oi, segue:

bool HorarioFechamento()
{

   TimeToStruct(TimeTradeServer(), DiaHoraAtual); // Alterado
   if(DiaHoraAtual.hour >= HorarioEncerramento.hour)
   {
      if((DiaHoraAtual.hour > HorarioEncerramento.hour) // Alterado
          || (DiaHoraAtual.hour == HorarioEncerramento.hour && DiaHoraAtual.min >= HorarioEncerramento.min)) // Alterado
         {
            trade.PositionClose(_Symbol,ULONG_MAX);
            int TotalDeOrdens = OrdersTotal();
            flagStopDiario = false;
            for(int i = (TotalDeOrdens - 1); i >= 0; i--)
            {
               if(OrderGetTicket(i) > 0) trade.OrderDelete(OrderGetTicket(i));
               
            }
           return true;
         }
      else 
      {
         return false;
      }
   return true;
   }
   return false;
}

Note que voce não pode em teoria colocar o horario que o mercado esta fechado, então se o mercado fecha 17h teria que ser colocar algo como 16h55 a depender de onde a função é chamada e não foi mostrada. É muito provavel que a chamada dessa função esteja no ponto errado.

EDIT: Vi mais uma melhoria no codigo em funcao de provavel leilao.
 
Ricardo Rodrigues Lucca #:

Oi, segue:

Note que voce não pode em teoria colocar o horario que o mercado esta fechado, então se o mercado fecha 17h teria que ser colocar algo como 16h55 a depender de onde a função é chamada e não foi mostrada. É muito provavel que a chamada dessa função esteja no ponto errado.

EDIT: Vi mais uma melhoria no codigo em funcao de provavel leilao.

opa,coloquei esse codigo e mudei tudo para TimeTradeServer, porem continua a mesma coisa, 1 dia opera no outro nao opera , tenho medo disso implicar na conta real, caso eu venha a coloca ele para opera em uma vps

 
Na Onda #opa,coloquei esse codigo e mudei tudo para TimeTradeServer, porem continua a mesma coisa, 1 dia opera no outro nao opera , tenho medo disso implicar na conta real, caso eu venha a coloca ele para opera em uma vps

Olá, se eu entendi direito, essa verificação, no seu código, deveria ser feita através da variável flagStopDiario... Pelos trechos de código que você postou, ela está sendo atualizada nas funções EncerraPosicao(), quando a meta diária é atingida, e HorarioFechamento(), que eu não entendi por quê... A meu ver, deveria funcionar mais ou menos como segue para não acontecer o que você descreveu acima:

//=== ESCOPO GLOBAL
bool     flagStopDiario = false;
datetime DiaAtual = 0;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   datetime D1_TIME;

//--- Gets the opening time of the current day
   D1_TIME = iTime(_Symbol, PERIOD_D1, 0);
   if(D1_TIME == 0)
     {
      Print("Error getting current day open time...");
      return;
     }

//--- Checks if is a new day
   if(DiaAtual != D1_TIME)
     {
      flagStopDiario = false;
      DiaAtual = D1_TIME;
     }
  }
//+------------------------------------------------------------------+

... Então, mantém a atualização da variável flagStopDiario na função EncerraPosicao() e retira da função HorarioFechamento()... Teste essas alterações pra ver se muda alguma coisa... 👍

EDIT.1: E, claro, antes de abrir posição ou colocar ordem pendente, checar flagStopDiario...