Ошибки, баги, вопросы - страница 1680

 
fxsaber:
А что это за звездочки под названием темы? И количество отзывов еще.
Вот кстати давно интересно где эти самые звезды к темам смотреть и ставить
 

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

 

Грубо говоря, хотелось бы иметь доступ ко вложенному дереву вызовов функций/методов. Это возможно?

 
fxsaber:
Как в режиме дебага узнать, откуда была вызвана функция, в которой сейчас нахожусь?

В режиме "Шаг с заходом" поочерёдно просматривая вкладку "Отладка":

ступени 

 
Karputov Vladimir:

В режиме "Шаг с заходом" поочерёдно просматривая вкладку "Отладка":

Спасибо. Никак не могу понять, почему в начале индикатор вызывает дважды OnCalculate. Хотелось бы выяснить, на какое событие такая реакция. По отладке, к сожалению, событий не видно.
 
fxsaber:
Спасибо. Никак не могу понять, почему в начале индикатор вызывает дважды OnCalculate. Хотелось бы выяснить, на какое событие такая реакция. По отладке, к сожалению, событий не видно.

Бывает дважды, бывает один, а может и три раза дёрнуть: Вы в Oncalculate() поставьте такой код -

//+------------------------------------------------------------------+
//|  Accelerator/Decelerator Oscillator                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   Print(__FUNCTION__,", rates_total ",rates_total,", prev_calculated ",prev_calculated);

будет понятно, когда происходит подкачка истории (при подкачке истории prev_calculated==0).

 
Karputov Vladimir:

Бывает дважды, бывает один, а может и три раза дёрнуть: Вы в Oncalculate() поставьте такой код -

будет понятно, когда происходит подкачка истории (при подкачке истории prev_calculated==0).

Не, я на RTS сейчас запускаю, когда котиры стоят. Выяснил, что вызывается один раз, а отладчик врет, показывая, будто два. Код для воспроизведения (запускать на символе, где не идут тики)

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

int Func(){ return(0); }

int OnCalculate( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[] )
{
//  return(0); // если расскоментировать и здесь поставить точку останова, то отладчик отработает, как надо
  return(Func()); // здесь поставить точку останова (F9)
}

После нажатия на F5 будет попадание на точку останова. И после второго нажатия на F5 - аналогично. Хотя этого не должно бы было быть - как подтверждение, можно раскоментировать строчку, что в коде и попробовать с ней.

 
fxsaber:

Не, я на RTS сейчас запускаю, когда котиры стоят. Выяснил, что вызывается один раз, а отладчик врет, показываю, будто два. Код для воспроизведения (запускать на символе, где не идут тики)

После нажатия на F5 будет попадание на точку останова. И после второго нажатия на F5 - аналогично. Хотя этого не должно бы было быть - как подтверждение, можно раскоментировать строчку, что в коде и попробовать с ней.

Без разницы идут котировки или стоят. В индикаторе нужно контролировать условие prev_calculate==0 - это подкачка истории и второй момент - щадящий режим пересчёта изменённых баров, то есть по сути rates_total -prev_calculate+1.
 
Karputov Vladimir:
Без разницы идут котировки или стоят. В индикаторе нужно контролировать условие prev_calculate==0 - это подкачка истории и второй момент - щадящий режим пересчёта изменённых баров, то есть по сути rates_total -prev_calculate+1.

Вы бы читали сначала, что написано, а только потом отвечали. Код для воспроизведения бага отладчика! Все данные для воспроизведения даны.

Вот скрипт для воспроизведения того же бага

int Func(){ return(0); }

int Func2()
{
//  return(0); // если расскоментировать и здесь поставить точку останова, то отладчик отработает, как надо  
  return(Func()); // здесь поставить точку останова (F9)
}

void OnStart()
{
  Func2();
}
 
fxsaber:
Вы бы читали сначала, что написано, а только потом отвечали. Код для воспроизведения бага отладчика! Все данные для воспроизведения даны.

Я Вам ответил - Вам нет дела до того, сколько раз вызывается OnCalculate. Ваша задача - обеспечивать или полный пересчёт индикатора или частичный, анализируя два значения: rates_total, prev_calculate и условие когда prev_calculate==0.

Нет жёстких условий, что OnCalculate() должна быть вызвана один или два раза. OnCalculate() никому ничего не должна. А вот программист обязан контролировать два значения: rates_total, prev_calculate и условие когда prev_calculate==0.

 
Karputov Vladimir:
Я Вам ответил - Вам нет дела до того, сколько раз вызывается OnCalculate. Ваша задача - обеспечивать или полный пересчёт индикатора или частичный, анализируя два значения: rates_total, prev_calculate и условие когда prev_calculate==0.

Мне есть дело, сколько раз вызывается отладчик и сколько раз вызывается OnCalculate. Я по натуре ЗАНУДА! И мне до всего есть дело.

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