![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Отличный торговый бот Donchian Channel на mql5! | Программирование МТ5
Отличный торговый бот Donchian Channel на mql5! | Программирование МТ5
После того, как вы добавили пользовательский индикатор на график, вы увидите, что канал Дончиана отображается в виде синих линий. Индикатор канала Дончиана показывает самый высокий максимум и самый низкий минимум за предыдущие n баров. Он обычно используется для создания стратегий прорыва, когда трейдеры открывают сделки на покупку, когда цена пересекает верхнюю полосу канала Дончиана, и сделки на продажу, когда она пересекает нижнюю полосу.
Однако для этого советника (эксперта) мы хотим протестировать противоположный подход. Вместо того, чтобы покупать, когда цена пересекает верхнюю полосу, мы будем продавать, и наоборот. Таким образом, всякий раз, когда цена пересекает верхнюю полосу канала Дончиана, мы открываем позицию на продажу, а когда она пересекает нижнюю полосу, мы открываем позицию на покупку.
Кроме того, мы будем устанавливать стоп-лосс для каждой сделки либо в пунктах, либо в процентах от канала. Мы также можем рассмотреть возможность добавления фильтра в советник Donchian Channel EA в зависимости от размера канала. Теперь давайте перейдем в MetaEditor, чтобы начать программировать наш собственный индикатор канала Дончиана.
В MetaEditor создайте новый файл пользовательского индикатора, нажав «Создать» в верхнем левом углу, выбрав «Пользовательский индикатор» и нажав «Далее». Назовите файл «MyDonchianChannel» и нажмите «Далее» и «Готово», чтобы завершить процесс. После создания файла очистите код, удалив ненужные комментарии и выровняв скобки. Затем скомпилируйте код, чтобы проверить наличие ошибок или предупреждений.
Теперь давайте определим свойства нашего пользовательского индикатора. Мы хотим, чтобы он отображался в главном окне графика, поэтому установите для свойства "indicator_chart_window" значение true. Нам также необходимо определить количество буферов и графиков для нашего индикатора. Так как у нас есть две строки (верхняя и нижняя), установите для «indicator_buffers» значение 2, а для «indicator_plots» — значение 2.
Далее мы определим входные параметры для нашего пользовательского индикатора. Нам нужны входные данные для периода канала Дончиана, процента смещения и цвета линий индикатора. Определите эти входные данные, используя соответствующие типы (целое число для периода и смещения и цвет для цвета), и установите значения по умолчанию и комментарии для каждого входного значения.
Скомпилируйте код еще раз, чтобы убедиться в отсутствии ошибок или предупреждений.
Теперь перейдем к кодированию функции onCalculate пользовательского индикатора. Сначала проверьте, не меньше ли количество баров на графике введенного периода плюс один. Если это так, то для расчета индикатора недостаточно баров, поэтому вернитесь с нулем. Далее устанавливаем переменную first, которая представляет собой первый бар, для которого мы хотим начать расчет канала Дончиана. Если предыдущий расчет не был выполнен (previous_calculated равен нулю), установите «first» на входной период. В противном случае установите для него значение previous_calculated минус один. Теперь нам нужно пройтись по столбцам, используя цикл for. Начните цикл с «первого» бара и продолжайте, пока текущий бар не станет меньше, чем общее количество баров на графике. Увеличивайте счетчик баров в конце каждой итерации цикла.
Внутри цикла рассчитайте верхнее и нижнее значения канала Дончиана, используя цены открытия каждого бара. Сохраните эти значения в «верхней» и «нижней» переменных соответственно.
Чтобы рассчитать смещение, вычтите нижнее значение из верхнего и умножьте его на входное смещение, деленное на 100. Это даст нам значение смещения в пунктах или в процентах от канала. Наконец, сохраните рассчитанные значения в соответствующих буферах, используя индекс буфера и барный счетчик. После расчета и сохранения значений в буферах нам нужно установить метки индикатора для каждого графика. Эти метки будут отображаться в окне свойств индикатора.
Назначьте метки верхнему и нижнему графикам с помощью функции SetIndexLabel(), передав индекс буфера и метку в качестве параметров. Далее установим цвета линий индикатора с помощью функций SetIndexStyle() и SetIndexColor(). Укажите индекс буфера, стиль линии (например, STYLE_SOLID) и желаемый цвет для каждой линии.
Наконец, мы добавим дополнительный код, чтобы сделать индикатор более привлекательным. Мы можем скрыть имя индикатора, задав для свойства Indicator_shortname пустую строку. Дополнительно мы можем добавить метку графика с текущим значением верхней полосы с помощью функций ObjectCreate() и ObjectSetText().
Скомпилируйте код еще раз, чтобы убедиться в отсутствии ошибок или предупреждений.
Поздравляем! Вы успешно написали пользовательский индикатор Donchian Channel. Теперь вы можете использовать этот индикатор в своем советнике для реализации своей торговой стратегии.
На следующем этапе мы перейдем к кодированию советника (EA), который будет использовать индикатор канала Дончиана для совершения сделок на основе стратегии прорыва. Откройте новый файл в редакторе MetaEditor, назовите его «DonchianChannelEA» и выберите опцию «Советник». Нажмите «Далее» и «Готово», чтобы создать файл. Очистите исходный код, удалив ненужные комментарии и выровняв скобки.
Во-первых, мы определим входные параметры для нашего советника. Они будут включать размер лота, стоп-лосс, тейк-профит, а также период и смещение для канала Дончиана. Определите эти входные данные, используя соответствующие типы, и установите значения по умолчанию и комментарии для каждого входа. Далее мы напишем функцию OnInit(). Внутри этой функции мы инициализируем индикатор канала Дончиана, вызвав функцию iCustom() с необходимыми параметрами.
Создайте переменные для хранения хэндла индикатора, значений верхней и нижней полос. Используйте функцию ArraySetAsSeries(), чтобы установить массивы как серии, чтобы обеспечить правильную индексацию. Теперь давайте перейдем к кодированию основной функции OnTick(), которая будет обрабатывать торговую логику.
Начните с проверки, достаточно ли баров для расчета канала Дончиана. Если нет, вернитесь с нулем. Получить текущие значения верхней и нижней полосы индикатора с помощью функции CopyBuffer(). Теперь проверим сигнал на покупку. Если цена пересекает верхнюю полосу, открываем позицию на продажу с помощью функции OrderSend(). Установите соответствующий тип ордера (OP_SELL), размер лота, уровни стоп-лосса и тейк-профита. Не забудьте обработать возможные ошибки, возвращаемые функцией OrderSend().
Точно так же проверьте сигнал на продажу. Если цена пересекает нижнюю полосу, открывайте позицию на покупку с помощью функции OrderSend(). Установите соответствующий тип ордера (OP_BUY), размер лота, уровни стоп-лосса и тейк-профита.
Скомпилируйте код, чтобы убедиться в отсутствии ошибок или предупреждений.
Вот и все! Вы завершили программирование советника Donchian Channel. Теперь вы можете протестировать советник на демо-счете или протестировать его на исторических данных, чтобы оценить его производительность. Не забудьте тщательно протестировать свой советник и подумайте о применении методов управления рисками, прежде чем использовать его на реальном торговом счете. Обратите внимание, что предоставленный код является базовой реализацией и может потребовать дальнейших модификаций или улучшений в соответствии с вашими конкретными торговыми требованиями.
Потрясающий торговый бот на пробой максимума/минимума в mql5! | Часть 1
Потрясающий торговый бот на пробой максимума/минимума в mql5! | Часть 1
Тоби, в этом видео я хочу представить новый проект, который предполагает использование максимумов и минимумов для создания прибыльной стратегии прорыва. Основная идея состоит в том, чтобы определить самую высокую и самую низкую цену текущего символа и использовать эти уровни для определения потенциальных точек пробоя. Давайте посмотрим на график, чтобы понять, как это работает.
Для начала мы наблюдаем за последними n барами и определяем самую высокую и самую низкую цены. Если цена прорывается выше высокого уровня, мы открываем позицию на покупку. И наоборот, если цена пробивает нижний уровень, мы открываем позицию на продажу. Это простая концепция, но мы усовершенствуем ее, добавив уровни стоп-лосса и тейк-профита в пунктах. Кроме того, мы внедрим фильтры, чтобы уточнить стратегию и избежать торговли на каждом максимуме и минимуме.
Давайте подождем торговой возможности, чтобы продемонстрировать концепцию. Здесь у нас есть позиция на продажу, так как цена пробила нижний уровень, и мы закрыли сделку с прибылью. Это служит основной основой нашей стратегии, и мы можем улучшить ее, включив дополнительные компоненты.
Теперь давайте переключимся в Meta Editor и начнем программировать. Мы создадим новый файл в папке YouTube и назовем его «Toby's Breakout EA». В файле мы определим необходимые входные данные для нашего советника. К ним относятся магическое число, размер лота, количество баров для рассмотрения, стоп-лосс и тейк-профит. Мы установим соответствующие значения по умолчанию и предоставим комментарии для объяснения каждого ввода.
Далее мы перейдем к функции onInit, где мы проверим вводимые пользователем данные, чтобы убедиться, что они действительны. Мы создадим отдельную функцию с именем checkInputs для обработки этой проверки. Если какой-либо из входных данных неверен, мы отобразим сообщение об ошибке и предотвратим запуск советника.
В функции onInit мы также установим магический номер нашего торгового объекта, используя предоставленный ввод. Это позволит нам в дальнейшем фильтровать и управлять позициями, открытыми нашим советником.
Теперь давайте рассмотрим функцию onTick. Мы начнем с сохранения текущего тика и предыдущих значений тика. Это поможет нам отслеживать движение цены и определять, пересекаем ли мы какие-либо важные уровни. Мы будем использовать функцию SymbolInfoTick для получения текущего тика, и если произойдет какая-либо ошибка, мы выведем сообщение об ошибке и остановим советник.
После этого мы добавим три пользовательские функции: countOpenPositions, normalizePrice и closePositions. Эти функции помогут нам управлять нашими позициями, подсчитывать количество открытых позиций, нормализовать цены и закрывать позиции при необходимости.
Возвращаясь к функции onTick, начнем с подсчета открытых позиций как на покупку, так и на продажу. Если во время этого процесса произойдет ошибка, мы остановим советник без отображения сообщения об ошибке, так как она уже обработана в пользовательской функции. Затем мы проверим, есть ли открытые позиции на покупку и не равен ли верхний уровень нулю. Это гарантирует, что мы установили высокий уровень и нет существующих позиций на покупку.
Отсюда мы можем продолжить кодирование логики стратегии прорыва. Аналогичные проверки реализуем для позиций на продажу и нижнего уровня. Эти операторы if помогут нам определить, следует ли открывать позицию на покупку или продажу на основе прорыва соответствующих уровней.
Как только у нас будет базовая структура, мы можем еще больше улучшить стратегию, добавив дополнительные компоненты и фильтры. Это может включать дополнительные входные параметры и условия для уточнения торговых сигналов и повышения общей производительности.
Это охватывает начальный процесс кодирования. Следуя этим шагам, мы можем создать пробойный советник на основе максимумов и минимумов, который может служить отправной точкой для дальнейшей разработки и оптимизации.
Алгоритм:
Алгоритм постоянно проверяет потенциальные точки входа и выхода на основе цен покупки и продажи по отношению к предопределенным высоким и низким уровням. Он открывает позиции при выполнении условий и закрывает позиции, когда цены движутся в противоположном направлении.
Торговый бот на пробой максимума/минимума mql5 | Часть 2
Торговый бот на пробой максимума/минимума mql5 | Часть 2
В этом видео продолжаем работу над нашей черной Audi с покрытием high-low. В продолжение нашего предыдущего сеанса мы теперь включим логику торговли и введем некоторые дополнительные компоненты. Для начала мы рассчитаем стоп-лосс для наших позиций. Если ввод стоп-лосса равен нулю, мы устанавливаем переменную «SL» в ноль, указывая на отсутствие стоп-лосса. В противном случае мы устанавливаем текущую цену предложения за вычетом входного стоп-лосса, умноженного на значение в пунктах.
Далее рассчитываем тейк-профит. Если ввод тейк-профита равен нулю, мы устанавливаем переменную «TP» в ноль. В противном случае мы устанавливаем текущую цену предложения плюс введенный тейк-профит, умноженный на значение в пунктах. Чтобы обеспечить постоянство ценовых значений, мы нормализуем стоп-лосс и тейк-профит, используя функцию «нормализованная цена».
Имея торговую логику, мы используем торговый объект, который был объявлен ранее с помощью класса cTrade, для открытия позиций. Для позиции на покупку мы используем текущий символ, вводим лоты для размера лота, текущую цену предложения для цены, переменную стоп-лосса для стоп-лосса и переменную тейк-профита для тейк-профита. Точно так же для позиции на продажу мы используем текущую цену предложения в качестве цены. Чтобы отличить эту позицию от других, мы добавляем комментарий, указывающий, что она принадлежит нашему советнику "High-Low Record EA".
После компиляции кода переключаемся на MetaTrader для тестирования. Настраиваем визуальный тест, указав временные рамки и период. С входными данными по умолчанию мы запускаем тест и наблюдаем за высокими и низкими значениями. Используя режим «Только цена открытия», мы можем видеть, какие позиции открываются при пересечении верхнего или нижнего уровня. На следующем шаге мы изменим тиковый режим советника, чтобы он действовал только на открытых тиках. Это обеспечивает более надежную и быструю среду тестирования для создания стабильных систем.
Двигаясь вперед, мы реализуем индексный фильтр, чтобы предотвратить торговлю на экстремальных точках в самом начале или в конце ретроспективного периода. Мы вводим ввод под названием «Фильтр индекса», который представляет собой процент баров в период ретроспективного анализа, которые следует отфильтровать. Например, если период ретроспективного анализа составляет 50 баров, а индексный фильтр установлен на 10, экстремумы в пределах первых пяти или последних пяти баров будут отфильтрованы. Чтобы визуализировать этот диапазон, мы рисуем прямоугольник на графике. Добавляем необходимые глобальные переменные, устанавливаем их начальные значения и вносим изменения в функцию «OnTick» для расчета максимального и минимального индексов с помощью функций «I Highest» и «I Lowest».
Кроме того, мы обновляем функцию «CheckInputs», чтобы включить вход «Index Filter» и проверить его значение. Мы также создаем новую функцию под названием «CheckIndexFilter», которая проверяет, следует ли фильтровать экстремум на основе индекса и настроек фильтра. Для завершения реализации компилируем код и переходим к визуальному тесту. Мы проверяем, открываются ли позиции только тогда, когда экстремумы находятся в пределах определенного диапазона, в соответствии с индексным фильтром. В следующем сегменте мы планируем модифицировать тиковый режим советника, чтобы он лучше соответствовал нашим требованиям. Мы перейдем в режим открытых тиков, что позволит советнику работать исключительно на открытых тиках, повысив надежность и эффективность системы.
После изменения тикового режима на открытый тиковый режим мы приступаем к дальнейшим улучшениям нашего советника. Одним из улучшений, которые мы сделаем, является добавление временного фильтра. Чтобы реализовать временной фильтр, мы вводим два новых ввода: «Час начала» и «Час окончания». Эти входные данные позволяют нам указать диапазон времени, в течение которого должна быть разрешена торговля. Например, если мы установим начальный час на 8 и конечный час на 18, советник будет открывать позиции только между 8:00 и 18:00. Чтобы включить временной фильтр, мы обновляем функцию «CheckInputs», чтобы проверить новые входные данные и убедиться, что час начала меньше часа окончания. Мы также модифицируем функцию «OnTick», чтобы сверять текущее время с указанным диапазоном перед открытием позиций.
С установленным временным фильтром мы компилируем код и запускаем визуальный тест, чтобы убедиться, что позиции открываются только в указанном временном диапазоне. Далее мы переходим к другому усовершенствованию: добавлению фильтра спреда. Фильтр спреда позволяет определить максимально допустимый спред, выше которого советник не будет открывать позиции. Чтобы реализовать фильтр спреда, мы вводим новый вход под названием «Максимальный спред». В функцию «OnTick» мы включаем проверку, чтобы убедиться, что текущий спред находится в допустимом диапазоне перед открытием позиций.
Мы также обновляем функцию «CheckInputs», чтобы проверить ввод «Max Spread» и убедиться, что это положительное значение. После реализации фильтра спреда мы компилируем код и выполняем визуальный тест, чтобы убедиться, что позиции открываются только тогда, когда спред ниже указанного максимума. Наконец, мы представляем функцию для отслеживания и отображения количества открытых позиций на графике. Мы создаем новую глобальную переменную с именем «Счетчик позиций» и инициализируем ее нулем. В функции "OnTick" мы увеличиваем количество позиций при каждом открытии позиции.
Чтобы отобразить количество позиций на графике, мы используем функцию «ObjectSetText» для создания текстового объекта, показывающего текущее количество. Мы обновляем текстовый объект последним значением счетчика на каждом тике. После того, как код скомпилирован, мы запускаем визуальный тест, чтобы наблюдать за количеством позиций, отображаемым на графике, и убедиться, что оно точно отражает количество открытых позиций.
Благодаря этим усовершенствованиям мы значительно улучшили функциональность и производительность нашего советника. Фильтр времени, фильтр спреда и отображение количества позиций обеспечивают больший контроль и прозрачность процесса торговли.
В следующем видео мы рассмотрим дополнительные методы оптимизации и тонкой настройки для дальнейшего повышения производительности нашего советника.
Удивительный торговый бот на пробой максимума/минимума mql5 | Часть 3
Удивительный торговый бот на пробой максимума/минимума mql5 | Часть 3
В сегодняшнем видео Тоби продолжает разработку советника на прорыве хай-лоу для MK5. Он вводит в стратегию два новых компонента, а в конце проводит несколько тестов на исторических данных.
Тоби начинает с компиляции советника, чтобы убедиться, что он в рабочем состоянии. Затем он добавляет ввод для скользящего стоп-лосса, чтобы повысить эффективность стратегии как системы прорыва и следования за трендом. Вход представляет собой логическую переменную, которую можно активировать или деактивировать. Тоби также создает функцию под названием «updateStopLoss» для расчета и обновления значений стоп-лосса для каждой позиции.
Чтобы реализовать трейлинг-стоп, Тоби копирует функцию updatePosition из другого советника и модифицирует ее соответствующим образом. Он добавляет параметр для расстояния до стоп-лосса и корректирует расчет нового значения стоп-лосса на основе этого ввода. Он также включает функцию под названием «normalizedPrice», чтобы обеспечить нормализацию значения стоп-лосса. После внесения этих изменений Тоби снова компилирует код, чтобы убедиться в отсутствии ошибок.
Затем Тоби переходит к функции «OnTick», где он интегрирует функцию «updateStopLoss». Он добавляет оператор if, чтобы проверить, активен ли трейлинг-стоп-лосс, и если да, то вызывает функцию «updateStopLoss», чтобы отслеживать значения стоп-лосса. Он также гарантирует, что функция применяется как к позициям покупки, так и к позициям продажи.
После компиляции кода Тоби добавляет в стратегию следующий компонент — фильтр размера. Фильтр размера позволяет отфильтровывать каналы, в которых высокие и низкие значения слишком далеко друг от друга, указывая на больший диапазон. Тоби добавляет входные данные для фильтра размера в пунктах и соответствующим образом корректирует код, чтобы проверить, превышает ли размер канала указанный предел. Он также включает фильтр размера в визуализацию линий максимума и минимума.
Затем Тоби проводит визуальный тест с помощью тестера стратегий, чтобы убедиться, что скользящий стоп-лосс и фильтр по размеру работают правильно. Он наблюдает за поведением стоп-лосса и изменением цвета линий в зависимости от условия фильтра по размеру.
В заключительной части видео Тоби проводит бэктесты, чтобы оценить производительность советника за последние 10 лет. Он устанавливает критерии оптимизации в качестве коэффициента восстановления и использует определенный символ и временной интервал. Тоби планирует использовать оставшиеся годы в качестве вневыборочного теста.
Тоби вносит несколько улучшений в советник прорыва максимума-минимума, включая добавление скользящего стоп-лосса и фильтра по размеру. Он также демонстрирует, как проводить бэктесты для оценки производительности советника.
Напишем на mql5 лучший советник по свечным паттернам! | Часть 1
Напишем на mql5 лучший советник по свечным паттернам! | Часть 1
Привет, это Тоби, и в этом видео я начинаю новый проект кодирования EA на своем канале. Мы сосредоточимся на свечных паттернах и создадим советник, который может торговать различными паттернами, такими как доджи, утренняя звезда, восходящая звезда и многими другими. Советник также будет иметь панель для отображения различных условий. Я уже провел предварительное тестирование с помощью советника, и результаты оказались довольно интересными, особенно на разных символах. Я считаю, что этот подход может привести к очень эффективной стратегии. Давайте погрузимся!
Прежде чем мы приступим к написанию советника, давайте обсудим общую идею стратегии. Крайне важно понимать, что мы стремимся создать по мере нашего продвижения. Чтобы проиллюстрировать концепцию, я создал простую диаграмму. Наш советник будет работать исключительно с ценой открытия каждого бара. Например, рассмотрим текущий бар (индекс 0) и предыдущий бар (индекс 1). Мы хотим создать советник, который может торговать различными графическими паттернами или паттернами свечей, такими как доджи, утренняя звезда, вечерняя звезда, восходящая звезда и многими другими.
Для этого мы определим различные условия. Например, мы можем установить условие, при котором максимальная цена бара 2 должна быть выше максимальной цены бара 1. Другим условием может быть то, что цена открытия бара 3 должна быть ниже цены закрытия бара 3, что указывает на бычья свеча. Комбинируя эти условия, мы можем инициировать сделку на покупку при открытии следующего бара. Мы можем применить аналогичные условия в обратном порядке для сигналов на продажу.
Кроме того, я хочу учитывать не только цены открытия, максимума, минимума и закрытия каждой свечи, но и другие факторы, такие как размер диапазона или размер тела. Например, мы можем рассчитать размер тела, разделив его на общий диапазон свечи. Этот расчет может помочь нам идентифицировать бары Доджи. Мы даже можем установить определенные значения, например, требуемый размер тела больше 50 точек. С помощью этих опций мы можем создавать и тестировать различные паттерны с помощью одного советника. Путешествие обещает быть захватывающим!
Теперь давайте перейдем к MetaEditor и начнем программировать. Но прежде чем мы начнем, я хотел бы получить ваш отзыв. Если вы считаете эти видео полезными и хотите хорошо выспаться сегодня, ставьте лайк. Кроме того, я рассматриваю возможность переключения между темным режимом и белым фоном по умолчанию. Я создам опрос для вас, чтобы проголосовать за ваши предпочтения. Дайте мне знать в комментариях, если вы можете прочитать все правильно в темном режиме.
Ладно, приступим к кодированию! В MetaEditor я создам нового советника в своей папке YouTube. Я назову его 'Candle Pattern EA'. Мы начнем с чистого шаблона, удалив ненужные комментарии и организовав структуру кода. После компиляции и проверки отсутствия ошибок мы приступим к следующим шагам.
Мы определим некоторые ключевые параметры в разделе ввода, такие как магический номер, который должен быть уникальным идентификатором для этого советника, чтобы избежать конфликтов с другими советниками, работающими на том же экземпляре MetaTrader. Присвоим ему случайное число.
Это охватывает первоначальную настройку и входные параметры. Теперь мы готовы перейти к следующей части. Следите за обновлениями!
Советник по свечным паттернам в mql5! | Часть 2
Советник по свечным паттернам в mql5! | Часть 2
В сегодняшнем видео меня зовут Тоби, и мы продолжим кодирование нашего простого советника (EA) по свечному паттерну в MetaTrader 5. Сейчас мы находимся во второй части этой серии кодирования, поэтому, если вы пропустили первую часть, где я объяснил идею стратегии более подробно, ссылка на это видео находится здесь. Прежде чем мы начнем программировать, я хочу поделиться результатами недавнего опроса, который я провел на YouTube о предпочтительной цветовой теме для записи видео. Из 140 голосов большинство людей (90) предпочли темный фон, а 50 человек предпочли белый фон. Лично я нахожу темный фон более приятным для глаз и использую его также для записи своих собственных советников.
Еще я хотел упомянуть, что недавно настроил Visual Studio Code для MQL5. Если вы заинтересованы в использовании Visual Studio Code для своих проектов кодирования, дайте мне знать в комментариях, и я сниму об этом видео.
Теперь вернемся к кодированию нашего советника. В предыдущем видео мы остановились на входах для первого условия. Теперь мы создадим еще одно условие и добавим ввод для второго условия. Мы скопируем раздел для условия один и переименуем его в условие два, внеся необходимые изменения во входные переменные. На данный момент мы упростим только два условия, но в будущем мы можем добавить больше. После внесения этих изменений мы скомпилируем код, чтобы убедиться в отсутствии ошибок или предупреждений.
Некоторые зрители просили увеличить размер шрифта для лучшей читабельности. Хотя я предпочитаю видеть больше кода на экране, я понимаю необходимость увеличения размера шрифта. Однако пока мы будем придерживаться текущего размера шрифта. При необходимости могу внести коррективы в будущем.
Далее мы свяжем входные данные с нашим массивом условий, который мы создали в разделе глобальных переменных. Для этого мы создадим пользовательскую функцию setInputs. Эта функция будет вызываться перед проверкой входных данных. После написания кода для функции setInputs мы снова скомпилируем код, чтобы проверить его правильность.
Двигаясь дальше, мы проверим входные данные, чтобы убедиться, что они соответствуют требуемым критериям. Мы будем использовать оператор if для каждого ввода, чтобы выполнить необходимые проверки. Если какой-либо ввод будет признан недействительным, мы отобразим предупреждение для пользователя и вернем false из функции checkInputs. Мы начнем с проверки магического числа, убедившись, что оно не ниже или равно нулю. Затем мы перейдем к проверке размера лота, стоп-лосса и тейк-профита. Кроме того, нам потребуется добавить проверку массива условий, о чем мы поговорим позже.
Чтобы сделать код более модульным, мы будем использовать функцию setInputs для установки магического числа для нашего торгового объекта. Это будет полезно при поиске позиций или совершении торговых операций. После внесения этого изменения мы снова скомпилируем код, чтобы подтвердить его точность.
Теперь перейдем к функции onTick, в которой происходят основные операции советника. Во-первых, мы проверим, является ли текущий тик тиком открытия бара, используя нашу функцию isNewBar. Если он возвращает false, указывая, что это не тик открытия бара, мы просто возвращаемся и ждем следующего тика.
Далее получаем тик текущего символа. Это обеспечит доступ к бидам, аск и другой информации, связанной с тиками. Мы воспользуемся функцией SymbolInfoTick и сохраним результат в переменной. Если эта операция завершится неудачно, мы отобразим сообщение об ошибке и возврате из функции onTick.
После этого мы будем подсчитывать открытые позиции, используя нашу функцию countOpenPositions. Это даст нам количество открытых позиций на покупку и продажу в текущий момент времени. Если эта операция завершится неудачно, мы отобразим сообщение об ошибке, указывающее на сбой и возврат из функции onTick.
Получив количество открытых позиций, мы проверим, есть ли открытые позиции. Если они есть, мы выведем сообщение с указанием количества открытых позиций. В противном случае мы перейдем к следующему шагу.
Теперь мы пройдемся по каждой открытой позиции, используя цикл for. Внутри цикла мы будем получать информацию о позиции, используя функцию PositionGetTicket. Мы сохраним номер тикета в переменной и отобразим сообщение с номером тикета в целях отладки.
Далее мы проверим тип позиции (покупка или продажа) с помощью функции PositionGetInteger и свойства POSITION_TYPE. Если позиция является позицией на покупку, мы выполним необходимый код для позиций на покупку. Точно так же, если позиция является позицией на продажу, мы выполним код для позиций на продажу.
Для позиций на покупку мы проверим, ниже ли текущая цена предложения уровня стоп-лосса позиции. Если это так, мы покажем сообщение о том, что уровень стоп-лосса достигнут, и закроем позицию с помощью функции PositionClose.
Точно так же для позиций на продажу мы проверим, выше ли текущая цена предложения, чем уровень стоп-лосса позиции. Если это так, мы покажем сообщение о достижении уровня стоп-лосса и закроем позицию.
После закрытия всех необходимых позиций мы перейдем к следующему шагу, который проверяет наши условия, чтобы определить, следует ли нам открывать новую позицию. Для этой цели мы будем использовать функцию checkConditions. Если функция checkConditions вернет true, указывая на то, что все условия соблюдены, мы выполним необходимый код для открытия новой позиции. В противном случае мы перейдем к следующему тику.
В коде открытия новой позиции зададим объем, стоп-лосс, тейк-профит и другие необходимые параметры. Мы будем использовать функцию OrderSend для отправки торгового запроса и открытия позиции. Если торговый запрос будет успешным, мы отобразим сообщение об успешном открытии позиции. В противном случае мы отобразим сообщение об ошибке.
Наконец, мы скомпилируем код, чтобы убедиться в отсутствии ошибок или предупреждений, и, если все пройдет успешно, мы будем готовы протестировать наш советник на демо-счете или на реальном счете.
На этом видео заканчивается. В следующей части мы продолжим работу над нашим советником, добавляя дополнительные функции и улучшая нашу стратегию. Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте их в комментариях ниже. Спасибо за просмотр, и увидимся в следующем видео!
Отличный советник по свечным паттернам в mql5! | Часть 3
Отличный советник по свечным паттернам в mql5! | Часть 3
В этом видео Тоби представляет себя и объявляет, что основное внимание будет уделено продолжению разработки советника (EA) по свечным паттернам в MetaTrader5. Цель состоит в том, чтобы написать основную логику, необходимую для проведения первого бэктеста и получения результата. Тоби призывает зрителей посмотреть предыдущие части сериала, если они еще этого не сделали.
Тоби открывает Мета-редактор и начинает писать код с того места, где он остановился в предыдущем видео. Он объясняет, что они уже внедрили код для открытия позиций на покупку и продажу, но теперь им нужно добавить проверки условий. Для этого Тоби планирует создать пользовательскую функцию, которую можно будет вызывать для проверки условий сделок как на покупку, так и на продажу.
Перед началом процесса кодирования Тоби хочет убедиться, что в существующем коде нет ошибок. Он компилирует код для проверки ошибок или предупреждений.
Затем Тоби приступает к написанию логики пользовательской функции под названием «проверка условий». Эта функция будет перебирать каждое условие, используя цикл for. Внутри цикла они будут вызывать другую пользовательскую функцию под названием «проверить одно условие» для оценки каждого отдельного условия.
Тоби создает функцию «проверить одно условие», которая принимает параметры для сделки покупки/продажи и индекс условия, которое нужно проверить. Внутри этой функции выполняются различные проверки, например, определение того, активно ли условие. Если условие неактивно, функция вернет true, указывая на то, что оно не имеет значения.
Чтобы проверить условия, Тоби нужно получить данные бара. Он объявляет переменную типа mql rate, которая представляет собой предопределенную структуру, содержащую цены открытия, максимума, минимума и закрытия. Они задают массив ставок как серию и используют функцию скорости копирования для получения необходимых данных для условий.
После успешного получения данных гистограммы Тоби переходит к установке значений переменных A и B, которые будут использоваться для сравнения и оценки условий. Значения определяются на основе режима условия, такого как открытое, высокое, низкое, близкое, диапазон, тело, отношение или значение. Значения назначаются соответствующим образом, с учетом того, является ли сделка покупкой или продажей.
Как только значения установлены, Тоби компилирует код, чтобы проверить наличие ошибок или ошибок.
Тоби повторяет процесс для условий режима B, внося необходимые коррективы в переменные и наблюдения.
Наконец, Тоби завершает видео, убеждаясь в отсутствии ошибок в коде и подчеркивая важность понимания логики кода.
Удивительные результаты! Советник по свечным паттернам в mql5! | Часть 4
Удивительные результаты! Советник по свечным паттернам в mql5! | Часть 4
Привет, я Тоби. В сегодняшнем видео мы продолжим кодирование экспертного советника (EA) по свечному паттерну. У нас есть определенные цели для этого видео. Во-первых, мы добавим в советник панель, которая будет отображать различные условия и соответствующие им сигналы на покупку/продажу. Мы также выполним дополнительные проверки ввода, чтобы убедиться в работоспособности советника. Наконец, мы проведем несколько бэктестов и поделимся с вами некоторыми интересными результатами. Итак, приступим.
Прежде чем мы продолжим, если вы не смотрели предыдущие части этой серии кодирования паттернов свечей, я рекомендую сначала ознакомиться с ними. Ссылки вы найдете в описании.
В этом видео мы начнем с создания графической панели для нашего советника. Панель будет содержать линии, представляющие различные условия, с крестами, указывающими на сигналы покупки и продажи. Если условия соблюдены, советник будет открывать сделки в указанном направлении. Кроме того, мы внедрим проверку ввода, чтобы упростить оптимизацию в тестере стратегий.
Чтобы начать программировать панель, мы откроем MetaEditor и перейдем к папке include. Внутри папки include мы создадим новую папку с именем YouTube. В папке YouTube мы создадим файл графической панели. Мы очистим содержимое файла по умолчанию и включим необходимые файлы для нашей панели.
Далее мы определим необходимые метки для нашей панели. Каждая метка будет представлять определенный элемент, такой как число, условие, покупка, продажа и т. д. Мы также создадим массивы меток для отображения нескольких строк для каждого условия.
После определения меток мы приступим к написанию кода класса Panel. Этот класс будет наследоваться от класса CAppDialog, предоставляя нам доступ к его членам. Мы создадим приватный раздел для меток панели и несколько методов, включая конструктор, деструктор, onInit, update и bannerChartEvent.
Конструктор инициализирует панель, а деструктор занимается ее очисткой. Метод onInit будет вызван из функции onInit советника и создаст панель. Метод update будет вызываться на каждом тике для обновления содержимого панели. Наконец, метод bannerChartEvent будет обрабатывать события, связанные с панелью.
Внутри метода createPanel мы создадим фактическую панель с нужными параметрами, такими как идентификатор диаграммы, имя, подокно и координаты. Мы обеспечим успешное создание панели и вернем true, если это так, или false в противном случае.
Как только класс панели будет закодирован, мы включим его в наш файл советника. Мы создадим экземпляр объекта панели и вызовем его метод onInit после установки магического числа. Если создать панель не удастся, мы вернем соответствующее сообщение об ошибке.
Вот и все, что касается этой части нашей серии кодирования паттернов свечей. В следующем видео мы продолжим добавлять функционал в наш советник и проведем дальнейшее тестирование. Оставайтесь с нами для получения более интересных результатов.
Код пользовательского критерия в mql5
Код пользовательского критерия в mql5
Привет, это Тоби. В этом видео я покажу, как написать пользовательский критерий для оптимизации вашего советника на MQL5. Мы будем использовать советник Hilo скобки в качестве примера. Цель состоит в том, чтобы создать настраиваемые критерии, учитывающие как коэффициент прибыли, так и количество сделок при ранжировании результатов оптимизации.
Для начала откройте свой советник в среде кодирования (например, в Visual Studio Code) и сохраните его под новым именем. Затем добавьте в свой советник предопределенную функцию OnTester. Эта функция рассчитает пользовательские критерии и вернет их значение. Вы можете использовать функцию «TestStatistics», чтобы получить количество сделок и коэффициент прибыли. Умножьте эти два значения, чтобы вычислить пользовательские критерии.
Скомпилируйте код, чтобы убедиться в отсутствии ошибок. Теперь переключитесь на MetaTrader и выполните оптимизацию. Выберите свой советник и выберите «Custom Max» в качестве оптимального критерия поиска для использования ваших пользовательских критериев. Запустите оптимизацию и дождитесь результатов. Вы увидите, что пользовательские критерии рассчитываются на основе количества сделок, умноженных на коэффициент прибыли.
Если вы хотите настроить вес коэффициента прибыли, вы можете использовать функцию «MathPower» в своем коде. Например, вы можете возвести коэффициент прибыли в степень 4, чтобы придать ему больший вес. Перекомпилируйте и снова запустите оптимизацию, чтобы увидеть обновленный рейтинг.
Кроме того, вы можете добавить в код оператор if, чтобы исключить комбинации с менее чем 100 сделками. Если количество сделок меньше 100, можно вернуть нулевое значение. Это гарантирует, что учитываются только комбинации с достаточным количеством сделок.
Следуя этим шагам, вы можете создать свои собственные критерии ранжирования и выбрать лучшие результаты оптимизации для своего советника. Не забудьте сохранить измененный советник под новым именем, прежде чем вносить какие-либо изменения. Если вы нашли это видео полезным, пожалуйста, оставьте лайк и не стесняйтесь делиться своими пожеланиями или идеями для будущих видео в комментариях. Спасибо, и до встречи в следующем видео!
Стохастический торговый бот в mql5! | Часть 1
Стохастический торговый бот в mql5! | Часть 1
В этом видео я покажу, как написать простой стохастический советник в MetaTrader 5. Ближе к концу видео мы также проведем тестирование, чтобы оценить эффективность стратегии за последние 10 лет.
Давайте начнем с понимания общей идеи стратегии. Мы будем использовать стохастический индикатор, который широко известен. Советник будет совершать сделку на покупку, когда стохастик пересекает нижний уровень, и сделку на продажу, когда он пересекает верхний уровень. Глядя на график, важно помнить, что наш мозг имеет тенденцию сосредотачиваться на прибыльных сделках, поэтому крайне важно закодировать и протестировать стратегию, чтобы оценить ее эффективность.
Теперь давайте переключимся на Visual Studio Code, чтобы начать кодирование советника. Мы создадим новый файл в папке YouTube, используя MetaEditor по умолчанию, и назовем его «Stochastic EA». Затем мы откроем файл в Visual Studio Code и внесем некоторые изменения в форматирование, чтобы улучшить читаемость.
Мы организуем код по разделам и начнем с включений. Нам нужно подключить только один файл trades.mqh, содержащий класс CTrade. После этого мы определим входные данные для нашего советника. У нас будет общий раздел для входных данных, таких как магическое число и размер лота, за которым следует торговый раздел для стоп-лосса, тейк-профита и закрытия сделок по противоположному сигналу. Затем у нас будет раздел ввода специально для стохастического индикатора, включая период K и верхний уровень.
Как только входные данные будут определены, мы перейдем к разделу глобальных переменных, где мы объявим переменные для дескриптора стохастического индикатора, буфера, текущего тика и торгового объекта. После глобальных переменных реализуем функцию onInit. Мы начнем с проверки пользовательских входных данных с помощью функции checkInputs, которая гарантирует, что входные значения находятся в допустимом диапазоне. Если какие-либо входные данные неверны, мы вернем «Неверные параметры инициализации».
Далее мы установим магический номер для торгового объекта, используя входное значение, предоставленное пользователем. Затем мы создадим дескриптор индикатора, используя встроенную стохастическую функцию, указав символ, период, период K, период D (установите значение 1 для отсутствия сигнальной линии), значение замедления, метод MA (SMA) и поле цены. (низкий высокий). Проверим, удалось ли создать хэндл индикатора. Если он вернет недопустимый дескриптор, мы отобразим предупреждающее сообщение и вернем «Ошибка инициализации». Наконец, мы установим буфер с помощью функции arraySetAsSeries, чтобы указать, что это временной ряд.
Далее мы определим функцию checkInputs, которая будет проверять правильность каждого ввода. Мы проверим, находятся ли магическое число и размер лота в допустимом диапазоне, и вернем false, если это не так. Кроме того, мы можем добавить дополнительные проверки, например, убедиться, что размер лота не превышает 10. После завершения функций onInit и checkInputs мы можем скомпилировать код и перейти к следующим шагам в видео.
Функция предназначена для выполнения нескольких шагов. Во-первых, он извлекает текущий тик и сохраняет его в глобальной переменной «CT». Затем он переходит к получению значений индикатора с помощью функции «CopyBuffer». Функция проверяет наличие ошибок и в случае успеха сохраняет значения в «Главном» буфере. Если есть ошибка, он печатает сообщение и выходит из функции.Следующим шагом является подсчет количества открытых позиций. Это делается с помощью функции "CountOpenPositions", а количество хранится в двух целочисленных переменных: "CountBuy" и "CountSell". В случае ошибки при подсчете позиций выводится сообщение и функция завершает работу.
Затем функция проверяет наличие сделки на покупку или продажу. Если нет открытой позиции на покупку (CountBuy равен нулю), он проверяет значения индикатора, чтобы определить, следует ли открывать сделку на покупку. Условия открытия сделки на покупку заключаются в том, что текущее значение индикатора ниже заданного нижнего уровня, а предыдущее значение индикатора выше нижнего уровня. При соблюдении этих условий печатается сообщение об открытии позиции на покупку. Точно так же функция проверяет наличие сделки на продажу, если нет открытой позиции на продажу (CountSell равен нулю). Условия открытия сделки на продажу заключаются в том, что значение индикатора выше заданного верхнего уровня, а предыдущее значение индикатора ниже верхнего уровня. При соблюдении этих условий печатается сообщение об открытии позиции на продажу.
После реализации торговой логики функция закрывает все позиции на продажу, если входной параметр «ClosedSignal» имеет значение true. Он использует функцию «ClosePositions» со значением параметра 2 для закрытия всех позиций на продажу. В случае ошибки при закрытии позиций функция завершает работу и выводит сообщение. Далее функция рассчитывает значения стоп-лосса и тейк-профита на основе входных параметров. Если входное значение стоп-лосса равно нулю, стоп-лосс устанавливается равным нулю; в противном случае он рассчитывается на основе текущей цены тика и введенного значения стоп-лосса. Тот же процесс используется для расчета значения тейк-профита.
Перед открытием позиции функция нормализует цены стоп-лосса и тейк-профита с помощью функции "NormalizePrice". Если в нормализации есть ошибка, функция завершает работу. Наконец, функция открывает позицию с помощью метода "PositionOpen" торгового объекта. Позиция открывается в зависимости от типа (покупка или продажа), объема, цены, значений стоп-лосса и тейк-профита. Комментарий к заказу также включен.
Функция скомпилирована, чтобы убедиться в отсутствии ошибок, а затем ее можно протестировать в MetaTrader, используя исторические данные, чтобы увидеть, происходят ли желаемые открытия и закрытия сделок в соответствии с заданными условиями. После открытия позиции функция проверяет наличие ошибок с помощью функции "GetLastError". Если есть ошибка, он печатает сообщение и завершает работу.
Наконец, функция обновляет глобальные переменные «LastTick» и «LastSignal» с текущим тиком и типом сигнала (покупка или продажа) соответственно. Это делается для того, чтобы отслеживать последний обработанный тик и сигнал для будущих расчетов.
Эта функция извлекает текущий тик, получает значения индикатора, подсчитывает количество открытых позиций, проверяет торговые возможности, открывает позиции на основе заданных условий, при необходимости закрывает позиции на продажу, рассчитывает значения стоп-лосс и тейк-профит, нормализует цены, открывает позиции , обрабатывает ошибки и обновляет глобальные переменные.
Чтобы использовать эту функцию в среде MetaTrader 5, вам необходимо интегрировать ее в советник или скрипт и настроить входные параметры и значения индикаторов в соответствии с вашей торговой стратегией. Кроме того, вам может понадобиться реализовать другие функции для управления позициями, обработки ошибок и выполнения других торговых операций.
Обратите внимание, что предоставленное объяснение является общим пониманием, основанным на предоставленной информации, и фактическая реализация может различаться в зависимости от конкретной торговой платформы и используемого языка программирования.