Ошибки, баги, вопросы - страница 1782
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
А какие работают?
Работает правило потери значащих цифр и заполнение их рандомом
Результат long, но в промежуточных вычислениях double и именно в них теряются значащие цифры
(Digits+1)*3-1=17
Работает правило потери значащих цифр и заполнение их рандомом
Результат long, но в промежуточных вычислениях double и именно в них теряются значащие цифры
(Digits+1)*3-1=17
Спасибо за информацию.
Однако, тяжело укладывается информация - т.е. число быть таким может, но нельзя делать с ним вычисления?
Вот пример кода, где пробразование происходит из строки в число
Print ("CalcY=",CalcY);
Принтует число 111111111111111104
Т.е. тут то вычислений нет, или я не прав?
Есть возможность оперировать такими числами или это ограничения языка?
Т.е. тут то вычислений нет, или я не прав?
Вычисления - любая операция (в данном случае преобразование). Для указанного числа StringToDouble возвращает double с потерей точности
StringToInteger вернет long, но далее в вычислениях без потери точности нельзя использовать функции оперирующие с double, такие как: NormalizeDouble, MathPow
Вычисления - любая операция (в данном случае преобразование). StringToDouble возвращает double - происходит потеря точности
StringToInteger вернет long, но далее в вычислениях без потери точности нельзя использовать функции оперирующие с double, такие как: NormalizeDouble, MathPow,
Со StringToInteger получилось выразить число, но дальше уже труха, нужно как-то разбивать число видимо на составляющие для математических операций...
Print ("CalcZ=",CalcZ);
double Test=CalcZ;
Print ("Test=",Test);
Test=1.111111111111111e+17
Опять же в хелпе написано
INT_MAX
Максимальное значение, которое может быть представлено типом int
2147483647
Тогда как через StringToInteger произошло преобразование и сохранилось в long , если число больше допустимого?
Тогда как через StringToInteger произошло преобразование и сохранилось в long , если число больше допустимого?
StringToInteger первоначально возвращает long в пределах LONG_MIN LONG_MAX (она могла называться и StringToКолобок)
StringToInteger первоначально возвращает long (она могла называться и StringToКолобок)
Это конечно видимо так, но в хэлпе то так замудрили
"
Преобразование строки, содержащей символьное представление числа, в число типа int (целое).
"
это и ввело в заблуждение.
Спасибо за информацию.
Я так понимаю, что выше представленное число в графический буфер не пролезет?
Я так понимаю, что выше представленное число в графический буфер не пролезет?
Они записываются в таком виде B'11111111111111111111111111111111'
Я утверждаю (и предлагаю это проверить) что при смене таймфрейма с M5 на M15 первому индикатору (и только ему - в данном случае M5) никакой команды M5 Deinit не посылается и он не выгрузится с графика до тех пор пока пользователь не удалит эксперта
Обратите внимание, что в МТ5 расчетное ядро индикатора - это разделяемый ресурс со счетчиком использования в своем собственном менеджере. Если в разных программах или окнах используется индикатор с одинаковыми параметрами, то на самом деле работает одна расчетная копия со счетчиком использования. Это позволяет здорово экономить, когда трейдер использует одни и те же индикаторы на чартах и в эксперте.
Менеджер индикаторов устроен так, что он физически удаляет индикаторы асинхронно и с задержкой. А в это время создается новая рабочая копия с новыми параметрами, которая часто инициализируется раньше, чем физически удалится старая копия.
Менеджер индикаторов устроен так, что он физически удаляет индикаторы асинхронно и с задержкой. А в это время создается новая рабочая копия с новыми параметрами, которая часто инициализируется раньше, чем физически удалится старая копия.
Упростим индикатор
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 ?
Мой ответ: Никогда!
Ваш ответ выше: асинхронно и с задержкой