Как дождаться освобождения торгового потока


например, forex

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

Перейти к главе «Критическая секция: разграничение доступа к ресурсу».
 
+7 (495) 710-76-76
8 (800) 200-01-31
по России бесплатно

закрыть

Вход в личный кабинет

Для счета alpari.classic введите номер счета (буква и 4 цифры) и пароль в ЛК.

Для счетов alpari.micro и alpari.partner введите логин и пароль в МТ.

Зарегистрироваться!Забыли пароль?

 
Rambler's Top100