English 中文 Español Deutsch 日本語 Português
Видео: Простая автоматизированная торговля – Как создать простой торговый советник с помощью MQL5

Видео: Простая автоматизированная торговля – Как создать простой торговый советник с помощью MQL5

MetaTrader 5Эксперты | 4 июля 2022, 14:20
1 343 0
Raimund Bauer
Raimund Bauer

Часть 1. Создаем простой торговый советник


На видео показано создание заготовки торгового советника. Торговый советник — это автоматизированное приложение, которое может работать в MetaTrader и способно самостоятельно открывать и закрывать позиции.

В представленном видео показано создание простейшего советника. Щелкните по иконке "Редактор MetaQuotes Language" или нажмите F4 в MetaTrader, чтобы открыть MetaEditor. Нажмите "Файл" > "Новый файл" > "Советник (шаблон)" > "Далее". Я назвал своего советника SimpleExpertAdvisor. Затем жмем "Далее" > "Далее" > "Готово".

Эта версия удобна для чтения людьми. Когда мы ее компилируем, мы создаем удобочитаемую версию для MetaTrader. Так как новый советник уже создан, откроем новое окно графика и перетащим на него только что созданный файл. Пока у советника нет логики. Мы добавим ее в следующих видео.


Часть 2. Функции


MQL5 использует функции для автоматизации процессов. Наша заготовка советника уже имеет несколько функций. Функция OnInit – это функция инициализации советника. Она запускается только один раз, когда вы перетаскиваете советник на график. Возвращаемое значение укажет, была ли функция успешной.

Функция OnDeinit запускается перед закрытием советника. Она ничего не возвращает (void).

Причина проста: OnDeinit — это последнее, что будет запущено в нашей программе, и мы ничего не сможем вернуть, потому что после этого программа закроется. Функция OnTick запускается при каждом изменении цены на графике. Большая часть логики кода будет запускаться именно функцией OnTick. Всякий раз, когда цена изменяется на одном из ваших графиков, запускается всё, что находится между этими двумя скобками. Теперь мы можем избавиться от остальных элементов шаблона.

Для нашего простого примера нам нужна только функция OnTick, которая будет использоваться для вызова другой функции и отображения местного времени. Когда мы хотим что-то увидеть на нашем графике, мы используем функцию Comment (комментарий). В нашем случае функция отображает пользовательское значение в верхнем левом углу графика. Параметры указываются в круглых скобках. Это может быть текст, например "Hello".

Наш советник уже вполне готов. Мы уже можем его скомпилировать. Теперь вернемся в MetaTrader и перетащим SimpleExpertAdvisor на график. При нажатии на OK отобразится текст "Hello". Возможности функции Comment этим не ограничиваются.

Мы хотим, чтобы отображалось местное время, поэтому укажем: "The local time is" (местное время:). Мы можем передать еще один параметр через запятую. В нашем случае это TimeLocal. Перекомпилируем код. Теперь советник выводит текст "The local time is" и местное время прямо на графике.

В этом видео мы узнали о встроенных функциях, таких как функция OnTick, которая вызывается при каждом изменении цены. Также мы научились пользоваться функцией Comment для вывода текста, за которым следует вычисленное значение. В частности, с помощью всего лишь нескольких строк кода мы вывели на график текст и местное время.


Часть 3. Тестер стратегий

В этом видео мы узнаем, как пользоваться тестером стратегий. Тестер стратегий занимается тестированием на истории. Советник прогоняется по историческим данным для оценки его прибыльности. В прошлый раз мы сделали простой шаблон, выводящий текст "Hello MQL5". Протестируем его на истории.

Перейдите "Вид" > "Тестер стратегий" или нажмите CTRL+R. Появится панель "Тестер стратегий". Мы можем выбрать файл. Начнем с простого советника (SimpleExpertAdvisor), который мы сделали в прошлый раз.

Будем использовать пару австралийский доллар/канадский доллар (AUDCAD) на минутном графике. Также выберем 2017 год в качестве периода тестирования. Одним из преимуществ MetaTrader 5 является то, что вам не нужно загружать исторические данные. Если вы выберете период, для которого у вас нет исторических данных, они загрузятся автоматически в фоновом режиме. Настройка OHLC на M1 (открытие, максимум, минимум, закрытие) определяет качество тестирования. Если вы наведете указатель мыши на свечу, вы увидите ее цены открытия, максимума, минимума и закрытия.

Не все знают, что каждый тик свечи, имеющей более одного изменения цены, моделируется. Даже если мы выберем режим "Все тики" для дневной (24-часовой) свечи, каждое изменение цены в течение этих 24 часов кроме цен открытия, максимума, минимума и закрытия, будет рассчитываться случайным образом.

Подробности можно узнать в руководстве пользователя. Я не использую форвард-тестирование. Вряд ли кто-то может предсказать будущее. Параметр "Задержки" позволяет имитировать сетевые задержки. Им я тоже не пользуюсь.

Параметр "Начальный депозит" позволяет указать, сколько денег есть на вашем тестовом счете. Сумму можно указывать в американских долларах, евро или в любой другой валюте. Также имеется параметр "плечо". Чем оно больше, тем большими (относительно вашего счета) деньгами вы можете торговать.

Об "Оптимизации" мы поговорим ниже. Щелкаем по кнопке "Старт" и видим текст "Hello MQL5" на графике. Это не очень интересно. Давайте заменим его, используя функцию TimeLocal.

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

 

Часть 4. Типы данных


В этом видео поговорим о типах данных. При тестировании стратегии мы видим, что местное время указывается в определенном формате. Когда вы что-то вычисляете, важно использовать правильный тип данных. Давайте выясним, как этого добиться.

Щелкните по иконке "Редактор MetaQuotes Language" или нажмите F4. В открывшемся MetaEditor нажмите "Файл" > "Новый файл" > "Советник (шаблон)" > "Далее". Я назвал своего советника SimpleDataTypes. Затем жмем "Далее" > "Далее" > "Готово". Всё, что находится выше функции OnTick, можно удалить. Также удалим две строки с комментариями.

Начнем с наиболее очевидного типа данных — текста. Мы используем тип данных string (строка), чтобы присвоить этот текст строковой переменной с именем Text (текст), но мы не можем использовать строковые переменные для вычислений.

Для получения баланса счета необходимо использовать тип, который является типом с плавающей точкой, вместе с функцией AccountInfoDouble и выражением в верхнем регистре. Таким образом мы должны получить правильное значение. Давайте используем функцию Comment, чтобы отобразить Text, за которым следует вычисленное значение. Щелкните по кнопке "Компилировать" или нажмите F7.

Компиляция должна пройти без проблем. Нажмите F4, чтобы вернуться в MetaTrader. В прошлом видео мы узнали, как пользоваться тестером стратегий, поэтому жмем "Вид" > "Тестер стратегий", выбираем появившийся файл SimpleDataTypes и начинаем новое тестирование. В верхнем левом углу видим значение 100000.0.

Изменим значение депозита, добавив цифры после точки. Именно для этого мы используем тип double при работе со значениями с плавающей точкой. Из прошлого видео вы уже знаете о функции TimeLocal. Она возвращает переменную типа datetime.

Чтобы вывести ее, перекомпилируем код, остановим предыдущий тест и начнем новый. Данные выводятся в специальном формате. Таким образом, если мы имеем дело с датой и временем, необходимо использовать тип datetime. Для целых чисел можно использовать тип integer.

В этом случае мы получаем номер счета, используя AccountInfoInteger. Мы используем эту константу для входа в учетную запись (ACCOUNT LOGIN). Давайте посмотрим, как это выглядит.

Если утверждение может быть только истинным или ложным (true/false), необходимо использовать булевый тип (bool). Давайте посмотрим, как выглядит вывод такого значения: "The value is: true" (значение истинно). Это лишь некоторые распространенные типы данных. Подробнее о типах данных можно узнать в Справке (F1). Есть еще несколько типов, доступных для использования. Также можно использовать сложные типы данных.

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


Часть 5. Расчеты


В этом видео займемся несложной математикой. При разработке советника для автоматической торговли расчетов не избежать.

Например, я рассчитал максимальное количество разрешенных позиций. Как вы видите, прибыль по валютной паре также рассчитывается. Давайте научимся делать некоторые базовые вычисления. Щелкните по иконке "Редактор MetaQuotes Language" или нажмите F4 в MetaTrader, чтобы открыть MetaEditor.

Нажмите "Файл" > "Новый файл" > "Советник (шаблон)" > "Далее". Назовем файл советника SimpleExpertAdvisor. Затем жмем "Далее" > "Далее" > "Готово". Всё, что находится выше функции OnTick, можно удалить. Также удалим две строки с комментариями. Во-первых, нам нужны две переменные int. "a" имеет значение 5, а "b" равно 3.

Используем Comment, чтобы показать, что нам даст операция "a" плюс "b". Нажмем кнопку "Компилировать". Ошибок нет. Нажмем F4, чтобы вернуться в MetaTrader.

Откроем тестер стратегий, выберем новый файл SimpleCalculations.ex5, включим визуализацию и начнем тестирование. Результат равен 8, так как 5+3=8. Попробуем "a" - "b", перекомпилируем и начнем новый тест. На этот раз результат равен 2, потому что 5-3=2.

Умножим два числа: 5 x 3 = 15. Перекомпилируем. Попробуем поделить "а" на "b". Получаем 1! Мы использовали целочисленные переменные, поэтому 5/3 = 1.

У нас здесь нет значений с плавающей точкой. Используем double в качестве типа данных и получим 1.6666666667. Уже лучше.

Что случится, если мы к "a" прибавим "a" и умножим на "b"? "a" равно 5, соответственно "a" плюс "a" равно 10. "b" равно 3. Поэтому 10, умноженное на 3, должно равняться 30.

Однако, проведя все эти операции, мы получаем 20! Это происходит потому, что умножение или деление всегда выполняются первыми. Если вы хотите это изменить, используйте скобки. То, что находится внутри скобок, вычисляется до умножения или деления. На этот раз мы получаем 30.

В Справочнике MQL5 вы найдете множество других математических функций. Я советую писать небольшие программы наподобие этой, чтобы выяснить принципы их работы. В будущем вам понадобится выполнять более сложные вычисления.

В этом коротком видео мы узнали, как выполнять самые простые математические вычисления с помощью нескольких строк MQL5-кода.

 

Часть 6. Проверка условий с помощью if


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

Сейчас мы научимся это делать. Щелкните по иконке "Редактор MetaQuotes Language" или нажмите F4 в MetaTrader, чтобы открыть MetaEditor. Нажмите "Файл" > "Новый файл" > "Советник (шаблон)" > "Далее". Назовем нашего советника SimpleIfCondition. Затем жмем "Далее" > "Далее" > "Готово".

Всё, что находится выше функции OnTick, можно удалить. Также удалим две строки с комментариями. Начнем с использования двух целочисленных переменных: "a" равно 5, а "b" должно быть равно 3. Если "а" больше 5, я хочу увидеть текст "a>5". Если это не так, я могу использовать оператор else, поэтому всякий раз, когда ни одно из условий не выполняется, я хочу видеть текст "Conditions not true" (условия неверны). Жмем "Скомпилировать" или F7. Ошибок нет...

Однако я получил предупреждение, так как забыл об операторе Comment, но теперь все в порядке. Нажмем F4, чтобы вернуться в MetaTrader. Открываем тестер стратегий и выбираем файл SimpleIfCondition.ex5.

Включим режим визуализации и начнем тестирование. Получаем сообщение "Conditions not true", потому что "a" не больше 5, поэтому добавим еще один оператор if, чтобы проверить, равно ли "a" пяти. Перекомпилируем код, остановим тест и начнем новый.

На этот раз в качестве результата получаем "a==5". Что произойдет, если мы добавим сюда еще один оператор if, чтобы проверить, равно ли "b" трем? Перекомпилируем код и запустим еще один тест.

Теперь мы видим на экране только сообщение "b equals 3". Оператор в этом случае игнорируется, поэтому вместо него мы могли бы использовать два оператора if. В первом мы проверим, равно ли "a" пяти, а во втором - равно ли "b" трем.

Результатом будет "a==5 and b==3". Перекомпилируем код, и при следующем тестировании мы увидим на экране "a = 5 and b = 3".

Пока все хорошо, но если добавить сюда что-то типа "c = a + b" и нажать "Компилировать", то мы получим две ошибки. Это связано с тем, что всякий раз, когда у вас есть более одной строки после оператора if, вам нужно использовать две фигурные скобки. Перекомпилируем код. В следующем тесте мы увидим сообщение "c = 8".

Это был очень простой пример. Есть много других способов проверить истинность условия. В этом коротком видео вы узнали, как использовать оператор if и несколько строк MQL5-кода, чтобы проверить истинность условия.


Часть 7. Операторы switch и case


В этом видео мы узнаем, как изменить способ работы советника с помощью операторов switch и case. В данный момент наш советник умеет только выводить сообщение "customer wants RSI" (клиент хочет RSI).

Нам нужно выяснить, как изменить это значение с помощью команд switch и case. Откройте MetaEditor.

Нажмите "Файл" > "Новый файл" > "Советник (шаблон)" > "Далее". Назовем этот файл SimpleSwitchCase. Затем жмем "Далее" > "Далее" > "Готово". Всё, что находится выше функции OnTick, можно удалить. Также удалим две строки с комментариями. Начнем с использования целочисленной переменной choice, равной 5.

Также используем строковую переменную entry внутри функции OnTick. Мы не назначаем ей никакого значения, так как хотим вычислить эту переменную на основе того, что мы здесь выберем. Делается это с помощью оператора switch.

Мы хотим пройти по различным возможным значениям переменной. Так, если клиент выбирает 5, выводим "the customer wants RSI". Здесь мы используем знак плюс и знак равенства. Позже объясню почему. А пока прервем текущую итерацию.

Как только код запущен, "цикл switch-case" завершится благодаря оператору break. Добавим еще одну опцию. При вводе 4 выводим "the customer wants Bollinger Bands" (клиент хочет полосы Боллинджера).

Мы снова используем оператор break, чтобы покинуть конструкцию switch/case. Добавим еще одну возможную опцию. Если наша переменная равна 3, оператор entry должен выводить "customer wants MACD" (клиент хочет MACD).

Вы также можете использовать здесь выражение типа 1+1 вместо числа, но оператор case не работает с переменными, поэтому вы получите ошибку. Добавим также опцию "default" (по умолчанию). Default используется, если не задействован ни один из других доступных вариантов. В этом случае оператор entry выводит "the customer doesn't know" (клиент не знает).

Добавим сюда две фигурные скобки. Затем используем функцию Comment для вывода entry. Как закончите, жмите "Компилировать".

Ошибок и предупреждений быть не должно. Вернемся в MetaTrader. Открываем тестер стратегий и выбираем файл SimpleSwitchCase.ex5.

Включим режим визуализации и начнем тестирование. Видим надпись "The customer wants RSI". Установим choice на 3, перекомпилируем код и запустим еще один тест. На этот раз получаем "The customer wants MACD". Так как значение choice, равное 3, совпадает с MACD. Установим значение 11, перекомпилируем код и посмотрим, что произойдет.

На этот раз видим сообщение "the customer doesn't know", так как значения 11 нет в списке доступных опций. Соответственно, срабатывает значение по умолчанию. Закомментируем оператор break для первых двух операторов case. Снова установим choice на 5, перекомпилируем код и запустим еще один тест.

На этот раз мы получим сообщения "the customer wants RSI", "the customer wants Bollinger Bands" и "the customer wants MACD". Это связано с тем, что первые три части нашей switch-case-конструкции обработаны. Помните, что если вы опустите здесь оператор break, наш советник не выйдет из цикла, а продолжит проверку следующего условия.

В этом видео мы узнали, как использовать операторы switch и case с помощью нескольких строк MQL5-кода.

 

Часть 8. Цикл while


В этом видео мы узнаем, как использовать оператор while при ожидании того или иного события. Мы подождали, пока счетчик задержки достигнет 500 000, теперь посмотрим, как использовать цикл while в MQL5.

Откройте MetaEditor. Нажмите "Файл" > "Новый файл" > "Советник (шаблон)" > "Далее". Назовем файл советника SimpleWhileLoop. Затем жмем "Далее" > "Далее" > "Готово". Всё, что находится выше функции OnTick, можно удалить. Также удалим две строки с комментариями. Начнем с создания счетчика задержки (DelayCounter).

Будем использовать целочисленную переменную, потому что нам нужны только целые числа. Присвоим ей значение 1 и увеличим ее в функции OnTick. Допустим, наше минимальное значение равно 500 000, и мы хотим что-то сделать только в том случае, если счетчик задержки выше этого значения.

Теперь мы можем использовать оператор while внутри функции OnTick, чтобы проверить, находится ли счетчик задержки ниже минимального значения. Если это так, нам необходимо сделать две вещи. Во-первых, необходимо вывести текст "DelayCounter:", за которым следует вычисленное значение текущего счетчика задержки.

Затем нужно увеличить счетчик задержки на 1, указав DelayCounter равным DelayCounter плюс 1. Откройте тестер стратегий. Выберите только что созданный файл SimpleWhileLoop.ex5.

Включим режим визуализации и начнем тестирование. Как только счетчик достигает 500 000, график начинает двигаться. Всё работает правильно. Однако есть одна загвоздка: если мы хотим увеличить счетчик задержки вне цикла while, мы все равно можем скомпилировать код без каких-либо ошибок, но при запуске следующего теста ничего не произойдет.

Почему тестер перестает работать? Если мы выделим оператор while и нажмем F1, откроется нужный раздел Справки, однако тестер стратегий останется неподвижным. Это произошло из-за того, что мы создали бесконечный цикл.

Когда приходит первый тик и это выражение истинно, оператор while запускает бесконечный цикл. Мы хотели увеличить счетчик задержки, но поскольку мы сделали это вне цикла while, этого никогда не произойдет. Выражение всегда будет истинным. Это одна из причин, по которой я избегаю слишком частого использования цикла while. Большинство условий можно проверить с помощью if.

Перекомпилируем код и перезапустим тест. Теперь мы видим, что счетчик задержек работает, потому что оператор if будет выполняться только один раз каждый раз, когда приходит тик. Если хотите использовать оператор while, убедитесь, что цикл затем будет остановлен. Проведем еще один тест. Теперь расчет происходит правильно.

В этом коротком видео мы узнали, как использовать оператор while и избегать бесконечных циклов с помощью нескольких строк MQL5-кода.


Часть 9. Цикл for


В этом видео мы узнаем, как использовать цикл for для изменения значения счетчика (counter). Счет идет до значения 10 000.

Откройте MetaEditor. Нажмите "Файл" > "Новый файл" > "Советник (шаблон)" > "Далее". Назовем файл SimpleForLoop. Затем жмем "Далее" > "Далее" > "Готово".

Всё, что находится выше функции OnTick, можно удалить. Также удалим две строки с комментариями. Начнем с создания переменной counter (счетчик).

Это целочисленная (int) переменная с начальным значением 1. Мы также устанавливаем endvalue (конечное значение). В нашем случае это 10 000. Цикл for будет использоваться внутри функции OnTick.

Если вы никогда раньше не имели дела с циклом for, это может показаться странным. Первое выражение является начальным значением. В нашем случае это 1. Второе выражение проверяет условие.

В нашем случае мы хотим проверить, меньше ли значение counter значения endvalue. В третьем выражении мы что-то делаем с counter. В нашем случае добавляем к нему 1 (counter++).

Можно сказать, что counter равен counter плюс 1. Все, что находится внутри фигурных скобок, будет выполняться до тех пор, пока выполняется это условие. В нашем случае мы просто распечатываем текст "the counter So far, so good" (счетчик Пока всё хорошо).

Щелкнем по кнопке "Компилировать". Если никаких ошибок нет, возвращаемся в MetaTrader. Откроем тестер стратегий, выберем файл SimpleForLoop.ex5, включим визуализацию и начнем тестирование. Работу счетчика можно увидеть на вкладке "Журнал".

Значение растет, пока не достигнет 9 999. Также можно сделать обратный отсчет. Поменяем значения. Теперь счетчик должен начинаться с 10 000, а endvalue равно 1.

Мы начнем со значения counter и проведем обратный отсчет, вычитая из него 1, пока счетчик выше endvalue. Теперь запустим тест заново. Он заканчивается сообщением "Counter = 2," так как во втором выражении мы проверяли, было ли значение counter выше значения endvalue.

Мы могли бы также указать "больше или равно". Перекомпилируем советник. На этот раз последнее значение должно быть равно единице. Так и есть. Вы также можете использовать цикл for, чтобы значение counter увеличивалось или уменьшалось с разным шагом.

Давайте укажем 10. После очередной компиляции мы видим, что обратный отсчет работает с шагом 10.

В этом коротком видео мы узнали, как использовать цикл for для расчета и уменьшения/увеличения значения с помощью нескольких строк MQL5-кода.


Часть 10. Создание простой функции


В этом видео мы используем MQL5 для создания пользовательской функции, которая будет удваивать значение счетчика при каждом изменении цены. Откройте MetaEditor. Нажмите "Файл" > "Новый файл" > "Советник (шаблон)" > "Далее". Назовем этот файл SimpleFunction. Затем жмем "Далее" > "Далее" > "Готово".

Всё, что находится выше функции OnTick, можно удалить. Также удалим две строки с комментариями. Начнем с создания статической переменной для counter. В данном случае мы используем определение "статический" для создания локальной переменной, которая будет существовать только в нашей функции.

Передадим переменную в другую функцию, которая будет называться DoubleTheValue (удвоить значение), но сначала ее нужно создать. Текущее значение counter будет передаваться в круглых скобках. Для вывода значения счетчика используем функцию Comment.

Как уже было сказано, функцию DoubleTheValue еще нужно создать. Для создания пользовательской функции начните с определения того, что она будет возвращать. В нашем случае функция вернет целое значение (int).

Это имя пользовательской функции (DoubleTheValue) и это то, что функция примет в качестве параметра. Мы передаем counter, являющийся целым числом (int). Я назвал его CounterValue (значение счетчика) в пользовательской функции, но вам не обязательно использовать то же имя.

Нашей функции потребуются две фигурные скобки. При компиляции мы получим еще одну ошибку, потому что наша функция ничего не вернет. Итак, давайте сначала удвоим переданное значение, которое мы назвали CounterValue. Для этого умножим CounterValue на 2.

Результат сохраняется в новой переменной DoubleValue, и мы можем использовать оператор return, чтобы отправить значение обратно в вызывающую программу. Для этого введите "return DoubleValue;". Скомпилируем код заново, чтобы убедиться, что ошибок нет.

Откроем тестер стратегий, выберем файл SimpleFunction.ex5, включим визуализацию и начнем тестирование. Теперь мы видим, что значение счетчика удваивается каждый раз, когда приходит новый тик, поэтому наша пользовательская функция вызывается при каждом изменении цены. Пример очень простой, так как мы передаем только одно значение и выполняем одну операцию.

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

В этом коротком видео мы узнали, как создать пользовательскую функцию в MQL5 с помощью нескольких строк кода.


Заключение

MQL5 не обязан быть сложным. Я надеюсь, статья поможет вам начать работу и даст вам хорошее представление о том, насколько простой может быть автоматическая торговля. Конечно, впоследствии вам нужно будет добавить более продвинутые компоненты в свою систему, но к этому моменту вы уже должны знать, подходит ли вам программирование на MQL5...


Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/10954

Нейросети — это просто (Часть 19): Ассоциативные правила средствами MQL5 Нейросети — это просто (Часть 19): Ассоциативные правила средствами MQL5
Продолжаем тему поиска ассоциативных правил. В предыдущей статье мы рассмотрели теоретические аспекты данного типа задач. В этой статье я продемонстрирую реализацию метода FP-Growth средствами MQL5. А также мы протестируем нашу реализацию на реальных данных.
Разработка торговой системы на основе индикатора MACD Разработка торговой системы на основе индикатора MACD
В этой статье мы познакомимся с очередным инструментом из нашей серии: мы узнаем, как создать торговую систему на основе одного из самых популярных технических индикаторов — Moving Average Convergence Divergence (MACD).
Индикатор CCI. Модернизация и новые возможности Индикатор CCI. Модернизация и новые возможности
В этой статье мы рассмотрим возможность модернизации индикатора CCI. Кроме того, будет представлен пример модификации этого индикатора.
Разработка торгового советника с нуля (Часть 13): Время и торговля (II) Разработка торгового советника с нуля (Часть 13): Время и торговля (II)
Сегодня мы построим вторую часть системы Times & Trade для анализа рынка. В предыдущей статье "Times & Trade (I)" мы рассмотрели альтернативную систему для организации графика, чтобы у нас был индикатор, позволяющий как можно быстрее интерпретировать сделки, совершенные на рынке.