Пример использования функции GlobalVariableSetOnCondition()
В этом же выпуске я хотел бы рассмотреть пример ее практического использования.
//+---------------------------------------------------------------------+
//| int StartTrading() |
//| |
//| Функция занимает торговый поток |
//| Функция возвращает: |
//| 0 - если можно торговать |
//| 1 - если работа эксперта была остановлена |
//| 2 - если торговля экспертов запрещена на уровне настроек|
//| клиентского терминала |
//+---------------------------------------------------------------------+
#define GLOB_VAR_NAME "TradeIsAllowed"
int StartTrading()
{
// если советник работает в режиме тестирования, то просто выйдем
if (IsTesting()) return(0);
int LastError;
while (!IsStopped())
{
// Если торговля экспертов запрещена на уровне настроек
// клиентского терминала, то выйдем и вернем 2
if (!IsExpertEnabled()) return(2);
// проверим, существует ли глобальная переменная
if (GlobalVariableCheck(GLOB_VAR_NAME)) break;
// если произошла ошибка при проверке глобальной переменной,
// то сообщим об этом в логах и выждем 0.1 секунды
LastError = GetLastError();
if (LastError!=0)
{
Print("StartTrading(): ошибка ", LastError,
" при проверке наличия глобальной переменной ", GLOB_VAR_NAME);
Sleep(100);
continue;
}
// глобальная переменная не существует - создадим ее
if (GlobalVariableSet(GLOB_VAR_NAME, 0)>0) break;
// произошла ошибка при создании переменной - запишем в лог
LastError = GetLastError();
Print("StartTrading(): ошибка ", LastError,
" при создании глобальной переменной ", GLOB_VAR_NAME);
Sleep(100);
}
// глобальная переменная существует или же эксперт был остановлен
// В цикле проверяем, как изменилась ситуация
while (!IsStopped())
{
// Если торговля экспертов запрещена на уровне настроек
// клиентского терминала, то выйдем и вернем 2
if (!IsExpertEnabled()) return(2);
// Если удалось изменить значение глобальной переменной, то обновим данные
// о текущих курсах и вернем 0
if (GlobalVariableSetOnCondition(GLOB_VAR_NAME, 1, 0))
{
RefreshRates();
return(0);
}
// Если дошли до момента, то ситуация не изменилась
// Поэтому делаем паузу в 0.1 секунду
Sleep(100);
}
// Т.к. вышли из цикла, то работа эксперта была остановлена
// Вернем 1
return(1);
}
//+---------------------------------------------------------------------+
//| int StopTrading() |
//| |
//| Функция разрешает торговать следующему эксперту |
//| Функция возвращает: |
//| 0 - если другому эксперту можно торговать |
//| 1 - если работа эксперта была остановлена |
//| 2 - если торговля экспертов запрещена на уровне настроек|
//| клиентского терминала |
//+---------------------------------------------------------------------+
#define GLOB_VAR_NAME "TradeIsAllowed"
int StopTrading()
{
// если советник работает в режиме тестирования, то просто выйдем
if (IsTesting()) return(0);
int LastError;
while (!IsStopped())
{
// Если торговля экспертов запрещена на уровне настроек
// клиентского терминала, то выйдем и вернем 2
if (!IsExpertEnabled()) return(2);
// Если удалось изменить значение глобальной переменной, то обновим данные
// о текущих курсах и вернем 0
if (GlobalVariableSet(GLOB_VAR_NAME, 0)>0)
{
return(0);
}
// при сбросе значения глобальной переменной произошла какая-то ошибка
LastError = GetLastError();
Print("StopTrading(): ошибка ", LastError,
" при сбросе значения глобальной переменной ", GLOB_VAR_NAME);
// делаем паузу в 0.1 секунду
Sleep(100);
}
// Т.к. вышли из цикла, то работа эксперта была остановлена
// Вернем 1
return(1);
}