Решение я нашел в использовании комментариев к сделке в качестве однозначного идентификатора. При этом он может быть просто порядковым номером, т.е. для 1-ой позиции (на покупку, к примеру) - 0, для второй - 1 и т.д. Тип комментария String, однако, его легко можно переводить в коде в Integer и обратно соответствующими функциями (StrToInteger() и IntegerToString()). При этом, поскольку, указывается также спецификатор в виде типа позиции (OP_BUY или OP_SELL), то совпадение комментариев для покупок и продаж - не имеет значения.
Итак, далее идут функции, требующиеся для работы с данным методом.
1. Получение величины профита позиции открытой с указанным комментарием
- Код: выделить все
double f_GetProfitPosByComment(string sy, int op, int mn, string co)
{
/*
Версия : 12.03.2017
Описание : Возвращает профит открытой по указанному комменту позиции
Параметры:
sy - наименование инструмента ("0" - текущий символ)
op - операция (-1 - любая позиция)
mn - MagicNumber (-1 - любой магик)
co - комментарий
*/
double dbl_Prof = 0;
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)
{
dbl_Prof = OrderProfit() + OrderCommission() + OrderSwap();
}
}
}
}
}
}
return(dbl_Prof);
}
2. Получение комментария позиции по цене открытия
- Код: выделить все
string f_GetCommentByOpenPrice(int op, int mn, double pp)
{
/*
Возвращает комментарий позиции по цене открытия
pp - цена открытия позиции
*/
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if((OrderSymbol() == Symbol()) && (op < 0 || OrderType() == op))
{
if(OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if(mn < 0 || OrderMagicNumber() == mn)
{
if(NormalizeDouble(pp, _Digits) == NormalizeDouble(OrderOpenPrice(), _Digits))
{
return(OrderComment());
}
}
}
}
}
}
return("");
}
3. Получение цены TakeProfit позиции, открытой с определенным комментарием
- Код: выделить все
double f_GetTPPosByComment(string sy, int op, int mn, string co)
{
/*
Описание : Возвращает цену TakeProfit позиции с определенным комментом
Параметры:
sy - наименование инструмента ("0" - текущий символ)
op - операция (-1 - любая позиция)
mn - MagicNumber (-1 - любой магик)
co - комментарий
*/
double tp = -1;
if(sy == "0") sy = Symbol();
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == sy)
{
if(OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if(op < 0 || OrderType() == op)
{
if(mn < 0 || OrderMagicNumber() == mn)
{
if(OrderComment() == co) tp = OrderTakeProfit();
}
}
}
}
}
}
return(tp);
}
4. Возвращает флаг существования позиций по указанному комментарию
- Код: выделить все
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);
}
В таком же стиле могут быть созданы и другие функции. В результате разработчик, однажды задав идентификатор позиции в виде комментария, приобретает над ними полный контроль.