Программирование на MQL II: Модернизация своими руками. - 28 Декабря 2009 - FOREX 21
ФОРЕКС 21 Понедельник, 05.12.2016, 17:29
Главная | Регистрация | Вход Приветствую Вас Гость | RSS
Меню сайта

Главная » 2009 » Декабрь » 28 » Программирование на MQL II: Модернизация своими руками.
Программирование на MQL II: Модернизация своими руками.
20:50
Программирование на 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("Указанного отложенного ордера не существует!"); };
Просмотров: 524 | Добавил: forex21 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Календарь новостей
«  Декабрь 2009  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031

Поиск

Друзья сайта


Статистика

Copyright MyCorp © 2016 Бесплатный конструктор сайтов - uCoz