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

 

Нестабильное выполнение

  • Путь расположения Индикатора: \Indicators\Test_i.ex5
  • Путь расположения Эксперта:    \Experts\Test.ex5
  • Путь расположения Скрипта:     \Scripts\Test_s.ex5

Последовательность действий: Несколько раз присоединить Скрипт 'Test_s.ex5' к графику M15 (символ EURUSD)

Результат:

2017.02.05 15:17:59.076 OnStart                  1-ый раз присоединили
2017.02.05 15:18:03.293 OnStart                  2-ой раз присоединили 
2017.02.05 15:18:07.760 OnStart                  3-ий раз присоединили  
2017.02.05 15:18:07.778 OnInit
2017.02.05 15:18:07.781 OnDeinit:1
2017.02.05 15:18:16.891 OnStart                  4-ый раз присоединили

Результаты присоединений отличаются. Ожидалось что не будут отличаться, кроме результат носит случайный характер: строка с OnInit\OnDeinit может появиться с 1-го раза, а может и с 10-го

//Test_i.mq5 //Индикатор
void OnInit()                    { Print( __FUNCTION__ ); }
void OnDeinit( const int reason ) { Print( __FUNCTION__, ":", reason ); }
int OnCalculate( const int, const int, const int, const double& [] ) { return 0; }
//Test_s.mq5 //Скрипт
#import "..\\Experts\\Test.ex5"
        void OnInit();
#import
void OnStart()
{
        Print( __FUNCTION__ );
        OnInit();
}

файл эксперта прикреплен (фактически используется как библиотека), код здесь https://www.mql5.com/ru/forum/1111/page1801#comment_4059227

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
Файлы:
Test.mq5  1 kb
 

Не понимаю, ошибка моя или терминала

На 5 знаке
void OnStart()
  {

double A=1.11111;
double B=1.11111;
double C=1.11111;

long CalcX=
NormalizeDouble(A,Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(B,Digits)*MathPow(10,(Digits+1)*2-1)+
NormalizeDouble(C,Digits)*MathPow(10,(Digits+1)*1-1);

Print ("CalcX=",CalcX);  
  }

 Принтует CalcX=111111111111111104 ожидаемое значение CalcX=111111111111111111

 
A100:

Неверный порядок вызова функций при смене периода графика

  • Путь расположения Индикатора:   \Indicators\Test_i.ex5
  • Путь расположения Эксперта:      \Experts\Test.ex5

Последовательность действий:

  1. Присоединить Эксперт 'Test.ex5' к графику M5 (символ GBPUSD)
  2. Сменить период графика на M15
  3. Сменить период графика на M30
  4. Удалить Эксперт с графика 

Покажите логи. Чтобы было видно время.

Тут остаётся добавить, что добавление индикатора на график и удаление индикатора с графика это - несинхронные операции.

Кроме того, при смене таймфрейма, индикатор не сразу выгружается с этого таймфрейма. При том что создаётся новая копия индикатора на новом таймфрейме. Я вижу у Вас принты в конструкторе-деструкторе, Вы предполагаете, что деструктор вызывается сразу? Нет, Вы ошибаетесь. Деструктор вызывается при выгрузке индикатора, а выгрузка индикатора производится только через несколько секунд после удаления индикатора
 
Slawa:
Покажите логи. Чтобы было видно время.
Тут остаётся добавить, что добавление индикатора на график и удаление индикатора с графика это - несинхронные операции.
Кроме того, при смене таймфрейма, индикатор не сразу выгружается с этого таймфрейма. При том что создаётся новая копия индикатора на новом таймфрейме. Я вижу у Вас принты в конструкторе-деструкторе, Вы предполагаете, что деструктор вызывается сразу? Нет, Вы ошибаетесь. Деструктор вызывается при выгрузке индикатора, а выгрузка индикатора производится только через несколько секунд после удаления индикатора

Предполагается что между шагами (сменами периода графика) проходит достаточно времени

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 (выделено красным)?

 
-Aleks-:

Не понимаю, ошибка моя или терминала

 Принтует CalcX=111111111111111104 ожидаемое значение CalcX=111111111111111111

Если в double число значимых десятичных знаков > DBL_DIG=15, то обычные правила - не работают
 
A100:

Предполагается что между шагами (сменами периода графика) проходит достаточно времени

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. При этом заранее неизвестно какая из этих команд будет выполнена раньше другой - здесь классические гонки между разными потоками.

После этого первому индикатору будет убавлен счётчик использования. Через несколько секунд после того, как счётчик использования станет нулевым индикатор будет выгружен с графика. При этом будут вызваны деструкторы глобальных объектов этого индикатора
 
Slawa:
Попробую ещё раз объяснить

На графике 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

 
Slawa:
Попробую ещё раз объяснить

На графике M5 некий индикатор. При смене таймфрейма с M5 на M15 создаётся вторая копия этого же индикатора. Обоим индикаторам посылается команда - первому на M5 Deinit, второму на M15 Init. При этом заранее неизвестно какая из этих команд будет выполнена раньше другой - здесь классические гонки между разными потоками.

После этого первому индикатору будет убавлен счётчик использования. Через несколько секунд после того, как счётчик использования станет нулевым индикатор будет выгружен с графика. При этом будут вызваны деструкторы глобальных объектов этого индикатора
Можете пояснить, про какие потоки идет речь? Разве все индикаторы одного символа не работают в одном потоке?
 
Vladimir Gribachev:

Глюки при установке индикаторов Билла Вильямса

ставлю фракталы - ставится

 

ставлю  АО - ставится ADX

 

билд 1031 

сто-питьсотлетний баг с необновлением меню при изменениях в структуре каталогов /MQx/Indicators :-) Баг настолько стар что уже воспринимается как фича, привыкайте.. на юзабилити кувалдой забит квадратный болт, зато число pi считается быстрее всех :-)
 
A100:
Если в double число значимых десятичных знаков > DBL_DIG=15, то обычные правила - не работают

 

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

В хэлпе  написано, что для long максимальное значение  9223372036854775807 - я до него явно не добираю.