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

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


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

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

OK.

я здесь пропишусь...

 

вот тоже интересен вопрос: на конкретном периоде красить ма возможно, наподобие как в АО - вверх зелена,а вниз красная напрмер?

а тоя думаю, что будет краситься вс я линия в зависимости направления на последних барах?

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

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

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

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

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

Liv, добрый день, еще вопрос:- можно ли отобразить вертикальный отрезок в необходимом месте экрана, с координатами в пикселах (а не время/цена)?
Ссылка на комментарий
Поделиться на другие сайты

я здесь пропишусь...

 

вот тоже интересен вопрос: на конкретном периоде красить ма возможно, наподобие как в АО - вверх зелена,а вниз красная напрмер?

а тоя думаю, что будет краситься вс я линия в зависимости направления на последних барах?

Такой индикатор уже давно написан (не мной) и он достаточно прикольный.

см. приложение....

 

а что касается "можно ли отобразить вертикальный отрезок в необходимом месте экрана, с координатами в пикселах (а не время/цена)?", то именно такой объект создать нельзя - нет такого в MT4. Это же не графический редактор, а график движения цен и здесь всё на это завязано. поэтому вряд ли стоит что-то ещё придумывать.... :cool2:

ma_color.zip

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

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

 

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

 

Уважаемый Liv!

 

C Вашей помощью сделал первый индикатор:

http://forum.masterforex-v.org/index.php?a...5799&st=60#

 

Спасибо Первому учителю!

 

вероятно, все это не оптимально, но это потом.

 

Нужна также помощь для дальнейшего развития.

 

Всем удачи!

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

Я очень этому рад! Желаю удачи и дальнейших успехов! Буду помогать, как смогу! :biggrin: :biggrin:

 

Liv, нужна помощь, сделал скрипт, http://forum.masterforex-v.org/index.php?a...=5799&st=61

в LiteForexe работает, в других терминалах - нет, как такое может быть?

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

Liv, нужна помощь, сделал скрипт, http://forum.masterforex-v.org/index.php?a...=5799&st=61

в LiteForexe работает, в других терминалах - нет, как такое может быть?

Вообще-то, язык MQL был разработан для платформы MT4 и, разумеется, может быть использован только там. И если какой-то ДЦ имеет терминал, отличный от MetaTrader, то там, вполне возможно, советники/индикаторы/скрипты, написанные в MQL работать не будут.

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

Вообще-то, язык MQL был разработан для платформы MT4 и, разумеется, может быть использован только там. И если какой-то ДЦ имеет терминал, отличный от MetaTrader, то там, вполне возможно, советники/индикаторы/скрипты, написанные в MQL работать не будут.

 

Да нет, ну ест-но везде МТ4, но в Lite работает , а в Finex - нет

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

Советую скачать МетаТрейдер с сайта производителя. Заметил следующую вещь: скаченные у ДЦ терминалы по разному отображают индикаторы... иногда совсем в обратную сторону...

Очень подозреваю, что некоторые ДЦ специально изменяют терминал (он поставляется в исходных кодах и легко поддаётся модификации) для успешного "заваливания" трейдера.

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

@Не обязательно запоминать полностью написание всех параметров функций, - достаточно запомнить только написание имени функции. Уже при написании имени функции редактор предложит вам список, из которого вы сможете выбрать нужное слово. Пишем её, выделяем и нажимаем F1. Откроется окно подсказки, где вы увидите полностью расписанную функцию со всеми параметрами.@

 

Понятно, как узнать совокупность параметров индикаторов, входящих в комплект МТ4. А как быть с пользовательскими индикаторами, которых там нет?

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

например совершенно замечательные индикаторы Юрика

JMA JMACD JCFBaux Heiken Ashi

www.Specia-list2007.narod.ru/_ind_.rar

(в папке _include_ - файлы для правильной работы этих индикаторов, кот. нужно поместить в папку experts/include )

 

Станислав

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

Понятно, как узнать совокупность параметров индикаторов, входящих в комплект МТ4. А как быть с пользовательскими индикаторами, которых там нет?

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

например совершенно замечательные индикаторы Юрика

JMA JMACD JCFBaux Heiken Ashi

www.Specia-list2007.narod.ru/_ind_.rar

(в папке _include_ - файлы для правильной работы этих индикаторов, кот. нужно поместить в папку experts/include )

 

Станислав

:blush: Я бы назвал этот вопрос провокационным, т.к. ответ ты уже знаешь!...

Но раз вопрос прозвучал, то нужно ответить...

 

В основном это делается с помощью функции iCustom.

Например:

получение значения индикатора JMA:

MQL
double dlCurrentValue = iCustom(NULL,0,"JMA" ,0,0);

Значения параметров этой функции простые:

  1. NULL - пишется, если не конкретизируется инструмент, иначе пишется символьное имя инструмента, например "GBPUSD".
  2. 0 - если не конкретизируется таймфрейм, иначе пишется нужный таймфрейм, например 15 - 15-минутный таймфрейм.
  3. "JMA" - имя используемого индикатора. Индикатор должен быть скомпиллирован, т.е. должен присутствовать файл "jma.ex4" (в Windows регистр букв не имеет значение). После этого параметра могут быть один или несколько параметров, кот. передаются в вызываемый индикатор. Передаваемые параметры должны соответствовать порядку объявления и типу внешних (extern) переменных индикатора. ВНИМАНИЕ! Не все индикаторы принимают параметры из этой функции. Например, я очень много промучался передавая параметры индикатору ZigZag, но выяснилось, что эти парметры не принимаются. В этом случае следует скомпиллировать индикатор с нужными вам параметрами.
  4. 0 - линия индикатора. У используемого индикатора может быть несколько линий и здесь указывается номер линии по порядку начиная с 0 (всего у индикатора может быть 9 линий - от 0 до 8)
  5. 0 - текущий бар (свеча). Номера баров (свечей) начинаются от нуля и увеличиваются с права на лево.

Для себя я чаще делаю так (при наличии исходных кодов): выделяю индикатор в отдельную функцию и затем использую полчившийся массив в своих целях.

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

По просьбам, я забегу несколько вперёд и расскажу сегодня о том, как использовать виндоузовские DLL.

Если у вас есть DLL, о которой вы всё знаете (какие функции экспортирует, какие параметры имеют эти функции), то её использование в вашем скрипте/индикаторе/советнике - очень простое дело! :cool2:

 

И как всегда, я буду показывать на примере. Здесь кусочек кода скрипта, с помощью которого я читал данные на своём сервере для использования.

MQL
#import "wininet.dll"

 int InternetAttemptConnect (int x);

 int InternetCloseHandle(int hInet);

 int InternetOpenA(

 string sAgent,

 int lAccessType,

 string sProxyName = "",

 string sProxyBypass = "",

 int lFlags = 0);

 int InternetOpenUrlA(

 int hInternetSession,

 string sUrl,

 string sHeaders = "",

 int lHeadersLength = 0,

 int lFlags = 0,

 int lContext = 0);

 int InternetReadFile(

 int hFile,

 int& sBuffer[],

 int lNumBytesToRead,

 int& lNumberOfBytesRead[]);

#import

 

int start() {

 if(!IsDllsAllowed()) {

Alert("У вас выключено разрешение использовать DLL" );

return(0);

 }

 int rv = InternetAttemptConnect(0);

 if(rv != 0) {

Alert("Нет соединения!" );

return(0);

 }

 int hInternetSession = InternetOpenA("Microsoft Internet Explorer" , 0, "", " ", 0);

 if(hInternetSession <= 0) {

Alert("Не удаётся соединиться с Internet'ом" );

return(0);

 }

 int hURL = InternetOpenUrlA(hInternetSession, "http://forex.orotukan.ru/cgi-bin/connect.cgi" , "", 0, 0, 0);

 if(hURL <= 0) {

Alert("Не удалось соединиться с адресом!" );

InternetCloseHandle(hInternetSession);

return(0);

 }

 int cBuffer[256];

 int dwBytesRead[1];

 bool bResult = InternetReadFile(hURL, cBuffer, 1024, dwBytesRead);

 /* здесь я обрабатываю полученные данные в массиве cBuffer */

 InternetCloseHandle(hInternetSession);

 return(0);

}

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

MQL
...

int& sBuffer[],

...

Знак амперсанда (&) как раз и указывает то, что этот параметр передаётся по ссылке, а не по значению.

 

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

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

После некоторого отступления, вернёмся опять к нашим скользящим средним.

Сейчас мы создадим простой индикатор флэта.

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

Он будет иметь одну линию типа гистограммы:

MQL
#property indicator_separate_window

#property indicator_buffers 1

#property indicator_color1 White

#property indicator_width1 2

#property indicator_minimum 0

#property indicator_maximum 10

Как видите, я прописал размер отдельного окна с тем, чтобы величина нашего индикатора всегда была не более 1/10 совместного окна. Если индикатор не будет использоваться с другими индикаторами вместе, то можно выключить установки максимума и минимума окна и сделать окно индикатора узеньким.

Для нашего индикатора мы будем использовать пять параметров - уровень флэта и четыре периода СС:

MQL
extern double УровеньФлэта=0.0003;

extern int MA1=5;

extern int MA2=12;

extern int MA3=18;

extern int MA4=21;

//---- buffers

double ExtMapBuffer1[];

Уровень флэта подбирается на каждый таймфрейм самостоятельно. Он будет везде разным. И, возможно придётся и периоды подбирать....

Наш индикатор будет гистограммой:

