Необходимость обнаружения позиции по определенной цене может возникнуть, когда заранее известны уровни на которых должны открываться позиции. Такое встречается, например, в сеточной торговле, когда уровни сформированы отдельным условием и, в основном, занесены в массивы данных. Вот тогда, к примеру, начальный уровень установк сетки даже может быть оформлен как внешний параметр советника, в который пользователь руками его должен вбить. Однако, все остальные уровни, обычно, вычисляются по некоему алгоритму, который и пишется разработчиком в коде. И вот иногда с вычисленного программой какого-нибудь уровня и нужно получить информацию, а есть ли там открытая позиция или её нет. Ответ на этот вопрос обусловит дальнейшие действия программы, например, установку ордера на том уровне или если это вблизи текущей цены происходит, то попытку открытия позиции.
Данная функция была в свободном доступе в интернете, потому разбирем код функции, осуществляющей поиск позиции по цене открытия.
- Код: выделить все
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает флаг существования позиций по цене открытия |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" - любой символ, |
//| NULL - текущий символ) |
//| op - операция (-1 - любая позиция) |
//| mn - MagicNumber (-1 - любой магик) |
//| pp - цена (-1 - любая цена) |
//+----------------------------------------------------------------------------+
bool f_ExistPosByPrice(string sy = "", int op = -1, int mn = -1, double pp = -1)
{
int d, i, k = OrdersTotal();
if(sy == "0") sy = Symbol();
for(i = 0; i < k; i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op))
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
d = (int) MarketInfo(OrderSymbol(), MODE_DIGITS);
if(pp < 0 || NormalizeDouble(pp, d) == NormalizeDouble(OrderOpenPrice(), d))
{
if(mn < 0 || OrderMagicNumber() == mn) return(true);
}
}
}
}
}
return(false);
}
Из кода видно, что функция имеет название f_ExistPosByPrice() и возвращает тип bool, т.е. является логической функцией. В функцию передаются параметры:
- sy - наименование инструмента;
- op - тип торговой операции (покупка, продажа или, если "-1", то или покупка, или продажа);
- mn - MagicNumber - "серийник" эксперта;
- pp - цена по которой была открыта позиция. При этом, автором придусмотрена ситуация, когда при вводе значения данного параметра в качестве "-1", будет происходить поиск позиции, открытой по любой цене, т.е., фактически, функция будет возвращать результат просто есть ли позиция открытая или её нет.
Как обычно, имеет место цикл перебора всех ордеров, в котором по заданным условиям поиска происходит отбор необходимой позиции. Это и определяют входные параметры функции.
Обращают на себя внимание строки,
- Код: выделить все
d = (int) MarketInfo(OrderSymbol(), MODE_DIGITS);
if(pp < 0 || NormalizeDouble(pp, d) == NormalizeDouble(OrderOpenPrice(), d))
где сначала берется информация о количестве цифр после точки в котировках данного торгового инструмента, осуществляется явное преобразование из типа double в целочисленный тип int, что обусловлено оператором (int), а потом введенное значение параметра pp, отвечающее за искомую цену, нормализуется и сравнивается также с нормализуемой ценой открытия текущей позиции, найденной в цикле.
В результате функция f_ExistPosByPrice() возвращает true при успешной операции поиска открытой позиции по заданным параметрам и false в случае отсутствия такой позиции.