OrderSymbol() - инструмент выделенного ордера
Очень часто перед трейдером стоит задача перебрать все открытые позиции или отложенные ордера и что-то сделать с позициями или ордерами, которые выставлены по инструменту, к которому прикреплен советник. Предположим, что нас интересуют только отложенные ордера.
Используя функцию OrderSymbol(), мы можем получить информация о выделенном с помощью функции OrderSelect() ордере или позиции.
string OrderSymbol()
Напишем кусочек кода, который просматривает все наши неудаленные отложенные ордера и производит какие-то действия с ордерами, которые выставлены по инструменту, к которому прикреплен советник.
int pos; for (pos=0; pos<OrdersTotal(); pos++) { // выделим ордер if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true) { // ордер выбран; проверим является ли этот ордер отложенным if (OrderType()>=OP_BUYLIMIT) { // ордер оказался отложенным; проверим инструмент if (OrderSymbol()==Symbol()) { // делаем что-то с ордером // ... } } } else Print("Ошибка ", GetLastError(), " при выборе ордера номер ", pos);
В этом коде Вам могут быть непонятны два момента.
Во-первых, я как-то странно на первый взгляд провожу определение типа ордера: if (OrderType()>=OP_BUYLIMIT). На самом деле условие OrderType()>=OP_BUYLIMIT будет истинно в тех случаях, когда выбран ордер, и ложно в тех случаях, когда выбрана позиция. Дело в том, что константы, определяющие тип ордера, имеют следующие числовые значения:
Константа | Значение | Описание |
OP_BUY | 0 | Позиция на покупку | OP_SELL | 1 | Продажа |
OP_BUYLIMIT | 2 | Отложенный ордер BUY LIMIT |
OP_SELLLIMIT | 3 | Отложенный ордер SELL LIMIT |
OP_BUYSTOP | 4 | Отложенный ордер BUY STOP |
OP_SELLSTOP | 5 | Отложенный ордер SELL STOP |
Как мы видим, во всех случаях, когда выделен отложенный ордер, значение функции OrderType() будет больше или равно OP_BUYLIMIT (т.е. больше или равно 2).
Второй непонятный момент в коде - функция Symbol(). Эта функция возвращает текстовую строку с именем финансового инструмента, к которому прикреплен советник:
string Symbol()
Все остальное Вы уже на данный момент знаете:
- целочисленные переменные (int),
- цикл for,
- функцию выделения ордера OrderSelect(),
- функцию получения типа выделенного ордера OrderType(),
- функцию печати информации в журнал экспертов Print().
В следующем выпуске я продолжу рассмотрение торговых функций.
Все статьи по теме "Пишем советников для MetaTrader 4".
- Механическая торговая система - миф или реальность?
- С чего начать при написании советника:
- Создаем нового советника - Настраиваем параметры. - Язык MetaQuotes Language 4:
Комментарии по теме "OrderSymbol() - инструмент выделенного ордера"
Аффтар жжот!
Бу-га-га!!!
Автор: Вася | 25.08.2006 12:47
Жгу :-D
Автор: Андрей Ведихин | 25.08.2006 13:46
Уважаемый автор!
Подскажите пожалуйста...
Если эксперт используется на нескольких инструментах, то как можно определить, что на данном конкретном инструменте количество открытых позиций = 0?
if (OrderSymbol()==Symbol()&& (OrdersTotal<1))
{
???
таким образом не получается, не пойму где ошибка...
Автор: Евгений | 11.10.2006 15:40
Уважаемый автор!
Подскажите пожалуйста...
Если эксперт используется на нескольких инструментах, то как можно определить, что на данном конкретном инструменте количество открытых позиций = 0?
if (OrderSymbol()==Symbol()&& (OrdersTotal<1))
{
???
таким образом не получается, не пойму где ошибка...
Автор: Евгений | 11.10.2006 15:42
if (OrderSymbol()==Symbol()&& (OrdersTotal<1))
{
почему-то запостилось без скобок вконце...
Автор: Anonymous | 11.10.2006 15:44
Если эксперт используется на нескольких инструментах, то как можно определить, что на данном конкретном инструменте количество открытых позиций = 0?
int num = 0;
int i;
for (i=0; i<OrdersTotal(); i++)
{
if (!OrderSelect(i, SELECT_BY_POS))
{
Print("Ошибка при выделении ордера");
num = -1;
break;
}
if ((Symbol()==OrderSymbol())&&(OrderType()<=OP_SELL)) num++;
}
Получаем:
если num=-1 - была ошибка
если num не равно -1, то оно содержит кол-во открытых по этому инструменту позиций
Автор: Андрей Ведихин | 11.10.2006 22:16
почему-то запостилось без скобок вконце...
Подправил Ваши комментарии - теперь все нормально. Проблема была в том, что Ваш знак "меньше" движок блога воспринял как начало HTML тэга.
Автор: Андрей Ведихин | 11.10.2006 22:24
Здравствуйте, Андрей!
Все получилось : )
поставил условие
if (num<2)
{
и по каждому инструменту эксперт открывает по 1 сделке, не зависимо от общего количества.
Спасибо Вам! : )
Автор: Евгений | 13.10.2006 14:21
Отлично!
P.S. Хороших выходных!
Автор: Андрей Ведихин | 14.10.2006 14:19