Перейти к содержанию
Форекс Форум трейдеров Академии «MasterForex-V»

Создание индикаторов


Рекомендуемые сообщения

  • Ответов 159
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

После некоторого отсутствия (увы - денюжку я пока не на форексе зарабатываю), я продолжаю наши занятия.

 

Сегодня будет простой урок:

Как сделать, чтобы индикатор был в отдельном окне?

 

На самом деле это очень просто! Нужно только вместо:

#property indicator_chart_window

написать так:

#property indicator_separate_window

 

Те, кто немного разбирает аглицкие буковы поймёт, что новая инструкция как раз и устанавливает индикатор в отдельном окне.

 

В принципе, любой индикатор может помещён как в окно графика цены, так и в отдельное окно. Для проверки достаточно в нашем индикаторе Сидуса заменить указаные инструкции. Может получиться так, что некоторым такой вариант этого индикатора будет удобнее, т.к. ничего не мешает определению пересечений линий индикатора. А индикатор MACD, например, может некоторым понравиться в окне графика, ибо там он становиться более наглядным.

http://forex.orotukan.ru/images/macd.jpg

Как я только что обнаружил, что это работает не на всех терминалах. :ohmy: :ninja:

 

Тут надо быть внимательным, потому, что не все индикаторы будут нормально отображаться в противоположном окне. Индикатор ZigZag, в отрыве от цены, полностью теряет свою информативность и в отдельном окне абсолютно не пригоден. Так же как и некоторые индексные индикаторы (CCI, RVI, RSI & etc.), которые используют текущую шкалу цены и исчезают с графика (или полностью корожатся).

Ссылка на комментарий
Поделиться на другие сайты

Индикатор Сидуса построен на нескольких скользящих средних (СС). Но СС можно использовать не только на ценах графика, но и на других линиях графика.

 

Вот сегодня мы и займёмся построением СС на другой линии, например RSI.

 

RSI – это индексный индикатор относительной силы рынка. Он построен на отношении положительных ценовых изменений (это когда цена идёт вверх) к отрицательным ценовым изменениям (когда цена идёт вниз). Один из распространенных методов анализа индикатора RSI состоит в поиске расхождений, при которых цена образует новый максимум, а RSI не удается преодолеть уровень своего предыдущего максимума. Подобное расхождение свидетельствует о вероятности разворота цен. Если затем индикатор поворачивает вниз и опускается ниже своей впадины, то он завершает так называемый «неудавшийся размах» (failure swing). Этот неудавшийся размах считается подтверждением скорого разворота цен.

 

Итак, начнём.

Отрываем редактор и создаём новый индикатор, который назовём "RSI+MA". В качестве переменных пишем:

ПериодRSI = 14;

ПериодMA = 6;

Добавляем две линии – синюю для RSI и красную для СС. Указываем, что индикатор будет в отдельном окне и желательно указать максимум и минимум окна – для RSI используется 100 и 0.

Делаем цикл так же, как мы делали на индикаторе Сидуса и в этом цикле мы делаем расчёт RSI.

MQL
ExtMapBuffer1 = iRSI(NULL,0,ПериодRSI,PRICE_CLOSE,i);

Как видите, здесь всё просто и для вывода RSI больше ничего не надо…. Но наша задача "навесить" СС на нашу линию RSI. Для этого мы делаем ещё раз цикл и пользуемся функцией iMAOnArray:

MQL
for(i=0; i<limit; i++) {

 ExtMapBuffer2 = iMAOnArray(ExtMapBuffer1,0,ПериодMA,0,MODE_SMA,i);

}

Функция iMAOnArray предназначена как раз, для расчёта СС исходя из данных имеющегося массива ExtMapBuffer1. Как видите, он стоит первым в аргументах функции. С остальными аргументами функции вам, я думаю, уже не стоит труда разобраться.

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

 

Это всё! Осталось сохранить, скомпилировать, поместить на график и наслаждаться нашим индикатором.

Скользящая средняя на RSI будет показывать тенденцию изменения индекса роста/снижения цен, а сама линия RSI покажет момент возможного разворота цен.

 

Домашнее задание:

  1. Что нужно сделать, чтобы выводились линии уровней 30 и 70? Они помогают в определении точки разворота.
  2. Что нужно сделать для добавления ещё одной СС?
  3. Разобраться, для чего нужна вторая СС.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Добрый день,

 

