Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Названия цветов 12 страница




Функции для работы с GV-переменными

 

Для работы с GV-переменными в MQL4 имеются ряд функций (см. также Глобальные переменные GlobalVariables). Рассмотрим те из них, которые понадобятся нам в последующих примерах.

Функция GlobalVariableSet()

datetime GlobalVariableSet(string name, double value)

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

Параметры:

name - Имя глобальной переменной.

value - Новое числовое значение.

 

Функция GlobalVariableGet()

double GlobalVariableGet(string name)

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

Параметры:

name - Имя глобальной переменной.

 

Функция GlobalVariableDel()

bool GlobalVariableDel(string name)

Функция удаляет глобальную переменную. При успешном удалении функция возвращает TRUE, иначе FALSE. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

name - Имя глобальной переменной.

 

Чтобы продемонстрировать насколько удобным и полезным может быть использование GV-переменных, решим следующую задачу:

Задача 24. В терминале одновременно работают несколько экспертов. Сумма депозита составляет $10 000. Общая стоимость всех открытых ордеров не должна превышать 30% от суммы депозита. Каждому эксперту должно быть выделено равное количество денежных средств. Составить программу эксперта, содержащую расчёт суммы, выделенной для торговли.

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

Здесь нужно заметить, что в общем случае не каждая программа предназначена для решения подобной задачи. Если в клиентском терминале появится эксперт, не заявляющий о своём присутствии, то, естественно, он никак не будет учтён. Поэтому в данном случае сама постановка задачи предполагает использование только тех экспертов, которые содержат необходимый код - и для изменения значения GV-переменной, и для последующего считывания значения этой переменной.

Ниже представлен эксперт, демонстрирующий использование GV-переменных (globalvar.mq4), который может быть использован для решения Задачи 24:

//--------------------------------------------------------------------

// globalvar.mq4

// Предназначен для использования в качестве примера в учебнике MQL4.

//--------------------------------------------------------------------

int Experts; // Колич. экспертов

double Depo=10000.0, // Заданный депозит

Persent=30, // Заданный процент

Money; // Искомые средства

string Quantity="GV_Quantity"; // Имя GV-переменной

//--------------------------------------------------------------------

int init() // Спец. функция init

{

Experts=GlobalVariableGet(Quantity); // Получим тек. знач.

Experts=Experts+1; // Колич. экспертов

GlobalVariableSet(Quantity, Experts); // Новое значение

Money=Depo*Persent/100/Experts; // Средства для эксп.

Alert("Для эксперта в окне ", Symbol()," выделено ",Money);

return; // Выход из init()

}

//--------------------------------------------------------------------

int start() // Спец. функция start

{

int New_Experts= GlobalVariableGet(Quantity);// Новое колич. эксп.

if (Experts!=New_Experts) // Если изменилось

{

Experts=New_Experts; // Теперь текущ. такое

Money=Depo*Persent/100/Experts; // Новое знач. средств

Alert("Новое значение для эксперта ",Symbol(),": ",Money);

}

/*

...

Здесь долен быть указан основной код эксперта,

в котором используется значение переменной Money

...

*/

return; // Выход из start()

}

//--------------------------------------------------------------------

int deinit() // Спец. ф-ия deinit

{

if (Experts ==1) // Если эксперт один..

GlobalVariableDel(Quantity); //..удаляем GV-перемен

else // А иначе..

GlobalVariableSet(Quantity, Experts-1); //..уменьшаем на 1

Alert("Эксперт выгружен из окна ",Symbol()); // Сообщ. о выгрузке

return; // Выход из deinit()

}

//--------------------------------------------------------------------

Этот эксперт содержит три специальные функции. Кратко напомним, что все специальные функции запускаются на исполнение клиентским терминалом: функция init() - при присоединении эксперта к окну финансового инструмента, функция deinit() - при выгрузке эксперта из окна, а функция start() - потиково. В головной части программы объявлены глобальные переменные (областью видимости этих переменных является программа).

Распределение средств между экспертами зависит от одного изменяемого параметра - количества одновременно запущенных экспертов. Поэтому и GV-переменная, отражающая количество экспертов, должна быть одна. Название этой переменной задано в строке:

string Quantity = "GV_Quantity"; // Имя GV-переменной

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

Разберём подробно как изменяется и обрабатывается значение переменной Quantity в процессе выполнения программы. Прежде всего, эксперт, присоединяемый к окну финансового инструмента, должен заявить о своём присутствии, чтобы другие эксперты, работающие в терминале, могли об этом событии узнать. Это необходимо сделать как можно раньше (как можно ближе к тому моменту, когда эксперт присоединён). Наиболее подходящее для этого место в программе - специальная функция init(). В первой строке этой функции эксперт запрашивает текущее значение переменной Quantity, для этого используется функция GlobalVariableGet():

Experts = GlobalVariableGet(Quantity); // Получим тек. знач.

Теперь значение GV-переменной Quantity, каким бы оно ни было на момент присоединения эксперта, должно быть увеличено на 1. Это означает, что только что присоединяемый эксперт увеличил общее количество экспертов, одновременно работающих в терминале, на один:

Experts = Experts+1; // Колич. экспертов

Глобальная переменная Experts используется в программе для удобства. Её значение недоступно другим экспертам. Чтобы изменить значение GV-переменной Quantity, необходимо воспользоваться функцией GlobalVariableSet(), устанавливающей новое значение GV-переменной:

GlobalVariableSet(Quantity, Experts); // Новое значение

Это означает, что GV-переменной Quantity присвоено новое значение Experts. Теперь это новое значение GV-переменной доступно всем работающим в терминале программам. Вслед за этим рассчитывается и искомая сумма, выделенная для торговли только что присоединённому эксперту и делается сообщение (здесь сообщения необходимы только для того, чтобы проиллюстрировать в какой момент времени в каком эксперте осуществляются те или иные события; в реально работающей программе сообщения используются по необходимости).

Money = Depo*Persent/100/Experts; // Средства для эксп.
Alert("Для эксперта в окне ", Symbol()," выделено ",Money);

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

Теперь, в рамках решения поставленной задачи, целью эксперта является отслеживание текущего количества присоединённых экспертов - ведь могут быть присоединены или выгружены другие эксперты, а значит, общее количество одновременно работающих экспертов может измениться. В зависимости от этого наш эксперт должен пересчитать сумму средств, выделяемых ему по условию задачи. Поэтому, первое, что делает эксперт на каждом новом тике, - это запрашивает новое значение GV-переменной Quantity:

int New_Experts= GlobalVariableGet(Quantity);// Новое колич. эксп.

и если это новое значение New_Experts не совпадает с последним известным значением Experts, то новое известное значение теперь учитывается как текущее, выполняется пересчёт средств, выделяемых эксперту для торговли (Money), а также делается соответствующее сообщение:

if (Experts!= New_Experts) // Если изменилось

{

Experts = New_Experts; // Теперь текущ. такое

Money = Depo*Persent/100/Experts; // Новое знач. средств

Alert("Новое значение для эксперта ",Symbol(),": ",Money);

}

Если же переменные New_Experts и Experts совпадают, то этот расчёт не производится, а в дальнейшем коде эксперта (в функции start()) используется ранее вычисленное значение переменной Money. Так, в зависимости от ситуации, на каждом тике высчитывается новое или сохраняется имеющееся значение Money.

На этапе выгрузки каждый эксперт, принимающий участие в вычислениях в рамках Задачи 24, должен сообщить другим экспертам, что он выгружен, т.е. количество одновременно работающих экспертов уменьшилось. Более того, если этот эксперт последний, то необходимо удалить и саму GV-переменную. О выгрузке эксперта однозначно свидетельствует факт исполнения специальной функции deinit(), поэтому соответствующий код должен быть расположен именно в этой функции:

int deinit() // Спец. ф-ия deinit

{

if (Experts ==1) // Если эксперт один..

GlobalVariableDel(Quantity); //..удаляем GV-перемен

else // А иначе..

GlobalVariableSet(Quantity, Experts-1); //..уменьшаем на 1

Alert("Эксперт выгружен из окна ",Symbol()); // Сообщ. о выгрузке

return; // Выход из deinit()

}

Все вычисления в специальной функции deinit() производятся в рамках одного оператора if. Если количество экспертов равно 1, т.е. этот эксперт последний, то исполняется удаление GV-переменной с помощью функции GlobalVariableDel(), а во всех остальных случаях (т.е. когда количество экспертов больше 1) с помощью функции GlobalVariableSet() для переменной Quantity устанавливается новое значение, которое на 1 меньше текущего. Эксперты, оставшиеся загруженными, в начале исполнения специальной функции start(), отследят новое значение переменной Quantity и пересчитают искомое значение переменной Money.

Легко заметить, что значения GV-переменных могут быть считаны или изменены из любого исполняющегося эксперта с помощью предназначенных для этого функций. Прямые вычисления со значениями GV-переменных недопустимы. Для того, чтобы использовать значение GV-переменной в обычном выражении, необходимо это значение присвоить какой-нибудь другой переменной, и в вычислениях использовать эту переменную. В нашем случае такую роль играют две переменные - Experts и New_Experts в таких строках:

Experts = GlobalVariableGet(Quantity); // Получим тек. знач.

int New_Experts= GlobalVariableGet(Quantity);// Новое колич. эксп.

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


Рис. 55. Сообщения в окне функции Alert в результате последовательной загрузки и выгрузки
эксперта globalvar.mq4 в окна трёх различных финансовых инструментов.

В клиентском терминале имеется возможность открыть панель "Глобальные переменные", на которой в режиме реального времени можно увидеть все открытые на текущий момент GV-переменные и их значения. Эта панель доступна через меню клиентского терминала Сервис >> Глобальные переменные (клавиша F3):


Рис. 56. Состояние панели глобальных переменных клиентского терминала в момент, когда
в клиентском терминале было одновременно запущено три эксперта globalvar.mq4.

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

Ошибки при использовании GV-переменных

 

Если запустить эксперт globalvar.mq4 в окнах нескольких финансовых инструментов и не торопясь последовательно отслеживать все события, то легко убедиться, что представленный код успешно работает. Однако, это происходит только в том случае, если паузы между событиями достаточно большие. Обратите внимание на условие оператора if в функции deinit():

if (Experts ==1) // Если эксперт один..

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

 


Рис. 57. Выгрузка советника из окна EUR/USD до третьего тика.

На Рис. 57 представлено развитие событий, касающихся значения глобальной переменной клиентского терминала Quantity. Проследим как будет изменяться это значение в зависимости от происходящих событий. Пусть запуск на исполнение эксперта в окне EUR/USD произошел в момент t 0. В этот момент GV-переменной Quantity ещё не существует. В период t 0 - t 1 исполняется специальная функция init() эксперта, в результате чего создаётся GV-переменная Quantity, значение которой в момент t 1 равно 1. Последующие тики по валютному инструменту EUR/USD запускают на исполнение специальную функцию start(). Однако в период t 0 - t 6 в клиентском остаётся всего один эксперт, поэтому значение значение GV-переменной Quantity не изменяется.

В момент t 6 в окно финансового инструмента GBP/USD присоединяется второй эксперт. В результате исполнения его функции init() значение GV-переменной Quantity изменяется и в момент t 7 становится равным 2. После этого в момент t 8 в окно USD/CHF присоединяется третий эксперт, в результате чего в момент t 9 значение GV-переменной Quantity становится равным 3.

В момент t 10 трейдер принимает решение о выгрузке советника из окна EUR/USD. Обратите внимание, последний раз переменная Experts в эксперте, работающем в этом окне была изменена в период исполнения функции start(), запущенной на втором тике, т.е. в период t 4 - t 5. В момент t 10 значение переменной Experts в эксперте, работающем в окне EUR/USD, остаётся равным 1. Поэтому при исполнении специальной функции deinit() этого эксперта GV-переменная Quantity будет удалена в результате исполнения строк:

if (Experts ==1) // Если эксперт один..
GlobalVariableDel(Quantity); //..удаляем GV-перемен

Таким образом, несмотря на то, что в клиентском терминале остаются подключёнными два эксперта, GV-переменная удалена! Нетрудно понять, какие последствия это событие будет иметь для расчётов в работающих экспертах. При исполнении функции start() в этих экспертах будет установлено, что текущее значение переменной New_Experts равно нулю, поэтому и новое текущее значение переменной Experts также обнулится. В результате окажется, что значение переменной Money вычислить не представляется возможным, т.к в формуле, используемой для расчёта, переменная Experts стоит в знаменателе. Таким образом, дальнейшие расчёты в экспертах пойдут по ложному пути со всеми вытекающими последствиями.

Кроме того, при исполнении функции deinit() экспертов (при выгрузке из окон GBP/USD и USD/CHF) GV-переменная будет снова открыта, но получит значение -1 (минус единица) после выгрузки одного из них, и -2 при выгрузке последнего. Это приведёт к получению отрицательного значения переменной Money. Важным также является то, что после выгрузки всех экспертов GV-переменная Quantity останется открытой в клиентском терминале и в будущем окажет влияние на работу всех экспертов, интересующихся её значением.

Возможен и другой сценарий развития событий. На Рис. 58 показано как изменится значение GV-переменной в случае, если перед выгрузкой первого эксперта успеет случиться ещё один тик.

 


Рис. 58. Выгрузка советника из окна EUR/USD после третьего тика.

 

События, отраженные на Рис. 58, в период t 0 - t 9 полностью совпадают с событиями, отражёнными на Рис. 57. Согласно представленной диаграмме, в момент t 12 по финансовому инструменту EUR/USD поступает третий тик, в результате чего при исполнении специальной функции start() значение переменной Experts изменится и станет равным 3. Это значит, что при выгрузке эксперта из окна EUR/USD, в результате исполнения функции deinit() значение GV-переменной Quantity будет установлено равным 2, т.е. правильно отражающим количество экспертов, оставшихся в работе.

На основании этих рассуждений можно сделать вывод, что эксперт globalvar.mq4 составлен некорректно. Алгоритмическая ошибка в данном случае состоит в том, что для анализа ситуации в функции deinit() используется значение переменной Experts, не отражающей действительное количество одновременно работающих экспертов во всех без исключения случаях. Для случая, показанного на Рис. 58, значение переменной Experts оказывается справедливым, а для случая, представленного на Рис. 57, - нет. Таким образом, общий результат работы эксперта находится в зависимости от случайных событий, а именно, от последовательности прихода тиков по финансовым инструментам, с которыми работает эксперт.

В данном случае исправить ошибку просто. Достаточно обновить значение переменной Experts перед анализом (перед исполнением оператора if):

int deinit() // Спец. ф-ия deinit

{

Experts = GlobalVariableGet(Quantity); // Получим тек. знач.

if (Experts ==1) // Если эксперт один..

GlobalVariableDel(Quantity); //..удаляем GV-перемен

else // А иначе..

GlobalVariableSet(Quantity, Experts-1); //..уменьшаем на 1

Alert("Эксперт выгружен из окна ",Symbol()); // Сообщ. о выгрузке

return; // Выход из deinit()

}

Подобные алгоритмические ошибки опасны тем, что они не всегда очевидны, и их бывает трудно обнаружить. Из этого вовсе не следует, что программисту нужно отказаться от использования GV-переменных. Однако, это значит, что код любой программы должен быть составлен корректно, с учётом всех событий, которые могут повлиять на работоспособность программы.

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

Массивы

 

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

Понятие массив

 

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

Элемент массива - это составная часть массива; индексированная переменная с одноимённым названием, имеющая некоторое значение.

 


Рис. 59. Графическое представление массивов целого типа: а) одномерный; b) двумерный; с) трёхмерный.

Индексирование

 

Индекс элемента массива - одно или несколько целых значений, указанных в виде константы, переменной или выражения, перечисленных через запятую и заключённых в квадратные скобки. Индекс элемента массива однозначно определяет место элемента в массиве. Индекс элемента массива указывается непосредственно после идентификатора переменной (названия массива) и является неотъемлемой частью элемента массива. В MQL4 принято индексирование, начинающееся с нуля.

Допускается также способ указания индексов, при котором каждый из индексов обрамляется квадратными скобками:

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

Объявление массива и доступ к элементам массива

 

Перед тем, как массив будет использоваться в программе, его необходимо объявить. Массив может быть объявлен так же, как и переменная, - на глобальном и локальном уровне. Соответственно, значения элементов глобального массива доступны всей программе, а локального массива - только той функции, в которой этот массив объявлен. Массив не может быть объявлен на уровне клиентского терминала, поэтому глобальные переменные клиентского терминала не могут быть объединены в массив. Тип значений элементов массива может быть любым. Значения всех элементов массива имеют одинаковый тип, а именно тот, который указан при объявлении массива. При объявлении массива указывается тип данных, название массива и количество элементов в каждом измерении массива:

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

Значения элементов массивов, показанных на Рис. 59, следующие:

- для одномерного массива значением элемента Mas[4] является целое число 34;

- для двумерного массива значением элемента Mas[3,7] является целое число 28;

- для трёхмерного массива значением элемента Mas[5,4,1] является целое число 77.

Обратите внимание, минимальное значение индекса элемента массива - 0 (ноль), а максимальное значение - на единицу меньше, чем количество элементов в соответствующем измерении, указанное при объявлении массива.

Например, для массива Mas[10][15] элементом с минимальными значениями индексов является элемент Mas[0,0], а с максимальными значениями индексов - элемент Mas[9,14].

Осуществлять операции с массивами можно также с помощью стандартных функций. Для получения подробной информации о работе этих функций обратитесь к справочной документации на сайте производителя (http://docs.MQL4.com/ru) или к разделу "Справка" в редакторе MetaEditor. Некоторые из этих функций рассматриваются в дальнейшем изложении.

Инициализация массива

 

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

int Mas_i[3][4] = { 0, 1, 2, 3, 10, 11, 12, 13, 20, 21, 22, 23 };

 

double Mas_d[2][3] = { 0.1, 0.2, -0.3, -10.2, 1.5, 7.0 };

 

bool Mas_b[5] = { false, true, false, true, true }

В инициализирующей последовательности допускается пропуск одной или нескольких констант. В этом случае соответствующие элементы массивов числовых типов инициализируются нолём, а элементы массивов типа string инициализируются строковым значением "" (открывающая и закрывающая двойная кавычка без промежутка), т.е. пустой строкой (не путать с пробелом). Следующая программа выводит на экран значений массивов, инициализированных последовательностью с пропусками некоторых значений (скрипт arrayalert.mq4):

//--------------------------------------------------------------------

// arrayalert.mq4

// Предназначен для использования в качестве примера в учебнике MQL4.

//--------------------------------------------------------------------

int start() // Спец. функция start

{

string Mas_s[4] = {"a","b",,"d"}; // Строковый массив

int Mas_i[6] = { 0,1,2,,4,5 }; // Массив целого типа

Alert(Mas_s[0],Mas_s[1],Mas_s[2],Mas_s[3]); // Вывод на экран

Alert(Mas_i[0],Mas_i[1],Mas_i[2],Mas_i[3],Mas_i[4],Mas_i[5]);

return; // Выход из start()

}

//--------------------------------------------------------------------

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

 

Все используемые в MQL4 массивы можно разделить на две группы: пользовательские массивы (создаваемые по инициативе программиста) и массивы - таймсерии (массивы с предопределёнными именами и типами данных). Определение размеров пользовательских массивов и значений их элементов зависит от того, как составлена программа и в конечном счёте - от воли программиста. Значения элементов пользовательских массивов сохраняется в программе в течение всего времени исполнения программы и может быть изменено в результате вычислений. В то же время изменение значений элементов в массивах-таймсериях не допускается, а их размеры могут увеличиваться при подкачке истории.

Пользовательские массивы

 

В разделе Оператор switch рассматривалась Задача 18. Несколько усложним условие (увеличим количество выводимых словами пунктов до 100) и решим эту задачу, используя массивы.

Задача 25. Составить программу, в которой реализуются следующие условия: если курс поднялся выше заданного уровня, то выдать сообщение, в котором словами обозначено превышение над уровнем (до 100 пунктов); в остальных случаях сообщить, что курс не превышает заданный уровень.

Решение Задачи 25 с использованием строкового массива может быть таким (эксперт stringarray.mq4):

//--------------------------------------------------------------------

// stringarray.mq4

// Предназначен для использования в качестве примера в учебнике MQL4.

//--------------------------------------------------------------------

extern double Level=1.3200; // Заданный уровень

string Text[101]; // Объявление массива

//--------------------------------------------------------------------

int init() // Спец. ф-ия init()

{ // Присвоение значений

Text[1]="один "; Text[15]="пятнадцать ";

Text[2]="два "; Text[16]="шестнадцать ";

Text[3]="три "; Text[17]="семнадцать ";




Поделиться с друзьями:


Дата добавления: 2014-12-29; Просмотров: 339; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.014 сек.