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