Como faço para sair de uma operação depois de uma sequencia de candles?

 

Estou com dificuldade para contar os candles para sair de uma operação.

Alguém consegue me dar uma mãozinha?

 
Opa, consigo sim.
Mas não ficou muito claro a sua pergunta.
Você se refere a como fazer isso através da programação?

E contar os candles... como assim? Tente detalhar mais sua dúvida.
att,
 
Pablo Jaguanharo Carvalho Pinheiro #:
Opa, consigo sim.
Mas não ficou muito claro a sua pergunta.
Você se refere a como fazer isso através da programação?

E contar os candles... como assim? Tente detalhar mais sua dúvida.
att,

Olá Pablo. Estou fazendo um EA que tem como takeprofit dois candles com lucro, não necessariamente consecutivos mas tem que estar entre os cinco após a entrada. O código ainda está com takeprofit fixo no preço pois não faço ideia de como fazer

// Condições de entrada MmPsarMacd
void MmPsarMacd() // Testa condições para Marubozu/Marubozu_long/Long
   {CANDLE_STRUCTURE cand;
    RecognizeCandle(_Symbol,_Period,velas[1].time,10,cand);
    if(cand.type==CAND_MARIBOZU||cand.type==CAND_MARIBOZU_LONG||cand.type==CAND_LONG)
      {if(wma_220_Buffer[1]<wma_62_Buffer[1]&&wma_14_Buffer[1]<wma_8_Buffer[1])
         {if(velas[1].open<wma_8_Buffer[1]&&velas[1].close>wma_8_Buffer[1])
            {if(psar_Buffer[1]<velas[1].open&&macd_Buffer[1]>0)
               {if(OrdersTotal()==0&&PositionsTotal()==0&&pode_operar)
                  {ObjectCreate(0,"x"+velas[1].time,OBJ_ARROW_CHECK,0,velas[1].time,velas[1].low);
                   CompraAMercado(num_lots,tick.ask);}}}}
       else if(wma_220_Buffer[1]>wma_62_Buffer[1]&&wma_14_Buffer[1]>wma_8_Buffer[1])
          {if(velas[1].open>wma_8_Buffer[1]&&velas[1].close<wma_8_Buffer[1])
             {if(psar_Buffer[1]>velas[1].open&&macd_Buffer[1]<0)
                {if(OrdersTotal()==0&&PositionsTotal()==0&&pode_operar)
                   {ObjectCreate(0,"x"+velas[1].time,OBJ_ARROW_CHECK,0,velas[1].time,velas[1].high);
                    VendaAMercado(num_lots,tick.bid);}}}}}}


void CompraAMercado(double num_lots_,double ask)                               // Função contendo o objeto trade
   {houve_reversao=false;take_profit_alt=false;
    if(velas[1].low<velas[2].low&&velas[1].low<velas[3].low)                   // Calcula o Stop Loss
      {stop=velas[1].low;}
    else if(velas[2].low<velas[3].low)
           {stop=velas[2].low;}
         else {stop=velas[3].low;}
    take=(velas[1].high-velas[1].low)+(((velas[1].high-velas[1].low)*80)/100); // Takeprofit
    trade.Buy(num_lots_,_Symbol,ask,stop,ask+take);                            // Entrada
    desenhaLinhaVertical("Compra",velas[1].time,clrBlue);   
    if(trade.ResultRetcode()==10008||trade.ResultRetcode()==10009)             // Testa se houve erro
      {Print(" ====== Ordem de Compra executada com sucesso! ====== ");}
    else
      {Print("Erro ao enviar Ordem de Compra. Erro = ", GetLastError());
       ResetLastError();}}
