Об отличиях значений индикаторов на графике от значение их буферов.

 
Имеем индикатор с 3-мя линиями на графике и, соответственно с 3-мя буферами. Последнее значение индикатора перестраивается по текущему Close. Предполагается использование индикатора в стратегии.

Сейчас нас интересует только последнее значение. Пишем код:

Определяем хэндл
int               hFBat2S;
hFBat2S=iCustom(NULL,0,"MyInd\\FBat\\FBat2S");

Функция считывания буферов. Возвращает последнее значение указанного буфера
double cQuoteData::IndValue(int buffnum)
  {
   double out[1];
   CopyBuffer(hFBat2S,buffnum,0,1,out);
   return out[0];
  }

В OnTick распечатываем последние значения всех буферов индикатора
void OnTick()
  {
   Print("OnTick, 0: "+ (string)cQuoteData::IndValue(0) + ", 1: " + (string)cQuoteData::IndValue(1)+ 
   ", 2: " + (string)cQuoteData::IndValue(2));
  };

Смотрим распечатку

2018.03.01 13:12:23.733 SigmaExpert (EURUSD,M1) OnTick, 0: 1.218771922983449, 1: 1.218960029262306, 2: 1.218583816704593

Для буфера 0 - на графике - 1.218529, в буфере -1.218771922983449

 Для буфера 1 - на графике - 1.218763, в буфере -1.218960029262306,

 для буфера 2 - на графике -  1.218240, в буфере -1.218583816704593.

  На других ТФ все тоже самое.

 Как видим, разница в несколько единиц 4-го знака, что существенно превышает спрэд.

Для больших ТФ м.б. это и сойдет, а для малых это уже никуда не годится.


 

 
Yuriy Asaulenko:
Смотрим распечатку

Для буфера 0 - на графике - 1.218529, в буфере -1.218771922983449

 Для буфера 1 - на графике - 1.218763, в буфере -1.218960029262306,

 для буфера 2 - на графике -  1.218240, в буфере -1.218583816704593.

  На других ТФ все тоже самое.

Каким образом считываете показания с графика? Просто визуально? Тогда встает вопрос о синхронизации этих действий. Ведь тики приходят достаточно часто. Вряд ли успеете зафиксировать визуально принятое значение, чтобы корректно сравнить его с тем, что в логе.

Сравнения визуальных данных и программно полученных лучше проводить на уже сформированных барах. Если и там разногласия, то это повод углубиться в код.

 
Ihor Herasko:

Каким образом считываете показания с графика? Просто визуально? Тогда встает вопрос о синхронизации этих действий. Ведь тики приходят достаточно часто. Вряд ли успеете зафиксировать визуально принятое значение, чтобы корректно сравнить его с тем, что в логе.

Сравнения визуальных данных и программно полученных лучше проводить на уже сформированных барах. Если и там разногласия, то это повод углубиться в код.

Да, визуально. Отключаем инет, Далее, наводилась мышка, и из высвечивающегося окошка считывалось число. Но даже без этого видно, что график отличается от буфера. Работал только с последним значением. другие не проверялись. Меня пока интересует только последнее значение.

На последнем баре индикатор перестраивается.

ЗЫ Индикатор достаточно медленный, и даже без отключения инета все видно. Это-же 4-й знак!

ЗЫ2 Вечером посмотрю-сравню значения на предыдущих барах.

 
Yuriy Asaulenko:
Имеем индикатор с 3-мя линиями на графике и, соответственно с 3-мя буферами. Последнее значение индикатора перестраивается по текущему Close. Предполагается использование индикатора в стратегии.

Сейчас нас интересует только последнее значение. Пишем код:

Смотрим распечатку

Для буфера 0 - на графике - 1.218529, в буфере -1.218771922983449

 Для буфера 1 - на графике - 1.218763, в буфере -1.218960029262306,

 для буфера 2 - на графике -  1.218240, в буфере -1.218583816704593.

  На других ТФ все тоже самое.

 Как видим, разница в несколько единиц 4-го знака, что существенно превышает спрэд.

Для больших ТФ м.б. это и сойдет, а для малых это уже никуда не годится.

Возникает вопрос: как при отключенном интернете (без тиков) работает функция OnTick() ?

Теоретически можно сделать в индикаторе так: завести 6 буферов и запретить вывод первых трех в окно данных. Проверьте так: посмотрите содержимое буферов 3, 4, 5. Если там нули - буфера отсутствуют... и у Вас что-то другое

 
STARIJ:

Возникает вопрос: как при отключенном интернете (без тиков) работает функция OnTick() ?

Теоретически можно сделать в индикаторе так: завести 6 буферов и запретить вывод первых трех в окно данных. Проверьте так: посмотрите содержимое буферов 3, 4, 5. Если там нули - буфера отсутствуют... и у Вас что-то другое

При отключении инета все замирает (OnTick()), и все последние данные можно смотреть часами.) Эт чтобы двигаться перестало.)

Теоретически, CopyBuffer неоткуда считывать данные, кроме как из буферов по хэндлу. Все движется, все живет по тикам.

Не понял - отрисовывающихся буферов всего 3 -0,1,2. Никаких 3,4,5 нет. Точнее, есть еще 2 расчетных буфера, но там полная лабуда для графиков - они-б зашкалили.)) Но, вообще, индикатор штатно работает, к нему нет вопросов.

 
Yuriy Asaulenko:

Да, визуально. Отключаем инет, Далее, наводилась мышка, и из высвечивающегося окошка считывалось число. Но даже без этого видно, что график отличается от буфера. Работал только с последним значением. другие не проверялись. Меня пока интересует только последнее значение.

На последнем баре индикатор перестраивается.

ЗЫ Индикатор достаточно медленный, и даже без отключения инета все видно. Это-же 4-й знак!

ЗЫ2 Вечером посмотрю-сравню значения на предыдущих барах.

Визуально показание с мышкой может незначительно меняться, всегда смотрите в окно данных, так будет правильно.

Причина обращения: