Olá, algumas observações:
1. Código formatado incorrectamente. Por favor, utilize o botão do CÓDIGO (Alt -S) ao inserir o seu código.
2. Declare globais as variáveis adx_handle e symbol e inclua o código abaixo em OnInit():
adx_handle = iADX(symbol, PERIOD_D1, 14);3. SEMPRE verifique adequadamente o retorno de todas as funções (iADX, CopyRates, CopyBuffer, ...)... Não confie que vai sempre funcionar sem erros.
4. A função CopyRates retorna true/false, não inteiro. Veja no exemplo abaixo como fazer a verificação correta:
//--- verificação MqlRates mql_rates[]; if(CopyRates(Symbol(), PERIOD_CURRENT, 1, 10, mql_rates)) { Print("mql_rates array:"); ArrayPrint(mql_rates); } else { Print("CopyRates(Symbol(), PERIOD_CURRENT,1, 10, mql_rates). Error ", GetLastError()); }
5. Estou sem B3 em meu computador, mas testei o trecho do CopyRates em Forex (EURUSD) e não está indo para o else de erro... Desconfio desse símbolo que você está usando, né não ?
6. Faça um teste substituindo target_date por 1...
Olá pessoal, agradeço imensamente se puderem me ajudar.
Tenho um indicador que roda no gráfico M1 do mini indice B3 e apenas preciso acessar os dados do indicador ADX mas com dados do gráfico diário.
Criaei o codigo abaixo apenas como exemplo para tentar acessar os dados de ADX do gráfico diário do dia 08/04/2024 mas o meu array sempre fica com 0 e cai no else de erro:
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
for(int i=0;i<rates_total;i++)
{
string symbol = "WIN$N";
datetime target_date = D'2024.04.08';
int adx_handle = iADX(symbol, PERIOD_D1, 14);
MqlRates rates_array[];
int rates_copied = CopyRates(symbol, PERIOD_D1, target_date, 1, rates_array);
// Verifica se os dados da barra foram copiados corretamente
if(rates_copied > 0)
{
// Obtém o timestamp da barra diária desejada
datetime daily_time = rates_array[0].time;
// Cria um array para armazenar os valores do ADX
double adx_values[];
// Copia o valor do ADX para o array
int copied = CopyBuffer(adx_handle, 0, daily_time, 1, adx_values);
double daily_adx = adx_values[0];
}
else
{
Print("Erro ao acessar os dados diários: ", GetLastError());
}
//Restante do código do indicador abaixo:......
}
return(rates_total);
}
Quando voce esta em um timeframe diferente do que voce quer os dados e esta a criar o handler no OnCalculate(), acontece que os dados vao pra uma fila para serem calculados como a fila de ticks. Entao, voce tem que sair da OnCalculate pra permitir a fila ser consumida do periodo desejado e dai sim passa a dar resultados. Sleep() pra tentar forcar a pausa e dar tempo pro indicador calcular se for o caso da fila que falei tambem nao tem efeito. Tem que sair da funcao.
Olá,
Você é programador? foi realmente você quem criou esse código? Pois tem várias inconsistências de entendimento sobre como o MQL5 funciona com Higher Timeframes...
Ajude-nos a te ajudar...
;)
- 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á pessoal, agradeço imensamente se puderem me ajudar.
Tenho um indicador que roda no gráfico M1 do mini indice B3 e apenas preciso acessar os dados do indicador ADX mas com dados do gráfico diário.
Criaei o codigo abaixo apenas como exemplo para tentar acessar os dados de ADX do gráfico diário do dia 08/04/2024 mas o meu array sempre fica com 0 e cai no else de erro:
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
for(int i=0;i<rates_total;i++)
{
string symbol = "WIN$N";
datetime target_date = D'2024.04.08';
int adx_handle = iADX(symbol, PERIOD_D1, 14);
MqlRates rates_array[];
int rates_copied = CopyRates(symbol, PERIOD_D1, target_date, 1, rates_array);
// Verifica se os dados da barra foram copiados corretamente
if(rates_copied > 0)
{
// Obtém o timestamp da barra diária desejada
datetime daily_time = rates_array[0].time;
// Cria um array para armazenar os valores do ADX
double adx_values[];
// Copia o valor do ADX para o array
int copied = CopyBuffer(adx_handle, 0, daily_time, 1, adx_values);
double daily_adx = adx_values[0];
}
else
{
Print("Erro ao acessar os dados diários: ", GetLastError());
}
//Restante do código do indicador abaixo:......
}
return(rates_total);
}