// Venda a mercado
void VendaAMercado(double num_lots_,double bid)                                // Função contendo o objeto trade
   {houve_reversao=false;take_profit_alt=false;
    if(velas[1].high>velas[2].high&&velas[1].high>velas[3].low)                // Calcula o Stop Loss
      {stop=velas[1].high;}
    else if(velas[2].high>velas[3].high)
           {stop=velas[2].high;}
         else {stop=velas[3].high;}
    take=(velas[1].high-velas[1].low)+(((velas[1].high-velas[1].low)*80)/100); // Calcula o Take Profit
    trade.Sell(num_lots_,_Symbol,bid,stop,bid-take);                           // Entrada
    desenhaLinhaVertical("Venda",velas[1].time,clrRed);
    if(trade.ResultRetcode()==10008||trade.ResultRetcode()==10009)             // Testa se houve erro
      {Print(" ====== Ordem de Venda executada com sucesso! ====== ");}
    else
      {Print("Erro ao enviar Ordem de Venda. Erro = ", GetLastError());
       ResetLastError();}}

Tentei fazer desta forma mas não tá dando muito certo, o contador não zera quando dá stop e está contando todas as velas, não só as com lucro

// 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;}}}}
Já procurei material sobre o assunto mas não encontro
 
Alexandre Becker:

Estou com dificuldade para contar os candles para sair de uma operação.

Alguém consegue me dar uma mãozinha?

Voce conhece a funcao iBarShift ?

 
Alexandre Becker #:

Olá Pablo. Estou fazendo um EA que tem como takeprofit dois candles com lucro, não necessariamente consecutivos mas tem que estar entre os cinco após a entrada. O código ainda está com takeprofit fixo no preço pois não faço ideia de como fazer

Tentei fazer desta forma mas não tá dando muito certo, o contador não zera quando dá stop e está contando todas as velas, não só as com lucro

Já procurei material sobre o assunto mas não encontro

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 

         }

       }

      } 

    }  

  }    

}

 
Alexandre Becker #:

Tentei fazer desta forma mas não tá dando muito certo, o contador não zera quando dá stop e está contando todas as velas, não só as com lucro

Então @Alexandre Becker, tudo bem?

Vou me ater a essa parte do contador apenas para tentar lhe ajudar. 

Percebo que seu robô esta contando tudo, pois quando você faz o uso do

PositionSelect(_Symbol)

e continua a perguntar se é do tipo compra ou venda

PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)

ele, de acordo com o código esta incrementando mais 1 ao contador 

if((sClose-sOpen)>0)
             {cont=cont+1;Print("cont takealt = ",cont);

A questão é que você deve perguntar a ele se no histórico das posições, depois de selecioná-las é claro

bool  HistorySelect( 
   datetime  from_date,     // a partir da data 
   datetime  to_date        // até à data 
   );

Se no seu histórico deal, desde que você abriu sua posição, garanta o horário da operação

int  HistoryDealsTotal();

houve alguma com o reason 

DEAL_REASON_SL

Transação realizada como resultado da ativação de uma ordem Stop Loss


Então você conta.

Sugiro que separe seu código, faça uma função para contar, uma função para selecionar seu histórico etc.

Como na matemática que, ao termos um problema, dividimos ele. 

Da maneira que está aí você não conseguirá de fato contar àquelas operações que foram concluídas com o stop loss como deseja.

Observe também que, apesar de você desejar saber se houve stop você atribui um valor true a uma variável que possui nome de take profit

take_profit_alt=true;}}}

Neste caso você deve buscar a 

DEAL_REASON_TP

Transação realizada como resultado da ativação de uma ordem Take Profit

pois para o robô serão coisas diferentes

Enfim, evitei criar um código pois a lógica de cada um é muito pessoal, uma assinatura, então acredito que mostrar a questão do contador somente é suficiente para você adequar com sua assinatura ao seu código. 

Sucesso por aí.

 
Alexandre Becker:

Estou com dificuldade para contar os candles para sair de uma operação.

Alguém consegue me dar uma mãozinha?

Eu não trabalho com EAs, só indicadores mas...

Cria uma variável contadorPositivo que deve ser zerada quando a operação é aberta.
Na abertura de uma nova barra vc verifica se a vela anterior foi de lucro ou não. Se foi, incrementa seu contador.

Quando o contador for maior ou igual a 1 (acho melhor do que ==2) fecha a operação.
Razão: