Расхождение значений индикатора и его же в эксперте

 
Хочу посоветоваться с опытными разработчиками MQL кода.

В тестере накладываю на график индикаторы. Те же самые индикаторы, их значения, считаются в коде эксперта (код индикаторов мне открыт), это некий ряд на основе 30-90 значений последних цен закрытия.

Методика расчёта индикаторов в эксперте такая.
1. Качаются цены в массивы для всех нужных таймфреймов методом:
bool downloadArray6(double arrClose[][], int currPeriod)
{
   // закачать массив ценовых параметров //
   // if OK, return true //
   // провести закачку
   int number_copied = ArrayCopyRates(arrClose, NULL, currPeriod);
 
   // если нет, повторить
   if (GetLastError() == 4009)
      number_copied = ArrayCopyRates(arrClose, NULL, currPeriod);
 
   if (PrintErrMessage("downloadArray6(" + currPeriod + ") FAILED "))
      return(false); // FAILED
 
   // OK
   return (true);
}
2. И потом индикатор считается как:
double getValue(double arrClose[][], int shift)
на основе переданных в массиве значений arrClose[shift+0][4], arrClose[shift+1][4], arrClose[shift+2][4] и т.д.
Нулевой бар я вседа из расчётов убираю.
И всё же на графике, ставя точки через ObjectCreate:
         if (ObjectCreate(sName
            , OBJ_ARROW // OBJ_VLINE // OBJ_ARROW // int type OBJ_RECTANGLE 4 Символ Черточки (–)
            , 0 // int window
            , Time[0]
            , dValue
            ))
         {
            ObjectSet(sName, OBJPROP_ARROWCODE, 159); // 252 251 170 115 224
            ObjectSet(sName, OBJPROP_TIMEFRAMES, OBJ_ALL_PERIODS);
            //ObjectSet(sName, OBJPROP_COLOR, Red);
            ObjectSet(sName, OBJPROP_COLOR, MediumAquamarine);
         }
значений этих индикаторов, рассчитанных в эксперте, вижу расхождение с этими же индикаторами, положенными на график.

На графике Magenta-точки аппроксимируют в эксперте белый индикатор, а Cyan-точки - коричневый индикатор. На втором особенно виден большой разброс точек-объектов от индикатора.
Кто-нибудь может подсказать причину такой разницы?
 
Вставьте хотя бы простую проверку - совпадение последних N элементов arrClose[][] с данными, которые видит тестер. Если они совпадют - значит косяк в Вашей реализации. Больше сказать пок аничего нельзя.
 
Rosh:
Вставьте хотя бы простую проверку - совпадение последних N элементов arrClose[][] с данными, которые видит тестер. Если они совпадют - значит косяк в Вашей реализации. Больше сказать пок аничего нельзя.

Честно, не совсем понял, с чем мне сравнить arrClose[][]? Это же цены закрытия по разным TimeFrames. Сравнить их с даными из iClose(), или не то?
 

Существует разница в способах расчётов.
Индикатор, прикреплённый к графику, рассчитывается с каждым новым тиком.
Индикатор, вызываемый из эксперта, рассчитывается только при его вызове функцией iCustom, и не факт, что эти вызовы будут производиться каждый тик.

 
stringo:

Существует разница в способах расчётов.
...


А разве эта разница может повлиять на результаты, если расчет идет по ценам закрытия баров (на нулевом баре может и будет разница, а на остальных почему)?
 
Совсем недавно это обсуждалось в ветке Похоже, iCustom() таки ошибается
 
Rosh:
Совсем недавно это обсуждалось в ветке Похоже, iCustom() таки ошибается

Прочитал эту ветку. Заинтересовала цитата Рената:
"Но в тестере все по-другому. Там индикатор вызывается только в нужные моменты и между вызовами может пройти несколько баров/тиков".
Но совсем понял, это особенности того конкретно обсуждаемого эксперта, или сам тестер может пропустить несколько баров при расчёте индикатора?
И ещё момент, мне действительно нужны для расчёта индикаторов максимум последние 90 цен (баров), но я ведь не могу управлять числом закачиваемых баров через ArrayCopyRates, у неё нет параметра MaxBars.

Вообще, эта задача, как вижу, актуальна, и что всё же точнее - вносить код индикатора в эксперт, или вызывать его как "черный ящик" через iCustom? И в случае с iCustom, он всегда возвращает double, если индикатор не готов отдать это значение (поток занят и т.д.), что он вернёт? Сам пока не исследовал этот вопрос, может, уже кто-то проходил это? Поделитесь, пожалуйста, информацией.

Опять же, исходя из этой цитаты:
stringo 16.05.2007 15:23

Существует разница в способах расчётов.
Индикатор, прикреплённый к графику, рассчитывается с каждым новым тиком.
Индикатор, вызываемый из эксперта, рассчитывается только при его вызове функцией iCustom, и не факт, что эти вызовы будут производиться каждый тик.

То, если эксперт пропускает N-е число тиков, но это всё в пределах одного бара, то что страшного в пропуске нескольких тиков? Тиков ведь в одном баре много.

 
После того, как несколько раз нарвался на неприятности вроде тех, о которых сообщал в той ветке, принял такой порядок действий:
-- идея/проверка/отладка --> для сокращения времени можно вызывать индикатор из эксперта как подпрограмму;
-- окончательная доводка до ума/подготовка рабочего варианта --> только встраивание кода индикатора в тело эксперта, чтобы он выполнялся строго в том же самом потоке, что и эксперт. Рисовать на графике при необходимости - из эксперта с помощью объектов.
З.Ы. А все-таки - почему иногда получалась суперпозиция числа пи и цен с графика (см. ветку)? И не противоречит ли это здравому смыслу?
 
chv:

Вообще, эта задача, как вижу, актуальна, и что всё же точнее - вносить код индикатора в эксперт, или вызывать его как "черный ящик" через iCustom? И в случае с iCustom, он всегда возвращает double, если индикатор не готов отдать это значение (поток занят и т.д.), что он вернёт? Сам пока не исследовал этот вопрос, может, уже кто-то проходил это? Поделитесь, пожалуйста, информацией.

Опять же, исходя из этой цитаты:
stringo 16.05.2007 15:23

Существует разница в способах расчётов.
Индикатор, прикреплённый к графику, рассчитывается с каждым новым тиком.
Индикатор, вызываемый из эксперта, рассчитывается только при его вызове функцией iCustom, и не факт, что эти вызовы будут производиться каждый тик.

То, если эксперт пропускает N-е число тиков, но это всё в пределах одного бара, то что страшного в пропуске нескольких тиков? Тиков ведь в одном баре много.


Так-же нарвался разок на нопонятности при использовании iCustom а именно при управлении типами цен из эксперта, разбиратся небыло ни времени ни особого желания, просто перенес индикатор прямо в эксперт и проблема исчезла. Из за неоднократных нареканий на форуме на эту функцию (возможно и незаслуженных), решил от нее пока отказатся.
 
xeon:

Так-же нарвался разок на нопонятности при использовании iCustom а именно при управлении типами цен из эксперта, разбиратся небыло ни времени ни особого желания, просто перенес индикатор прямо в эксперт и проблема исчезла. Из за неоднократных нареканий на форуме на эту функцию (возможно и незаслуженных), решил от нее пока отказатся.

Возможно, была попытка использовать в индикаторе тип int. Тогда - да, проблемы обеспечены.
 
Rosh:
xeon:

Так-же нарвался разок на нопонятности при использовании iCustom а именно при управлении типами цен из эксперта, разбиратся небыло ни времени ни особого желания, просто перенес индикатор прямо в эксперт и проблема исчезла. Из за неоднократных нареканий на форуме на эту функцию (возможно и незаслуженных), решил от нее пока отказатся.

Возможно, была попытка использовать в индикаторе тип int. Тогда - да, проблемы обеспечены.

Rosh, а можно поподробнее про тип int в индикаторе? И связаные с этим проблемы. Честно, первый раз слышу, что использование int'a даёт какие-то проблемы с индикатором. Хочется узнать суть задачи, у меня int'ы стоят в индикаторах и экспертах сплошь и рядом.
Причина обращения: