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();
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
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
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.
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.
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
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.
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.
Boa noite Galera,
Sabem me dizer se temos algum indicador " Contador de candle " disponivel pata MT4?
Abcs e bons traders!!!!
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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.