|
|
|
|
|
|
|
|
|
« - А где же моя взятка на козырного туза?!
- Расклад, батенька, расклад »
Из разбора партии в преферанс.
В данный момент имеем:
- советник BlackBox, который умеет отслеживать два события;
- индикатор 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 не успевает следовать за ценой, и терминал может зависать на несколько минут на не достаточно мощных компьютерах. Поэтому, сначала необходимо протестировать работу советника и индикатора в таких условиях, чтобы не возникло помех для торговли на реальном счету.
|
|
|
|
Код советника выложен здесь .
Перейти к статье «Массивы и технические индикаторы на них».
|
|
|
|
|
|