Не могу понять зигзаг - страница 3

 
Candid:

SetIndexStyle(3, DRAW_SECTION, EMPTY, 2, Red);

SetIndexStyle(3,DRAW_ZIGZAG, EMPTY, 2, Red);



так тоже не отображается, только линией
 
dax10:


так тоже не отображается, только линией
Тогда проблема в другом месте кода.
 

Отрезки рисуются с помощью двух стилей -- DRAW_SECTION и DRAW_ZIGZAG. Зигзаг можно нарисовать любым из них.

Объекты для зигзага лучше не использовать, потому как качественно написать зигзаг на объектах намного сложнее, чем на буфере. И кстати далеко не факт что быстрее.

Зигзагов, в том числе быстрых (экономных), довольно много с разными алгоритмами. Есть тема с их перечислением, есть статья с принципами написания.

 
dax10:
Спасибо, а вот "затирать", это заполнять нулями или как и рисовать объектами отрезки тоже интересно.

шоб затереть нужно записать в ту точку EMPTY_VALUE, но не ноль.

про рисовку объектами тут статья https://www.mql5.com/ru/articles/1503/page2

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

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

рисовать зигзаг на объектах гораздо легче - достаточно указать только конечные точки, а остальные точки будут просчитаны автоматически, а в индикаторной линии нужно считать каждую точку. вот пример.

ObjectCreate("MyLineOpenPosition", OBJ_TREND, 0, Time[1],Close[0], Time[0],Close[0]);
ObjectSet("MyLineOpenPosition", OBJPROP_STYLE, STYLE_SOLID);
ObjectSet("MyLineOpenPosition", OBJPROP_RAY, False);
ObjectSet("MyLineOpenPosition",OBJPROP_WIDTH,3);
ObjectSet("MyLineOpenPosition", OBJPROP_COLOR, Black);
 

Andrei01:

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

Правильная рекомендация: все созданные объекты индикатор должен по завершении работы уничтожить.

Рекомендация создавать объекты только при инициализации весьма спорная, она эквивалентна рекомендации: не пользуйтесь динамическим распределением памяти. Возможно вы пока писали мало кода на MQL и просто не представляете всего разнообразия возникающих задач.

 
Candid:

1. Правильная рекомендация: все созданные объекты индикатор должен по завершении работы уничтожить.

2. Рекомендация создавать объекты только при инициализации весьма спорная, она эквивалентна рекомендации: не пользуйтесь динамическим распределением памяти. Возможно вы пока писали мало кода на MQL и просто не представляете всего разнообразия возникающих задач.

1. Ясень пень, хотя речь была о другом - правильном использовании объектов.

2. Желательно пользоваться динамическим распределением с умом, то есть по минимуму ибо это сильно дефрагментирует память и требует много ненужных вычислений, резервирования и освобождения памяти, а операции с памятью самые медленные как известно.

Обычно бесконтрольно плодят динамические объекты и массивы люди либо не понимающие основ правильного написания кода либо те кто не в состоянии правильно запрограммировать алгоритм шоб оптимально контролировать использование памяти. Это приходит обычно с опытом.

 
Andrei01:

1. Ясень пень, хотя речь была о другом - правильном использовании объектов.

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

ObjectDelete("MyLineOpenPosition");
ObjectCreate("MyLineOpenPosition", OBJ_TREND, 0, Time[1],Close[0], Time[0],Close[0]);
ObjectSet("MyLineOpenPosition", OBJPROP_STYLE, STYLE_SOLID);
ObjectSet("MyLineOpenPosition", OBJPROP_RAY, False);
ObjectSet("MyLineOpenPosition",OBJPROP_WIDTH,3);
ObjectSet("MyLineOpenPosition", OBJPROP_COLOR, Black);

То есть без указания на необходимость уничтожать объекты ваш код будет просто нерабочим.

Кроме того, в init() вообще не рекомендуется пользоваться предопределёнными переменными, если конечно этот код предназначался для init().

 

гг :) Маразм крепчал.

Аффтор, пеши исчо, почти каждый пост перечитываю с удовольствием по нескольку раз :)

 
Candid:

1. Ваш код сработает при первом запуске индикатра, индикатор потом снимется, а объект в терминале останется. Если каждый индикатор будет оставлять после себя сотни и тысячи объектов, это и будет самая натуральная утечка памяти. Кроме того, при следующем запуске индикатора попытка создания объекта даст ошибку, поскольку такой объект уже будет существовать.

2. Кроме того, в init() вообще не рекомендуется пользоваться предопределёнными переменными, если конечно этот код предназначался для init().

1. Вы не учли несколько простых вещей. При инициалиции, прежде чем создать необходимые объекты все предыдущие объекты удаляются повторно для страховки, хотя они и так уничтожаются при деинициализации. Поэтому все Ваши опасения совершенно напрасны. Просто нужно уметь этим правильно пользоваться и мыслить логически. А код приведен лишь как пример создания объекта.

2. А в чем проблема?

 
Andrei01:

1. Вы не учли несколько простых вещей. При инициалиции, прежде чем создать необходимые объекты все предыдущие объекты удаляются повторно для страховки, хотя они и так уничтожаются при деинициализации. Поэтому все Ваши опасения совершенно напрасны. Просто нужно уметь этим правильно пользоваться и мыслить логически. А код приведен лишь как пример создания объекта.

2. А в чем проблема?

1. Я только не понял, их надо уничтожать при деинициализации или они сами уничтожатся? Почему бы вам самому не проверить в терминале некоторые простые вещи?

Вы давали рекомендацию новичку, вы посоветовали как предпочтительнй способ при котором число созданных объектов будет равно числу сегментов зигзага, при этом вы забыли предупредить об элементарной технике безопасности

2. Проблема в том, что иногда их может ещё не быть.
Причина обращения: