КАТЕГОРИИ: Архитектура-(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) |
Стохастический Осциллятор (Stochastic Oscillator). 11 страницаQnt_Symb=FileWrite(Handle,Erray[i,0],Erray[i,1]);//Запись в файл При записи в файл после значения Erray[i,0] будет записан разделитель (символ, используемый как разделитель, указывается в функции открытия файла FileOpen(), в данном случае ';'). После окончания исполнения функции FileWrite(), т.е. в конце записи, будет автоматически записан признак конца строки "\r\n". На всех последующих итерациях цикла for будет сделана очередная запись такого же вида. Каждая новая запись начинается с того места, где остался файловый указатель после последней записи. При этом в файл будут записаны значения следующих элементов массива Erray (индексы элементов на каждой итерации увеличиваются на 1). Если текущая запись в файл выполнена успешно, то управление передаётся на следующую итерацию. Если же запись в файл закончилась неудачей, то после сообщения пользователю файл закрывается с помощью функции FileClose() и функция start() заканчивает работу. Если все записи в файл выполнены успешно, то после окончания исполнения цикла for управление передаётся функции закрытия файла FileClose() в блок 7-8. В этом случае выводится сообщение об успешном создании файла, после чего исполнение функции start() заканчивается. По окончании исполнения эксперта будет создан файл News.csv, представленный на Рис. 149.
Функции, применяемые для осуществления файловых операций
Для получения подробного описания этих и других функций необходимо обратиться к справочной документации на MQL4.community, сайте MetaQuotes Software Corp. или к разделу "Справка" в редакторе MetaEditor. Массивы и таймсерии
При работе с массивами очень важно помнить, что в MQL4 нумерация любой последовательности однотипных элементов начинается с нуля. Ранее указывалось, что не следует путать максимальное значение индекса элемента массива с количеством элементов этого массива (см. Массивы). Например, если объявлен массив: int Erray_OHL[3]; // Объявление массива то это значит, что одномерный массив (имеющий одно измерение) с именем Erray_OHL состоит из трёх элементов. Индексация элементов массива начинается с нуля, т.е. первый из трёх элементов имеет индекс 0 (Erray_OHL[0]), второй элемент - индекс 1 (Erray_OHL[1 ]), а третий элемент - индекс 2 (Erray_OHL[2 ]). Таким образом, максимальное значение индекса элемента массива на единицу меньше, чем количество элементов в этом измерении. В данном случае массив является одномерным, т.е можно говорить о количестве элементов в первом измерении: поскольку количество элементов в массиве равно 3, значит максимальное значение индекса равно 2. То же можно сказать и о нумерации измерений массива. Например, если объявлен массив: int Erray_OHL[3][8]; // Объявление массива то это значит, что массив имеет два измерения. Первое измерение этого массива определяет количество строк (в данном примере 3), а второе измерение - количество элементов в строке (или, что тоже самое, количество столбцов, в данном примере 8). Сами измерения также нумеруется. Первое измерение имеет номер 0, а второе измерение - номер 1. Номера измерений используются, например, в функции ArrayRange(). Функция ArrayRange() int ArrayRange(object array[], int range_index) Функция возвращает число элементов в указанном измерении массива. Использование функции ArrayRange() можно продемонстрировать при решении следующей задачи:
Зададимся некоторыми значениями элементов и представим исходную и искомую матрицы, содержащиеся, соответственно, в массивах Mas_1 и Mas_2:
Рис. 151. Исходная и транспонированная матрицы. В данном случае вся задача сводится к тому, чтобы переписать значения одного массива в другой, соблюдая при этом правила транспонирования матрицы, а именно, значения элементов, содержащихся в столбцах исходного массива, переписать в строки искомого массива. Решение задачи транспонирование матрицы реализовано в эксперте matrix.mq4: //-------------------------------------------------------------------- // matrix.mq4 // Предназначен для использования в качестве примера в учебнике MQL4. //--------------------------------------------------------------- 1 -- int start() // Спец. функция start { int Mas_1[3][5]={1,2,3,4,5, 11,12,13,14,15, 21,22,23,24,25}; int Mas_2[5][3]; int R0= ArrayRange(Mas_1, 0); // Число элементов в первом изм int R1= ArrayRange(Mas_1, 1); // Число элементов в втором изм
for(int i=0; i В функции start() эксперта открыты два массива. Массив Mas_1 имеет 3 строки по 5 элементов в каждой строке, а массив Mas_2 - 5 строк по з элемента в строке. Собственно перезапись значений элементов из одного массива в другой выполняется в строке: Mas_2[[j][i] = Mas_1[i][j]; // Транспонирование матрицы Для того, чтобы определить условия выполнения (количество итераций) двух вложенных операторов цикла, необходимо знать значения элементов в каждом из массивов. В данном примере можно было бы использовать значения констант 3 и 5. Однако, такой способ составления программ является некорректным. В общем случае программа может содержать объёмный код, во многих местах которого выполняется обращение к одним и тем же значениям. Программа должна быть составлена так, чтобы при необходимости внесения изменений исправления можно было бы сделать в одном месте, а во всех других местах все необходимые значения вычислялись. В данном случае, если необходимо будет изменить размеры массивов, то исправления нужно внести только в строки, в которых эти массивы открываются и инициализируются, и не придётся править код нигде в других местах. Для определения количества элементов в первом и втором измерении массива Mas_1 выполняются вычисления: int R0 = ArrayRange(Mas_1, 0); // Число элементов в первом изм Обратите внимание, для первого измерения используется значение 0, а для второго 1. Вычисленные значения переменных R0 и R1 используются для определения количества итераций в циклах for. Полученные значения элементов массива Mas_2 выводятся на экран с помощью функции Comment().
Функции для работы с массивами
Функции доступа к таймсериям
Для получения подробного описания этих и других функций необходимо обратиться к справочной документации на MQL4.community, сайте MetaQuotes Software Corp. или к разделу "Справка" в редакторе MetaEditor. Математические функции
В составе MQL4 имеются математические и тригонометрические функции. Использование большинства из них не вызывает никаких затруднений. Например, функция MathMax() возвращает максимальное из двух числовых значений, указанных в списке параметров вызова функции. Использование других функций требует определённой внимательности и вдумчивости. Рассмотрим одну из таких функций. Функция MathFloor() double MathFloor(double x) Функция возвращает числовое значение, представляющее наибольшее целое число, которое меньше или равно x. Параметры: x - числовое значение. Обратите внимание, значение, возвращаемое функцией, является действительным числом (типа double), в то же время в назначении функции указано, что функция возвращает целое число. Это нужно понимать так, что функция возвращает действительное число, у которого во всех разрядах после разделительной точки указаны нули. Например, функция MathFloor() может вернуть 37.0 (положительное число типа double) или -4.0 (отрицательное число типа double). В описании также указано, что функция возвращает максимальное из возможных чисел, которое меньше заданного. Например, если значение передаваемого параметра х равно 13.5, то максимальное действительное число, имеющее после разделительной только нули, равно 13.0. Если же в вызове функции указано отрицательное число -13.5, то максимальное меньшее целое число равно -14.0. Таким образом, изменение знака передаваемого параметра приводит к разным результатам, а именно, получаемые значения не равны по модулю. В некоторых случаях использование подобных функций оказывается очень удобным. Для примера рассмотрим фрагмент расчёта количества лотов для новых ордеров: int Percent =30; // % свободных средств double Free =AccountFreeMargin(); // Свободные средства double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Стоим. 1 лота double Step =MarketInfo(Symb,MODE_LOTSTEP); // Шаг изменен размера
double Lots_New=MathFloor(Free*Percent100One_LotStep)*Step; Значение переменной Percent задаётся пользователем. В данном случае пользователь выделил для новых ордеров 30% свободных средств. В соответствии с правилами, установленными дилинговым центром, правильно вычисленное количество лотов должно быть кратно минимальному шагу изменения размера лотов (Step). Для расчёта необходимы также значения свободных средств на счёте (Free) и стоимости одного лота (One_Lot). Рассмотрим логику рассуждений программиста, составившего формулу для расчёта искомого количества лотов Lots_New для новых ордеров. Используем для наглядности численные значения переменных. Пусть Free = 5000.0, One_Lot = 1360.0 (в большинстве ДЦ стоимость 1 лота для валютной пары, в знаменателе которой USD, пропорциональна цене по валютному инструменту), Step = 0.1. В этом случае программную строку для вычисления Lots_New можно переписать так: Lots_New = MathFloor(5000.0*30/100/1360.0/0.1)*0.1; Значением выражения 5000.0*30/100 является количество средств, выделенных пользователем для открытия нового ордера. В данном случае стоимость нового ордера может достигать 1500.0. Потратив все эти средства можно открыть один ордер, количество лотов у которого равно 1500.0 / 1360.0 = 1.102941. Однако, дилинговый центр не примет заявку на такое количество лотов, т.к. минимальный шаг (в большинстве дилинговых центров) Step = 0.1. Для вычисления искомого количества лотов необходимо отбросить "лишние" цифры в дробной части и заменить их нулями. Для этого можно воспользоваться рассматриваемой математической функцией: Lots_New = MathFloor(1.102941/0.1)*0.1; Результатом вычисления MathFloor(1.102941/0.1) будет число 11.0, а вычисленным значением переменной Lots_New - число 1.1 лота. Это значение соответствует правилам, установленным дилинговым центром, поэтому его можно использовать как заявляемое количество лотов для новых ордеров.
Математические функции
Для получения подробного описания этих и других функций необходимо обратиться к справочной документации на MQL4.community, сайте MetaQuotes Software Corp. или к разделу "Справка" в редакторе MetaEditor. Глобальные переменные GlobalVariables
Значительная часть функций, предназначенных для работы с глобальными переменными клиентского терминала, рассмотрена в разделе Переменные GlobalVariables. В предыдущем изложении указывалось, что при завершении работы правильно составленная программа должна удалить глобальные переменные, которые были ею созданы. После завершения всех программ в клиентском терминале не должно оставаться GV-переменных. При отладке, использующих глобальные переменные клиентского терминала, в терминале могут оставаться одна или несколько GV-переменных. В этом случае, перед очередным запуском на исполнение отлаживаемой программы программисту приходится вручную удалять GV-переменные, оставшиеся после предыдущего исполнения программы. Для механизации этого процесса можно создать скрипт, удаляющий все глобальные переменные клиентского терминала. Функция GlobalVariablesDeleteAll() int GlobalVariablesDeleteAll(string prefix_name=NULL) Удаляет глобальные переменные. Если префикс для имени не задан, то удаляются все глобальные переменные. В противном случае удаляются только те переменные, имена которых начинаются на указанный префикс. Функция возвращает количество удаленных переменных. Параметры: prefix_name - префикс имени удаляемых глобальных переменных. Пример простого скрипта deleteall.mq4, удаляющего все без исключения глобальные переменные клиентского терминала. //-------------------------------------------------------------------- // deleteall.mq4 // Предназначен для использования в качестве примера в учебнике MQL4. //-------------------------------------------------------------------- int start() // Специальная функция start() { GlobalVariablesDeleteAll(); // Удаление всех GV-переменных PlaySound("W2.wav"); // Брыньк return; // И уходим } //-------------------------------------------------------------------- Скрипт можно применять только в том случае, если в клиентском терминале нет ни одной исполняющейся программы, использующей GV-переменные. В противном случае исполнение скрипта может нарушить логику вычислений в других программах, что может привести к неконтролируемым действиям. После исполнения скрипта окно глобальных переменных клиентского терминала (F3) будет пустым:
Функции для работы с глобальными переменными
Для получения подробного описания этих и других функций необходимо обратиться к справочной документации на MQL4.community, сайте MetaQuotes Software Corp. или к разделу "Справка" в редакторе MetaEditor. Пользовательские индикаторы
Функции пользовательских индикаторов позволяют выполнить необходимые настройки, чтобы представить индикатор в удобном оформлении. Рассмотрим некоторые из них (см. также Создание пользовательских индикаторов). Функция SetIndexBuffer() bool SetIndexBuffer(int index, double array[]) Функция связывает переменную-массив, объявленный на глобальном уровне, с предопределенным буфером пользовательского индикатора. Количество буферов, необходимых для расчета индикатора, задается с помощью функции IndicatorBuffers() и не может быть больше 8. В случае успешного связывания возвращается TRUE, иначе FALSE. Чтобы получить расширенные сведения об ошибке, следует вызвать функцию GetLastError().
Дата добавления: 2014-12-29; Просмотров: 447; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |