Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 154

 
paladin800:
Т.е. вам из цифры 1,33182 надо получить 1,3318? Вам надо просто отбросить 5-ую цифру после запятой или округлить до 4-ой цифры, т.е. например из 1,33186 надо 1,3318 или 1,3319?

У меня вопрос есть баг или нету. При приведении из double в int в моем примере результат выдается на единицу меньше. Проверьте у себя пожалуйста. 

   double max=NormalizeDouble(1.33182,4);  
   //double max=1.3318;
   Alert(int(max*10000));
Alert должен выдать 13318, а выдает 13317. При этом если не приводить к int, то выдаст правильно 13318.0
 

Скажите, есть ли разница в выражениях:

if(bufferclose[1]<=MaxLine(1)-m_open_bar_error*ticksize && bufferopen[1]<=MaxLine(1)-m_open_bar_error*ticksize)

и

if((bufferclose[1]<=MaxLine(1)-m_open_bar_error*ticksize) && (bufferopen[1]<=MaxLine(1)-m_open_bar_error*ticksize))
 
sgreen:

Скажите, есть ли разница в выражениях:

и

Если у вас подозрения что что-то не так как надо, то сделайте так:

if(bufferclose[1]<= ( MaxLine(1)-m_open_bar_error*ticksize ) && bufferopen[1]<= ( MaxLine(1)-m_open_bar_error*ticksize ) )
 
Rorschach:

У меня вопрос есть баг или нету. При приведении из double в int в моем примере результат выдается на единицу меньше. Проверьте у себя пожалуйста. 

Alert должен выдать 13318, а выдает 13317. При этом если не приводить к int, то выдаст правильно 13318.0
Алерт не выдаёт ошибку. Т.е. бага нету.  Дело в том что нормализация приводит число к двоичной форме, которая наиболее близка к запрашиваемому десятичному аналогу, при этом может с ним не совпадать в большую или меньшую (в вашем случае) сторону.  Поскольку то, что выразимо конечной десятичной дробью, не всегда может быть выражено конечной двоичной.  Выражение
int(max*10000)

приводит к отбрасыванию дробной части, а не округлению (т.е. похожа скорее на MathFloor(), нежели на MathRound()), а в вашем случае нормализованное число вполне может быть равно не 13318 ровно, а скажем 13317,999999999999997

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

Надеюсь понятно объяснил.

 
pronych:
аналог шарповского partial есть? или как сделать?

аналога нет.  можно врезать кусок определения при помощи #include <partial_class_code.mqh>

некоторые деятели даже множественное наследование таким способом имитируют.  // я этим не занимаюсь, привык обходится без оного.  и даже, стесняюсь признаться, нравится. :)

 
paladin800:

Если у вас подозрения что что-то не так как надо, то сделайте так:

Уже сделал. Просто интересно.
 
sgreen:
Уже сделал. Просто интересно.

Понятно. Возвращая к вашему предыдущему вопросу суть записи можно провести к такому сравнению:

if (A<=B && C<=D)     // 1
if ((A<=B) && (C<=D)) // 2

 Разницы между этими записями нет. Заодно рекомендую математические вычисления внутри if-ов заключать в скобки, типа: 

if (A<=(B1+B2*B3) && C<=(D1-D2*D3))
Распределенные вычисления в сети MQL5 Cloud Network
Распределенные вычисления в сети MQL5 Cloud Network
  • cloud.mql5.com
Заработать деньги, продавая мощности своего компьютера для сети распределенных вычислений MQL5 Cloud Network
 
MetaDriver:
Алерт не выдаёт ошибку. Т.е. бага нету.  Дело в том что нормализация приводит число к двоичной форме, которая наиболее близка к запрашиваемому десятичному аналогу, при этом может с ним не совпадать в большую или меньшую (в вашем случае) сторону.  Поскольку то, что выразимо конечной десятичной дробью, не всегда может быть выражено конечной двоичной.  Выражение

приводит к отбрасыванию дробной части, а не округлению (т.е. похожа скорее на MathFloor(), нежели на MathRound()), а в вашем случае нормализованное число вполне может быть равно не 13318 ровно, а скажем 13317,999999999999997

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

Надеюсь понятно объяснил.

Спасибо, понятно.

Еще вопрос, как с этим бороться, если без перевода в int не обойтись? 

 
Подскажите как при тестировании советника учесть комиссию брокера?
 
Rorschach:

Спасибо, понятно.

Еще вопрос, как с этим бороться, если без перевода в int не обойтись? 

 а вы пару эпсилонов прибавьте.

DBL_EPSILON

Наименьшее число для которого выполняется условие 1.0+DBL_EPSILON != 1.0


Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Константы числовых типов
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Константы числовых типов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Константы числовых типов - Документация по MQL5
Причина обращения: