Доброго времени суток.
Данный урок будем последним из первого раздела для новичков. В нем мы разберем, как работать с графиками разных валютных пар, а также рассмотрим окно обзора рынка, как использовать символы в вашем программном коде.
Операции с графиками
Как всегда, мы рассмотрим только определенные функции, которые в первую очередь нам понадобятся на практике в будущем. Проверить код из урока рекомендую во вновь созданном скрипте, этот тип программы больше всего подходит для подобного рода работы.
- ChartID — функция возвращает идентификационный номер (ID) графика, на котором эта функция вызвана. Номер представляет собой длиннющее число целого типа long, но нам не нужно его помнить по памяти, оно лишь участвует в дальнейшей работе с графиком.
0 1 |
long chart_id = ChartID(); Print("ID номер текущего графика: ",chart_id); |
- ChartOpen — команда открывает новый график. Имеет два параметра: символ, который нужно открыть и период графика. К примеру, если вам нужно продублировать текущий график, то вместо символа пишется слово NULL, это предопределенная константа, которая в данном случае обозначает текущий символ. Для того, чтобы указать текущий период, во втором параметре можно прописать PERIOD_CURRENT, либо просто поставится ноль, что по сути будет одно и тоже. Продублируем текущий график:
0 |
ChartOpen(NULL,0); |
0 1 |
long new_chart = ChartOpen("AUDUSD",PERIOD_D1); if(new_chart > 0) Print("Новый график под номером ",new_chart," успешно открыт!"); |
- ChartClose — функция закрывает график по указанному ID номеру. На примере выше мы открыли график, давайте его закроем с паузой в 3 секунды, раз мы знаем его идентификационный номер
0 1 2 3 |
Sleep(3000); bool chart_close = ChartClose(new_chart); if(chart_close) Print("Указанный график был закрыт"); |
- Symbol — возвращает имя символа, которые присвоено текущему графику в виде текстового значения.
- Period — возвращает период текущего графика в числовом типе формата int.
0 1 |
Print("Текущий символ графика: ", Symbol()); Print("Текущий период графика: ", Period()); |
- ChartSymbol — возвращает наименование символа указанного по ID графика.
- ChartPeriod — возвращает период указанного по ID графика. Попробуем открыть какой-либо график и программно узнать его период и символ.
0 1 2 3 |
long new_chart2 = ChartOpen("EURUSD",PERIOD_H4); Print("Символ указанного графика: ", ChartSymbol(new_chart2)); Print("Период указанного графика: ", ChartPeriod(new_chart2)); |
- ChartSetSymbolPeriod — функцию изменяет значение символа и периода указанного графика по идентификатору, имеет три параметра: ID изменяемого графика, новый символ, который нужно задать и новый период.
Откроем график EURUSD H4 и изменим его на NZDUSD M5:
0 1 |
long new_chart3 = ChartOpen("EURUSD",PERIOD_H4); ChartSetSymbolPeriod(new_chart3,"NZDUSD",PERIOD_M5); |
А если нам нужно оставить текущий период, но поменять только символ? Тогда обратимся к функции ChartPeriod, чтобы узнать и задать функции замены старое значение периода:
0 1 |
long new_chart4 = ChartOpen("EURUSD",PERIOD_H4); ChartSetSymbolPeriod(new_chart4,"NZDUSD",ChartPeriod(new_chart4)); |
- ChartNavigate — функция производит сдвиг указанного графика на определенное количество баров относительно заданной позиции. Имеет три параметра: идентификатор графика, тип позиции сдвига (начало графика, текущая позиция, либо конец графика) и значение сдвига, рассчитанное в барах.
Попробуем сдвинуть график с конца на 50 баров назад, предварительно отключив функцию автоскролла и автосдвига текущего графика.
0 1 2 |
ChartSetInteger(ChartID(),CHART_AUTOSCROLL,false); ChartSetInteger(ChartID(),CHART_SHIFT,false); ChartNavigate(ChartID(),CHART_END,-50); |
- ChartRedraw — вызов принудительной перерисовки заданного графика. Функцию стоит применять, когда с графиком произошли какие-то действия — обновились графические объекты, индикатор изменил свои линии, подгрузилась история котировок и т.д.
- ChartFirst, ChartNext — две функции, которые используются при работе с перебором графиков. ChartFirst возвращает ID самого первого графика, открытого в терминале, ChartNext указывает номер графика, следующего за предыдущем.
Давайте поставим себе задачу пробежаться по всем открытым графикам в терминале и вывести в принт их символ и период. Для этого вначале откроем 4-5 разных графиков и напишем алгоритм с помощью цикла while.
0 1 2 3 4 5 6 7 8 9 10 |
int i = 0; long currChart = ChartFirst(); while(i<200)// Цикл будет проходить максимум 200 раз, больше не нужно { Print("Символ открытого графика: ",ChartSymbol(currChart),", Период графика: ", ChartPeriod(currChart),", ID номер: ",currChart); currChart=ChartNext(currChart); // сохраняем номер следующего графика по списку if(currChart<0) break; // если такого графика нет, значит мы в конце списка, останавливаем цикл i++;// увеличиваем счетчик прохода } |
Цикл while мы изучали в этом уроке, если вы с ним еще не знакомы, пожалуйста, вернитесь на первые уроки, все обучение идет последовательно. Мы определили период прохода цикла с 0 до 200 графиков (больше графиков у нас просто не может быть открыто). Перед циклом мы ввели переменную, которой назначили номер самого первого открытого графика. Далее тело цикла выдает нам принт с интересующими данными и после меняет значение переменной currChart на номер следующего по списку графика. Если этот номер становится меньше нуля, значит такого графика не существует и цикл прекращает свою работу. Если существует, мы увеличиваем счетчик на единицу и продолжаем поиск.
У меня было открыто 5 графиков и в журнал перешли следующие сообщения:
- ChartSaveTemplate — функция автоматизирует сохранение текущего шаблона графика с целью дальнейшего использования его пользователем. Это можно и сделать вручную, но вдруг ваш советник должен иметь именно синий фон графика и вы хотите применить этот шаблон к другим графикам. Проверим, как это работает. Измените текущий график как вам нравится, задайте свой ТФ, цвет фона, уберите сетку и т.д. Далее воспользуется этим кодом:
0 |
ChartSaveTemplate(0,"My Chart"); |
- ChartApplyTemplate — функция для загрузки имеющегося шаблона из папки терминала.
Откроем новый график, к которому не быть применен данный шаблон и в новом скрипте напишем следующий код:
0 |
ChartApplyTemplate(0,"My Chart"); |
Шаблон применился к этому графику. С помощью этой функции и цикла while, изученного выше можно сделать скрипт, который будет применять ваш заранее подготовленный пользовательский шаблон ко всем графикам в вашем терминале. Удобно, когда у вас уже есть готовый сохраненный стиль оформления графика, а торговать приходится у разных брокеров.
- ChartScreenShot — сохраняет скриншот указанного графика. Может быть в трех форматах: .png, .bmp или .gif. Функция имеет пять параметров: ID номер графика, имя сохраняемого файла, ширина, высота в пикселях и тип выравнивания графика: по левой, правой границе или по центру.
0 1 2 3 4 |
string name = "Мой первый скриншот.png"; if(ChartScreenShot(0,name,1920,1200,ALIGN_RIGHT)) { Print("Скриншот '",name, "' сохранен!"); } else Print("Скриншот сохранить не удалось"); |
C:\Users\Admin\AppData\Roaming\MetaQuotes\Terminal\<номер терминала>\MQL4\Files
Если имя скриншота совпадает с уже существующим изображением, то оно просто будет заменено. Чтобы такого не происходило, лучше к имени добавлять текущее время терминала TimeCurrent(). Также рекомендую вам попробовать наш профессиональный индикатор Truly ScreenShot для качественного сохранения снимков экрана.
- WindowBarsPerChart — функция возвращает количество свечей, которые помещаются в текущей окне терминала. Настроек у функции нет, результат имеет формат int. При изменении масштаба графика количество баров будет изменяться. Ее можно применять, когда нужно пробежаться только по видимым свечам.
0 1 |
int bars_count = WindowBarsPerChart(); Print("Количество баров на текущем графике: ",bars_count); |
- WindowFirstVisibleBar — Возвращает номер первого видимого бара на графике. Отсчет идет справа налево.
0 1 |
int bar=WindowFirstVisibleBar(); Print("Первый видимый бар на текущем графике: ",bar); |
- WindowPriceMax, WindowPriceMin — максимальная и минимальная видимая цена на текущем графике в данный момент. Функции нужны, чтобы было удобнее работать с графическими объектами, чтобы найти центр текущего графика и т.д.
0 1 2 3 4 |
double price_min = WindowPriceMin(); double price_max = WindowPriceMax(); Print("Цена на графике: Минимальная: ",DoubleToString(price_min,Digits), ", Максимальная: ",DoubleToString(price_max,Digits)); |
- WindowExpertName — функция возвращает имя текущего скрипта, индикатора или советника, которое пользователь задал файлу. Под этим именем можно сохранять все графические объекты, чтобы потом разом их удалить. Также по имени индикатора или эксперта его можно снять с графика.
0 |
Print("Наименование текущего скрипта: ",WindowExpertName()); |
Получение рыночной информации
Окно «Обзора рынка» (MarketWatch) можно открыть в меню Вид или с помощью клавиш Ctrl+M. В нем учитываются все символы, которые пользователь отобразил в настройках. Рассмотрим функции, которые помогают работать с ними:
- SymbolsTotal — возвращает доступное количество символов в окне обзора рынка. Имеет один параметр selected. Если он равен true, тогда возвращается количество символов, отображенных в окне обзора. Если false — то вообще все доступные символы у данного брокера.
0 1 |
Print("Символов в окне обзора рынка: ",SymbolsTotal(true)); Print("Всего символов у брокера: ",SymbolsTotal(false)); |
- SymbolName — возвращает имя выбранного символа по номеру позиции из окна рынка. Чтобы узнать наименование всех символов в окне рынка, можно сделать цикл for по всем инструментам:
0 1 2 |
for(int j=0; j<SymbolsTotal(true); j++) { Print("Имя выбранного символа: ", SymbolName(j,true)); } |
- SymbolSelect — отобразить, либо убрать существующий символ из окна обзора рынка. Функция имеет два параметра: имя нужного символа и переключатель: включить/выключить, которые равны true/false.
Попробуем добавить символ, которого нет в окне обзора, но он точно есть у данного брокера. Чтобы посмотреть все возможные символы, нужно щелкнуть правой кнопкой в окне и выбрать «Символы». В моем случае не отображена валютная пара USDSDG, давайте ее включим, чтобы в будущем наш программный код смог сделать по ней анализ. Если символа нет в окне обзора, то его котировки не доступны программно.
0 |
if(SymbolSelect("USDSGD",true)) Print("Символ USDSGD добавлен в окно обзора рынка"); |
Если данное сообщение появилось в журнале, значит теперь нужный символ открыт, можете проверить в окне инструментов. Данная функция удобна, когда ваш советник должен торговать по 6 разным валютным парам, которых может не быть в окне рынка, она запускается при инициализации и добавляет необходимые символы.
- MarketInfo — функция содержит в себе большое количество информации о финансовых инструментах в окне обзора рынка. Первый ее параметр это нужный нам символ, второй — идентификаторы запроса. Вот часть из них:
- MODE_BID — последнее известное значение цены Bid на рынке.
- MODE_ASK — последнее известное значение цены Ask на рынке.
- MODE_POINT — размер пункта в валюте выбранной котировки.
- MODE_DIGITS — количество знаков после запятой у выбранного инструмента
- MODE_SPREAD — значение текущего спреда в новых пунктах
- MODE_SWAPLONG — размер свопа для покупок по текущему инструменту
- MODE_SWAPSHORT — размер свопа для продаж по текущему инструменту
Попробуем выдать все эти значения за раз в журнал:
0 1 2 3 4 5 6 |
Print(""); Print("Цена Bid: ",MarketInfo(Symbol(),MODE_BID),", Цена Ask: ",MarketInfo(Symbol(),MODE_ASK), ", Спред: ",DoubleToString(MarketInfo(Symbol(),MODE_SPREAD),0)); Print("Размер пункта: ",DoubleToString(MarketInfo(Symbol(),MODE_POINT),Digits), ", Количество знаков: ",DoubleToString(MarketInfo(Symbol(),MODE_DIGITS),0)); Print("Своп для покупок: ",MarketInfo(Symbol(),MODE_SWAPLONG)," ",AccountCurrency(), ", Своп для продаж: ",MarketInfo(Symbol(),MODE_SWAPSHORT)," ",AccountCurrency()); |
В МТ4 часть из этих функций можно заметить предопределенными переменными. Вместо MarketInfo(Symbol(),MODE_BID) можно написать просто Bid, MarketInfo(Symbol(),MODE_ASK) — просто Ask. Вместо DoubleToString(MarketInfo(Symbol(),MODE_POINT) написать Point, а вместо DoubleToString(MarketInfo(Symbol(),MODE_DIGITS) слово Digits.
В дальнейшем я планирую сделать урок по написанию небольшого индикатора, в котором будет отображаться эта и дополнительная информация по текущему символу, подписывайтесь на нашу рассылку, чтобы не пропустить новую информацию.
На этом мы заканчиваем раздел обучения теорией и будем переходить к практике. В следующих уроках нас ждут простые скрипты, индикаторы и советники. Сложность кода постараюсь повышать постепенно, буду использовать весь пройденный материал для закрепления.
Всем профитов!
[download url=»http://www.davinci-fx.com/wp-content/uploads/2021/01/1.11-Operations-with-charts.-Getting-market-information.rar» title=»Скачать примеры урока»]