Так, в частности, разрабатываемый нами советник Колобок (см. тему Создание советника по ТС "Колобок" (мод. трин)) нуждается в такой функции. Этот советник, как мы помним, предназначен для быстрой отработки необходимого объема сделок, что необходимо для отработки бонусов у целого ряда брокеров рынка Форекс.
Ниже приведем код рассматриваемой функции:
- Код: выделить все
double f_GetPosSumLots(string sy, int op, int mn)
{
/*
Проверено! Работает правильно
Описание : Возвращает сумму лотов открытых позиций
Если выбран тип операции "-1" (любая позиция), то функция вернет
разность лотов покупок и продаж. Если она будет положительной,
то суммарный лот больше покупок если отрицательной - суммарный лот
больше продаж.
Параметры:
sy - наименование инструмента ("0" - текущий символ)
op - операция (-1 - любая позиция)
mn - MagicNumber (-1 - любой магик)
*/
double dbl_Y = 0, dbl_BuyQ = 0, dbl_SelQ = 0;
if(sy == "0") sy = Symbol();
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == sy)
{
if(mn < 0 || OrderMagicNumber() == mn)
{
if(op < 0)
{
if(OrderType() == OP_BUY) dbl_BuyQ += OrderLots();
if(OrderType() == OP_SELL) dbl_SelQ += OrderLots();
}
else if(OrderType() == OP_BUY && op == OP_BUY)
{
dbl_BuyQ += OrderLots();
}
else if(OrderType() == OP_SELL && op == OP_SELL)
{
dbl_SelQ += OrderLots();
}
}
}
}
}
if(op == OP_BUY) dbl_Y = dbl_BuyQ;
if(op == OP_SELL) dbl_Y = dbl_SelQ;
if(op < 0) dbl_Y = dbl_BuyQ - dbl_SelQ;
return(dbl_Y);
}
Назовём функцию f_GetPosSumLots(). Я всегда ставлю символы "f_" перед смысловой частью в названии функции, чтобы систематизировать разрабатываемый код, чтобы было ясно, что дело имеем с функцией.
Данная функция возвращает тип double, что очевидно, т.к. сумма лотов открытых позиций, в основном, не целое число.
Параметрами функцию являются:
sy - наименование инструмента ("0" - текущий символ)
op - операция (-1 - любая позиция)
mn - MagicNumber (-1 - любой магик)
Таким образом, функция может возвращать сумму лотов открытых позиций нетолько по текущему инструменту (торговой паре), а по любому, по которому имеются открытые позиции.
В параметре "ор" мы определяем возможность помимо позиций на покупку или продажу указать "-1" чтобы функция определила объем открытых позиций и на покупку и на продажу. В этом случае функция вернет разность лотов покупок и продаж. Очевидно, что нам может понадобиться суммарный лот покупок и продаж по заданному инструменту, поэтому такая возможность должна быть в функции, что и реализовано.
Соответственно, при указании или покупки или продажи, мы получаем информацию конкретно о сумме объемов открытых покупок или продаж.
Мэджик "mn" мы всегда указываем для спецификации эксперта с которым функция расчета суммы лотов открытых позиций f_GetPosSumLots() имеет дело. Это необходимо чтобы выделить позиции открытые конкретным экспертом и не путать их с позициями, открытыми вручную или другим экспертом.
В функции мы вводим три переменные типа double, для расчетов суммы лотов открытых позиций. Далее в цикле перебора всех ордеров, выбираем согласно спецификациям открытые позиции, далее из них ищем позиции по заданному торговому инструменту, потом выбираем позиции с заданным мэджиком.
Для покупок в переменной dbl_BuyQ агрегируем значения всех лотов покупок, а в переменной dbl_SelQ - значения всех лотов продаж.
В завершении функция расчета суммы лотов открытых позиций f_GetPosSumLots() возвращает найденное значение, присвоив его переменной dbl_Y, а при необходимости возврата суммарного лота, дополнительно считает разность между dbl_BuyQ и dbl_SelQ.
Таким образом, функция расчета суммы лотов открытых позиций f_GetPosSumLots() позволяет получить искомый объем лотов открытых позиций для последующего использования в коде советника.