Програмиране в MQL 4 променливи

В тази статия ще продължим да говорим за променливите, ще обясним тяхната цел и някои от нюансите, свързани с тяхното използване.

MQL 4 има вградени предварително дефинирани променливи като Ask, Bid, Bars, Close, Open, High, Low, Time и Volume.

Тези променливи са „свързани“ с определена диаграма; всеки от инструментите, които отваряте, има свой собствен набор от предварително дефинирани променливи, споменати по-горе, за всеки от своите времеви интервали. Стойностите на тези променливи могат да бъдат достъпни от потребителска програма, прикрепена към диаграма за определен период от време по всяко време. Не е възможно да промените стойностите на тези променливи.

Трябва да се отбележи, че променливите Close, Open, High, Low, Time и Volume не са единични стойности, а масиви, съдържащи исторически данни за въпросния инструмент. Последната стойност (наричаме това „най-младата“ стойност) на която и да е от тези променливи е достъпна от името на променливата с индекс нула. Например най-новата продажна цена на търгуван инструмент ще бъде Ask[0].

Променливите Bid и Ask са релевантни само за текущо формирания бар, така че не са масиви. Те съхраняват информация за цената, предложена от продавача и исканата цена за покупка.

Графиките на цените обикновено се разглеждат в скалата на определени периоди от време - барове.

Лентата е графично представяне на един ценови период. Лентата има собствена цена на отваряне (променлива Open) - цената, която е била на пазара в началото на периода, представен от лентата; максимална (променлива High) и минимална (променлива Low) цена, достигната на интервалавреме на бара и цената на затваряне на бара (променлива Close) – цената на търгувания инструмент на пазара в края на периода от време, представен от бара. Фигурата по-долу обяснява на какво съответстват тези променливи на графиката.

програмиране

Както вече споменахме, удобно е да мислим за номерата на баровете като тяхната възраст. Сегашната лента все още не е напълно оформена и следователно възрастта й е нула. Лентата, която се формира в предишния интервал от време, има възраст от един период и т.н. В горната фигура номерата на лентите са обозначени със сини числа и можете да видите как техният брой нараства отдясно наляво с увеличаване на възрастта на лентите.

За да разберем колко бара са налични за нас в програмата, можем да използваме предварително дефинираната променлива Bars. За по-голяма яснота средните ленти са пропуснати на фигурата (вместо това виждате три удебелени точки) и последните няколко ленти са оставени. Както можете да видите, първата лента отляво (най-старата) е номерирана Bars-1, втората лента отляво е номерирана Bars-2 и т.н.

Мнозина са объркани от факта, че най-старият бар има номер, равен на Bars-1. Това се дължи на факта, че номерирането на лентите се извършва не от едно, а от нула. Да предположим, че имаме десет бара, номерирани от нула, получаваме следната серия от техните индекси:

9, 8, 7, 6, 5, 4, 3, 2, 1, 0

В резултат на това променливата Bars ще съдържа броя на баровете (десет), а най-старият бар ще има индекс, равен на Bars-1 (девет).

Масивът от времеви стойности съдържа времената на отваряне на периодите на показаните ленти.

Масивът от стойности на обема съдържа тиковите обеми на баровете. Те могат да се използват само за преценка на броя на транзакциите, а не за действителния обем на продадените или закупени стоки, независимо дали става дума за валута, акции или други търгуемиинструмент.

Глобалните променливи са удобен инструмент за организиране на обмена на информация между програмите или за запазване на числените стойности на вашата програма, докато изключвате MetaTrader или компютъра.

За да създадете или промените стойността на глобална променлива, извикайте функцията GlobalVariableSet(). Тази функция сама ще създаде глобална променлива, ако изведнъж все още не съществува, а в случай, че променливата вече съществува, тя ще промени стойността си. Първият параметър на тази функция е името на глобалната променлива, вторият параметър е числовата стойност.

За да избегнете предположението дали вече е създадена глобална променлива с някакво име, можете да използвате функцията GlobalVariableCheck(). Обикновено функциите GlobalVariableSet() и GlobalVariableCheck() се използват заедно за инициализиране на глобална променлива, както следва:

// ако няма глобална // променлива с име “g1”, тогава // я създайте и й присвоете // стойността 12345

Можете да получите стойността на глобална променлива с помощта на функцията GlobalVariableGet().

Можете да изтриете глобална променлива с помощта на функцията GlobalVariableDel(). Ако стане необходимо да изтриете наведнъж всички глобални променливи, които в момента присъстват в системата, това може да стане чрез извикване на GlobalVariableDeleteAll().

Нека обърнем малко внимание на променливите, които се използват за съхраняване на стойности при писане на програми. В статията „Програмиране в MQL 4: Променливи“, публикувана в 21-ия брой на списание Forex, ние дадохме кратки препоръки за прилагане на правилата за именуване, а сега ще ги разширим малко. Вероятно читателите вече са обърнали внимание на факта, че в много програми някои променливи имат префикс“g_”, а някои нямат този префикс. Нека се опитаме да обясним с какво е свързано.

Когато пишете програми, е задължително да вземете предвид така наречения „обхват“ на променливата. Факт е, че на нивото на изходния код на програмата има и глобални променливи и локални променливи. Локалните променливи са тези, които са декларирани във функция. Обхватът на такива променливи е тялото на функцията, оградено във фигурни скоби, вътре в което са декларирани. Глобалните променливи са тези, които са декларирани извън тялото на която и да е функция, те са достъпни за всички функции на файла, в който е записана програмата.

// глобална променлива int g_nLots;

void Функция1(int param1) < // локална променлива int nLots;

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

Ако все пак се окаже, че глобалните и локалните променливи са наречени еднакви, тогава докато локалната променлива е в неговия обхват, тя ще бъде използвана. След като излезе от обхвата на локалната променлива, програмата ще използва глобалната променлива.

// декларирам глобална // променлива nLots int nLots = 0;

void Функция1() < // деклариране на локална // променлива nLots int nLots; // … // достъп до локална // променлива nLots nLots = 100; >;

void Функция2() < // достъп до глобалната // променлива nLots nLots = 3; >