Подскажите, как вывести, например, цифру, в угол главного окна?

Привет!

 

Простейший вариант - использование коментария:

MQL
Comment("Текщая цена: " + Bid);

Данная инструкция выведет строчку с ценой в левый верхний угол, во вторую строку. Для вывода многострочного коментария нужно разделять строки символом перевода строки "\n".

Более сложный вариант - использование объекта OBJ_TEXT:

MQL
ObjectCreate("name1" ,OBJ_TEXT,0,iTime(NULL,0,0),Ask);

ObjectSetText("name1" ,"Привет!" ,12,"Arial" ,Red);

Данный пример выводит слово "Привет" красным цветом в районе текущей цены. Примерно так же выводится с помощью инструкции OBJ_LABEL, только здесь координаты задаются в виде точек-пикселей, которые отчситываются от верхнего правого угла.

И наконец, инструкция OBJ_ARROW позволяет вывести один символ в нужной точке окна. Это может быть один из определённых символов MT4 или один из симоволов набора шрифта Windings.

Ссылка на комментарий
Поделиться на другие сайты

Привет!

 

Простейший вариант - использование коментария:

MQL
Comment("Текщая цена: " + Bid);

Данная инструкция выведет строчку с ценой в левый верхний угол, во вторую строку. Для вывода многострочного коментария нужно разделять строки символом перевода строки "\n".

Более сложный вариант - использование объекта OBJ_TEXT:

MQL
ObjectCreate("name1" ,OBJ_TEXT,0,iTime(NULL,0,0),Ask);

ObjectSetText("name1" ,"Привет!" ,12,"Arial" ,Red);

Данный пример выводит слово "Привет" красным цветом в районе текущей цены. Примерно так же выводится с помощью инструкции OBJ_LABEL, только здесь координаты задаются в виде точек-пикселей, которые отчситываются от верхнего правого угла.

И наконец, инструкция OBJ_ARROW позволяет вывести один символ в нужной точке окна. Это может быть один из определённых символов MT4 или один из симоволов набора шрифта Windings.

 

Привет, Спасибо

Мне нужно вывести переменную (int или double) как раз в определенном месте экрана с координатами X и Y. Так я понял-OBJ_LABEL надо использовать? Может, пример скинешь?

Ссылка на комментарий
Поделиться на другие сайты

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

Ээээ.... мда...

Переменной значение присваевается с помощью знака равно (=). Вот так:

int МояПеременная=0;

 

Если вы хотели что-то другое узнать, то нужно говрить конкретнее.....

Ссылка на комментарий
Поделиться на другие сайты

Ээээ.... мда...

Переменной значение присваевается с помощью знака равно (=). Вот так:

int МояПеременная=0;

 

Если вы хотели что-то другое узнать, то нужно говрить конкретнее.....

 

Прошу прощения за неточность.

Я имел ввиду -передать значение переменной в Label на экран, так,чтобы она обновлялась.Вроде, сделал сам.

 

int start() {

 

 

int limit;

int counted_bars=IndicatorCounted();

// проверим возможные ошибки - зачем время терять, если нет ничего

if(counted_bars<0) return(-1);

// пересчитаем последний

if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

for(int i=0; i<limit; i++) {

 

ObjectDelete ("MA1");

 

MA1 = iMA (NULL,0,MA_Period1,0,MODE_SMA,PRICE_CLOSE,i);

MA_1=DoubleToStr(MA1,4);

 

ObjectCreate("MA1" ,OBJ_LABEL,0,0,0);

ObjectSet ("MA1",OBJPROP_XDISTANCE, 50);

ObjectSet ("MA1",OBJPROP_YDISTANCE,50);

ObjectSetText("MA1" ,MA_1 ,12,"Arial" ,Red);

 

RefreshRates();

 

}

 

что-то типа этого, правильно?

 

теперь вопрос - как сделать обновлене не с кждым баром,а с каждым тиком?

Ссылка на комментарий
Поделиться на другие сайты

Вы не очень внимательно читали мои посты....

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

Для вашего примера это всё не требуется и всё просто:

MQL
#property indicator_chart_window

 

extern int Период=14;

extern color  Цвет=Red;

extern int КоордX=50;

extern int КоордY=50;

 

int init() {

 ObjectCreate("MA1" ,OBJ_LABEL,0,0,0);

 ObjectSet ("MA1" ,OBJPROP_XDISTANCE,КоордX);

 ObjectSet ("MA1" ,OBJPROP_YDISTANCE,КоордY);

 ObjectSetText("MA1" ,"0" ,12,"Arial" ,Цвет);

 return(0);

}

int deinit() {

 ObjectDelete ("MA1" );

 return(0);

}

int start() {

 double MA1 = iMA (NULL,0,Период,0,MODE_SMA,PRICE_CLOSE,0);

 string MA_1=DoubleToStr(MA1,4);  

 ObjectSetText("MA1" ,MA_1,12,"Arial" ,Цвет);

}

Данный пример никакой информационной ценности не несёт, но как пример использования объекта очень поучителен и я рад, всё-таки, что нашёлся хотя бы один неравнодушный к моим урокам. :biggrin:

 

Кстати, для того, чтобы ваш код имел расцветку нужно использовать BB-код:

[MQL]
...... здесь код программы ......
[/MQL]

Ссылка на комментарий
Поделиться на другие сайты

Вы не очень внимательно читали мои посты....

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

Для вашего примера это всё не требуется и всё просто:

 

...

 

Данный пример никакой информационной ценности не несёт, но как пример использования объекта очень поучителен и я рад, всё-таки, что нашёлся хотя бы один неравнодушный к моим урокам. :biggrin:

 

Liv, огромное спасибо, на самом деле -читаю вроде внимательно,но когда начинаешь писать, вылетает из головы,теперь уже запомню :)

 

 

Кстати, для того, чтобы ваш код имел расцветку нужно использовать BB-код:

[MQL]
...... здесь код программы ......
[/MQL]

 

И за это спасибо!

 

Что касается активности - я думаю- лето - вот причина.

Но я то буду теребить вопросами :)

Ссылка на комментарий
Поделиться на другие сайты

Вы не очень внимательно читали мои посты....

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

Для вашего примера это всё не требуется и всё просто:

MQL
#property indicator_chart_window

 

extern int   Период=14;

extern color  Цвет=Red;

extern int   КоордX=50;

extern int   КоордY=50;

 

int init() {

 ObjectCreate("MA1" ,OBJ_LABEL,0,0,0);

 ObjectSet ("MA1" ,OBJPROP_XDISTANCE,КоордX);

 ObjectSet ("MA1" ,OBJPROP_YDISTANCE,КоордY);

 ObjectSetText("MA1" ,"0" ,12,"Arial" ,Цвет);

 return(0);

}

int deinit() {

 ObjectDelete ("MA1" );

 return(0);

}

int start() {

 double MA1 = iMA (NULL,0,Период,0,MODE_SMA,PRICE_CLOSE,0);

 string MA_1=DoubleToStr(MA1,4);  

 ObjectSetText("MA1" ,MA_1,12,"Arial" ,Цвет);

}

Данный пример никакой информационной ценности не несёт, но как пример использования объекта очень поучителен и я рад, всё-таки, что нашёлся хотя бы один неравнодушный к моим урокам. :biggrin:

 

Кстати, для того, чтобы ваш код имел расцветку нужно использовать BB-код:

[MQL]
...... здесь код программы ......
[/MQL]

 

 

А вот и вопрос:

можно сделать чтобы переменная Цвет менялась в зависимости от знака MA1 ?

Ссылка на комментарий
Поделиться на другие сайты

А вот и вопрос:

можно сделать чтобы переменная Цвет менялась в зависимости от знака MA1 ?

У переменной MA1 всегда будет + (плюс), т.к. это Moving Average, т.е. Средняя Скользящая цены, а цена никогда не будет отрицательной (во был бы прикол - тебе платят за то, что ты покупаешь товар! :rolleyes: )

 

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

Ссылка на комментарий
Поделиться на другие сайты

У переменной MA1 всегда будет + (плюс), т.к. это Moving Average, т.е. Средняя Скользящая цены, а цена никогда не будет отрицательной (во был бы прикол - тебе платят за то, что ты покупаешь товар! :rolleyes: )

 

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

 

Ну конечно, я говорил о своей переменной МА1, она у меня уже расчетная и меняет знак.

OK.

Ссылка на комментарий
Поделиться на другие сайты


×
×
  • Создать...