Не, я на RTS сейчас запускаю, когда котиры стоят. Выяснил, что вызывается один раз, а отладчик врет, показывая, будто два. Код для воспроизведения (запускать на символе, где не идут тики)
После нажатия на F5 будет попадание на точку останова. И после второго нажатия на F5 - аналогично. Хотя этого не должно бы было быть - как подтверждение, можно раскоментировать строчку, что в коде и попробовать с ней.
Вот так видно, в чём дело. Проследите за значением i на первой и второй остановках.
Да не врёт, а останавливается дважды - перед вычислением выражения в скобках, и после него, непосредственно перед возвратом.
Кстати, очень удобная фишка, на мой взгляд. Надо запомнить. Не нужно выносить результат в скобках в отдельную переменную, чтобы проверить возвращаемое значение перед выходом, дебаггер сам повторно сделает остановку.
Да не врёт, а останавливается дважды - перед вычислением выражения в скобках, и после него, непосредственно перед возвратом.
Кстати, очень удобная фишка, на мой взгляд. Надо запомнить. Не нужно выносить результат в скобках в отдельную переменную, чтобы проверить возвращаемое значение перед выходом, дебаггер сам второй раз сделает остановку.
Согласился бы, что это удобно. Но как выяснить результат возврата перед выходом без переменной в отладчике?
intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
int i=1;
Print("Перед: i ",i,",rates_total ",rates_total,", prev_calculated ",prev_calculated);
int rezult=Func(i);
Print("После: i ",i,",rates_total ",rates_total,", prev_calculated ",prev_calculated);
return(rezult); // здесь поставить точку останова (F9)
}
и набросьте индикатор на график. А потом перезагрузите терминал (индикатор удалять с графика не нужно). Увидите, что OnCalculate() может быть вызвано и один раз, и два раза, и даже три. То етьс, как я говорил выше - нет жёстких правил.
и набросьте индикатор на график. А потом перезагрузите терминал (индикатор удалять с графика не нужно). Увидите, что OnCalculate() может быть вызвано и один раз, и два раза, и даже три. То етьс, как я говорил выше - нет жёстких правил.
Вы вынуждаете меня жаловаться на вас, как абсолютно не желающего слышать то, что пишет оппонент.
fxsaber: Согласился бы, что это удобно. Но как выяснить результат возврата перед выходом без переменной в отладчике?
Посмотреть в теле Func(), что она возвращает перед выходом. Я ж о частном случае говорю. Если значение будет вычисляться непосредственно в скобках, то никак, конечно.
PS. Хотя... Почему никак? На второй остановке посмотреть значения всех аргументов return() и подсчитать результат. )
fxsaber: Вы вынуждаете меня жаловаться на вас, как абсолютно не желающего слышать то, что пишет оппонент.
Это Ваше право, моя задача донести до Вас, что нет жестких правил по количеству вызовов OnCalculate() - так как эта функция по сути, отображает реакцию на события: или подкачку истории, или изменении истории (приход свежих тиков) или подготовка торгового окружения.
Sergei Vladimirov: Посмотреть в теле Func(), что она возвращает перед выходом. Я ж о частном случае говорю. Если значение будет вычисляться непосредственно в скобках, то никак, конечно.
fxsaber: Спасибо. Никак не могу понять, почему в начале индикатор вызывает дважды OnCalculate. Хотелось бы выяснить, на какое событие такая реакция. По отладке, к сожалению, событий не видно.
Ответ из Сервисдеска по этому вопросу:
Конкретно зависит от контрольной суммы.
История может и не подкачалась (вполне может быть модификация уже существующей истории без добавления новых данных), а контрольная сумма значительно изменилась
Не, я на RTS сейчас запускаю, когда котиры стоят. Выяснил, что вызывается один раз, а отладчик врет, показывая, будто два. Код для воспроизведения (запускать на символе, где не идут тики)
После нажатия на F5 будет попадание на точку останова. И после второго нажатия на F5 - аналогично. Хотя этого не должно бы было быть - как подтверждение, можно раскоментировать строчку, что в коде и попробовать с ней.
Вот так видно, в чём дело. Проследите за значением i на первой и второй остановках.
Вот так видно, в чём дело. Проследите за значением i на первой и второй остановках.
Прослеживал, поэтому и написал
Выяснил, что вызывается один раз, а отладчик врет, показывая, будто два
Зачем отладчик возвращает меня туда же после второго нажатия на F5? С return(0) такого не происходит, что есть правильно.
Да не врёт, а останавливается дважды - перед вычислением выражения в скобках, и после него, непосредственно перед возвратом.
Кстати, очень удобная фишка, на мой взгляд. Надо запомнить. Не нужно выносить результат в скобках в отдельную переменную, чтобы проверить возвращаемое значение перед выходом, дебаггер сам повторно сделает остановку.
Да не врёт, а останавливается дважды - перед вычислением выражения в скобках, и после него, непосредственно перед возвратом.
Кстати, очень удобная фишка, на мой взгляд. Надо запомнить. Не нужно выносить результат в скобках в отдельную переменную, чтобы проверить возвращаемое значение перед выходом, дебаггер сам второй раз сделает остановку.
Поставьте такой код:
и набросьте индикатор на график. А потом перезагрузите терминал (индикатор удалять с графика не нужно). Увидите, что OnCalculate() может быть вызвано и один раз, и два раза, и даже три. То етьс, как я говорил выше - нет жёстких правил.
Поставьте такой код:
и набросьте индикатор на график. А потом перезагрузите терминал (индикатор удалять с графика не нужно). Увидите, что OnCalculate() может быть вызвано и один раз, и два раза, и даже три. То етьс, как я говорил выше - нет жёстких правил.
Согласился бы, что это удобно. Но как выяснить результат возврата перед выходом без переменной в отладчике?
Посмотреть в теле Func(), что она возвращает перед выходом. Я ж о частном случае говорю. Если значение будет вычисляться непосредственно в скобках, то никак, конечно.
PS. Хотя... Почему никак? На второй остановке посмотреть значения всех аргументов return() и подсчитать результат. )
Вы вынуждаете меня жаловаться на вас, как абсолютно не желающего слышать то, что пишет оппонент.
Посмотреть в теле Func(), что она возвращает перед выходом. Я ж о частном случае говорю. Если значение будет вычисляться непосредственно в скобках, то никак, конечно.
Спасибо. Никак не могу понять, почему в начале индикатор вызывает дважды OnCalculate. Хотелось бы выяснить, на какое событие такая реакция. По отладке, к сожалению, событий не видно.
Ответ из Сервисдеска по этому вопросу:
Конкретно зависит от контрольной суммы.
История может и не подкачалась (вполне может быть модификация уже существующей истории без добавления новых данных), а контрольная сумма значительно изменилась