Slawa: Покажите логи. Чтобы было видно время. Тут остаётся добавить, что добавление индикатора на график и удаление индикатора с графика это - несинхронные операции. Кроме того, при смене таймфрейма, индикатор не сразу выгружается с этого таймфрейма. При том что создаётся новая копия индикатора на новом таймфрейме. Я вижу у Вас принты в конструкторе-деструкторе, Вы предполагаете, что деструктор вызывается сразу? Нет, Вы ошибаетесь. Деструктор вызывается при выгрузке индикатора, а выгрузка индикатора производится только через несколько секунд после удаления индикатора
Предполагается что между шагами (сменами периода графика) проходит достаточно времени
Несинхронность влияет только на разный порядок вызова функций внутри шага (как это видно на примере шагов #3 и #5)
Как видно все последующие смены периода графика, кроме первого (шаг#2:две строки вывода) происходят ожидаемо (аналогично шагу#3:четыре строки вывода). А почему первая смена периода графика должна отличаться от всех остальных? Чем она лучше/хуже? Почему две недостающие строки вывода из шага#2(и только из него) перехали в шаг#7 (выделено красным)?
Несинхронность влияет только на разный порядок вызова функций внутри шага (как это видно на примере шагов #3 и #5)
Как видно все последующие смены периода графика, кроме первого (шаг#2) происходят ожидаемо (аналогично шагу#3). А почему первая смена периода графика должна отличаться от всех остальных? Чем она лучше/хуже?
Попробую ещё раз объяснить
На графике M5 некий индикатор. При смене таймфрейма с M5 на M15 создаётся вторая копия этого же индикатора. Обоим индикаторам посылается команда - первому на M5 Deinit, второму на M15 Init. При этом заранее неизвестно какая из этих команд будет выполнена раньше другой - здесь классические гонки между разными потоками.
После этого первому индикатору будет убавлен счётчик использования. Через несколько секунд после того, как счётчик использования станет нулевым индикатор будет выгружен с графика. При этом будут вызваны деструкторы глобальных объектов этого индикатора
На графике M5 некий индикатор. При смене таймфрейма с M5 на M15 создаётся вторая копия этого же индикатора. Обоим индикаторам посылается команда - первому на M5 Deinit, второму на M15 Init. При этом заранее неизвестно какая из этих команд будет выполнена раньше другой - здесь классические гонки между разными потоками.
После этого первому индикатору будет убавлен счётчик использования. Через несколько секунд после того, как счётчик использования станет нулевым индикатор будет выгружен с графика. При этом будут вызваны деструкторы глобальных объектов этого индикатора
Я утверждаю (и предлагаю это проверить) что при смене таймфрейма с M5 на M15 первому индикатору (и только ему - в данном случае M5) никакой команды M5 Deinit не посылается и он не выгрузится с графика до тех пор пока пользователь не удалит эксперта
Если struct I в 'Test_i.ex5' исключить (не влияет), то вывод упростится:
2017.02.05 20:49:06.842 OnInit->M5 2017.02.05 20:49:21.253 OnInit->M15 (*) смена периода M5 -> M15: индикатор M5 не выгружается 2017.02.05 20:56:40.001 OnDeinit->M15:3 смена периода M15 -> M30:индикатор M15 выгружается сразу 2017.02.05 20:56:40.132 OnInit->M30
С момента (*) прошло более 5 минут, а индикатор M5 не выгружается
Удаляем эксперт с графика
2017.02.05 20:57:35.176 OnDeinit->M5:1 индикатор M5 выгружается только после удаления эксперта 2017.02.05 20:57:35.177 OnDeinit->M30:1
На графике M5 некий индикатор. При смене таймфрейма с M5 на M15 создаётся вторая копия этого же индикатора. Обоим индикаторам посылается команда - первому на M5 Deinit, второму на M15 Init. При этом заранее неизвестно какая из этих команд будет выполнена раньше другой - здесь классические гонки между разными потоками.
После этого первому индикатору будет убавлен счётчик использования. Через несколько секунд после того, как счётчик использования станет нулевым индикатор будет выгружен с графика. При этом будут вызваны деструкторы глобальных объектов этого индикатора
Можете пояснить, про какие потоки идет речь? Разве все индикаторы одного символа не работают в одном потоке?
сто-питьсотлетний баг с необновлением меню при изменениях в структуре каталогов /MQx/Indicators :-) Баг настолько стар что уже воспринимается как фича, привыкайте.. на юзабилити кувалдой забит квадратный болт, зато число pi считается быстрее всех :-)
Вычисления - любая операция (в данном случае преобразование). Для указанного числа StringToDouble возвращает double с потерей точности
StringToInteger вернет long, но далее в вычислениях без потери точности нельзя использовать функции оперирующие с double, такие как: NormalizeDouble, MathPow
Покажите логи. Чтобы было видно время.
Тут остаётся добавить, что добавление индикатора на график и удаление индикатора с графика это - несинхронные операции.
Кроме того, при смене таймфрейма, индикатор не сразу выгружается с этого таймфрейма. При том что создаётся новая копия индикатора на новом таймфрейме. Я вижу у Вас принты в конструкторе-деструкторе, Вы предполагаете, что деструктор вызывается сразу? Нет, Вы ошибаетесь. Деструктор вызывается при выгрузке индикатора, а выгрузка индикатора производится только через несколько секунд после удаления индикатора
Предполагается что между шагами (сменами периода графика) проходит достаточно времени
2017.02.05 19:49:49.984 I::I->M5 #шаг 1: присоединение
2017.02.05 19:49:49.984 OnInit->M5
2017.02.05 19:51:39.853 I::I->M15 #шаг 2: смена периода M5 ->M15
2017.02.05 19:51:39.853 OnInit->M15
2017.02.05 19:53:29.813 OnDeinit->M15:3 #шаг 3: смена периода M15->M30
2017.02.05 19:53:29.813 I::~I->M15
2017.02.05 19:53:29.864 I::I->M30
2017.02.05 19:53:29.864 OnInit->M30
2017.02.05 19:54:03.245 OnDeinit->M30:3 #шаг 4: смена периода M30->H1
2017.02.05 19:54:03.245 I::~I->M30
2017.02.05 19:54:03.286 I::I->H1
2017.02.05 19:54:03.286 OnInit->H1
2017.02.05 19:55:02.984 I::I->H4 #шаг 5: смена периода H1 ->H4
2017.02.05 19:55:02.984 OnInit->H4
2017.02.05 19:55:02.984 OnDeinit->H1:3
2017.02.05 19:55:02.984 I::~I->H1
2017.02.05 19:55:50.697 I::I->D1 #шаг 6: смена периода H4 ->D1
2017.02.05 19:55:50.697 OnInit->D1
2017.02.05 19:55:50.697 OnDeinit->H4:3
2017.02.05 19:55:50.697 I::~I->H4
2017.02.05 19:56:11.122 OnDeinit->M5:1 #шаг 7: удаление
2017.02.05 19:56:11.122 I::~I->M5
2017.02.05 19:56:11.122 OnDeinit->D1:1
2017.02.05 19:56:11.123 I::~I->D1
Несинхронность влияет только на разный порядок вызова функций внутри шага (как это видно на примере шагов #3 и #5)
Как видно все последующие смены периода графика, кроме первого (шаг#2:две строки вывода) происходят ожидаемо (аналогично шагу#3:четыре строки вывода). А почему первая смена периода графика должна отличаться от всех остальных? Чем она лучше/хуже? Почему две недостающие строки вывода из шага#2(и только из него) перехали в шаг#7 (выделено красным)?
Не понимаю, ошибка моя или терминала
Принтует CalcX=111111111111111104 ожидаемое значение CalcX=111111111111111111
Предполагается что между шагами (сменами периода графика) проходит достаточно времени
2017.02.05 19:49:49.984 I::I->M5 #шаг 1: присоединение
2017.02.05 19:49:49.984 OnInit->M5
2017.02.05 19:51:39.853 I::I->M15 #шаг 2: смена периода M5 ->M15
2017.02.05 19:51:39.853 OnInit->M15
2017.02.05 19:53:29.813 OnDeinit->M15:3 #шаг 3: смена периода M15->M30
2017.02.05 19:53:29.813 I::~I->M15
2017.02.05 19:53:29.864 I::I->M30
2017.02.05 19:53:29.864 OnInit->M30
2017.02.05 19:54:03.245 OnDeinit->M30:3 #шаг 4: смена периода M30->H1
2017.02.05 19:54:03.245 I::~I->M30
2017.02.05 19:54:03.286 I::I->H1
2017.02.05 19:54:03.286 OnInit->H1
2017.02.05 19:55:02.984 I::I->H4 #шаг 5: смена периода H1 ->H4
2017.02.05 19:55:02.984 OnInit->H4
2017.02.05 19:55:02.984 OnDeinit->H1:3
2017.02.05 19:55:02.984 I::~I->H1
2017.02.05 19:55:50.697 I::I->D1 #шаг 6: смена периода H4 ->D1
2017.02.05 19:55:50.697 OnInit->D1
2017.02.05 19:55:50.697 OnDeinit->H4:3
2017.02.05 19:55:50.697 I::~I->H4
2017.02.05 19:56:11.122 OnDeinit->M5:1 #шаг 7: удаление
2017.02.05 19:56:11.122 I::~I->M5
2017.02.05 19:56:11.122 OnDeinit->D1:1
2017.02.05 19:56:11.123 I::~I->D1
Несинхронность влияет только на разный порядок вызова функций внутри шага (как это видно на примере шагов #3 и #5)
Как видно все последующие смены периода графика, кроме первого (шаг#2) происходят ожидаемо (аналогично шагу#3). А почему первая смена периода графика должна отличаться от всех остальных? Чем она лучше/хуже?
На графике M5 некий индикатор. При смене таймфрейма с M5 на M15 создаётся вторая копия этого же индикатора. Обоим индикаторам посылается команда - первому на M5 Deinit, второму на M15 Init. При этом заранее неизвестно какая из этих команд будет выполнена раньше другой - здесь классические гонки между разными потоками.
После этого первому индикатору будет убавлен счётчик использования. Через несколько секунд после того, как счётчик использования станет нулевым индикатор будет выгружен с графика. При этом будут вызваны деструкторы глобальных объектов этого индикатора
Попробую ещё раз объяснить
На графике M5 некий индикатор. При смене таймфрейма с M5 на M15 создаётся вторая копия этого же индикатора. Обоим индикаторам посылается команда - первому на M5 Deinit, второму на M15 Init. При этом заранее неизвестно какая из этих команд будет выполнена раньше другой - здесь классические гонки между разными потоками.
После этого первому индикатору будет убавлен счётчик использования. Через несколько секунд после того, как счётчик использования станет нулевым индикатор будет выгружен с графика. При этом будут вызваны деструкторы глобальных объектов этого индикатора
Я утверждаю (и предлагаю это проверить) что при смене таймфрейма с M5 на M15 первому индикатору (и только ему - в данном случае M5) никакой команды M5 Deinit не посылается и он не выгрузится с графика до тех пор пока пользователь не удалит эксперта
Если struct I в 'Test_i.ex5' исключить (не влияет), то вывод упростится:
2017.02.05 20:49:06.842 OnInit->M5
2017.02.05 20:49:21.253 OnInit->M15 (*) смена периода M5 -> M15: индикатор M5 не выгружается
2017.02.05 20:56:40.001 OnDeinit->M15:3 смена периода M15 -> M30: индикатор M15 выгружается сразу
2017.02.05 20:56:40.132 OnInit->M30
С момента (*) прошло более 5 минут, а индикатор M5 не выгружается
Удаляем эксперт с графика
2017.02.05 20:57:35.176 OnDeinit->M5:1 индикатор M5 выгружается только после удаления эксперта
2017.02.05 20:57:35.177 OnDeinit->M30:1
Попробую ещё раз объяснить
На графике M5 некий индикатор. При смене таймфрейма с M5 на M15 создаётся вторая копия этого же индикатора. Обоим индикаторам посылается команда - первому на M5 Deinit, второму на M15 Init. При этом заранее неизвестно какая из этих команд будет выполнена раньше другой - здесь классические гонки между разными потоками.
После этого первому индикатору будет убавлен счётчик использования. Через несколько секунд после того, как счётчик использования станет нулевым индикатор будет выгружен с графика. При этом будут вызваны деструкторы глобальных объектов этого индикатора
Глюки при установке индикаторов Билла Вильямса
ставлю фракталы - ставится
ставлю АО - ставится ADX
билд 1031
Если в double число значимых десятичных знаков > DBL_DIG=15, то обычные правила - не работают
А какие работают?
В хэлпе написано, что для long максимальное значение 9223372036854775807 - я до него явно не добираю.
А какие работают?
Работает правило потери значащих цифр и заполнение их рандомом
Результат 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