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

 
-Aleks-:

 А какие работают?

Работает правило потери значащих цифр и заполнение их рандомом

Результат long, но в промежуточных вычислениях double и именно в них теряются значащие цифры  

(Digits+1)*3-1=17

 
A100:

Работает правило потери значащих цифр и заполнение их рандомом

Результат long, но в промежуточных вычислениях double и именно в них теряются значащие цифры  

(Digits+1)*3-1=17

 Спасибо за информацию.

Однако, тяжело укладывается информация - т.е. число быть таким может, но нельзя делать с ним вычисления?

 

Вот пример кода, где пробразование происходит из строки в число

long CalcY=StringToDouble("111111111111111111");
Print ("CalcY=",CalcY);

 Принтует число 111111111111111104

Т.е. тут то вычислений нет, или я не прав?

Есть возможность оперировать такими числами или это ограничения языка? 

 

 
-Aleks-:

Т.е. тут то вычислений нет, или я не прав?

Вычисления - любая операция (в данном случае преобразование). Для указанного числа StringToDouble возвращает double с потерей точности

StringToInteger вернет long, но далее в вычислениях без потери точности нельзя использовать функции оперирующие с double, такие как: NormalizeDouble, MathPow

 
A100:

Вычисления - любая операция (в данном случае преобразование). StringToDouble возвращает double - происходит потеря точности

StringToInteger вернет long, но далее в вычислениях без потери точности нельзя использовать функции оперирующие с double, такие как: NormalizeDouble, MathPow,

 Со StringToInteger получилось выразить число, но дальше уже труха, нужно как-то разбивать число видимо на составляющие для математических операций...

long CalcZ=StringToInteger("111111111111111111");
Print ("CalcZ=",CalcZ);

double Test=CalcZ;
Print ("Test=",Test);

 Test=1.111111111111111e+17

 

Опять же в хелпе написано

INT_MAX

Максимальное значение, которое может быть представлено типом int

2147483647

 

Тогда как через StringToInteger произошло преобразование и сохранилось в long , если число больше допустимого? 

 
-Aleks-:

Тогда как через StringToInteger произошло преобразование и сохранилось в long , если число больше допустимого? 

StringToInteger первоначально возвращает long в пределах LONG_MIN  LONG_MAX (она могла называться и StringToКолобок) 

 
A100:
StringToInteger первоначально возвращает long (она могла называться и StringToКолобок)

Это конечно видимо так, но в хэлпе то так замудрили

"

Преобразование строки, содержащей символьное представление числа, в число типа int (целое). 

"

это и ввело в заблуждение.

Спасибо за информацию.

Я так понимаю, что выше представленное число в графический буфер не пролезет? 

 
-Aleks-:

Я так понимаю, что выше представленное число в графический буфер не пролезет? 

Они записываются в таком виде    B'11111111111111111111111111111111'

 
A100:

Я утверждаю (и предлагаю это проверить) что при смене таймфрейма с M5 на M15 первому индикатору (и только ему - в данном случае M5) никакой команды M5 Deinit не посылается и он не выгрузится с графика до тех пор пока пользователь не удалит эксперта

Слава прав и выгрузка работает правильно.

Обратите внимание, что в МТ5 расчетное ядро индикатора - это разделяемый ресурс со счетчиком использования в своем собственном менеджере. Если в разных программах или окнах используется индикатор с одинаковыми параметрами, то на самом деле работает одна расчетная копия со счетчиком использования. Это позволяет здорово экономить, когда трейдер использует одни и те же индикаторы на чартах и в эксперте.

Менеджер индикаторов устроен так, что он физически удаляет индикаторы асинхронно и с задержкой. А в это время создается новая рабочая копия с новыми параметрами, которая часто инициализируется раньше, чем физически удалится старая копия.
 
Renat Fatkhullin:
Менеджер индикаторов устроен так, что он физически удаляет индикаторы асинхронно и с задержкой. А в это время создается новая рабочая копия с новыми параметрами, которая часто инициализируется раньше, чем физически удалится старая копия.

Упростим индикатор

//Test_i.mq5 //Индикатор
void Prn( string f, int i = -1 ) { Print( f, "->", StringSubstr( EnumToString( Period()), 7 ), (i == -1 ? "" : ":" + i )); }
void OnInit()                    { Prn( __FUNCTION__ );         }
void OnDeinit( const int reason ) { Prn( __FUNCTION__, reason ); }
int OnCalculate( const int, const int, const int, const double& [] ) { return 0; }

Прикрепим Эксперта Test.mq5 к графику M5 и далее сменим период графика M5->M15

Результат:

2017.02.06 00:54:20.897 OnInit->M5
2017.02.06 00:54:25.553 OnInit->M15

Вопрос: Когда будет вызван OnDeinit->M5 ?

Мой ответ: Никогда!

Ваш ответ выше: асинхронно и с задержкой 

Файлы:
Test.mq5  1 kb