КАТЕГОРИИ: Архитектура-(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). 12 страница
Параметры: index - порядковый номер линии (допускаются значения от 0 до 7); array[] - имя массива, связанного с расчетным буфером. Функция SetIndexStyle() void SetIndexStyle(int index, int type, int style=EMPTY, int width=EMPTY, color clr=CLR_NONE) Функция устанавливает новый тип, стиль, ширину и цвет для указанной линии индикатора. Параметры: index - порядковый номер линии (допускаются значения от 0 до 7); type - стиль отрисовки линии индикатора. Может быть одним из перечисленных стилей отрисовки линии (см. Стили отображения индикаторных линий); style - стиль линии. Используется для линий толщиной в 1 пиксель. Может быть одним из стилей линии, указанных в приложении Стили отображения индикаторных линий. Пустое значение (EMPTY) указывает, что стиль не будет изменен; width - ширина линии; допустимые значения - 1,2,3,4,5; пустое значение (EMPTY) указывает, что ширина не будет изменена; clr - цвет линии. Пустое значение CLR_NONE указывает, что цвет не будет изменен.
Функция SetIndexLabel() void SetIndexLabel(int index, string text) Функция позволяет устанавливать имя линии индикатора для отображения информации в окне DataWindow и всплывающей подсказке. Параметры: index - порядковый номер линии (допускаются значения от 0 до 7); text - Текст описания линии индикатора. NULL означает, что значение этой линии не показывается в DataWindow.
Пример простого индикатора, отображающего линию High (indicatorstyle.mq4), использующий указанные выше функции: //-------------------------------------------------------------------- // indicatorstyle.mq4 // Предназначен для использования в качестве примера в учебнике MQL4. //--------------------------------------------------------------- 1 -- #property indicator_chart_window // Индик. рисуется в основном окне #property indicator_buffers 1 // Количество буферов #property indicator_color1 Blue // Цвет первой линии
double Buf_0[]; // Открытие индикаторного массива
//--------------------------------------------------------------- 2 -- int init() // Специальная функция init() { SetIndexBuffer(0,Buf_0); // Назначение массива буферу SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);// Стиль линии SetIndexLabel (0,"Линия High"); return; // Выход из спец. ф-ии init() } //--------------------------------------------------------------- 3 -- int start() // Специальная функция start() { int i, // Индекс бара Counted_bars; // Количество просчитанных баров Counted_bars=IndicatorCounted(); // Количество просчитанных баров i=Bars-Counted_bars-1; // Индекс первого непосчитанного while(i>=0) // Цикл по непосчитанным барам { Buf_0[i]=High[i]; // Значение 0 буфера на i-ом баре i--; // Расчёт индекса следующего бара } return; // Выход из спец. ф-ии start() } //--------------------------------------------------------------- 4 -- В блоке 1-2 индикатора выполнены общие настройки. С помощью директивы #property указано, что индикатор должен отображаться в основном окне, индикатор использует один буфер, цвет индикаторной линии - синий. В блоке 1-2 также открыт один буферный массив. В блоке 2-3 используются указанные выше функции. В строке: SetIndexBuffer(0,Buf_0); // Назначение массива буферу буферу с индексом 0 ставится в соответствие массив с именем Buf_0. В строке: SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);// Стиль линии определяется стиль индикаторной линии, имеющей индекс 0. Константа DRAW_LINE означает, что отображаемая линия - простая, указание константы STYLE_SOLID означает, что линия сплошная, а 2 определяет толщину линии. В строке: SetIndexLabel (0,"Линия High"); индикаторной линии с индексом 0 присваивается имя. Указанное имя можно видеть в окне данных и во всплывающей подсказке в окне финансового инструмента (см. Рис. 810_3). Именование линий удобно использовать в случаях, когда в окне одновременно отражено несколько индикаторных линий; иногда это единственный способ отличить одну линию от другой. В блоке 3-4 выполняется простой расчёт значений элементов индикаторного массива для линии, отображающей максимальные значения баров (порядок расчёта индикаторных массивов подробно рассмотрен в разделе Программирование пользовательских индикаторов.).
Если индикатор отображается в отдельном подокне, то в этом окне можно отобразить горизонтальные уровни. Функция SetLevelValue() void SetLevelValue(int level, double value) Устанавливает значение для указанного горизонтального уровня индикатора, выводимого в отдельное окно. Параметры: level - номер уровня (0-31). value - значение для указанного уровня. Использование горизонтальных уровней бывает очень удобно в тех случаях, когда необходимо зрительно определить находится ли индикаторная линия выше или ниже некоторых заданных значений. Представленный ниже простой индикатор рассчитывает разницу между максимальной и минимальной ценами бара. События на рынке представляют интерес для пользователя (условно, в данном примере), если индикаторная линия находится выше уровня 0.001 или ниже уровня -0.001. Пример индикатора, отображающего разницу High и Low (linelevel.mq4). //-------------------------------------------------------------------- // linelevel.mq4 // Предназначен для использования в качестве примера в учебнике MQL4. //--------------------------------------------------------------- 1 -- #property indicator_separate_window // Индик. рисуется в отдельн. окне #property indicator_buffers 1 // Количество буферов #property indicator_color1 Red // Цвет линии
double Buf_0[]; // Открытие индикаторного массива //--------------------------------------------------------------- 2 -- int init() // Специальная функция init() { SetIndexBuffer(0,Buf_0); // Назначение массива буферу SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);// Стиль линии SetIndexLabel (0,"Разница High и Low"); SetLevelValue (0, 0.0010); // Задан уровень горизонт. линии SetLevelValue (1,-0.0010); // Задан ещё один уровень return; // Выход из спец. ф-ии init() } //--------------------------------------------------------------- 3 -- int start() // Специальная функция start() { int i, // Индекс бара Counted_bars; // Количество просчитанных баров
Counted_bars=IndicatorCounted(); // Количество просчитанных баров i=Bars-Counted_bars-1; // Индекс первого непосчитанного
while(i>=0) // Цикл по непосчитанным барам { Buf_0[i]=High[i]-Low[i]; // Значение 0 буфера на i-ом баре if(Open[i]>Close[i]) // Если свеча чёрная.. Buf_0[i]=-Buf_0[i]; //.. то реверс значения i--; // Расчёт индекса следующего бара } return; // Выход из спец. ф-ии start() } //--------------------------------------------------------------- 4 -- Рассматриваемая функция используется в индикаторе в блоке 2-3. В данном случае задано два горизонтальных уровня. Первое значение в списке параметров - номер горизонтального уровня, а второе - заданное значение уровня:
SetLevelValue (0, 0.0010); // Задан уровень горизонт. линии Параметры настроенных таким образом индикаторов indicatorstyle.mq4 и linelevel.mq4 отражаются в окне финансового инструмента и в окне данных. На Рис. 154 представлено два окна - окно данных и окно финансового инструмента. В окне данных можно наблюдать строку, содержащую текст "Линия High" и значение 1.3641. Такие же надписи отображаются в нижней строке всплывающей подсказки. В окне данных указанная строка присутствует в течение всего времени исполнения индикатора, название линии при этом не изменяется, а значение в правой части строки зависит от места положения курсора в окне финансового инструмента. Название линии, отображаемое во всплывающей подсказке, соответствует той индикаторной линии, к которой подведен курсор. В подокне индикатора linelevel.mq4 отображены горизонтальные линии, установленные в соответствии со значениями, заданными пользователем. Если подвести стрелку курсора к красной индикаторной линии, то во всплывающей подсказке можно видеть название этой линии, в данном случае "Разница High и Low", и чуть правее - значение линии в точке курсора. Функции для настройки пользовательских индикаторов
Для получения подробного описания этих и других функций необходимо обратиться к справочной документации на MQL4.community, сайте MetaQuotes Software Corp. или к разделу "Справка" в редакторе MetaEditor. Информация о счёте
Функции клиентского терминала и проверки состояния удобно применять, например, для ограничения использования программ при коммерческом распространении. Рассмотрим как может быть решена такая задача:
В этом примере правильно сформулирована постановка задачи. Для успешного коммерческого распространения в распоряжение потенциальных потребителей необходимо предоставить программу, которая в полной мере может быть опробована на демо-счёте. При этом пользователь может оценить все достоинства программы и принять решение о её приобретении. Применять один общий пароль для всех клиентов неправильно - в этом случае появляется риск несанкционированного распространения программы. Поэтому для индивидуальных клиентов пароль должен быть поставлен в зависимость от номера реального счёта. Для корпоративных клиентов (если дилинговый центр приобрёл лицензию для всех своих трейдеров) использовать пароль нет необходимости - программа должна сама определить к какому серверу подключён клиентский терминал. И если это сервер корпоративного клиента, то необходимо предоставить любому пользователю возможность беспрепятственной работы. Решение Задачи 39 для ограничения прав использования программ может быть таким (эксперт сheck.mq4): //-------------------------------------------------------------------- // сheck.mq4 // Предназначен для использования в качестве примера в учебнике MQL4. //--------------------------------------------------------------- 1 -- extern int Parol=12345; //--------------------------------------------------------------- 2 -- int start() // Спец. функция start { if(Check()==false) // Если условия использования.. return; //..не выполняются, то выход
// Здесь должен быть указан основной код программы Alert("Исполнение программы"); // Алерт для примера
return; // Выход из start() } //--------------------------------------------------------------- 3 -- bool Check() // Пользов. функция проверки.. { //.. условий использования if (IsDemo()==true) // Если это демо-счёт, то.. return(true); //.. других ограничений нет if (AccountCompany()=="SuperBank") // Для корпоративных клиентов.. return(true); //..пароль не нужен int Key=AccountNumber()*2+1000001; // Вычисляем ключ if (Parol==Key) // Если пароль верный, то.. return(true); //..разрешаем работу на реале Alert("Неправильный пароль. Эксперт не работает."); return(false); // Выход из пользов. функции } //--------------------------------------------------------------- 4 -- В данном примере необходимая проверка выполняется в первых строках специальной функции start (блок 2-3): if(Check()==false) // Если условия использования.. Если в результате выполнения проверки пользовательская функция Check() (блок 3-4) вернула false, то управление передаётся на оператор return и специальная функция start() заканчивает работу. Основной код программы располагается непосредственно после указанной проверки. В результате успешной проверки функция Check() вернёт true, в этом случае основной код программы будет исполнен. В пользовательской функции Check() выполняется проверка по трём критериям: Для проверки по первому критерию используется функция IsDemo(). Функция IsDemo() bool IsDemo() Функция возвращает TRUE, если программа работает на демонстрационном счете, в противном случае возвращает FALSE. Если функция IsDemo() возвращает true, то пользователь работает на демо-счёте. Это значит, что выполнять другие проверки нет необходимости (т.к. опробование программы на демо-счёте позволено для всех желающих). В этом случае функция Check() прекращает работу, и возвращает значение true: if (IsDemo() == true) // Если это демо-счёт, то.. Если же в функция IsDemo() вернёт значение false, значит пользователь работает на реальном счёте. В этом случае необходимо выяснить достаточно ли у пользователя прав. В данном примере сначала выполняется проверка корпоративных клиентов, для этого используется функция AccountCompany(). Функция AccountCompany() string AccountCompany() Функция возвращает название брокерской компании, в которой зарегистрирован текущий счет. Если в результате выполнения проверки: if (AccountCompany() == "SuperBank")// Для корпоративных клиентов.. установлено, что название компании совпадает с тем, что указано в программе, то функция Check() закончит работу и вернёт true - проверка закончена успешно. Если же оказывается, что клиент подключен к другой компании (не являющейся корпоративным клиентом), то необходимо выяснить имеет ли он индивидуальную лицензию. В строке: int Key = AccountNumber()*2+1000001;// Вычисляем ключ в программу заложен алгоритм вычисления ключа для любого номера счёта. В данном примере это простой способ. Программист по своему усмотрению может ввести в программу другой, более сложный способ вычисления ключа. В любом случае алгоритм вычисления ключа должен учитывать номер счёта, который доступен программе через функцию AccountNumber(). Функция AccountNumber() int AccountNumber() Функция возвращает номер текущего счета. Ранее вычисленный по тому же алгоритму пароль передаётся пользователю. Если в результате проверки оказывается, что пароль и ключ совпадают, то функция Check() прекращает работу и возвращает значение true: if (Parol == Key) // Если пароль верный, то.. Если ни одна из проверок не закончилась успешно, это означает, что пользователь не имеет права применения данной программы на реальном счёте. В этом случае, после соответствующего уведомления, функция Check() прекращает работу и возвращает значение false. Таким образом пресекается попытка несанкционированного использования программы. Функции, возвращающие информацию о клиентском терминале
Функции, позволяющие определить текущее состояние клиентского терминала, в том числе состояние окружения выполняемой MQL4-программы
Функции для доступа к информации об активном счете
Для получения подробного описания этих и других функций необходимо обратиться к справочной документации на MQL4.community, сайте MetaQuotes Software Corp. или к разделу "Справка" в редакторе MetaEditor. Торговые функции
Все торговые функции можно разделить на две группы - функции, формирующие торговые приказы, и функции, возвращающие некоторое значение, характеризующее ордер. В MQL4 имеются всего пять функций, которые формируют и отправляют на сервер торговые приказы: OrderSend() - открытие рыночного ордера и установка отложенного ордера; OrderClose() - закрытие рыночного ордера; OrderCloseBy() - встречное закрытие двух разнонаправленных рыночных ордеров; OrderDelete() - удаление отложенного ордера; OrderModify() - модификация ордеров всех видов. Порядок использования указанных функций подробно рассматривался в главе Программирование торговых операций. Все другие функции не формируют торговых приказов, но их применение очень часто бывает востребованным. Например, в ряде случаев ордера требуется закрыть в порядке некоторого приоритета. Для этого в программе необходимо проанализировать характеристики каждого из ордеров, а именно, - тип ордера, количество лотов, положение стоп-приказов и т.д. Рассмотрим некоторые функции, позволяющие получить информацию об ордере. Функция OrderTotal() int OrdersTotal() Функция в озвращает общее количество открытых и отложенных ордеров. Функция OrderTakeProfit() double OrderTakeProfit() Функция возвращает значение заявленной цены закрытия позиции при достижении уровня прибыльности (take profit) для текущего выбранного ордера. Ордер должен быть предварительно выбран с помощью функции OrderSelect(). Функция OrderProfit() double OrderProfit() Возвращает значение чистой прибыли (без учёта свопов и комиссий) для выбранного ордера. Для открытых позиций это - текущая нереализованная прибыль. Для закрытых ордеров - зафиксированная прибыль. Ордер должен быть предварительно выбран с помощью функции OrderSelect(). Функция OrderLots() double OrderLots() Возвращает количество лотов для выбранного ордера. Ордер должен быть предварительно выбран с помощью функции OrderSelect(). Ниже представлен фрагмент программы, в котором вычисляются заявленная цена закрытия TakeProfit, прибыль по ордеру и количество лотов: for (int i=0; i<OrdersTotal(); i++) // По всем ордерам { if((OrderSelect(i,SELECT_BY_POS)==true) // Если есть следующ. { double ТР = OrderTakeProfit(); // TakeProfit ордера double Profit= OrderProfit(); // Прибыль по ордеру double Lots = OrderLots(); // Количество лотов //......Использование значений ТР и Profit в программе..... } } // Конец тела цикла Легко заметить, что каждая из рассматриваемых функций (OrderTakeProfit (), OrderProfit() и OrderLots() не имеет настраиваемых параметров, т.е. не предусматривает указание, например, номера ордера, чтобы возвращаемое функцией значение соответствовало характеристике конкретного ордера. Чтобы вычислить искомые характеристики какого-то одного ордера (в данном случае - заявленную цену одного из стоп-приказов, прибыль по ордеру и количество лотов), сначала необходимо выделить этот ордер, сообщив таким способом программе, для какого именно из ордеров будут производиться вычисления. Для этого перед вычислениями характеристик ордера, нужно исполнить функцию OrderSelect() (см. Закрытие и удаление ордеров). Торговые функции, исполненные после этого, будут возвращать значения, соответствующие характеристикам выбранного ордера. Немаловажное значение имеет правильная оценка программистом той или иной характеристики ордера. Например, при решении задачи о порядке закрытия ордеров, необходимо задаться какими-то критериями, чтобы вычислить, какой из ордеров необходимо закрыть раньше, а какой после. Рассмотрим небольшую задачу.
Очевидно, что прибыль по первому ордеру составляет 108 пунктов, а по второму 8. Несмотря на то, что первый ордер открыт на меньшее количество лотов, прибыль у него больше, чем у второго, а именно, у первого $540, а у второго $80. На первый взгляд может показаться, что сначала нужно закрыть первый ордер, т.к. у него больше прибыли. Однако, это решение является ошибочным. Для принятия правильного решения необходимо рассмотреть возможный сценарий развития событий. Если бы заранее было точно известно, что в течение периода закрытия ордеров цена не изменится, то порядок закрытия ордеров не имел бы значения. Однако, за то время, пока исполняется торговый приказ на закрытие одного из ордеров, цена может измениться. Поэтому, закрыть следует тот ордер, который при неблагоприятном развитии событий принесёт больше вреда. При изменении цены на 1 пункт прибыль по первому ордеру уменьшится на $5, а по второму - на $10. Очевидно, что вреда будет больше от второго ордера, т.е. его и следует закрыть первым. Таким образом, в вопросе о порядке закрытия ордеров определяющее значение имеет количество лотов. Благоприятное развитие событий в данном случае рассматривать нельзя, т.к. торговля в правильно составленной программе ведётся в соответствии с торговыми критериями, и в данном случае сработал критерий закрытия ордеров типа Buy.
Дата добавления: 2014-12-29; Просмотров: 352; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |