Однако, для подавляющего большинства задач этого не достаточно.
Рассмотрим, функцию для определения количества открытых позиций:
- Код: выделить все
int f_GetNumberOfPositions(string sy = "", int op = -1, int mn = -1)
{
/*
Версия : 28.10.2015 г.
Описание : Возвращает количество позиций (покупок или продаж или тех и других вместе)
Сторонних ресурсов не использует
Параметры:
sy - наименование инструмента ("" - любой символ, "0"- текущий символ)
op - операция {-1 любая; OP_BUY; OP_SELL}
mn - MagicNumber (-1 - любой маджик)
*/
int i, k = OrdersTotal(), kp = 0;
if(k == 0) return(0); // нет позиций вообще никаких
if(sy == "0") sy = Symbol();
for(i = 0; i < k; i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == sy || sy == "")
{
if(OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if(op < 0 || OrderType() == op)
{
if(mn < 0 || OrderMagicNumber() == mn) kp++;
}
}
}
}
}
return(kp);
}
Создадим в качестве примера советник, который будет делать только одно: выводить на экран количество открытых позиций. При этом можно будет определять их как для отдельного инструмента, так и для всех инструментов сразу, а также только для позиций, открытых при помощи определенного советника.
Алгоритм действий
1. Создать новый советник
2. Скопировать код функции f_GetNumberOfPositions() и вставить после функции OnTick(), т.е. в самый конец кода.
3. Создать переменную кол-во открытых позиций в теле функции OnTick():
- Код: выделить все
int intPos;
4. Присвоить этой переменной значение функции f_GetNumberOfPositions():
- Код: выделить все
intPos = f_GetNumberOfPositions("0", -1, -1);
В качестве параметров функции выбраны:
"0" - для текущего инструмента (т.е. на какой валютной паре запущен советник);
-1 - любая операция;
-1 - любой мэджик.
5. Сделать возможность выводить на экран (левый верхний угол) через комментарий количество открытых позиций, написав строку кода:
- Код: выделить все
Comment("\n", "Количество открытых позиций: ", intPos);
5. Откомпилировать советник.
Советник готов к использованию. Запустив его на кокой-нибудь паре, мы получим кол-во открытых позиций. Рынок при этом должен быть открыт.
Код советника:
- Код: выделить все
//+------------------------------------------------------------------+
//| EA-Example-01.mq4 |
//| Haos |
//| http://www.investforum.ru/forum/ |
//+------------------------------------------------------------------+
#property copyright "Haos"
#property link "http://www.investforum.ru/forum/"
#property version "1.00"
#property strict
//******************************************************************************************
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//******************************************************************************************
void OnDeinit(const int reason)
{
//---
}
//******************************************************************************************
void OnTick()
{
int intPos;
intPos = f_GetNumberOfPositions("0", -1, -1);
Comment("\n", "Количество открытых позиций: ", intPos);
}
//******************************************************************************************
int f_GetNumberOfPositions(string sy = "", int op = -1, int mn = -1)
{
/*
Версия : 28.10.2015 г.
Описание : Возвращает количество позиций (покупок или продаж или тех и других вместе)
Сторонних ресурсов не использует
Параметры:
sy - наименование инструмента ("" - любой символ, "0"- текущий символ)
op - операция {-1 любая; OP_BUY; OP_SELL}
mn - MagicNumber (-1 - любой маджик)
*/
int i, k = OrdersTotal(), kp = 0;
if(k == 0) return(0); // нет позиций вообще никаких
if(sy == "0") sy = Symbol();
for(i = 0; i < k; i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == sy || sy == "")
{
if(OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if(op < 0 || OrderType() == op)
{
if(mn < 0 || OrderMagicNumber() == mn) kp++;
}
}
}
}
}
return(kp);
}
//*********************************************************************************************