home

Пример использования функции 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);
}