Preciso de um Contador de Candles

Para adicionar comentários, por favor Faça o login ou registrar
paulocamargo33037
30
paulocamargo33037  

Olá a todos. Sou iniciante no Mql5 e estou desenvolvendo um EA para Mini índice e Mini Dólar. Preciso que ele conte a quantidade de candles desde o primeiro candle do dia

void OnTick()
  {
       if(TimeToString(TimeCurrent(),TIME_SECONDS)=="09:16:00")
         {
            mx=iHigh(1);
            mn=iLow(1);
            ab=iOpen(1);
            fx=iClose(1);
         }
       
       contarcandles();
  }
void contarcandles()
   {
      for(int i=1;i>=100;i++)
         {
            if(iHigh(i) == mx && iLow(i) == mn && iOpen(i) == ab && iClose(i) == fx) break;
            else ncandles=ncandles+1;
         }
   } // iHigh=máxima do candle (i), iLow=Mínima do candle (i), ab=Abertura do candle (i), fx=Fechamento do candle (i)


sendo que as 09:16:00 ele pega os dados do candle anteriorno M15.

fiz essa função para a contagem porém não está contando. A variável ncandles não sai do 1.

se alguém puder me ajudar Agradeço Muito.

Ruy Christian Hoffmann
713
Ruy Christian Hoffmann  
paulocamargo33037:

Olá a todos. Sou iniciante no Mql5 e estou desenvolvendo um EA para Mini índice e Mini Dólar. Preciso que ele conte a quantidade de candles desde o primeiro candle do dia


sendo que as 09:16:00 ele pega os dados do candle anteriorno M15.

fiz essa função para a contagem porém não está contando. A variável ncandles não sai do 1.

se alguém puder me ajudar Agradeço Muito.

Bom dia,

Basicamente se você só quer contar quantos candles e souber o horário que abre o mercado, então você pode usar um código igual esse que eu fiz, pode não ser o mais bonito, mas atende.

MqlRates rates[];
ArraySetAsSeries(rates,true);
int copied=CopyRates(_Symbol,_Period,0,81,rates);   

   MqlDateTime RelogioBarra;
   TimeToStruct(rates[0].time,RelogioBarra);
   int Minutos=RelogioBarra.hour-9;
   if(Minutos!=0)
      Minutos = Minutos*60;

   Minutos=Minutos+RelogioBarra.min;
   int BarrasQtd=Minutos/Period();
Rogerio Giannetti Torres
3154
Rogerio Giannetti Torres  
paulocamargo33037:



Bom dia

aproveitando a sugestão do Ruy, veja que a função CopyRates tem uma sobrecarga para trazer o histórico  por um intervalo de data e hora, entao:

int  CopyRates(    string           symbol_name,       // nome do ativo    ENUM_TIMEFRAMES  timeframe,         // período    datetime         start_time,        // data e hora de início    datetime         stop_time,         // data e hora de término    MqlRates         rates_array[]      // array destino para copiar    );


datetime hrINI=StringToTime(TimeToString(TimeTradeServer(), TIME_DATE));  // hrINI="DD/MM/YYYY 00:00"
int qtdBarras = CopyRates(_Symbol,_Period,hrINI,INT_MAX,rates);
if(qtdBarras<0) 
        { 
        Print("Erro ......." 
        }
else
        qtdBarras--; // Menos a barra corrente
Ruy Christian Hoffmann
713
Ruy Christian Hoffmann  
Rogerio Giannetti Torres:


Bom dia

aproveitando a sugestão do Ruy, veja que a função CopyRates tem uma sobrecarga para trazer o histórico  por um intervalo de data e hora, entao:


Massa Rogério, vou até substituir o meu aqui.

Obrigado

paulocamargo33037
30
paulocamargo33037  

Olá pessoal. Agradeço Muito a Ajuda. mas tentei até conseguir e consegui de uma forma simples. kkkk.

sou programador de VB e o MQL é mais parecido com c++.

declarei as variáveis que guardam as informações do candle anterior. "sempre o candle anterior", que é a comparação para saber se esta em um novo candle.

double mx,mn,ab,fx; //Variáveis dos Dados do Primeiro Candle do Dia
int ncandles; //Variável que informa o candle atual

no onTick coloquei um if que pega os dados do candle anterior as 09:00:01

void OnTick()
  {
     if(TimeToString(TimeCurrent(),TIME_SECONDS)=="09:00:01")
         {
            mx=iHigh(1);
            mn=iLow(1);
            ab=iOpen(1);
            fx=iClose(1);
            ncandles=1; //adiciona 1 ao ncandles para saber que está no candle 1
         }

     contarcandles(); //comando que chama a função que compara os cndles
  }

após fiz uma função que compara o candle anterior com os dados nav variáveis

void contarcandles()
   {
      if(iHigh(1)!=mx&&iLow(1)!=mn&&iOpen(1)!=ab&&iClose(1)!=fx) // compara os dados do candle anterior atual com os dados das variáveis criadas
         {
            mx=iHigh(1);
            mn=iLow(1);
            ab=iOpen(1);
            fx=iClose(1);
            ncandles=ncandles+1; //soma 1 ao ncandles após alterar o valor das variáveis
         }
   }

peço desculpas mas mudei de rates para funções iHigt,iLow,iOpen,iClose, pois como estou começando achei mais fácil de manipular. segue o codigo das funções para análize.

//+------------------------------------------------------------------+ 
//| Função que informa a Abertura dos Candles                        | 
//+------------------------------------------------------------------+ 
double iOpen(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
//---
   if(symbol==NULL) symbol=Symbol();
   if(timeframe==0) timeframe=Period();
   double Open[1];
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,Open);
   if(copied>0) open=Open[0];
//---
   return(open);
//---
  }
  
//+------------------------------------------------------------------+ 
//| Função que informa o Fechamento dos Candles                               | 
//+------------------------------------------------------------------+ 
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
//---
   if(symbol==NULL) symbol=Symbol();
   if(timeframe==0) timeframe=Period();
   double Close[1];
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,Close);
   if(copied>0) close=Close[0];
//---
   return(close);
//---
  }
  
//+------------------------------------------------------------------+ 
//| Função que informa a Máxima dos Candles                          | 
//+------------------------------------------------------------------+ 
double iHigh(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
//---
   if(symbol==NULL) symbol=Symbol();
   if(timeframe==0) timeframe=Period();
   double High[1];
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,High);
   if(copied>0) high=High[0];
//---
   return(high);
//---
  }
  
//+------------------------------------------------------------------+ 
//| Função que informa a Mínima dos Candles                              | 
//+------------------------------------------------------------------+ 
double iLow(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
//---
   if(symbol==NULL) symbol=Symbol();
   if(timeframe==0) timeframe=Period();
   double Low[1];
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,Low);
   if(copied>0) low=Low[0];
//---
   return(low);
//---
  }


Agradeço a Ajuda Mesmo. Agora estou Tentando fazer uma função que busca o melhor ponto para abrir a operação com cruzamento de médias móveis.

pois nem sempre quando cruza é o melhor momento.

ex: Média rápida(21periodos) cruzou a intermediária(36períodos) para cima. porém o mercado as vezes desce um pouco. sendo que eu poderia aproveitar melhor a abertura da operação comprando no rompimento de uns candles após o cruzamento já que o ea pega a máxima do candle anterior como ponto para abrir a operação. tem dado certo porém poderia pegar mais pontos

Agradeço a Ajuda. Abraço a Todos.

Ruy Christian Hoffmann
713
Ruy Christian Hoffmann  
paulocamargo33037:

Olá pessoal. Agradeço Muito a Ajuda. mas tentei até conseguir e consegui de uma forma simples. kkkk.

sou programador de VB e o MQL é mais parecido com c++.

declarei as variáveis que guardam as informações do candle anterior. "sempre o candle anterior", que é a comparação para saber se esta em um novo candle.

no onTick coloquei um if que pega os dados do candle anterior as 09:00:01

após fiz uma função que compara o candle anterior com os dados nav variáveis

peço desculpas mas mudei de rates para funções iHigt,iLow,iOpen,iClose, pois como estou começando achei mais fácil de manipular. segue o codigo das funções para análize.


Agradeço a Ajuda Mesmo. Agora estou Tentando fazer uma função que busca o melhor ponto para abrir a operação com cruzamento de médias móveis.

pois nem sempre quando cruza é o melhor momento.

ex: Média rápida(21periodos) cruzou a intermediária(36períodos) para cima. porém o mercado as vezes desce um pouco. sendo que eu poderia aproveitar melhor a abertura da operação comprando no rompimento de uns candles após o cruzamento já que o ea pega a máxima do candle anterior como ponto para abrir a operação. tem dado certo porém poderia pegar mais pontos

Agradeço a Ajuda. Abraço a Todos.

Olá Paulo, legal, estamos mais ou menos no mesmo barco, pois eu só estudei C++ na faculdade, na prática mesmo no decorrer dos anos usei mais VB e databases e assim mesmo muito pouco, pois pouco tempo depois de formado acabei caindo na área financeira e nunca mais saí.

Ao seu código, não li o código na íntegra, mas pelo que você descreveu que ele lê a partir de 9:01h, fique atento para situações que podem ocorrer do tipo:

a) Se o EA for ativado depois das 9:02h?

b) Se sua conexão cair/MT5 travar e o EA for recarregado?

A vantagem do código do Rogério para contar os candles é que ele funcionará em qualquer hipótese.

paulocamargo33037
30
paulocamargo33037  

Agradeço a preocupação, já aconteceu de cair porém a variável manteve o valor. basta não desligar o pc. no meu caso como o EA é pessoal. estou prevenido contra quedas de luz ou até mesmo falta.

Mas por precaução operacional  vou colocar o código do Rogério

obrigado a todos.

Consegui também fazer o EA buscar o melhor preço como queria.


double operarcompra=0,operarvenda=0; //Variáveis Operacionais

bool procompra=false,procvenda=false; //Variáveis Controladoras dos BreakEvens


void OnTick()
  {   
      
      //--- Altera o ponto de Operação caso o mercado não siga as médias nesse momento
      if(procompra==true&&iHigh(1)<operarcompra&&comm!=ncandles)
         {
            operarcompra=iHigh(1);
         }
      if(procvenda==true&&iLow(1)>operarvenda&&comm!=ncandles)
         {
            operarvenda=iLow(1);
         }
      
      if (HorarioEntrada()) //se está no horário de operações
         {   
            if(!posAberta() && !ordPendente()) //se tem posição aberta ou ordem pendente
               {
                  //--- Definição para identificar cruzamento das Médias Móveis Rápida e Intermediária
                  if(operarCM==true&&MediaMovel1[2]<MediaMovel2[2]&&MediaMovel1[1]>MediaMovel2[1])
                     {
                        operarcompra=iHigh(1)+desvPts;
                        comm=ncandles;
                        procompra=true;
                     }
                  if(operarCM==true&&MediaMovel1[2]>MediaMovel2[2]&&MediaMovel1[1]<MediaMovel2[1]) 
                     {
                        operarvenda=iLow(1)-desvPts;
                        comm=ncandles;
                        procompra=true;
                     }
                  //--- Definição de Operação do Cruzamento das Médias Móveis
                  if(ccmm!=ncandles&&Ask>=operarcompra+desvPts&&Ask<operarcompra+(desvPts*2))
                     {
                        preencherDados(11);
                        Comprar();
                        ccmm=ncandles;
                        procompra=false;
                        operarcompra=0;
                        operarvenda=0;
                        ultOperacao="Compra no Cruzamento de Médias Móveis";
                     }
                  if(ccmm!=ncandles&&Bid<=operarvenda&&Bid-desvPts>operarvenda-(desvPts*2))
                     {
                        preencherDados(11);
                        Vender();
                        procvenda=false;
                        operarvenda=0;
                        operarcompra=0;
                        ultOperacao="Venda no Cruzamento de Médias Móveis";
                     }
                  
               }
         }
      
      if(HorarioFechamento() && posAberta()) Finalizar();
      if(posAberta() && !be1Ativo) BreakEven1(ultimoTick.last);
      if(posAberta() && !beAtivo) BreakEven(ultimoTick.last);
      if(posAberta() && beAtivo) TrailingStop(ultimoTick.last);
      
  }


   


Resumindo está aí parte do meu EA para fins Educativos. kkkk. Estou Melhorando Ele Sempre que aprendo algo novo.

Estou buscando agora fazer um painel gráfico para exibir as informações do Comment sem que o gráfico atrapalhe. kkkk.

Se alguem melhorar ele posta aí pra eu atualizar. como eu disse sou iniciante. podendo reduzir o código sempre é bom. Abraço a Todos.

não consegui postar o código todo pois é grande. mas se quiserem mando pelo zap. 51989610904

Samuel Manoel De Souza
4902
Samuel Manoel De Souza  
paulocamargo33037:

Olá a todos. Sou iniciante no Mql5 e estou desenvolvendo um EA para Mini índice e Mini Dólar. Preciso que ele conte a quantidade de candles desde o primeiro candle do dia


sendo que as 09:16:00 ele pega os dados do candle anteriorno M15.

fiz essa função para a contagem porém não está contando. A variável ncandles não sai do 1.

se alguém puder me ajudar Agradeço Muito.

Erro lógico.
Você fez:

for(int i=1;i>=100;i++)

altere para 

for(int i=1;i<=100;i++)

Se começa em 1 o contador nunca terá incremento, pois ao verificar que i=2 é menor que 100 já sai do loop.

paulocamargo33037
30
paulocamargo33037  
Samuel Manoel De Souza:

Erro lógico.
Você fez:

altere para 

Se começa em 1 o contador nunca terá incremento, pois ao verificar que i=2 é menor que 100 já sai do loop.

eu não havia prestado atenção quanto a esse parametro. executar até que ou enquanto que. kkkk. obrigado a dica. testarei em uns loops que não deram certo.
Para adicionar comentários, por favor Faça o login ou registrar