Навскидку сложно сказать, что тут не так. Тем более, что код неполон.
Впечатление, что тут много излишних сложностей. Особенно удивила какая-то хитрая завязка "за следующий день", вычисляемая как просто добавление к номеру дня в месяце единицу, и без проверки, что будет, когда единица добавится к 31 числу.
Для выяснения, что не так - следует пройтись по коду в отладчике, проверяя на каждом этапе значения.
а в чем сложность использовать готовый индикатор ATR из стандартной поставки терминала?
Навскидку сложно сказать, что тут не так. Тем более, что код неполон.
Впечатление, что тут много излишних сложностей. Особенно удивила какая-то хитрая завязка "за следующий день", вычисляемая как просто добавление к номеру дня в месяце единицу, и без проверки, что будет, когда единица добавится к 31 числу.
Для выяснения, что не так - следует пройтись по коду в отладчике, проверяя на каждом этапе значения.
P.s. оказывается добавление единицы это просто в переменную добавляет единицу, а не вычисляет следующий день по времени. Надо пересмотреть функции.
date[i].day != date[i-1].day
И всё работает и высчитывает
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
double maxPrice = high[0];
double minPrice = low[0];
ATRBuffer[0] = 0;
double AverageATR = 0;
count.day += 1;
for(int i=1;i<rates_total;i++)
{
TimeToStruct(time[i],date);
if(date.day == count.day) // Ждем, пока наступит следующий день
{
dayATR.Add(maxPrice - minPrice); // Вычисляем АТР за день
maxPrice = high[i]; // обнуляем хай и лоу
minPrice = low[i];
if(dayATR.Total() > ATRPeriod) // После каждого дня удаляем АТР за старый день и добавляем новый, чтобы был список из АТР за нужный Период
{
dayATR.Delete(0);
}
if(dayATR.Total() < ATRPeriod) // Ждем, когда пройдет нужное количество дней для вычисления общего АТР
{
count.day += 1;
continue;
}
for(int j = 0;j<ATRPeriod;j++) // Суммируем АТР по каждому дню
{
AverageATR += dayATR[j];
}
ATRBuffer[i] = AverageATR / ATRPeriod; // Вычисляем средний АТР за кол-во дней
AverageATR = 0;
count.day += 1; // Переходим к следующему дню
}
else
{
ATRBuffer[i] = ATRBuffer[i-1];
if (high[i] > maxPrice)
{
maxPrice = high[i];
}
if (low[i] < minPrice)
{
minPrice = low[i];
}
}