Хранение данных в переменных


например, forex

Любой эксперт оперирует снекоторыми данными— ценами, значениями индикаторов, объемами, количеством открытых позиций ипр.Те,места, где эти данные хранятся вэксперте, называются переменными. Вкачестве имен переменных можно использовать цифры (0-9), латинские прописные истрочные буквы (а— zиА— Z,следует помнить, что буквы ’a’ и’A’— совершенно разные символы), символ подчеркивания (_). Первый символ неможет быть цифрой. Также имя переменной недолжно совпадать сзарезервированным словом (т.е. словом, которое имеет особый смысл вязыке MetaQuotes Language 4— нообэтом позже).

Желательно вкачестве имени переменной использовать такое, изкоторого сразу становится понятным предназначение переменной. Например, переменная, содержащая количество открытых позиций, может иметь такое имя: OpenPositionsNumber.

  • Можно создавать переменные разных типов:
  • int— целое число (от-2147483648до2147483647);
  • bool— логический тип (или ложь— false, или истина— true);
  • datetime— дата ивремя (вформате D’YYYY.MM.DD HH:MM:SS’);
  • color— цвет (оформате ярасскажу вследующих выпусках);
  • double— вещественное число (-1.7נ10-308до 1.7נ10308, точность— 15значащих цифр);
  • string— заключенная вдвойные кавычки строка (например, это строка).

Перед использованием переменной еенадо объявить. Это можно сделать несколькими способами:

тип     имя;
или
тип    имя = начальное_значение;

Примеры объявлений переменных:

int Count;
datetime InitialDate = D'2006.07.12 00:00';
string  ip_address = "127.0.0.1";

В дальнейшем для того, чтобы обратиться кзначению переменной, надо будет просто указать ееимя:

i = 5 + Count;

Иногда требуется сохранить неодно значение, аопределенное количество взаимосвязанных значений. Например, значение индикатора натекущем баре, напредыдущем баре, … , N-баров назад. Для таких целей существуют массивы. Массив— это индексированная совокупность однотипных данных.

Предположим, что унас вэксперте есть такое описание массива Prices:

double Prices[50];

Это означает, что массив-переменная Prices предоставляет доступ к50элементам типа double. Для доступа кi-му элементу надо указать Prices[i]. Нумерация элементов начинается снуля изаканчивается 49-м элементов (внашем случае).

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

В случае необходимости можно использовать нетолько одномерные массивы (укоторых только один индекс), ноимногомерные массивы.

Пример описания двухмерного массива, состоящего изшести массивов, каждый изкоторых состоит из50элементов:

int mas[6] [50];

При описании массива можно вфигурных скобках задать начальные значения для каждого элемента:

int    a[4][4] = { 1, 1, 1, 1,  2, 2, 2, 2,  3, 3, 3, 3,  4, 4, 4, 4 };

Начальные значения элементов массивов могут быть только константами. Если Вывфигурных скобках при инициализации массива указали меньшее количество начальных значений, чем размерность массива, тонедостающие элементы инициализируются нулями.

Локальные истатические переменные

  • Единственным нераскрытом моментом остались области видимости переменных. Дело втом, что переменные бывают нескольких типов:

  • локальные переменные,
  • статические переменные,
  • глобальные переменные,
  • внешние переменные,
  • параметры функций.

Локальные переменные

Если переменная объявлена впределах какой-нибудь функции, тоона является локальной переменной ивидна только впределах этой функции. Запределами этой функции кэтой переменной обращаться нельзя.

Инициализация (присвоение начального значения) локальной переменной происходит каждый раз при вызове функции. Присваиваемое начальное значение может быть как константой, так ивыражением.

Пример объявления иинициализации локальной переменной:

int CalcFactorial(int n)
  {
    int i = 0;
    ...
  }

Cтатические переменные

Статические переменные объявляются директивой static. Они инициализируются только один раз— при первом вызове функции исохраняют свое значение даже после выхода изфункции. Вследующий раз при новом вызове функции статические переменные будут иметь тоже значение, которое они имели перед выходом изфункции впослений раз.

Статические переменные объявляются впределах описания функции ипоэтому доступны для использования только впределах той функции, вкоторой они объявлены.

Пример объявления статической переменной:

int GetOpenPositionsNumber()
  {
    static int Count = 0;
    ...
  }

Внешние переменные

Мы уже сталкивались свнешними переменными, когда описывали параметры эксперта MAPeriod иLotsNumber вкоде нашего первого эксперта.

Внешние переменные описываются спомощью зарезервированного слова extern:

   extern int       MAPeriod=13;
   extern double    LotsNumber=1.0;

Внешние переменные немогут быть массивами.

Внешние переменные— это параметры эксперта, которые можно изменять.

Прикрепите эксперт кграфику. Для этого нажмите правую кнопку мыши наназвании эксперта вокне Навигатор ивпоявившемся контекстном меню выберите Присоединить кграфику. Появится окно свойств эксперта. Вовкладке Входные параметры Выможете изменить значения внешних переменных, описанных вэксперте (см.рис.1).

Рис. 1. Параметры эксперта
Рис. 1. Параметры эксперта

Если эксперт уже прикреплен кграфику (вправом верхнем углу графика Вывидите улыбающуюся или грустную рожицу), тодля изменения его параметров— значений внешних переменных— нажмите нарожице правую кнопку мыши ивыберите ввпоявившемся контекстном меню пункт Советники— Свойства …. Более быстрый способ— использовать горячую клавишу F7. Появится окно спараметрами эксперта (см.рис.1), вкотором Высможете изменить значения внешних переменных.

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

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

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

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

Второйже тип глобальных переменных ярассмотрю вследующих выпусках, когда буду рассказывать офункциях, спомощью которых ктаким переменным получают доступ,— GlobalVariable…().

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

   //---- глобальные переменные
int CurrentState;
int MyOrderTicket;

//---- определения функций
int init()
{
...
}

Начальное значение глобальной переменной может быть только константой (если незадано никакого значения, тоона инициализируется нулем). Это значение присваивается глобальной переменной только один раз, довыполнения функции init().


Перейти к главе «Параметры функций».
 
+7 (495) 710-76-76
8 (800) 200-01-31
по России бесплатно

закрыть

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

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

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

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

 
Rambler's Top100