|
|
|
|
|
|
|
|
|
Работа эксперта или скрипта, использующего торговые функции, требует получения текущей информации об открытых и отложенных ордерах – уровень открытия, значения Stop Loss и Take Profit, текущей прибыли(или убытка) для конкретного ордера, количество открытых ордеров. Иногда пишутся системы автоматической торговли, где важным является время удержания открытой позиции, в этих случаях также необходимо знать время открытия конкретной позиции. Для целей диверсификации создают системы, которые торгуют по схожим алгоритмам, но на разных инструментах, в таких случаях важно знать – по какому инструменту открыт данный ордер.
Или на одном инструменте работают две или более механические торговые системы (МТС), которые еще называют торговыми роботами. В таком случае необходимо как-то различать ордера, открытые разными МТС на одном и том же инструменте.
Бывают МТС, в которых приходят сигналы на открытие разной силы значимости(и поэтому открываются ордера большего или меньшего размера позиции) или требующие открытия нескольких ордеров в одном направлении по нескольким отличающимся друг от друга условиям, например, на пробой уровня сопротивления и на отскок от уровня поддержки. Ордера, открытые в одной МТС, но при разных ситуациях также необходимо как-то различать, добавлять к ним строчные комментарии.
Кроме того, бывают системы, в которых отложенные ордера, не сработавшие в течение определенного периода времени после установки, необходимо удалять, так как считается, что условия их существования (ордеров) больше не соответствуют уже текущей ситуации. Например, мы выставляем отложенный ордер в день, когда ожидается выход сильных новостей, и необходимо его удалить, если он не сработал в первые минуты после выхода этих новостей.
В общем, причин для открытия, закрытия, удаления и удержания ордеров может быть очень много, и практически все эти варианты реализуются в терминале МТ4. В терминале вызовем закладку «Терминал» (Ctrl+T) и выберем закладку «Торговля». На рисунке представлено типичное состояние терминала по торговому счету, на котором одновременно работают несколько МТС.
|
|
|
|
|
Первый столбец содержит номера тикета каждого ордера, далее столбец времени открытия ордера, затем следует столбец типа ордера (buy или sell), за ним столбец размера открытой позиции, цена открытия, уровень Stop Loss, уровень Take Profit, текущая рыночная цена, по которой можно закрыть ордер в данный момент(Ask или Bid в зависимости от типа ордера), накопленные свопы по данному ордеру (с плюсом или минусом), текущая прибыль по данному ордеру, и последний столбец – комментарии к ордеру.
Ниже строки, содержащей информацию о текущем Балансе, Эквити (Средства), Марже (Залог), свободной марже (Свободно) находится строчка с информацией об единственном отложенном ордере с тикетом 3313320. Для отложенных ордеров отсутствуют данные о свопе и текущей прибыли, остальные параметры тоже известны.
Кроме того, в таблице не показан MagicNumber каждого ордера. MagicNumber – это обычно уникальное целое число, которое выставляется советником при открытии ордера, чтобы этот советник мог отличать свои ордера от ордеров, открытых другими советниками или открытых вручную (для них MagicNumber=0). Чтобы увидеть MagicNumber конкретного ордера, достаточно подвести указатель мыши на нужный ордер, и тогда всплывет подсказка, содержащая номер тикета, номер MN (id 1005 на рисунке) и комментарий к ордеру.
|
|
|
|
То есть, у ордера с тикетом 3313336 MagicNumber равен 1005 и указан комментарий «sell stop».
Создадим скрипт, который выводит в файл *.csv и в лог журнала все атрибуты ордеров по текущему торговому счету (account). Чтобы это сделать, нам необходимо пройти по все ордерам и запросить эти атрибуты. Сделаем это опять с помощью цикла for(), операторов Print() и FileWrite(). На рисунке из терминала мы видим, что ордера в МТ4 можно представить в виде списка. Мы видим, что количество ордеров равно 13 (12 открытых ордеров + 1 отложенный ордер). Информацию об общем количестве ордеров возвращает функция OrdersTotal(). Действительно, список ордеров хранится в терминале, при этом нужно помнить, что номер позиции в списке начинается с нуля и заканчивается на OrdersTotal()-1. В приведенном рисунке последний ордер в списке будет иметь номер позиции равным 12, но не 13.
Для того, чтобы обратиться к ордеру его необходимо предварительно выбрать функцией OrderSelect(). При удачной попытке выбора функция возвращает значение true (истина), иначе false(ложь).
|
|
|
|
Я запустил скрипт на демо-счете и можно сравнить расположение ордеров в терминале (то, что мы видим) и расположение ордеров в памяти терминала (результат работы скрипта).
|
|
|
|
Видно, что ордера в памяти терминала расположены совсем не так, как мы видим. Но при правильном написании кода это не имеет значения.
Я добавил отложенный ордер по USDCAD 0.1 Buy Stop 1.1490 и запустил на терминале доработанный скрипт. Обратите внимание, что имя файла состоит из номера счета, на котором выполнялся скрипт, а после окончания его работы выводятся в лог журнала функцией Print() значения баланса, эквити, маржи и свободных средств на счету. Также подсчитываются количество открытых ордеров в покупку, продажу и четырех видов отложенных ордеров. Сделать вывод на печать этих подсчитанных значений можно аналогично.
|
|
|
|
Получилась такая таблица в Microsoft Excel. Ордер, выставленный вручную (USDCAD), имеет MagicNumber равный нулю. Видно, что на одном символе(EURUSD) открыты ордера с разными MagicNumber(1002, 1003, 1005, 1006, 1007), а также то, что на двух разных символах (EURJPY и GBPJPY) имеются ордера с одинаковыми MagicNumber(1009). МТ4 позволяет тестировать на одном торговом счете множество МТС, при этом каждая МТС отличает свои ордера от ордеров других МТС, и от ордеров, выставленных вручную или на другом символе.
<#IMG6>
Напоследок хочу напомнить самую распространенную ошибку при работе со списком ордеров – обычно ошибочно начинают обработку не с нулевой позиции списка, а с первой, и заканчивают, соответственно, за пределом списка ордеров. В итоге, это дает двойную ошибку – не обрабатывается ордер с нулевой позицией и делается попытка обработать несуществующий ордер на позиции OrdersTotal().
Сам скрипт можно взять OrderList здесь
Перейти к статье «Закрытие и удаление ордеров».
|
|
|
|
|
|