Encerrar posição

 

Galera me dei um norte

estou usando esse codigo para encerrar posicao caso atinge a meta tanto perda como ganho

//=============================================================
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; 
   }   
}
//==========================================================================================

ex 

eu defino 

50 de perca

50 de ganho

porem muitas das vezes quando bate 49 de ganho, ele entra na operação mas ja encera ali com 10 pontos de ganho

e gostaria que ele so encerrase as operaçoes depois que estivese acabado o trader 


alguem pode me da uma luz

 
Por favor não criar tópicos aleatoriamente sem ter em conta a secção adequada. O seu tópico foi movido para a secção: Expert Advisors e Negociação Automatizada
 
Na OndaGalera me dei um norte estou usando esse codigo para encerrar posicao caso atinge a meta tanto perda como ganho ex eu defino 50 de perca 50 de ganho porem muitas das vezes quando bate 49 de ganho, ele entra na operação mas ja encera ali com 10 pontos de ganho e gostaria que ele so encerrase as operaçoes depois que estivese acabado o trader alguem pode me da uma luz

Olá, você precisa postar a parte do código onde a variável Pontos_History é atualizada. Essa parte do código é que vai precisar alterar...

 
Na Onda:

Galera me dei um norte

estou usando esse codigo para encerrar posicao caso atinge a meta tanto perda como ganho

ex 

eu defino 

50 de perca

50 de ganho

porem muitas das vezes quando bate 49 de ganho, ele entra na operação mas ja encera ali com 10 pontos de ganho

e gostaria que ele so encerrase as operaçoes depois que estivese acabado o trader 


alguem pode me da uma luz

Eu nao entendi se estamos falando de encerrar posicao ou abrir ordem quando veio o texto: " porem muitas das vezes quando bate 49 de ganho, ele entra na operação mas ja encera ali com 10 pontos de ganho ". Como o colega disse o Pontos_History que tem que ser olhado e tem um erro que pode estar ocorrendo. Vamos dizer que sua perda diaria é monetária e não em pontos, logo tu tem que fazer essa conversão. Outro ponto, se for em pontos então o Pontos_History tem que ser em pontos acumulados em todas as operações até agora e não de uma simples operação para refletir o stop diario como tu parece querer. Outra coisa, mesmo eu acreditando que não é usado nas corretas brasileiras (mas nao sei se se refere a forex) o limit do PositionClose seria bom que coloca-se um valor menor tipo 1 ou 5.

 
Vinicius de Oliveira #:

Olá, você precisa postar a parte do código onde a variável Pontos_History é atualizada. Essa parte do código é que vai precisar alterar...

segue, estou usando assim, se conseguirem me ajudar

//======================================================================================
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(ProfitSoma);
   return(ProfitSoma);
} 
 

olhei, mas mesmo assim ainda nao consegue, espera ver se voce consegue me ajudar

desde ja agradeço

 
Na OndaGalera me dei um norte estou usando esse codigo para encerrar posicao caso atinge a meta tanto perda como ganho ex eu defino 50 de perca 50 de ganho porem muitas das vezes quando bate 49 de ganho, ele entra na operação mas ja encera ali com 10 pontos de ganho e gostaria que ele so encerrase as operaçoes depois que estivese acabado o trader alguem pode me da uma luz

Bom dia, revendo aqui o seu relato sobre o que o EA está fazendo e o que você gostaria que ele fizesse, na minha opinião, a forma que você descreveu que ele está atualmente trabalhando seria a forma correta: cumpriu a meta diária de lucro/prejuízo, encerra todas as posições e não negocia mais nesse dia... Agora, se ele já está fazendo isso, mas você deseja alterar para aguardar o encerramento das posições abertas, acredito que você deva deixar a sua função EncerraPosicao() apenas atualizando a variável flagStopDiario (sem encerrar as posições) para que novas posições não sejam abertas no dia atual, entendeu? Porém, fazendo dessa forma, tenha em mente que o desfecho da(s) posição(ões) aberta(s) poderá deixar o seu resultado diário abaixo ou acima da sua meta, pois, claro, nada garante que, por ela(s) estar(em) positiva(s) no momento da verificação, vá(ão) fechar positiva(s)...

 
Vinicius de Oliveira #:

Bom dia, revendo aqui o seu relato sobre o que o EA está fazendo e o que você gostaria que ele fizesse, na minha opinião, a forma que você descreveu que ele está atualmente trabalhando seria a forma correta: cumpriu a meta diária de lucro/prejuízo, encerra todas as posições e não negocia mais nesse dia... Agora, se ele já está fazendo isso, mas você deseja alterar para aguardar o encerramento das posições abertas, acredito que você deva deixar a sua função EncerraPosicao() apenas atualizando a variável flagStopDiario (sem encerrar as posições) para que novas posições não sejam abertas no dia atual, entendeu? Porém, fazendo dessa forma, tenha em mente que o desfecho da(s) posição(ões) aberta(s) poderá deixar o seu resultado diário abaixo ou acima da sua meta, pois, claro, nada garante que, por ela(s) estar(em) positiva(s) no momento da verificação, vá(ão) fechar positiva(s)...

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 foda ne

 
//======================================================================================
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(ProfitSoma);
   return(ProfitSoma);
}
//=============================================================
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; 
   }   
}
//==========================================================================================
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;
  }
//=============================================================================  

esse e todo o codigo que estou usando para tentar mudar essa função

 
Na Onda #:

esse e todo o codigo que estou usando para tentar mudar essa função

Olha eu começaria fazendo uma correção, veja o conflito:

(1) Stop/Ganho diario com 25 reais no indice;

(2) Stop/Ganho diario com 100 pontos no indice.

Vamos a uma simulação: Compra 1 no 100,100; Compra segundo no 100,050 e Compra o terceiro no 100,000. Ficando o médio no 100,050.

Veja na primeira compra o (1) e (2) são equivalentes, você pode converter o dinheiro pra pontos (note que não estou revisando sua formula nem nada);

Na compra do segundo contrato, o meio ficou em 100,075, logo:

(1) Esta negativo em 5 por contrato ou 10 no total;

(2) Esta negativo em 25 pontos e não 50;

Na compra do terceiro contrato:

(1) Esta negativo em 10 por contrato ou ao todo 30 reais;

(2) Esta negativo em 50 pontos e não 150 pontos;

Meu ponto é que tu esta trabalhando com martingale e, por exemplo, coloca que quer um stop de 50 pontos. Mas esses 50 pontos tu trabalha na verdade são baseados no lucro e quando se tem mais contratos esses 50 pontos são natualmente menor. Veja que por exemplo no caso (1) na compra do terceiro contrato teria sido atingido o stop, mas no caso (2) stop por pontos o stop mesmo com 3 contratos não foi ativado já que não caiu mais de 100 pontos a partir do medio.

Razão: