if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;

 

Здравствуйте! Нашел в стандартном индикаторе вот такую строчку кода

if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;

Мне не понятно в каких ситуациях может быть

1.prev_calculated>rates_total - кол-во подсчитанный баров больше кол-ва баров на графике.

2.prev_calculated<0 -                 кол-во подсчитанный баров меньше 0.

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



 

В каком это стандартном индикаторе? Ссылка на CodeBase есть?

 
Dmitry Fedoseev:

В каком это стандартном индикаторе? Ссылка на CodeBase есть?


очевидно что стандартный, значит в поставке МТ, какая тут ссылка, пусть даст название индикатора

 
Konstantin:

очевидно что стандартный, значит в поставке МТ, какая тут ссылка, пусть даст название индикатора

Дааа, конечно очевидно, что стандартный, если так и написано - "стандартный".

Все эти пользовательские индикаторы приложенные к терминалу в качестве примеров есть в CоdeBase, да и не в этом суть, а в том, что бы посозерцать реально объект обсуждения.

 

Ищутся эти совпадения элементарно: в строку поиска MetaEditor'a вставляется строка "if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total" и выбирается режим "Поиск в файлах". Первый подопытный - "Accelerator".

Вероятно конструкция

//--- we can copy not all data
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0)
      to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0)
         to_copy++;
     }

была введена для защиты вот от таких случаев ("+1" я дописал сам - для тестирования):

//--- return value of prev_calculated for next call
   return(rates_total+1);

- то есть вероятно раньше была возможность в конце OnCalculate() вернуть количество баров больше, чем "rates_total". А так как в коде применяется копирование ("CopyBuffer"), то можно было бы получить ошибку выхода за пределы массива.


Сейчас я попробовал 

//--- return value of prev_calculated for next call
   return(rates_total+1);

- но обмануть не удалось - при таком методе при последующем заходе в OnCalculate() "prev_calculated" сбрасывается в "0".

 

У меня один раз брокер глюканул, и на пару часов просто потерял историю баров дальше месяца назад. График цены обрывался месяц назад. Вот в таком случае rates_total точно уменьшились до нового очень маленького значения, индикаторы и эксперт позакрывались с ошибками в логах.

Это было на MT5. Мне кажется в MT4 другая система контроля истории, и брокер уже не может изменить ранее сохранённые бары.
 
Vladimir Karputov:

Сейчас я попробовал 

Менять символ на другой с меньшим кол-вом баров истории не пробовали?
 
Alexander Puzanov:
Менять символ на другой с меньшим кол-вом баров истории не пробовали?

Пробовал. Например был символ EURUSD, а потом замена символа на RTS-9.17.

А какой смысл в таком действии? Ведь при смене символа индикатор загружается по новой.

 
Vladimir Karputov:

Пробовал. Например был символ EURUSD, а потом замена символа на RTS-9.17.

А какой смысл в таком действии? Ведь при смене символа индикатор загружается по новой.

Или переключать на ТФ с короткой историей

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

 

Т.е. такая ситуация как 

1.prev_calculated>rates_total - кол-во подсчитанный баров больше кол-ва баров на графике.

2.prev_calculated<0 -                 кол-во подсчитанный баров меньше 0.

имеет место быть, то значит при таких условиях в индикаторе нужно просто делать перерасчет от 0 до rates_total, и я думаю на этом все))

 
Tango_X:

Т.е. такая ситуация как 

1.prev_calculated>rates_total - кол-во подсчитанный баров больше кол-ва баров на графике.

2.prev_calculated<0 -                 кол-во подсчитанный баров меньше 0.

имеет место быть, то значит при таких условиях в индикаторе нужно просто делать перерасчет от 0 до rates_total, и я думаю на этом все))


Не ну вы сподобитесь написать в каком индикаторы вы такое увидели, или не царское дело? Где увидели, что ситуация имеет место быть?

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