Пример использования функции GlobalVariableSetOnCondition()
В прошлом выпуске я рассказал о функции 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); }
Сегодня я не буду говорить о том, где и как используются эти две функции. Об этом мы поговорим завтра, в следующем выпуске.
Все статьи по теме "Пишем советников для MetaTrader 4".
- Механическая торговая система - миф или реальность?
- С чего начать при написании советника:
- Создаем нового советника - Настраиваем параметры. - Язык MetaQuotes Language 4: