Статьи по MQL4
Замечательная функция

Замечательная функция


например, forex

« - А где же моя взятка на козырного туза?!
  - Расклад, батенька, расклад »
Из разбора партии в преферанс.

В данный момент имеем:
  1. советник BlackBox, который умеет отслеживать два события;
  2. индикатор Ticks, который отражает тиковый график.
Хотелось бы — чтобы советник умел определять факт открытия и закрытия ордера по инструменту. Ордер может открываться вручную, может срабатывать отложенный ордер и может открываться каким-то другим советником, для нас это не имеет значения. Закрываться может также по достижению Take Profit, срабатыванию Stop Loss, просто закрытие по рынку вручную или советником. Хорошо бы все это записывать в лог-файл или отдельный файл. А сохранять скриншот (снимок экрана) таких моментов — было бы совсем здорово.

Год назад записать такие моменты можно было бы только находясь перед монитором, или создав сложную конструкцию из нескольких программ. Но даже и в этом случае успех был не гарантирован. Человек не может постоянно отслеживать несколько графиков одновременно, тем более 24 часа в сутки. А программы видео-грабберы могут работать только с одним монитором, а значит на каждый график потребовался бы один монитор.

Но теперь в МТ4 есть такая функция — ScreenShot(), которую я и назвал замечательной функцией.
 
 


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

Логично совместить работу советника BlackBox c записью таких картинок, да еще при этом отслеживать состояние нужных нам индикаторов. Сохраним советника с именем BlackBox-2 и начнем модификацию. В индикаторе Ticks был один недостаток — не отражалась линия Bid. Добавим ее с помощью нашего советника, заодно научимся создавать и перемещать горизонтальную линию, назовем ее bidLine (линия Bid? а). Естественно вставить этот код в функцию EveryTick():

 
 


Этот пример показывает взаимодействие советника и окна индикатора. Сначала мы ищем линию с именем bidLine, если находим — двигаем, не находим — создаем. Вы можете удалять эту линию, и советник будет создавать ее снова.

Далее, для записи скриншотов из терминала необходимо добавить параметры — начинать записывать серию снимков по фактам открытия и закрытия ордера, сколько снимков делать по каждому этому событию, через какое количество тиков делать снимки.

 
 


Кроме того, ввели новые глобальные переменные: orderShotCounter будет уменьшаться после каждого вызова ScreenShot(), а снимки будут делаться каждый раз, как только tickRateCounter будет достигать значения 0 (то есть, каждые 10 тиков в данном случае). Итого, будет записано NumberShots (100) снимков на каждое событие.

 
 


Логично, что запись будет вестись в той функции, которая вызывается на каждом тике. Этот блок будет работать только в том случае, если orderShotCounter станет больше нуля, поэтому запустить серию снимков очень просто- нам необходимо определить момент открытия или закрытия ордера и установить значение orderShotCounter равным нужному числу снимков. Перед снимком выводится время и номер снимка с помощью Comment().

 
 


Нам пришлось добавить три новые функции. Функция SymbolOrderTotals() простая, она подсчитывает количество открытых ордеров по нашему символу. Функции AddNewOrderLine() и DeleteClosedOrderLine() были добавлены для красоты, первая добавляет в окне индикатора Ticks горизонтальную линию по цене открытия нового ордера, а вторая эту линию удаляет.

 
 


Поиск нового ордера выполняется следующим образом: в цикле перебираем все ордера, для каждого ордера по нашему инструменту ищется горизонтальная линия с именем равным тикету ордера, если таковой линии не найдено — значит этот ордер и является нашим новым ордером. В этом случае создаем горизонтальную линию с именем lineName=DoubleToStr(OrderTicket(),0). Пришлось использовать функцию DoubleToStr() для преобразования номера тикета OrderTicket() в тип string.

 
 


Цвет линии зависит от типа ордера, ордера в покупку рисуются синим цветом, в продажу — красным цветом. Поиск последнего закрытого ордера производится в обратном порядке: на графике перебираются все горизонтальные линии, и для линий, имеющих описание «order» ищется ордер по тикету. Тут необходимо уточнить, что определить закрытый ордер можно только c помощью функции OrderCloseTime(), для открытых и отложенных ордеров она возвращает значение 0, то есть факта удаления отложенного ордера или закрытия рыночного ордера еще не было.

 
 


Фактически мы использовали набор горизонтальных линий как массив для запоминания списка открытых ордеров. У такого способа есть свой плюс: даже если терминал закрыть или сменить профиль — список открытых ордеров сохранится в виде набора объектов — горизонтальных линий.

Последний штрих — посчитаем количество ордеров по нашему инструменту и нанесем линии ордеров (если в этом есть необходимость) при первом запуске советника. Все лишние выводы в лог файл можете закомментировать сами, они сделаны для удобства отладки и пониманию программы. Логика советника не универсальна и он не сможет отслеживать сложные комбинации открытия/закрытия ордеров.

 
 


Для того, чтобы сделать снимки во время выхода данных по Non-farm Payrolls, я открыл ордер на продажу на демо-счете за несколько минут до выхода новости, советник обнаружил новый ордер и съемка началась. Серия из 100 снимков в формате 800в600 заняла немногим более 1Мб памяти, но во время сильных движений линия bidLine не успевает следовать за ценой, и терминал может зависать на несколько минут на не достаточно мощных компьютерах. Поэтому, сначала необходимо протестировать работу советника и индикатора в таких условиях, чтобы не возникло помех для торговли на реальном счету.


 
 

Код советника выложен здесь .
Перейти к статье «Массивы и технические индикаторы на них».
 
+7 (495) 710-76-76
8 (800) 200-01-31
по России бесплатно

закрыть

Вход в личный кабинет

Для счета alpari.classic введите номер счета (буква и 4 цифры) и пароль в ЛК.

Для счетов alpari.micro и alpari.partner введите логин и пароль в МТ.

Зарегистрироваться!Забыли пароль?

 
Rambler's Top100