Take profit na segunda vela que deu lucro

 

Olá, estou tentando colocar meu takeprofit na segunda vela que deu lucro, não precisam ser seguidas as velas. Alguém pode me ajudar?

void CompraAMercado(double num_lots_,double ask,double TK_,double SL_)
  {trade.Buy(num_lots_,_Symbol,NormalizeDouble(ask,_Digits),NormalizeDouble(ask-SL_*_Point,_Digits),
   NormalizeDouble(ask+TK_*_Point,_Digits));
   if(trade.ResultRetcode()==10008||trade.ResultRetcode()==10009)
     {Print("Ordem de Compra executada com sucesso!");}
   else
     {Print("Erro ao enviar Ordem de Compra. Erro = ", GetLastError());
      ResetLastError();}}
void VendaAMercado(double num_lots_,double bid,double TK_,double SL_)
  {trade.Sell(num_lots_,_Symbol,NormalizeDouble(bid,_Digits),NormalizeDouble(bid+SL_*_Point,_Digits),
   NormalizeDouble(bid-TK_*_Point,_Digits));
   if(trade.ResultRetcode()==10008||trade.ResultRetcode()==10009)
     {Print("Ordem de Venda executada com sucesso!");}
   else
     {Print("Erro ao enviar Ordem de Venda. Erro = ", GetLastError());
      ResetLastError();}}
 
Alexandre Becker:

Olá, estou tentando colocar meu takeprofit na segunda vela que deu lucro, não precisam ser seguidas as velas. Alguém pode me ajudar?

Que raio de código é esse?

Cadê a tentativa de "colocar meu takeprofit na segunda vela"?


Se você precisa que alguém codifique isso do zero, procure o serviço de Freelance...

https://www.mql5.com/pt/job

Aplicativos de negociação para o MetaTrader 5 por encomenda
Aplicativos de negociação para o MetaTrader 5 por encomenda
  • 2022.02.04
  • www.mql5.com
O maior serviço freelance com desenvolvedores de aplicativos MQL5
 
// Takeprofit por número de candles
void TakeALt()
   {if(PositionSelect(_Symbol)&&PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
          {sOpen=iOpen(NULL,PERIOD_CURRENT,1);
           sClose=iClose(NULL,PERIOD_CURRENT,1);
           if((sClose-sOpen)>0)
             {cont=cont+1;Print("cont takealt = ",cont);
              if(cont==4)
                {//cont=0;
                 FechaPosicao();
                 Print(" ========== TakeAlt ========== ");
                 ObjectCreate(0,"x"+velas[1].time,OBJ_ARROW_CHECK,0,velas[1].time,velas[1].high);
                 take_profit_alt=true;}}}
    if(PositionSelect(_Symbol)&&PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
          {sOpen=iOpen(NULL,PERIOD_CURRENT,1);
           sClose=iClose(NULL,PERIOD_CURRENT,1);
           if((sClose-sOpen)<0)
             {cont=cont+1;Print("cont takealt = ",cont);
              if(cont==4)
                {cont=0;
                 FechaPosicao();
                 Print(" ========== TakeAlt ========== ");
                 ObjectCreate(0,"x"+velas[1].time,OBJ_ARROW_CHECK,0,velas[1].time,velas[1].high);
                 take_profit_alt=true;}}}}

A tentativa tá aí, só que quando estopa não zera meu contador e tá contando todas as velas, não só as com lucro.

Não encontrei material sobre isso

 
Alexandre Becker:

Olá, estou tentando colocar meu takeprofit na segunda vela que deu lucro, não precisam ser seguidas as velas. Alguém pode me ajudar?

Deixa eu reformular sua pergunta porque do jeito que esta nao faz sentido, voce quer colocar o seu stop loss no segundo ponto mais alto ou mais baixo depois que voce abriu uma posicao eh isso?
 
Alexandre Becker #:

A tentativa tá aí, só que quando estopa não zera meu contador e tá contando todas as velas, não só as com lucro.

Não encontrei material sobre isso

Alexandre

Veja se a rotina abaixo pode ser util no seu codigo.. Apenas um exemplo partindo do pressuposto que já exista uma ordem de compra não importando se as velas de altas são seguidas ou maiores que as anteriores.

Fiz os testes aqui e aparentemente funciona, só fazer suas adaptações;

//==============================================================================

 // Inicialização de variaveis

    int barra_entrada,barras_positivas=0; 

    long bilhete;

    double fech, abert,prc_compra;

    

   if(PositionSelect(_Symbol)){ // Testamos a condição 

     if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY){ // Pegamos o tipo de posição aberta

      prc_compra=PositionGetDouble(POSITION_PRICE_OPEN); // Pegamos o preço de compra

      bilhete=PositionGetInteger(POSITION_TICKET); // Pegamos o ticket da posição aberta

      barra_entrada=iBarShift(_Symbol,PERIOD_CURRENT,PositionGetInteger(POSITION_TIME),false); // Pegamos a qtd de barra correntes desde a barra de entrada no trade

     }

    } 

     if(barra_entrada>=2){   //  Verificamos se a qtd de barra desde a entrada  é igual ou superior a 2 pois faz sentido que a contagem seja apenas a partir da segunda barra que precede a barra de entrada 

      for(int b=1;b<=barra_entrada;b++){  // Fazemos um loop pra tras até o valor da barra de entrada

       fech=iClose(_Symbol,PERIOD_CURRENT,b); // Pegamos o fechamento imediatamente anterior até o fechamento da barra de entrada

       abert=iOpen(_Symbol,PERIOD_CURRENT,b); // Pegamos a abertura imediatamente anterior ate a abertura da barra de entrada

       if(fech > abert && fech > prc_compra){ // Testamos se os fechamentos são maiores que a aberturas ao mesmo tempo se os fechamentos são maiores que o preço de entrada

        barras_positivas=barras_positivas+1;  // Caso a condição acima seja satisfeita, incrementamos o contador de barras positivas

       if(barras_positivas==2){   // Testamos se as qtd de barras positivas são iguais a 2

        if(trade.PositionClose(bilhete,-1)){   // Fechamos o trade 

          barras_positivas=0;                  // zeramos o contador de barras positivas 

         }

       }

      } 

    }  

  }    

}

 
josue moraes #:

Alexandre

Veja se a rotina abaixo pode ser util no seu codigo.. Apenas um exemplo partindo do pressuposto que já exista uma ordem de compra não importando se as velas de altas são seguidas ou maiores que as anteriores.

Fiz os testes aqui e aparentemente funciona, só fazer suas adaptações;

//==============================================================================

 // Inicialização de variaveis

    int barra_entrada,barras_positivas=0; 

    long bilhete;

    double fech, abert,prc_compra;

    

   if(PositionSelect(_Symbol)){ // Testamos a condição 

     if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY){ // Pegamos o tipo de posição aberta

      prc_compra=PositionGetDouble(POSITION_PRICE_OPEN); // Pegamos o preço de compra

      bilhete=PositionGetInteger(POSITION_TICKET); // Pegamos o ticket da posição aberta

      barra_entrada=iBarShift(_Symbol,PERIOD_CURRENT,PositionGetInteger(POSITION_TIME),false); // Pegamos a qtd de barra correntes desde a barra de entrada no trade

     }

    } 

     if(barra_entrada>=2){   //  Verificamos se a qtd de barra desde a entrada  é igual ou superior a 2 pois faz sentido que a contagem seja apenas a partir da segunda barra que precede a barra de entrada 

      for(int b=1;b<=barra_entrada;b++){  // Fazemos um loop pra tras até o valor da barra de entrada

       fech=iClose(_Symbol,PERIOD_CURRENT,b); // Pegamos o fechamento imediatamente anterior até o fechamento da barra de entrada

       abert=iOpen(_Symbol,PERIOD_CURRENT,b); // Pegamos a abertura imediatamente anterior ate a abertura da barra de entrada

       if(fech > abert && fech > prc_compra){ // Testamos se os fechamentos são maiores que a aberturas ao mesmo tempo se os fechamentos são maiores que o preço de entrada

        barras_positivas=barras_positivas+1;  // Caso a condição acima seja satisfeita, incrementamos o contador de barras positivas

       if(barras_positivas==2){   // Testamos se as qtd de barras positivas são iguais a 2

        if(trade.PositionClose(bilhete,-1)){   // Fechamos o trade 

          barras_positivas=0;                  // zeramos o contador de barras positivas 

         }

       }

      } 

    }  

  }    

}

Vou dar uma olhada. Obrigado

 
Valeu pessoal funcionou muito bem!!
 
Alexandre Becker #:
Valeu pessoal funcionou muito bem!!

Funfou?

 
josue moraes #:

Funfou?

Funcionou sim. 

 
Alexandre Becker #:

Funcionou sim. 

Legal...

Razão: