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