Программирование на MQL II: Модернизация своими руками. Программирование на MQL II: Модернизация своими руками.
|

Программирование на 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