MQL
int init() {

 SetIndexStyle(0,DRAW_HISTOGRAM);

 SetIndexBuffer(0,ExtMapBuffer1);

 return(0);

}

И теперь расчётная часть:

MQL
int start() {

 int limit;

 int save_val=0;

 double valMA1, valMA2, valMA3, valMA4;

 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++) {

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

valMA2 = iMA(NULL,0,MA2,0,MODE_SMA,PRICE_CLOSE,i);

valMA3 = iMA(NULL,0,MA3,0,MODE_SMA,PRICE_CLOSE,i);

valMA4 = iMA(NULL,0,MA4,0,MODE_SMA,PRICE_CLOSE,i);

if (  MathAbs(valMA1-valMA2)<=УровеньФлэта &&

MathAbs(valMA1-valMA3)<=УровеньФлэта &&

MathAbs(valMA1-valMA4)<=УровеньФлэта  ) save_val = 1;

else save_val=0;

ExtMapBuffer1 = save_val;

 }

 return(0);

}

Как видите - тут всё просто: на текущем баре расчитываются СС разных периодов и разности этих значений сравниваются со значением переменной УровеньФлэта. Если значение не правышает уровень, то индикатору назначается 1, иначе - 0. Всё просто! :blush:

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

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

Приветствую!

Пока есть немного времени я хочу поговорить о ещё одной возможности индикации флэта.

 

У RSI есть одна интересная особенность: чем больше волатильность, тем меньше мгновенное значение движения RSI. И, соответственно, наоборот.... что даёт нам возможность получить индикатор мгновенного флэта.

 

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

 

Это будет просто вывод сообщения о том, что "Индикатор мгновенного флэта" показывет вероятность флэта.

Будут пять внешних параметров:

[MQL]

extern double РазмерФлэта=3.0; // проверочная значение шага RSI

extern int ПериодФлэта=10; // период для расчёта RSI

extern color ЦветФлэта=Yellow; // цвет вывода надписи

extern int КоординатаX=400; // координаты вывода надписи

extern int КоординатаY=0;

// нам нужна одна переменная, которая бы хранила прошлое значение

static double OldValue;

[/MQL]

Собственно никаких идикаторов нет... просто будет выводиться надпись о том, что RSI сигналит о возможном флэте.

 

Создаём эту надпись и временно убираем с экрана:

[MQL]

int init() {

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

ObjectSet("FlatSig",OBJPROP_XDISTANCE,1000);

ObjectSet("FlatSig",OBJPROP_YDISTANCE,1000);

ObjectSetText("FlatSig","ФЛЭТ!",14,"Arial Cyr",ЦветФлэта);

return(0);

}

 

int deinit() {

ObjectDelete("FlatSig");

ObjectDelete("HalfLine");

Comment(" ");

return(0);

}

// эта функция показывает надпись

void Make() {

ObjectSet("FlatSig",OBJPROP_XDISTANCE,КоординатаX);

ObjectSet("FlatSig",OBJPROP_YDISTANCE,КоординатаY);

}

// эта функция прячет надпись

void Del() {

ObjectSet("FlatSig",OBJPROP_XDISTANCE,1000);

ObjectSet("FlatSig",OBJPROP_YDISTANCE,1000);

}

 

int start() {

double NewValue = iRSI(NULL,0,ПериодФлэта,PRICE_CLOSE,0);

double CurFlat = MathAbs(NewValue - OldValue);

Comment("Флэт="+ CurFlat);

if (CurFlat > РазмерФлэта || CurFlat == 0) {

Make();

} else {

Del();

}

OldValue = NewValue;

}

[/MQL]

 

Вот, собственно, и всё... :smile:

При подозрении на флэт будет выводиться надпись "ФЛЭТ!", а в месте коментария будет выведено расчётное значение.

 

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

 

Я широко пользуюсь этим индикатором.

Как только начинает мигать (или горит постоянно) надпись "ФЛЭТ!", значит будет флэт. Если сначала уровень был высок, затем снизился (надпись исчезла), а потом опять появилась - сужающийся флэт,.... если сначала высокий, затем низкий, затем опять высокий, то тут можно ждать расширяющегося флэта...

Вариантов очень много, но, к сожалению, на каждом инструменте, таймфрэйме и ДЦ они разные.

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

  • 1 месяц спустя...
Здравствуйте.Я все прочел но видно не дано быть писателем индикаторов.Не все могут.Но один индикатор хотелось бы иметь.Может кто и напишет. Идея такая."Я проверял не обман ли упровляемость рынка просто"Провел по паре EURUSD по вершинам линии и они совпали во многих местах в2,00минутки на терминале лайта.Я даже чутьчуть с этого поимел потом тренд пошел в верх.хотел индикатор но не мое.
Ссылка на комментарий
Поделиться на другие сайты


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