Отличие работы функции OnChartEvent в МТ4 и в МТ5 - страница 3

 
Eugeni Neumoin:

При переходе на МТ5 много неявных (нигде не описанных) отличий.

Например. В МТ4 не получалось удалять графический выделенный объект. Предполагаю, это было потому, что он был "захвачен" мышкой для перемещений.

Наворочал в МТ4 сложный код. Объект стал удаляться. Но редко проявлялась все-таки ошибка - объект оставался на графике. А после перерисовки графика он удалялся.

В МТ5 захваченный мышкой объект удаляется и функция ончартевент также грамотно отрабатывается в этом случае. Но в МТ5 эта функция и не понадобилась, так как  объект удаляется и без программных наворотов.

Ну и еще некоторые неявные отличия имеются. В статье по переходу на МТ5 с МТ4 не описанные.

=============

В МТ5 почистил код от излишеств.

В той статье много чего из предложенного не оптимально.
 
Artyom Trishkin:
В той статье много чего из предложенного не оптимально.

Там и ошибка есть.

Я не стал использовать функции из статьи. Вызов функций кушает ресурс компьютера.

 
Artyom Trishkin:
В той статье много чего из предложенного не оптимально.

Артем, как найти на форуме информацию о создании нескольких индикаторных буферов?

Интересует вопрос, как привязывать цвета и стили для нескольких индикаторных буферов.

У меня выводятся несколько зигзагов одновременно. Каждой линии зигзага необходимо задать свой цвет и стиль.

В МТ4 проблем не было. В МТ5 не нахожу, как это сделать. В описании языка об этом нет информации. Задавать цвет и стиль необходимо не через #property.

Задаю

#property indicator_buffers 28
#property indicator_plots 28

Проблемы с этими буферами:

   SetIndexBuffer(8,Lmzz1,INDICATOR_DATA);
   SetIndexBuffer(9,Hmzz1,INDICATOR_DATA);
   SetIndexBuffer(10,Lmzz2,INDICATOR_DATA);
   SetIndexBuffer(11,Hmzz2,INDICATOR_DATA);
   SetIndexBuffer(12,Lmzz3,INDICATOR_DATA);
   SetIndexBuffer(13,Hmzz3,INDICATOR_DATA);
   SetIndexBuffer(14,Lmzz4,INDICATOR_DATA);
   SetIndexBuffer(15,Hmzz4,INDICATOR_DATA);
   SetIndexBuffer(16,Lmzz5,INDICATOR_DATA);
   SetIndexBuffer(17,Hmzz5,INDICATOR_DATA);
   SetIndexBuffer(18,Lmzz6,INDICATOR_DATA);
   SetIndexBuffer(19,Hmzz6,INDICATOR_DATA);
   SetIndexBuffer(20,Lmzz7,INDICATOR_DATA);
   SetIndexBuffer(21,Hmzz7,INDICATOR_DATA);
   SetIndexBuffer(22,Lmzz8,INDICATOR_DATA);
   SetIndexBuffer(23,Hmzz8,INDICATOR_DATA);
   SetIndexBuffer(24,Lmzz9,INDICATOR_DATA);
   SetIndexBuffer(25,Hmzz9,INDICATOR_DATA);
   SetIndexBuffer(26,Lmzz10,INDICATOR_DATA);
   SetIndexBuffer(27,Hmzz10,INDICATOR_DATA);

Да и, наверное, и с первыми 8 буферами также есть проблемы.

Потом задаю

      PlotIndexSetInteger(8,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(9,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(10,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(11,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(12,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(13,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(14,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(15,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(16,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(17,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(18,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(19,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(20,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(21,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(22,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(23,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(24,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(25,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(26,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(27,PLOT_DRAW_TYPE,DRAW_ZIGZAG);


   PlotIndexSetInteger(8,PLOT_LINE_COLOR, propWave[0].colorWave);
   PlotIndexSetInteger(9,PLOT_LINE_COLOR, propWave[0].colorWave);
   PlotIndexSetInteger(10,PLOT_LINE_COLOR, propWave[1].colorWave);
   PlotIndexSetInteger(11,PLOT_LINE_COLOR, propWave[1].colorWave);
   PlotIndexSetInteger(12,PLOT_LINE_COLOR, propWave[2].colorWave);
   PlotIndexSetInteger(13,PLOT_LINE_COLOR, propWave[2].colorWave);
   PlotIndexSetInteger(14,PLOT_LINE_COLOR, propWave[3].colorWave);
   PlotIndexSetInteger(15,PLOT_LINE_COLOR, propWave[3].colorWave);
   PlotIndexSetInteger(16,PLOT_LINE_COLOR, propWave[4].colorWave);
   PlotIndexSetInteger(17,PLOT_LINE_COLOR, propWave[4].colorWave);
   PlotIndexSetInteger(18,PLOT_LINE_COLOR, propWave[5].colorWave);
   PlotIndexSetInteger(19,PLOT_LINE_COLOR, propWave[5].colorWave);
   PlotIndexSetInteger(20,PLOT_LINE_COLOR, propWave[6].colorWave);
   PlotIndexSetInteger(21,PLOT_LINE_COLOR, propWave[6].colorWave);
   PlotIndexSetInteger(22,PLOT_LINE_COLOR, propWave[7].colorWave);
   PlotIndexSetInteger(23,PLOT_LINE_COLOR, propWave[7].colorWave);
   PlotIndexSetInteger(24,PLOT_LINE_COLOR, propWave[8].colorWave);
   PlotIndexSetInteger(25,PLOT_LINE_COLOR, propWave[8].colorWave);
   PlotIndexSetInteger(26,PLOT_LINE_COLOR, propWave[9].colorWave);
   PlotIndexSetInteger(27,PLOT_LINE_COLOR, propWave[9].colorWave);

   PlotIndexSetInteger(8,PLOT_LINE_WIDTH, propWave[0].width);
   PlotIndexSetInteger(9,PLOT_LINE_WIDTH, propWave[0].width);
   PlotIndexSetInteger(10,PLOT_LINE_WIDTH, propWave[1].width);
   PlotIndexSetInteger(11,PLOT_LINE_WIDTH, propWave[1].width);
   PlotIndexSetInteger(12,PLOT_LINE_WIDTH, propWave[2].width);
   PlotIndexSetInteger(13,PLOT_LINE_WIDTH, propWave[2].width);
   PlotIndexSetInteger(14,PLOT_LINE_WIDTH, propWave[3].width);
   PlotIndexSetInteger(15,PLOT_LINE_WIDTH, propWave[3].width);
   PlotIndexSetInteger(16,PLOT_LINE_WIDTH, propWave[4].width);
   PlotIndexSetInteger(17,PLOT_LINE_WIDTH, propWave[4].width);
   PlotIndexSetInteger(18,PLOT_LINE_WIDTH, propWave[5].width);
   PlotIndexSetInteger(19,PLOT_LINE_WIDTH, propWave[5].width);
   PlotIndexSetInteger(20,PLOT_LINE_WIDTH, propWave[6].width);
   PlotIndexSetInteger(21,PLOT_LINE_WIDTH, propWave[6].width);
   PlotIndexSetInteger(22,PLOT_LINE_WIDTH, propWave[7].width);
   PlotIndexSetInteger(23,PLOT_LINE_WIDTH, propWave[7].width);
   PlotIndexSetInteger(24,PLOT_LINE_WIDTH, propWave[8].width);
   PlotIndexSetInteger(25,PLOT_LINE_WIDTH, propWave[8].width);
   PlotIndexSetInteger(26,PLOT_LINE_WIDTH, propWave[9].width);
   PlotIndexSetInteger(27,PLOT_LINE_WIDTH, propWave[9].width);

При выводе на график рисуется непонятно что. 

Картинка в МТ4 (так должно рисоваться):

MT4

Картинка в МТ5 (так рисуется. Цвет линий):

MT5

 
Реter Konow:
Сначала, после перехода, был недоволен МТ5, потом адаптировался к отличиям с МТ4, и жаловаться стало не на что. Вроде хочется сказать "Не, МТ4 в этом и этом лучше", но не могу, потому как разницы лично для моих кодов нет. Что четверка, что пятерка, работают одинаково. И там и там быстро... В общем, пятерка для меня стала чуть чуть лучше четверки именно из за требовательности. В остальном, всё тоже самое. Для меня. 

ЗЫ. Всё таки, МТ5 получше. Не отнять. Возможностей и мощностей больше.
Примечание: всё это для меня. Человека, игнорирующего всё правила программирования, не считающегося ни с какими стандартами кода, кроме собственных. Для меня, действительно без разницы какая платформа, потому что я даже библиотеки никакие и никогда не использовал. Один раз взял класс канвас, но и его "разломал" и вынул ценное. Так что, для тех, кто программирует как я, для них разницы между платформами не будет. Ну а для остальных... тут уже десятки тем об этом было.
 
Eugeni Neumoin:

Артем, как найти на форуме информацию о создании нескольких индикаторных буферов?

Интересует вопрос, как привязывать цвета и стили для нескольких индикаторных буферов.

У меня выводятся несколько зигзагов одновременно. Каждой линии зигзага необходимо задать свой цвет и стиль.

В МТ4 проблем не было. В МТ5 не нахожу, как это сделать. В описании языка об этом нет информации. Задавать цвет и стиль необходимо не через #property.

Задаю

#property indicator_buffers 28
#property indicator_plots 28

Проблемы с этими буферами:

   SetIndexBuffer(8,Lmzz1,INDICATOR_DATA);
   SetIndexBuffer(9,Hmzz1,INDICATOR_DATA);
   SetIndexBuffer(10,Lmzz2,INDICATOR_DATA);
   SetIndexBuffer(11,Hmzz2,INDICATOR_DATA);
   SetIndexBuffer(12,Lmzz3,INDICATOR_DATA);
   SetIndexBuffer(13,Hmzz3,INDICATOR_DATA);
   SetIndexBuffer(14,Lmzz4,INDICATOR_DATA);
   SetIndexBuffer(15,Hmzz4,INDICATOR_DATA);
   SetIndexBuffer(16,Lmzz5,INDICATOR_DATA);
   SetIndexBuffer(17,Hmzz5,INDICATOR_DATA);
   SetIndexBuffer(18,Lmzz6,INDICATOR_DATA);
   SetIndexBuffer(19,Hmzz6,INDICATOR_DATA);
   SetIndexBuffer(20,Lmzz7,INDICATOR_DATA);
   SetIndexBuffer(21,Hmzz7,INDICATOR_DATA);
   SetIndexBuffer(22,Lmzz8,INDICATOR_DATA);
   SetIndexBuffer(23,Hmzz8,INDICATOR_DATA);
   SetIndexBuffer(24,Lmzz9,INDICATOR_DATA);
   SetIndexBuffer(25,Hmzz9,INDICATOR_DATA);
   SetIndexBuffer(26,Lmzz10,INDICATOR_DATA);
   SetIndexBuffer(27,Hmzz10,INDICATOR_DATA);

Да и, наверное, и с первыми 8 буферами также есть проблемы.

Потом задаю

      PlotIndexSetInteger(8,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(9,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(10,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(11,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(12,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(13,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(14,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(15,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(16,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(17,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(18,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(19,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(20,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(21,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(22,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(23,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(24,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(25,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(26,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
      PlotIndexSetInteger(27,PLOT_DRAW_TYPE,DRAW_ZIGZAG);


   PlotIndexSetInteger(8,PLOT_LINE_COLOR, propWave[0].colorWave);
   PlotIndexSetInteger(9,PLOT_LINE_COLOR, propWave[0].colorWave);
   PlotIndexSetInteger(10,PLOT_LINE_COLOR, propWave[1].colorWave);
   PlotIndexSetInteger(11,PLOT_LINE_COLOR, propWave[1].colorWave);
   PlotIndexSetInteger(12,PLOT_LINE_COLOR, propWave[2].colorWave);
   PlotIndexSetInteger(13,PLOT_LINE_COLOR, propWave[2].colorWave);
   PlotIndexSetInteger(14,PLOT_LINE_COLOR, propWave[3].colorWave);
   PlotIndexSetInteger(15,PLOT_LINE_COLOR, propWave[3].colorWave);
   PlotIndexSetInteger(16,PLOT_LINE_COLOR, propWave[4].colorWave);
   PlotIndexSetInteger(17,PLOT_LINE_COLOR, propWave[4].colorWave);
   PlotIndexSetInteger(18,PLOT_LINE_COLOR, propWave[5].colorWave);
   PlotIndexSetInteger(19,PLOT_LINE_COLOR, propWave[5].colorWave);
   PlotIndexSetInteger(20,PLOT_LINE_COLOR, propWave[6].colorWave);
   PlotIndexSetInteger(21,PLOT_LINE_COLOR, propWave[6].colorWave);
   PlotIndexSetInteger(22,PLOT_LINE_COLOR, propWave[7].colorWave);
   PlotIndexSetInteger(23,PLOT_LINE_COLOR, propWave[7].colorWave);
   PlotIndexSetInteger(24,PLOT_LINE_COLOR, propWave[8].colorWave);
   PlotIndexSetInteger(25,PLOT_LINE_COLOR, propWave[8].colorWave);
   PlotIndexSetInteger(26,PLOT_LINE_COLOR, propWave[9].colorWave);
   PlotIndexSetInteger(27,PLOT_LINE_COLOR, propWave[9].colorWave);

   PlotIndexSetInteger(8,PLOT_LINE_WIDTH, propWave[0].width);
   PlotIndexSetInteger(9,PLOT_LINE_WIDTH, propWave[0].width);
   PlotIndexSetInteger(10,PLOT_LINE_WIDTH, propWave[1].width);
   PlotIndexSetInteger(11,PLOT_LINE_WIDTH, propWave[1].width);
   PlotIndexSetInteger(12,PLOT_LINE_WIDTH, propWave[2].width);
   PlotIndexSetInteger(13,PLOT_LINE_WIDTH, propWave[2].width);
   PlotIndexSetInteger(14,PLOT_LINE_WIDTH, propWave[3].width);
   PlotIndexSetInteger(15,PLOT_LINE_WIDTH, propWave[3].width);
   PlotIndexSetInteger(16,PLOT_LINE_WIDTH, propWave[4].width);
   PlotIndexSetInteger(17,PLOT_LINE_WIDTH, propWave[4].width);
   PlotIndexSetInteger(18,PLOT_LINE_WIDTH, propWave[5].width);
   PlotIndexSetInteger(19,PLOT_LINE_WIDTH, propWave[5].width);
   PlotIndexSetInteger(20,PLOT_LINE_WIDTH, propWave[6].width);
   PlotIndexSetInteger(21,PLOT_LINE_WIDTH, propWave[6].width);
   PlotIndexSetInteger(22,PLOT_LINE_WIDTH, propWave[7].width);
   PlotIndexSetInteger(23,PLOT_LINE_WIDTH, propWave[7].width);
   PlotIndexSetInteger(24,PLOT_LINE_WIDTH, propWave[8].width);
   PlotIndexSetInteger(25,PLOT_LINE_WIDTH, propWave[8].width);
   PlotIndexSetInteger(26,PLOT_LINE_WIDTH, propWave[9].width);
   PlotIndexSetInteger(27,PLOT_LINE_WIDTH, propWave[9].width);

При выводе на график рисуется непонятно что.

В справке написано, что для цвета отрисовки необходимо задать номер индекса цвета в модификаторе (вторая форма вызова PlotIndexSetInteger()).

Параметры

plot_index

[in]  Индекс графического построения

prop_id

[in]  Идентификатор свойства индикатора. Значение может быть одним из значений перечисления ENUM_PLOT_PROPERTY_INTEGER.

prop_modifier

[in]  Модификатор указанного свойства. Только свойства индексов цветов требуют модификатора.

prop_value

[in]  Значение свойства.

Возвращаемое значение

В случае успешного выполнения возвращает true, в противном случае false.

PLOT_LINE_COLOR

Цвет отрисовки

color     модификатор=номер индекса цвета


Значит - передайте в модификатор 0 - у вас же всего один буфер цвета для одной линии - т.е., вы же рисуете не цветным буфером (DRAW_COLOR_ZIGZAG), а обычным DRAW_ZIGZAG - значит и буфер цвета тут всего один, и его индекс должен быть нулевым.

Не утверждаю, что сам не ошибаюсь - давненько я не писал индикаторов - мог и подзабыть. Но одно время плотно занимался переделкой индикаторов с MQL4 на MQL5, и проблем с цветом не было.

Попробуйте.

 
Artyom Trishkin:


Это все давно уже не актуально. Все работает. Проблемы сейчас другие. Но их решу. Просто в версии для МТ4 устранял старинную проблему. Сейчас там все работает как дОлжно. Можно и МТ5 заняться.
 
Eugeni Neumoin:
Это все давно уже не актуально. Все работает. Проблемы сейчас другие. Но их решу. Просто в версии для МТ4 устранял старинную проблему. Сейчас там все работает как дОлжно. Можно и МТ5 заняться.

Хорошо. Просто мне пришло сообщение о том, что тут новое сообщение - глянул - и вправду ваше сообщение помечено цветом как новое - вот и ответил. А оказалось - совсем и не новое (если на дату глянуть) - видать новая выкладка сайта сделала своё дело...

Но если не секрет - я верно догадался? Хочется самому память освежить - не люблю забывать (а тут подзабыл)...

 
Artyom Trishkin: 

Но если не секрет - я верно догадался? Хочется самому память освежить - не люблю забывать (а тут подзабыл)...

Верно. У меня буферов получилось 18. Причем есть вывод какого-то параметра и через один буфер, и через два. Переключение производится через графический интерфейс. И здесь может быть и один Plot буфер и два. Этот фигуристый параметр поместил в конец списка буферов чтобы не производить программно смещение всех выше стоящих Plot-ов.

 
Как мне обратиться в тех.поддержку? Помогите?
 
Реter Konow:
Всё верно говорят. Проблема в ChartRedrаw(). Прошел через эту проблему. Решается просто. Везде, где требуется обновление графика после пользовательского рисования, ставить флаг  перерисовки(глобальный), а потом в таймере проверять его и вызывать ChartRedrаw() и обнулять флаг.  Иначе, при постоянном вызове будут красные квадратики появляться.

Спасибо за совет, это сократило количество вызовов функции ChartRedrаw(), но мне не помогло с проблемой. У меня по непонятной причине при работе НЕ в тестере кнопки OBJ_BITMAP_LABEL сами по себе "отжимались", будучи нажатыми. Убрал ChartRedrаw(), не помогло. Убирал и добавлял еще много чего, но заставить работать нормально так и не смог. При том проблема вылезала только при запущенных нескольких копиях советника на разных графиках. Так и не нашел корень проблемы, видимо он закопан где-то в недрах терминала, а не в моём советнике. В итоге пришлось сделать 2 вида работы (и отрисовки) кнопок - для торгового режима через OnChartEvent и для тестера стратегий в обычном режиме через ObjectSetInteger(0,name,OBJPROP_STATE,false)/ObjectSetInteger(0,name,OBJPROP_STATE,true). Вышло неплохо, так как нажатия в торговом режиме стали более четкие и моментальные, не зависящие от таймера, при этом сохранилась работа кнопок в тестере (лично меня бесит, когда гоняешь советника в тестере и не можешь нажимать кнопки. Особо "гениальные" разработчики вообще создают торговые панели, которые не возможно протестировать в визуальном режиме для оценки функциональности продукта).

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