Просьба помочь найти баг - страница 2

 
Vinin >>:

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

А если одна и та же логика работает по разному внутри одной и той же функции, то как извините это называется?

Тоже ошибка логики?

 
Andrei01 >>:

А если одна и та же логика работает по разному внутри одной и той же функции, то как извините это называется?

Тоже ошибка логики?

Не надо раньше времени грешить на терминал. Проблема оказалась в самонадеянности автора индикатора, который не проинициализировал переменные массивов. Проблема решилась путем добавления двухстрочек после их объявления:

   int a[60], b[60];
   ArrayInitialize(a,0);
   ArrayInitialize(b,0);

а ниже результат работы программы:

n   a[] b[] ;19:44:01
 1; ;0; ;0
 2; ;0; ;0
 3; ;0; ;0
 4; ;1; ;2
 5; ;0; ;0
 6; ;1; ;6
 7; ;0; ;0
 8; ;0; ;0
 9; ;0; ;0
10; ;0; ;0
11; ;0; ;0
12; ;1; ;3
13; ;0; ;0
14; ;0; ;0
15; ;1; ;1
16; ;1; ;3
17; ;0; ;0
18; ;0; ;0
19; ;1; ;1
20; ;1; ;5
21; ;0; ;0
22; ;0; ;0
23; ;0; ;0
24; ;0; ;0
25; ;1; ;9
26; ;0; ;0
27; ;0; ;0
28; ;0; ;0
29; ;0; ;0
30; ;0; ;0
31; ;0; ;0
32; ;0; ;0
33; ;0; ;0
34; ;1; ;2
35; ;0; ;0
36; ;1; ;2
37; ;0; ;0
38; ;1; ;1
39; ;1; ;1
40; ;1; ;2
41; ;0; ;0
42; ;1; ;1
43; ;1; ;1
44; ;1; ;2
45; ;0; ;0
46; ;1; ;1
47; ;1; ;2
48; ;0; ;0
49; ;1; ;3

будьте внимательнее ...и добавьте таки инициализацию переменной LastBar

Удачи.

 
alsu >>:

Не надо раньше времени грешить на терминал. Проблема оказалась в самонадеянности автора индикатора, который не проинициализировал переменные массивов. Проблема решилась путем добавления двухстрочек после их объявления:

а ниже результат работы программы:

будьте внимательнее ...и добавьте таки инициализацию переменной LastBar

Удачи.

спасибо, но проверить смогу только когда начнётся движение цен так как в статическом режиме всё работает и так.


пока что, без запуска и "на глаз" предлагаемое решение выглядит не очень логичным - зачем нужно добавочно инициализировать переменные массивов, если эти массивы и так полностью расчитываются во время вызова функции start()?

отсюда также выходит, что предварительная инициализация всех массивов строго обязательна для корректной работы МТ4, даже если эти начальные значения всё равно не используются в дальнейшем расчёте?

к сожалению, нигде в документации такого требования к массивам не встречал, так как обычно подразумевается, что достаточно просто объявить массивы в теле функции чтобы их можно было нормально использовать.


кстати, если какой-то способ для случайного моделирования движения цен для отладки кода когда нет торгов или например отсутствует связь с сервером?

 
Andrei01 >>:

спасибо, но проверить смогу только когда начнётся движение цен так как в статическом режиме всё работает и так.


пока что, без запуска и "на глаз" предлагаемое решение выглядит не очень логичным - зачем нужно добавочно инициализировать переменные массивов, если эти массивы и так полностью расчитываются во время вызова функции start()?

отсюда также выходит, что предварительная инициализация всех массивов строго обязательна для корректной работы МТ4, даже если эти начальные значения всё равно не используются в дальнейшем расчёте?

к сожалению, нигде в документации такого требования к массивам не встречал, так как обычно подразумевается, что достаточно просто объявить массивы в теле функции чтобы их можно было нормально использовать.


кстати, если какой-то способ для случайного моделирования движения цен для отладки кода когда нет торгов или например отсутствует связь с сервером?


в том то и дело, что массив b[] рассчитывается у Вас не полностью, а только те индексы, куда прописываются подсчитанные количества нулей. Что лежит в остальных - пес его знает, так как какой участок памяти компилятор выделит под массив, заранее неизвестно, а обнуление в целях быстродействия в стандартный набор услуг не включено (исключение - индикаторные буферы, которые по умолчанию на всех позициях содержат значение EMPTY_VALUE). А вообще говоря, инициализация - даже если она не требуется по логике программы - всех переменных, включая массивы, относится к "правилам хорошего тона" программирования, т.к. позволяет избежать траты времени на поиск неочевидных ошибок, как, например, в Вашем случае.


Моделирование поведения цен выполняет тестер. Выбирайте кусок истории, какой Вам нравится, и гоняйте код.

 
alsu >>:

в том то и дело, что массив b[] рассчитывается у Вас не полностью, а только те индексы, куда прописываются подсчитанные количества нулей. Что лежит в остальных - пес его знает, так как какой участок памяти компилятор выделит под массив, заранее неизвестно, а обнуление в целях быстродействия в стандартный набор услуг не включено (исключение - индикаторные буферы, которые по умолчанию на всех позициях содержат значение EMPTY_VALUE). А вообще говоря, инициализация - даже если она не требуется по логике программы - всех переменных, включая массивы, относится к "правилам хорошего тона" программирования, т.к. позволяет избежать траты времени на поиск неочевидных ошибок, как, например, в Вашем случае.


Моделирование поведения цен выполняет тестер. Выбирайте кусок истории, какой Вам нравится, и гоняйте код.

Спасибо. Да, действительно массив b[] не расчитывается полностью, хотя в моей исходной версии есть инициализация как b[60] = {0}, а не через функцию и это не работало. В данном файле я почему-то это пропустил по-ошибке.


К сожалению, в тестере мне запустить этот код не удалось - пишет: invalid handle 0 in FileWrite, после того как я перенес этот код в раздел экспертов.

 
Andrei01 >>:

Спасибо. Да, действительно массив b[] не расчитывается полностью, хотя в моей исходной версии есть инициализация как b[60] = {0}, а не через функцию и это не работало. В данном файле я почему-то это пропустил по-ошибке.


К сожалению, в тестере мне запустить этот код не удалось - пишет: invalid handle 0 in FileWrite, после того как я перенес этот код в раздел экспертов.

b[60] = {0} означает что вы инициализируете нулём 0-вую ячейку массива, а остальные?

Есть же ArrayInitialize() и ArrayResize() чё огород городить?

 
Urain >>:

b[60] = {0} означает что вы инициализируете нулём 0-вую ячейку массива, а остальные?

Есть же ArrayInitialize() и ArrayResize() чё огород городить?

Спасибо. Сейчас вроде всё стало ясно.

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