Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1883

 
Alexey Viktorov #:

Я не спорю. «Серые» показаны на снимке в этом сообщении.


Без исходников вот эти


Ну я про "эти" и говорил. Когда у меня было переполнение и индикаторы не отображались, я не глядел что показывается в меню, которое показано на скрине в сообщении, о котором ты сказал. Тут ничего не могу сказать точно.

Но если индикаторов нет в навигаторе, но они есть в папке, то это означает, что новые не будут показываться в навигаторе до тех пор, пока часть старых не будет удалена из папки.

Было, проходили. Не я один.

 

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

https://www.mql5.com/ru/docs/series/bufferdirection:

Индикаторный буфер представляет из себя динамический массив типа double, размером которого управляет клиентский терминал с тем, чтобы он всегда соответствовал количеству баров, на которых индикатор рассчитывается. Обычный динамический массив типа double назначается в качестве индикаторного буфера с помощью функции SetIndexBuffer(). Для индикаторных буферов не требуется задавать размер с помощью функции ArrayResize(), исполняющая система терминала сама позаботится об этом.

 Идём по https://www.mql5.com/ru/docs/array/arrayisdynamic, запускаем код и вдруг выясняем, что:

2022.01.24 21:25:27.543 t (NZDUSD,D1) 3. Проверка индикаторного буфера:

2022.01.24 21:25:27.543 t (NZDUSD,D1) Размер до освобождения памяти = 7278

2022.01.24 21:25:27.543 t (NZDUSD,D1) Это динамический массив = Нет

2022.01.24 21:25:27.543 t (NZDUSD,D1) Размер после освобождения памяти = 0

при этом он:

double ExtBuff[];      // индикаторный буфер
SetIndexBuffer(0,ExtBuff);

 Смотрю в книгу — вижу фигу. Или нас всё это время обманывали?

 Или он, быть может, однократно динамический (при первой инициализации), а потом всё?

 
x572intraday #:

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

https://www.mql5.com/ru/docs/series/bufferdirection:

 Идём по https://www.mql5.com/ru/docs/array/arrayisdynamic, запускаем код и вдруг выясняем, что:

при этом он:

 Смотрю в книгу — вижу фигу. Или нас всё это время обманывали?

 Или он, быть может, однократно динамический (при первой инициализации), а потом всё?

22:23:17.002 Dynamic EURCAD,H1: +============================+

0 22:23:17.002 Dynamic EURCAD,H1: 1. Проверка динамического массива:

0 22:23:17.002 Dynamic EURCAD,H1: Размер до освобождения памяти = 100

0 22:23:17.002 Dynamic EURCAD,H1: Это динамический массив = Да

0 22:23:17.002 Dynamic EURCAD,H1: Размер после освобождения памяти = 0

0 22:23:17.002 Dynamic EURCAD,H1: 2. Проверка статического массива:

0 22:23:17.002 Dynamic EURCAD,H1: Размер до освобождения памяти = 100

0 22:23:17.002 Dynamic EURCAD,H1: Это динамический массив = Нет

0 22:23:17.002 Dynamic EURCAD,H1: Размер после освобождения памяти = 0

0 22:23:17.002 Dynamic EURCAD,H1: 3. Проверка индикаторного буфера:

0 22:23:17.002 Dynamic EURCAD,H1: Размер до освобождения памяти = 2725

0 22:23:17.002 Dynamic EURCAD,H1: Это динамический массив = Да

0 22:23:17.002 Dynamic EURCAD,H1: Размер после освобождения памяти = 0

0 22:23:24.754 Dynamic EURCAD,H1: uninit reason 1

0 22:23:24.758 Custom indicator Dynamic EURCAD,H1: removed

Это в 4.

 
x572intraday #:

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

https://www.mql5.com/ru/docs/series/bufferdirection:

 Идём по https://www.mql5.com/ru/docs/array/arrayisdynamic, запускаем код и вдруг выясняем, что:

при этом он:

 Смотрю в книгу — вижу фигу. Или нас всё это время обманывали?

 Или он, быть может, однократно динамический (при первой инициализации), а потом всё?

да, потом всё :-)

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

 
Alekseu Fedotov #:

22:23:17.002 Dynamic EURCAD,H1: +============================+

0 22:23:17.002 Dynamic EURCAD,H1: 1. Проверка динамического массива:

0 22:23:17.002 Dynamic EURCAD,H1: Размер до освобождения памяти = 100

0 22:23:17.002 Dynamic EURCAD,H1: Это динамический массив = Да

0 22:23:17.002 Dynamic EURCAD,H1: Размер после освобождения памяти = 0

0 22:23:17.002 Dynamic EURCAD,H1: 2. Проверка статического массива:

0 22:23:17.002 Dynamic EURCAD,H1: Размер до освобождения памяти = 100

0 22:23:17.002 Dynamic EURCAD,H1: Это динамический массив = Нет

0 22:23:17.002 Dynamic EURCAD,H1: Размер после освобождения памяти = 0

0 22:23:17.002 Dynamic EURCAD,H1: 3. Проверка индикаторного буфера:

0 22:23:17.002 Dynamic EURCAD,H1: Размер до освобождения памяти = 2725

0 22:23:17.002 Dynamic EURCAD,H1: Это динамический массив = Да

0 22:23:17.002 Dynamic EURCAD,H1: Размер после освобождения памяти = 0

0 22:23:24.754 Dynamic EURCAD,H1: uninit reason 1

0 22:23:24.758 Custom indicator Dynamic EURCAD,H1: removed

Это в 4.

 Фантастика! Что за волшебство? Только что проверил на EURCAD,H1 — опять "Нет".

 И что за 4.? Там в примере всего три пункта.

 
x572intraday #:

 Фантастика! Что за волшебство? Только что проверил на EURCAD,H1 — опять "Нет".

 И что за 4.? Там в примере всего три пункта.

Терминал MT4

 
x572intraday #:

 Фантастика! Что за волшебство? Только что проверил на EURCAD,H1 — опять "Нет".

 И что за 4.? Там в примере всего три пункта.

0 23:33:06.088 test (EURUSD,D1) +============================+

0 23:33:06.088 test (EURUSD,D1) 1. Проверка динамического массива:

0 23:33:06.088 test (EURUSD,D1) Размер до освобождения памяти = 100

0 23:33:06.088 test (EURUSD,D1) Это динамический массив = Да

0 23:33:06.088 test (EURUSD,D1) Размер после освобождения памяти = 0

0 23:33:06.088 test (EURUSD,D1) 2. Проверка статического массива:

0 23:33:06.088 test (EURUSD,D1) Размер до освобождения памяти = 100

0 23:33:06.088 test (EURUSD,D1) Это динамический массив = Нет

0 23:33:06.088 test (EURUSD,D1) Размер после освобождения памяти = 100

0 23:33:06.088 test (EURUSD,D1) 3. Проверка индикаторного буфера:

0 23:33:06.088 test (EURUSD,D1) Размер до освобождения памяти = 1054

0 23:33:06.088 test (EURUSD,D1) Это динамический массив = Нет

0 23:33:06.088 test (EURUSD,D1) Размер после освобождения памяти = 0


Терминал MT5,  мыслей нет. 

 
x572intraday #:

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

https://www.mql5.com/ru/docs/series/bufferdirection:

 Идём по https://www.mql5.com/ru/docs/array/arrayisdynamic, запускаем код и вдруг выясняем, что:

при этом он:

 Смотрю в книгу — вижу фигу. Или нас всё это время обманывали?

 Или он, быть может, однократно динамический (при первой инициализации), а потом всё?

Буферный массив является динамическим. В MQL динамические массивы имеют признаки объектов, на сколько я понял во время работы с ними (как в языках сверхвысокого уровня). Но если после объявления динамического массива объявить его буфером (с помощью SetIndexBuffer), то данная область памяти станет зарезервированной. Поэтому большинство стандартных функций не могут изменять его размер. Я иногда использую в качестве буферов индикатора массивы объекта. А если это делать то память таких массивов освобождается в деструкторе объекта. Таким образом, освобождение памяти буфера индикатора самим приложением (или объектом) допускается. Но это не значит, что массив можно освободить прямо в процессе работы индикатора. Всё нужно делать с умом.

 

Добрый день

Подскажите, пробую написать советника, и при тесте непонятная для меня вещь происходит...

есть функция

CalcAngleTrend(NormalizeDouble((a[0]-a[1]), MA_DIGITS));

double CalcAngleTrend(double d)
 {
  double a = (double) ((atan(d*pow(10,_Digits-2)))*(180/M_PI)*coefAngle);
Print("d: ", d);
  return(NormalizeDouble(a, ANGLE_DIGITS));
 }

ситуация такая, один экземпляр советника запущен на графике, второй экземпляр запускаю в режиме отладки МТ4 на аналогичном графике
входные данные для функции получаются одинаковые, а выходные различаются!!!? я просто чего-то не понимаю похоже...(

Это выдает запущеный вариант:

2022.01.25 15:01:12.880 USDJPY,M5: d: 0.0014887
2022.01.25 15:01:12.880 USDJPY,M5: d: -0.0060861
2022.01.25 15:01:12.880 USDJPY,M5: Angle Slow: +1.70580000
2022.01.25 15:01:12.880 USDJPY,M5: Angle Fast: -6.96560000

это в режиме отладки:

2022.01.25 15:01:14.330 USDJPY,M5: d: 0.0014887
2022.01.25 15:01:14.330 USDJPY,M5: d: -0.0060861
2022.01.25 15:01:14.330 USDJPY,M5: Angle Slow: +4.26450000
2022.01.25 15:01:14.330 USDJPY,M5: Angle Fast: -17.41390000

подскажите в какую сторону копать информацию?!

ПС: посчитал разница ровно в 2.5 раза между выходными данными
 
Владимир Казаков #:

Добрый день

Подскажите, пробую написать советника, и при тесте непонятная для меня вещь происходит...

есть функция

ситуация такая, один экземпляр советника запущен на графике, второй экземпляр запускаю в режиме отладки МТ4 на аналогичном графике
входные данные для функции получаются одинаковые, а выходные различаются!!!? я просто чего-то не понимаю похоже...(

подскажите в какую сторону копать информацию?!

ПС: посчитал разница ровно в 2.5 раза между выходными данными

Всё дело в формуле вычисления угла. В коде видно что для его вычисления используется только одна координата и какой то коэффициент, предназначение которого непонятно. Это как? Расскажите подробнее какие данные вы используете для вычисления угла.

Причина обращения: