Особенности языка mql5, тонкости и приёмы работы - страница 104
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Сколько инструментов в обзоре рынка?
61.
В билде 1907 ошибки чудесным образом исчезли. Даже не знаю, откатываться ли назад, чтобы их найти, или что-то в этом месте как раз пофиксили...
Вопрос по построению индикаторов
#property indicator_chart_window
#property indicator_buffers 12
#property indicator_plots 6
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_type2 DRAW_COLOR_LINE
#property indicator_type3 DRAW_COLOR_LINE
#property indicator_type4 DRAW_COLOR_LINE
#property indicator_type5 DRAW_COLOR_LINE
#property indicator_type6 DRAW_COLOR_LINE
SetIndexBuffer(0,upper_line,INDICATOR_DATA);
SetIndexBuffer(1,upper_line_color,INDICATOR_COLOR_INDEX);
PlotIndexSetString(0,PLOT_LABEL,"Upper Line");
PlotIndexSetInteger(0,PLOT_LINE_STYLE,UpperStyle);
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,UpperWidth);
PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,2);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,UpperTrendUp);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,UpperTrendDw);
// ==========
SetIndexBuffer(2,awera_line,INDICATOR_DATA);
SetIndexBuffer(3,awera_line_color,INDICATOR_COLOR_INDEX);
PlotIndexSetString(1,PLOT_LABEL,"Average Line");
PlotIndexSetInteger(1,PLOT_LINE_STYLE,AverageStyle);
PlotIndexSetInteger(1,PLOT_LINE_WIDTH,AverageWidth);
PlotIndexSetInteger(1,PLOT_COLOR_INDEXES,2);
PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,AverageTrendUp);
PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,AverageTrendDw);
// ==========
SetIndexBuffer(4,lower_line,INDICATOR_DATA);
SetIndexBuffer(5,lower_line_color,INDICATOR_COLOR_INDEX);
PlotIndexSetString(2,PLOT_LABEL,"Lower Line");
PlotIndexSetInteger(2,PLOT_LINE_STYLE,LowerStyle);
PlotIndexSetInteger(2,PLOT_LINE_WIDTH,LowerWidth);
PlotIndexSetInteger(2,PLOT_COLOR_INDEXES,2);
PlotIndexSetInteger(2,PLOT_LINE_COLOR,0,LowerTrendUp);
PlotIndexSetInteger(2,PLOT_LINE_COLOR,1,LowerTrendDw);
Сколько можно использовать цветовых буферов?
Как связываются друг с другом буферы?
#property indicator_buffers 12 // Обьявили всего 12 буферов
#property indicator_plots 6 // Графических построений
Правильно я понимаю что указав indicator_type с 1 по 6 индикатор будет понимать что цветную линии нужно рисовать для 6 графических построений ?
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_type2 DRAW_COLOR_LINE
#property indicator_type3 DRAW_COLOR_LINE
#property indicator_type4 DRAW_COLOR_LINE
#property indicator_type5 DRAW_COLOR_LINE
#property indicator_type6 DRAW_COLOR_LINE
// =====
SetIndexBuffer(0,upper_line,INDICATOR_DATA); // Первый буфер для данных
SetIndexBuffer(1,upper_line_color,INDICATOR_COLOR_INDEX); // Второй буфер для данных цветов
PlotIndexSetString(0,PLOT_LABEL,"Upper Line"); // Меняем свойства первого буфера
PlotIndexSetInteger(0,PLOT_LINE_STYLE,UpperStyle);// Меняем свойства первого буфера
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,UpperWidth);// Меняем свойства первого буфера
PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,2);// Меняем свойства первого буфера
PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,UpperTrendUp);// Меняем свойства первого буфера
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,UpperTrendDw);// Меняем свойства первого буфера
SetIndexBuffer(2,awera_line,INDICATOR_DATA); // Третий буфер
SetIndexBuffer(3,awera_line_color,INDICATOR_COLOR_INDEX); // Четвертый буфер цветов
PlotIndexSetString(1,PLOT_LABEL,"Average Line"); // Меняем свойства буфера для SetIndexBuffer(2,awera_line,INDICATOR_DATA);
PlotIndexSetInteger(1,PLOT_LINE_STYLE,AverageStyle); // Меняем свойства буфера для SetIndexBuffer(2,awera_line,INDICATOR_DATA);
PlotIndexSetInteger(1,PLOT_LINE_WIDTH,AverageWidth); // Меняем свойства буфера для SetIndexBuffer(2,awera_line,INDICATOR_DATA);
PlotIndexSetInteger(1,PLOT_COLOR_INDEXES,2); // Меняем свойства буфера для SetIndexBuffer(2,awera_line,INDICATOR_DATA);
PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,AverageTrendUp); // Меняем свойства буфера для SetIndexBuffer(2,awera_line,INDICATOR_DATA);
PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,AverageTrendDw); // Меняем свойства буфера для SetIndexBuffer(2,awera_line,INDICATOR_DATA);
Вопрос по построению индикаторов
#property indicator_chart_window
#property indicator_buffers 12
#property indicator_plots 6
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_type2 DRAW_COLOR_LINE
#property indicator_type3 DRAW_COLOR_LINE
#property indicator_type4 DRAW_COLOR_LINE
#property indicator_type5 DRAW_COLOR_LINE
#property indicator_type6 DRAW_COLOR_LINE
SetIndexBuffer(0,upper_line,INDICATOR_DATA);
SetIndexBuffer(1,upper_line_color,INDICATOR_COLOR_INDEX);
PlotIndexSetString(0,PLOT_LABEL,"Upper Line");
PlotIndexSetInteger(0,PLOT_LINE_STYLE,UpperStyle);
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,UpperWidth);
PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,2);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,UpperTrendUp);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,UpperTrendDw);
// ==========
SetIndexBuffer(2,awera_line,INDICATOR_DATA);
SetIndexBuffer(3,awera_line_color,INDICATOR_COLOR_INDEX);
PlotIndexSetString(1,PLOT_LABEL,"Average Line");
PlotIndexSetInteger(1,PLOT_LINE_STYLE,AverageStyle);
PlotIndexSetInteger(1,PLOT_LINE_WIDTH,AverageWidth);
PlotIndexSetInteger(1,PLOT_COLOR_INDEXES,2);
PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,AverageTrendUp);
PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,AverageTrendDw);
// ==========
SetIndexBuffer(4,lower_line,INDICATOR_DATA);
SetIndexBuffer(5,lower_line_color,INDICATOR_COLOR_INDEX);
PlotIndexSetString(2,PLOT_LABEL,"Lower Line");
PlotIndexSetInteger(2,PLOT_LINE_STYLE,LowerStyle);
PlotIndexSetInteger(2,PLOT_LINE_WIDTH,LowerWidth);
PlotIndexSetInteger(2,PLOT_COLOR_INDEXES,2);
PlotIndexSetInteger(2,PLOT_LINE_COLOR,0,LowerTrendUp);
PlotIndexSetInteger(2,PLOT_LINE_COLOR,1,LowerTrendDw);
Сколько можно использовать цветовых буферов?
Как связываются друг с другом буферы?
#property indicator_buffers 12 // Обьявили всего 12 буферов
#property indicator_plots 6 // Графических построений
Правильно я понимаю что указав indicator_type с 1 по 6 индикатор будет понимать что цветную линии нужно рисовать для 6 графических построений ?
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_type2 DRAW_COLOR_LINE
#property indicator_type3 DRAW_COLOR_LINE
#property indicator_type4 DRAW_COLOR_LINE
#property indicator_type5 DRAW_COLOR_LINE
#property indicator_type6 DRAW_COLOR_LINE
// =====
SetIndexBuffer(0,upper_line,INDICATOR_DATA); // Первый буфер для данных
SetIndexBuffer(1,upper_line_color,INDICATOR_COLOR_INDEX); // Второй буфер для данных цветов
PlotIndexSetString(0,PLOT_LABEL,"Upper Line"); // Меняем свойства первого буфера
PlotIndexSetInteger(0,PLOT_LINE_STYLE,UpperStyle);// Меняем свойства первого буфера
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,UpperWidth);// Меняем свойства первого буфера
PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,2);// Меняем свойства первого буфера
PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,UpperTrendUp);// Меняем свойства первого буфера
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,UpperTrendDw);// Меняем свойства первого буфера
SetIndexBuffer(2,awera_line,INDICATOR_DATA); // Третий буфер
SetIndexBuffer(3,awera_line_color,INDICATOR_COLOR_INDEX); // Четвертый буфер цветов
PlotIndexSetString(1,PLOT_LABEL,"Average Line"); // Меняем свойства буфера для SetIndexBuffer(2,awera_line,INDICATOR_DATA);
PlotIndexSetInteger(1,PLOT_LINE_STYLE,AverageStyle); // Меняем свойства буфера для SetIndexBuffer(2,awera_line,INDICATOR_DATA);
PlotIndexSetInteger(1,PLOT_LINE_WIDTH,AverageWidth); // Меняем свойства буфера для SetIndexBuffer(2,awera_line,INDICATOR_DATA);
PlotIndexSetInteger(1,PLOT_COLOR_INDEXES,2); // Меняем свойства буфера для SetIndexBuffer(2,awera_line,INDICATOR_DATA);
PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,AverageTrendUp); // Меняем свойства буфера для SetIndexBuffer(2,awera_line,INDICATOR_DATA);
PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,AverageTrendDw); // Меняем свойства буфера для SetIndexBuffer(2,awera_line,INDICATOR_DATA);
Лучше создайте отдельную ветку для своего вопроса. Эта ветка про особенности, обсуждений тут не должно быть.
Чтобы лучше понять принцип построения, реализуйте функционал инкрементно. Построили одну линию - проверили работоспособность, добавили следующую.
У каждой графической серии (в данном случае цветной линии) может быть только один буфер цвета. Каждый буфер может содержать множество цветов.
В билде 1907 ошибки чудесным образом исчезли. Даже не знаю, откатываться ли назад, чтобы их найти, или что-то в этом месте как раз пофиксили...
Ошибки исчезли, а проблемы с очередью событий — нет. Через несколько часов работы терминал начинает загружать ЦП на 95%. И что-то мне подсказывает, что тики пропускаются.
@Slava, что-то менялось в ChartEvent-ах в 19хх билдах? У вас проблема воспроизводится?
Ошибки исчезли, а проблемы с очередью событий — нет. Через несколько часов работы терминал начинает загружать ЦП на 95%. И что-то мне подсказывает, что тики пропускаются.
@Slava, что-то менялось в ChartEvent-ах в 19хх билдах? У вас проблема воспроизводится?
Вот так выглядит мониторинг ресурсов через 15 часов работы терминала (минимальная частота отправки события шпионом — 500 мс):
Хотя несколько часов после запуска загрузка процессора близка к 0.
Вот так выглядит мониторинг ресурсов через 15 часов работы терминала (минимальная частота отправки события шпионом — 500 мс):
Хотя несколько часов после запуска загрузка процессора близка к 0.
Билд 1908 — без изменений.
Возможность замены операторов структур базового типа позволяет в некоторых ситуациях проявлять гибкость.
В качестве примера, ниже один из приемов для кастомной сортировки массива структур
Результат
Наверное, древний велосипед.
Возможность замены операторов структур базового типа позволяет в некоторых ситуациях проявлять гибкость.
есть несколько моментов. в mql оператор < обязательно должен быть методом класса\структуры.
это значит, что его нельзя задать для встроенных структур. ну или для неизменяемых.
этот способ можно немного улучшить, добавив шаблонную функцию сравнения, которая по умолчанию будет вызывать оператор <
UPD: пишу везде оператор < потому что перегружают обычно его а не >, это не строго, но общепринятоесть несколько моментов. в mql оператор < обязательно должен быть методом класса\структуры.
это значит, что его нельзя задать для встроенных структур. ну или для неизменяемых.
Результат
этот способ можно немного улучшить, добавив шаблонную функцию сравнения, которая по умолчанию будет вызывать оператор <
Если использовать typedef, то тогда нужно определять функцию сортировки не только для структур, но и для стандартных числовых типов. Или я не понял, о чем речь.