Опубликована новая статья Множественные индикаторы на графике (часть 04): начало работы с советником:
Автор: Даниэль Хосе
Здравствуйте Даниил, я слежу за вашими статьями, но что насчет части 03?
Была небольшая проблема в то время, когда просили выпустить для публикации, но уже разрешили публикацию части 03, скоро она тоже будет доступна, эта проблема была вызвана скорее количеством статей, которые я уже отправил ... В настоящее время у них есть еще 15 статей для анализа, все они связаны с разработкой этого советника, и в каждой из них все сложнее .... но спасибо, что следите за серией ... ожидайте огромных новостей от статьи 05, с этого момента вещь действительно будет стоить того, потому что она станет чем-то большим для людей, эти первые просто представляют то, что будет впереди ...😁👍
Привет, Даниель,
У меня возникли проблемы с разноцветными индикаторами, и ваши статьи, которые мне очень нравятся, указывают на то, что вы можете знать их решение.
Я хочу создать функцию, которая устанавливает все атрибуты индикатора без использования опций #property, например, #property indicator_color1 clrCrimson, clrWhite, clrLime.
В приведенной ниже тестовой программе я обнаружил, что при включенном #property indicator_color1 clrCrimson,clrWhite,clrLime программа работает правильно, тогда как если я его закомментирую, то программа работает некорректно.В этом случае кажется, что программа строит график только по некоторым точкам данных, как будто она использует таймфрейм "выше?" или пропускает несколько точек данных. Я подозреваю, что директива property color устанавливает больше атрибутов, которые я не определил, когда указано несколько цветов.
Вторая проблема заключается в том, что я, очевидно, не понимаю деталей и требований использования многоцветных графиков. Я просмотрел документацию и не нашел ни одной статьи, в которой бы давался обзор использования многоцветных индикаторов. В то время как первый график правильно меняет цвет, второй, построенный по минимумам, не меняет цвета в соответствии с моим вызовом функции. Для правильной работы этого графика требуются все три свойства: type2, color2 и width2. Я также недоумеваю, почему в объявлениях свойств используется 2, а не 3. Я использовал индикатор Laguerre Adaptive Filter Младена, чтобы определить, что индикаторы свойств используют номер графика 2, а не номер индикатора 3 для правильного отображения.
Любые предложения, ссылки или помощь будут высоко оценены.
С уважением, CapeCoddah
Любые предложения, ссылки или помощь будут высоко оценены.
Искренне, CapeCoddah
Вы немного запутались, я могу понять... но вся путаница в том, что вы на самом деле не смотрите на детали в своем коде. Я попытаюсь объяснить некоторые детали, которые есть в комментарии, а затем немного расскажу о вашем коде.....
Первый момент заключается в том, что вы можете сделать многоцветный индикатор и без использования #property indicator_colorN, но для пользователя и даже для вас это практичнее, безопаснее и проще в понимании и модификации кода, потому что все, что вам нужно сделать, это зайти в свойства и изменить присутствующие там цвета, а для пользователя это проще, потому что ему нужно будет только выбрать цвет, который нужно изменить, и сделать изменение, это в стандартном окне, которое MT5 создает для индикаторов. Вы как-то уже правильно поступаете, когда используете команду PlotIndexSetInteger для генерации изменений цвета, и так оно и есть, когда мы не используем #property indicator_colorN, но когда мы используем свойства, часто не имеет смысла использовать команду PlotIndexSetInteger для установки других цветов, Это связано с тем, что это может быть более сложным в обслуживании и более запутанным для пользователя, так как он может не понимать, что пытается сказать стандарт цвета, даже если код ваш и вы будете единственным, кто будет использовать индикатор, это не имеет большого смысла, за исключением редких случаев, когда вы создаете динамический цветовой шаблон.
Теперь о втором моменте: Проблема в том, что вы путаете количество объектов, которые будет строить индикатор (2 для 2 линий) со свойствами объекта (в данном случае линии), а для того, чтобы линия была построена, вам нужно объявить как минимум 3 части информации, а именно TypeN, ColorN, WidthN, где N означает номер объекта, с практикой и временем вы поймете эти небольшие различия между свойствами индикатора и свойствами объектов, которые он использует... Не сдавайтесь... продолжайте учиться и скоро все станет понятнее... 😁👍
Теперь давайте посмотрим на ваш код... Я не буду показывать вам, как именно его исправить (если я это сделаю, будет неинтересно... .... 😁👍✌ ) Я хочу, чтобы вы обратили внимание на следующий факт, и это важно:
Buf=Set_IndexBuffer5(Buf, dataHi, INDICATOR_DATA , DRAW_COLOR_LINE , 4 , "High" , clrYellow , clrWhite , clrDodgerBlue ); Buf=Set_IndexBuffer5(Buf, dataHic, INDICATOR_COLOR_INDEX ); Buf=Set_IndexBuffer5(Buf, dataLo, INDICATOR_DATA , DRAW_COLOR_LINE , 4 , "Low" , clrYellow , clrWhite , clrDodgerBlue ); Buf=Set_IndexBuffer5(Buf, dataLoc, INDICATOR_COLOR_INDEX );
Обратите внимание, что я отметил две вещи в вашем коде... теперь давайте посмотрим, что происходит, когда это воспроизводится на графике.....

Видите, что только одна из меток отображается так, как вы объявили в коде, только HIGH .... , а LOW ?!!! где она ?!!! это первый пункт, который вы должны исправить, потому что тот факт, что метка LOW не отображается, указывает на то, что используется цветовая схема, которая объявлена в #property indicator_color2, то есть у вас сбой в этой точке, если вы попытаетесь удалить свойства индикатора 2, которые фактически создают линию LOW, даже сохранив остальную часть кода, линия HIGH будет построена, но линия LOW не будет....почему?!!! потому что на самом деле вы не определяете информацию, необходимую для построения линии LOW, это происходит динамически через использование вызова PlotIndexSetInteger... это кажется странным ... но это то, что происходит .....
Когда вам удастся это исправить, если вы действительно хотите использовать динамический способ объявления данных объекта строки с помощью PlotIndexSetInteger, вы сможете удалить команды компиляции #property indicator_color из сцены, так как необходимые данные будут устанавливаться динамически, но если вы не хотите прилагать такие усилия, то это нормально.....
Теперь я хочу, чтобы вы посмотрели на изображение выше и сравнили его с цветами, которые вы используете в #property indicator_color ... смотрите на эти цвета очень внимательно .... если вы сделаете это, то заметите там что-то странное .... опять же не буду говорить, чтобы не потерять удовольствие, но попробуйте использовать разные цвета, не повторяя ни один из них... когда вы повторяете их, становится сложнее понять, где ошибка... 😁👍
Теперь последняя деталь: То, что вам кажется, что он прокладывает только одни точки и пропускает другие, может быть по двум причинам: Цветовой шаблон не контрастирует с фоном графика, попробуйте использовать цвета, контрастирующие с фоном графика, и второе, но я не верю, что это действительно так, это то, что может быть сбой в событии OnCalcule, вы возвращаете -1 или значение i, правильнее было бы возвращать rates_total, так что измените это в коде, чтобы избежать проблем с футурами...
Привет, Дэниел,
Я запутался. Я думал, что характеристики рисунка определяются с помощью спецификации буфера, как в MQ4, тогда как, по крайней мере, для спецификаций DRAW_COLOR... характеристики рисунка определяются с помощью идентификатора последовательного графика. Я не выяснил, требуют ли спецификации сюжета также для DRAW_LINE и т. д. Более того, свойство indicator_colorX фактически имеет две функции: сначала подсчитывает и устанавливает количество цветов, а затем устанавливает каждый указанный цвет в соответствующую позицию массива.Прилагаю два файла: Color Test, который сейчас работает корректно, хотя и требует доработки, и немного измененный MACD Original2_1 Младена. Программа Младена интересна тем, что он определил два графика, но использует только один цветовой индексный буфер.
Спасибо за помощь
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Несколько индикаторов на графике (Часть 04): Начинаем работу с советником:
В предыдущих статьях я объяснил, как создать индикатор с несколькими подокнами, что становится интересным при использовании пользовательских индикаторов. Здесь мы рассмотрим, как добавить несколько окон в советник.
Когда я решил создавать что-то новое, используя ООП (Объектно-ориентированное программирование), я сделал это, потому что уже знал, что есть большие преимущества в использовании такого подхода, среди которых безопасность и наследование, хотя у нас также есть полиморфизм, но мы будем использовать его позже, когда будем создавать систему перекрестного порядка, а здесь мы будем использовать одно из преимуществ ООП - наследование. Наш класс C_TemplateChart уже полностью функционален, и, видя это, мы не хотим перепрограммировать его заново или рисковать, добавляя код в класс, поотому что этот код не позволит использовать класс в других местах. Решением является использование наследования, что позволяет добавлять новый код или функции, никак не изменяя исходный код.
Использование наследования имеет ряд преимуществ, в том числе следующие: уже протестированный код остается протестированным; сложность растет без равного роста объема кода; только новые функции действительно нуждаются в тестировании; то, что не меняется, просто наследуется, обеспечивая стабильность. Иными словами, всё улучшается с минимальными усилиями, но с максимальной безопасностью, чтобы понять это, давайте посмотрим на схему ниже.
Автор: Daniel Jose