Индикатор стоимости пункта - страница 3

 
Boris:

А так не нарвёшься:

А если TickSize больше нуля, но меньше 1, то всегда будем получать 1 в знаменателе? Чтобы наверняка избежать ошибки, нужно кэшировать величину TickSize, проверить ее корректность, а потом использовать в расчетах, если значение больше нуля.
 
Игорь Герасько:
А если TickSize больше нуля, но меньше 1, то всегда будем получать 1 в знаменателе? Чтобы наверняка избежать ошибки, нужно кэшировать величину TickSize, проверить ее корректность, а потом использовать в расчетах, если значение больше нуля.
Разве TickSize не целое число, как пункты(Pips)?
 
Boris:
Разве TickSize не целое число, как пункты(Pips)?

Нет.

График XAUUSD, H1, 2015.10.14 13:44 UTC, MetaQuotes Software Corp., MetaTrader 5, Demo
 
Игорь Герасько:

Нет.

Благодарю за наглядность! Тогда вместо 1 поставим Point, чтобы сгодилось и для любых знаков. Так подойдёт?
 
Boris:
Благодарю за наглядность! Тогда вместо 1 поставим 0.00005, чтобы сгодилось и для 4-х знака. Или и это не подойдёт?

Зачем гадать, если есть однозначный способ, использованный мною в индикаторе PointValue (здесь)?

   double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
   if (tickSize <= 0.0)
   {
      Comment("Terminal fatal error!");
      return rates_total;
   }

   double pointValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE) * _Point / tickSize;
 
Игорь Герасько:

Зачем гадать, если есть однозначный способ, использованный мною в индикаторе PointValue (здесь)?

Быстро среагировали, я урывками захожу! Но я уже поправил 1 на Point.
 
Boris:
Быстро среагировали, я урывками захожу! Но я уже поправил 1 на Point.
Дело в том, что для верности тогда нужно еще и сам _Point проверить на 0. Такое (равенство _Point нулю) редко, но бывает. В итоге оказываемся там, откуда пришли. Поэтому наиболее удобный и наглядный способ - просто проверять все знаменатели перед операцией деления на равенство нолю. Причем значение знаменателя должно быть кэшированным, а не вычисляться в процессе операции деления.
 
Игорь Герасько:
Дело в том, что для верности тогда нужно еще и сам _Point проверить на 0. Такое (равенство _Point нулю) редко, но бывает. В итоге оказываемся там, откуда пришли. Поэтому наиболее удобный и наглядный способ - просто проверять все знаменатели перед операцией деления на равенство нолю. Причем значение знаменателя должно быть кэшированным, а не вычисляться в процессе операции деления.

 Спасибо! Но для меня сходит и это, потому как вряд ли когда-нибудь возьмусь за 5-ку. И на 4-ке предпочитаю без новых заморочек с классами, структурами и пр.  

 
Boris:

 Спасибо! Но для меня сходит и это, потому как вряд ли когда-нибудь возьмусь за 5-ку. И на 4-ке предпочитаю без новых заморочек с классами, структурами и пр.  

В четверке этот код будет работать, если заменить описание OnCalculate таким:

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[])

 В этом коде нет ни классов, ни структур. А вот на _Point, равный 0, в МТ4 также легко можно попасть.

 
Игорь Герасько:

В четверке этот код будет работать, если заменить описание OnCalculate таким:

 В этом коде нет ни классов, ни структур. А вот на _Point, равный 0, в МТ4 также легко можно попасть.

Но это обновлённый, тогда всё надо будет переделывать! И индикатор мне не нужен. Я только формулу стоимости пункта в советник поставлю и для инфо в соммент выведу! Кстати, на Point, равный нулю, никогда не попадал. Почти все параметры extern'а int в советнике, потому всё перевожу в double через Point.

Спасибо! С новой документацией знаком, но особенно не воодушевляет.

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