Глобальные переменные


например, forex

GlobalVariableCheck(): проверка существования глобальной переменной

Для человека, имеющего уже опыт написания экспертов, выражение глобальные переменные может внести небольшую путанницу. Дело втом, что насамом деле существует два вида глобальных переменных:

  • переменные, которые видны излюбой функции ОДНОГО эксперта (т.е. являются глобальными впределах этого эксперта); и
  • переменные, которые являются общими для ВСЕХ экспертов.

О глобальных переменных первого типа— тех, которые являются общими для всех функций ОДНОГО эксперта,— ярассказывал ранее, ввыпуске Глобальные переменные.

Сейчасже речь пойдет именно оглобальных переменных второго типа— общих для ВСЕХ экспертов.

Глобальная переменная второго типа— это переменная, ккоторой можно обратиться излюбого эксперта. Если втечение четырех недель небыло сделано попытки прочесть значение глобальной переменной или записать внее новое значение, тоглобальная переменная автоматически удаляется клиентским терминалом.

Для работы сглобальными переменными используются следующие функции:

  • GlobalVariableCheck()
  • GlobalVariableDel()
  • GlobalVariableGet()
  • GlobalVariableName()
  • GlobalVariableSet()
  • GlobalVariableSetOnCondition()
  • GlobalVariablesDeleteAll()
  • GlobalVariablesTotal()

Вначале яхотелбы рассказать офункции GlobalVariableCheck().

   bool GlobalVariableCheck(string name)

Эта функция возвращает true, если глобальная переменная сименем name существует, иfalse, если такой переменной нет.

В нашей функции WaitBeforeTransaction() мыхраним время идату совершения последней торговой операции вглобальной переменной LastTradeTime.

Перед тем, как узнать время последней операции, прочитав значение этой переменной, мыпроверяем, существуетли она вообще:

    // если глобальная переменная LastTradeTime не существует,
    // то создать ее
    if (!GlobalVariableCheck("LastTradeTime"))
      {
        ... создаем переменную ...
      }

Проверять существование глобальной переменной исоздавать еевслучае отсутствия можно вдвух местах: при инициализации эксперта— вфункции init()— или накаждом тике— вфункции start().

Несмотря нато,что напервый взгляд напрашивается осуществлять эти действия вфункции init(), ябы советовал Вам делать это все-таки вфункции start(). Дело втом, что если пользователь при работающем эксперте удалит глобальную переменную, апроверка наеесуществование делается только при инициализации эксперта, тодальнейшее поведение такого советника сложно спрогнозировать. Скорее всего, такой советник просто перестанет торговать иначнет выдавать ошибки при обращении кудаленной глобальной переменной.

GlobalVariableSet()— установка нового значения глобальной переменной

Предположим, что еенесуществует илиже нам надо изменить еезначение. Вэтом случае надо использовать функцию GlobalVariableSet().

   datetime GlobalVariableSet(string name, double value)

Функция GlobalVariableSet() устанавливает новое значение value глобальной переменной сименем name ивслучае успеха возвращает время последнего доступа кглобальной переменной. Если произошла какая-то ошибка, тофункция возвращает 0.Код ошибки, как обычно, можно получить спомощью функции GetLastError().

Если глобальная переменная сименем name отсутствовала, тоона создается иона принимает значение value.

Пример использования функции GlobalVariableSet() можно найти внаписанной нами функции WaitBeforeTransaction():

    // если глобальная переменная LastTradeTime не существует,
    // то создать ее
    if (!GlobalVariableCheck("LastTradeTime"))
      {
        // Если произошла какя-то ошибка при вызове функции
        // GlobalVariableCheck(), выйдем с ошибкой
        if (GetLastError()!=0) 
          {
            Print("WaitBeforeTransaction(): ошибка ",GetLastError(),
                  " при проверке глобальной переменной LastTradeTime");
            return(-1);
          }
// глобальная переменная не существует, создадим ее if (GlobalVariableSet("LastTradeTime", 1)==0) { // произошла ошибка при создании глобальной переменной Print("WaitBeforeTransaction(): ошибка ",GetLastError(), " при создании глобальной переменной LastTradeTime"); return(-1); }
// глобальная переменная успешно создана Print("WaitBeforeTransaction(): глобальная переменная ", "LastTradeTime создана"); }

GlobalVariableSetOnCondition()— установка нового значения глобальной переменной, если текущее еезначение равно заданному значению

К счастью, создатели языка MetaQuotes Language 4являются профессиональными программистами изаранее могут предугадать, что может понадобиться трейдеру при написании экспертов. Яимочень благодарен, что они включили всписок функций языка MetaQuotes Language 4функцию GlobalVariableSetOnCondition().

Давайтеже рассмотрим, чем так полезна эта функция.

   bool GlobalVariableSetOnCondition(string name, double value, double check_value)

Прежде всего эта функция проверяет, существуетли глобальная переменная сименем name. Вдокументации поMetaQuotes Language 4написано, что если такой глобальной переменной нет, тофункция возвращает false игенерит ошибку ERR_GLOBAL_VARIABLE_NOT_FOUND (4058), которую можно получить спомощью функции GetLastError().

Однако при экспериментах сфункцией GlobalVariableSetOnCondition() мне неудалось добиться того, чтобы функция вернула ошибку ERR_GLOBAL_VARIABLE_NOT_FOUND (4058). Почему-то даже вслучае отсутствия глобальной переменной функция возвращает false икод ошибки ERR_NO_ERROR (т.е. 0). Вот кусок кода, который яиспользовал для этой цели:

   string name = "MyGlobalVariable";
   double value = 1;
   double check_value = 2;
if (GlobalVariableSetOnCondition(name, value, check_value)) { Print("Глобальная переменная ", name, " существует.", " Ее значение изменено с ", check_value, " на ", value); } else { int Err=0; Err = GetLastError(); Print(Err); switch (Err) { case 0: Print("Глобальная переменная ", name," изменена не была", " т.к. ее значение не равно ", check_value); break; case 4058: Print("Глобальной переменной ", name, " не существует"); break; default: Print("Неизвестная ошибка: ", Err); } }

Если это баг, тодумаю, что вследующих версиях MetaTrader 4его исправят.

Вернемся кописанию функции GlobalVariableSetOnCondition(). Еслиже глобальная переменная name существует, тофункция неизменит еетекущего значения ивернет false, если текущее значение этой глобальной переменной неравно check_value. Если потом запросить код последней ошибки, тофункция GetLastError()вернет ERR_NO_ERROR (т.е. 0), т.к. реально никакой ошибки небыло.

Еслиже текущее значение глобальной переменной name равно значению check_value, тофункция GlobalVariableSetOnCondition() присвоит этой глобальной переменной новое значение: value.


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

закрыть

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

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

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

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

 
Rambler's Top100