Программирование на MQL II: Модернизация своими руками.
В предыдущем номере журнала (ForexMagazine Май 2004, №17) мы говорили о "нетрадиционном" использовании экспертов MetaTrader'а - об использовании их для сбора информации о рынке.
Но, как мы отмечали, экспертам можно найти ещё массу применений: давайте рассмотрим ещё один из вариантов использования экспертов. Иногда во время обсуждений торгового терминала MetaTrader упоминаются действительно полезные, но, к сожалению, нереализованные возможности, которые смогли бы облегчить жизнь трейдеров. Почему бы не попробовать реализовать эти идеи на MQL II?
Одной из таких "полезных штучек", востребованных пользователями, является отложенный ордер с ограниченным сроком действия. То есть возможность выставить ордер, который должен присутствовать на рынке только в течение определённого промежутка времени. Если же он не реализуется за это время, то он отменяется.
Перейдём к реализации этой идеи в виде эксперта для MetaTrader'а. Для начала рассмотрим вариант, когда у нас уже есть отложенный ордер, и нам требуется его закрыть в какое-то определённое время. При присоединении эксперта к графику мы можем передать в него параметры. Нам потребуется передавать номер отложенного ордера, который надо будет отменить, и, собственно, время его отмены. С номером ордера проблем возникнуть не должно, и первый параметр будет задавать номер отложенного ордера:
define: order_number(2000000);
А вот с передачей в программу даты и времени закрытия ордера не всё так просто. Так как параметры, передаваемые эксперту, могут быть только целыми или дробными числами, то в данном случае нам придётся прибегнуть к некоторым ухищрениям. Будем передавать дату и время следующим образом:
· отдельным числом - год;
· затем одним числом - пару "месяц и день", где целая часть числа будет означать месяц, а дробная - день;
· и последним числом - пару "часы и минуты", тем же способом: целая часть - часы, дробная - минуты.
define: close_year(2004);
define: close_date(11.22);
define: close_time(10.01);
Затем, для того чтобы переданные в отдельных трёх параметрах дату и время "превратить" в значение понятное функциям языка MQL II, прибегнем к ещё одному трюку. Объединим параметры close_year, close_date и close_time в одну строку в формате "yyyy.mm.dd hh:min". И после, с помощью функции StrToTime() превратим строку в значение, которое хранит количество секунд прошедших с 0 часов 0 минут 1-го января 1970-го года - именно этот вариант хранения даты и времени понятен функциям MQL II.
Далее приведён текст экспертас комментариями, которые помогут разобраться в прочих деталях его работы.
Следует заметить, что приведённый код не идеален с точки зрения устойчивости его работы. К примеру, не проверяется ситуация, когда пользователь (вводит) в параметр, означающий месяц и число, значение 99.99; то же самое касается времени. Для получения по-настоящему коммерческого продукта нужно добавить в код описанные проверки.
Кроме этого, можно сделать эксперта более удобным в использовании. Немного изменив программу, мы можем заставить её самостоятельно открывать отложенный ордер по определённой параметром цене. В случае intra day торговли, время закрытия можно указывать не как конкретную дату и конкретное время, а как временной интервал существования ордера - количество минут (или даже секунд) прошедших со времени его открытия. Как вариант, можно указывать срок жизни ордера даже в барах. После таких изменений для открытия отложенного ордера с ограниченным сроком жизни потребуется вводить не четыре, а всего лишь два параметра: цену и срок жизни.
Есть, конечно, и небольшое неудобство при работе с отложенными ордерами таким способом: к одному окну с графиком может быть прикреплён только один эксперт. Поэтому, при желании открыть несколько таких ограниченных по времени ордеров на одном и том же торгуемом инструменте, потребуется открыть несколько окон и прикрепить к ним по одному эксперту.
Вот и всё, что хотелось бы рассказать о "нетрадиционном" использовании экспертов для добавления новых возможностей в функциональность MetaTrader'а. Как всегда, читателям предлагается самостоятельно развить тему и подумать над способами расширения потенциала торгового терминала MetaTrader.
/*[[
Name := Close Pending Orders
Author := Copyright c 2004, Horn
Link := alexander@indus.ru
Notes := Закроет отложенный ордер с номером "order_number"
Notes := во время указанное с помощью переменных "close_year",
Notes := "close_date" и "close_time".
Notes := в "close_date" укажите месяц и дату через точку
Notes := в "close_time" укажите часы и минуты через точку
Lots := 0.00
Stop Loss := 0
Take Profit := 0
Trailing Stop := 0
]]*/
define: order_number(2000000);
define: close_year(2004);
define: close_date(11.22);
define: close_time(10.01);
var: bOrderPresented(false);
var: bOrderClosed(false);
var: bNoAlerts(false);
var: nTradeNumber(0);
var: tCloseTime(0);
// функция Floor вернёт целую часть дробного числа
tCloseTime = StrToTime(close_year + "."
+ Floor(close_date) + "."
+ (close_date - Floor(close_date))*100 + " "
+ Floor(close_time) + ":"
+ (close_time - Floor(close_time))*100);
for nTradeNumber = TotalTrades downto 1 {
// Если ордер является отложенным ордером на покупку или продажу и
// если его номер совпадает с номером, переданным в параметре эксперту,
// то проверяем текущее время.
if((OrderValue(nTradeNumber,VAL_TYPE) = OP_SELLLIMIT)
or (OrderValue(nTradeNumber,VAL_TYPE) = OP_SELLSTOP)
or (OrderValue(nTradeNumber,VAL_TYPE) = OP_BUYLIMIT)
or (OrderValue(nTradeNumber,VAL_TYPE) = OP_BUYSTOP))
and (OrderValue(nTradeNumber,VAL_TICKET) == order_number) then {
bOrderPresented = true;
// Если текущее время совпадает или больше
// требуемого времени закрытия, то отменяем ордер!
if (CurTime >= tCloseTime) then {
DeleteOrder(OrderValue(nTradeNumber,VAL_TICKET),Brown);
// Сообщаем пользователю об успешном закрытии ордера
Alert("Ордер № " + order_number + " закрыт в " + TimeToStr(CurTime));
bOrderClosed = true;
exit;
};
};
};
// Сообщаем пользователю о том, что отложенного ордера с номером,
// переданным эксперту в параметрах, не существует
if(!bOrderClosed and !bOrderPresented)then {
Alert("Указанного отложенного ордера не существует!");
};
Александр Иванов
для Forex Magazine