Я вот чего-то теперь не понял, мне чтоб иметь High & Low другого периода в индикаторе надо заводить теперь 2 буфера под них???
и в статье
почему неправильно работают функции, н-р:
//+------------------------------------------------------------------+
//| Получим High для заданного номера бара |
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
double high=0;
ArraySetAsSeries(High,true);
int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
if(copied>0 && index<copied) high=High[index];
return(high);
}
Что означает - "неправильно"? Надо ведь приводить конкретные примеры вместо общих заявлений "все плохо".
Попробуйте запустить пример из раздела CopyHigh():
//+------------------------------------------------------------------+
//| HighAndLow.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property version "1.00"
#property description "Пример вывода значений High[i] и Low[i]"
#property description "для баров, выбранных случайным образом"
double High[],Low[];
//+------------------------------------------------------------------+
//| Получим Low для заданного номера бара |
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
double low=0;
ArraySetAsSeries(Low,true);
int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
if(copied>0 && index<copied) low=Low[index];
return(low);
}
//+------------------------------------------------------------------+
//| Получим High для заданного номера бара |
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
double high=0;
ArraySetAsSeries(High,true);
int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
if(copied>0 && index<copied) high=High[index];
return(high);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- выводим на каждом тике значения High и Low для бара с индексом,
//--- равным секунде поступления тика
datetime t=TimeCurrent();
int sec=t%60;
printf("High[%d] =%G Low[%d] =%G",
sec,iHigh(Symbol(),0,sec),
sec,iLow(Symbol(),0,sec));
}
//+------------------------------------------------------------------+
Вот что получилось у меня, все показывает верно.
Что означает - "неправильно"? Надо ведь приводить конкретные примеры вместо общих заявлений "все плохо".
Попробуйте запустить пример из раздела CopyHigh():
Вот что получилось у меня, все показывает верно.
Прошу прощения за неконкретность претензий.
Мне кажется, если пишется функция, то подразумевается, что она работает под разными параметрами. Иначе в них просто нет смысла.
Добавим параметр TimeFrame. И протестируем программку под другим параметром, например, равном текущему,т.е. например на дневном графике зададим равным PERIOD_D1.
//+------------------------------------------------------------------+ //| HighAndLow.mq5 | //| Copyright 2009, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "2009, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property description "Пример вывода значений High[i] и Low[i]" #property description "для баров, выбранных случайным образом" double High[],Low[]; input ENUM_TIMEFRAMES TimeFrame; //+------------------------------------------------------------------+ //| Получим Low для заданного номера бара | //+------------------------------------------------------------------+ double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index) { double low=0; ArraySetAsSeries(Low,true); int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low); if(copied>0 && index<copied) low=Low[index]; return(low); } //+------------------------------------------------------------------+ //| Получим High для заданного номера бара | //+------------------------------------------------------------------+ double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index) { double high=0; ArraySetAsSeries(High,true); int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High); if(copied>0 && index<copied) high=High[index]; return(high); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- выводим на каждом тике значения High и Low для бара с индексом, //--- равным секунде поступления тика datetime t=TimeCurrent(); int sec=t%60; printf("High[%d] =%G Low[%d] =%G", sec,iHigh(Symbol(),TimeFrame,sec), sec,iLow(Symbol(),TimeFrame,sec)); } //+------------------------------------------------------------------+
Прошу прощения за неконкретность претензий.
Мне кажется, если пишется функция, то подразумевается, что она работает под разными параметрами. Иначе в них просто нет смысла.
Добавим параметр TimeFrame. И протестируем программку под другим параметром, например, равном текущему,т.е. например на дневном графике зададим равным PERIOD_D1.
Проверил Ваш вариант - работает тоже верно. Запускал в виде скрипта на таймфрейме D1 с параметрами H1 и D1. Значения были верны (проверял три последних бара)
Проверил Ваш вариант - работает тоже верно. Запускал в виде скрипта на таймфрейме D1 с параметрами H1 и D1. Значения были верны (проверял три последних бара)
только начал изучать. скачал положил в папку D:\MetaTrader 5\MQL5\Indicators
откомпелировал, накинул на график. некоторые индикаторы ничего не показывают ((.
Так и должно быть ? или я что то не то сделал.
не показывают индикаторы CrossMa.mq5, Toned_WPR.mq5 и HistogramSample.mq5
остальные работают
Что означает - "неправильно"? Надо ведь приводить конкретные примеры вместо общих заявлений "все плохо".
Попробуйте запустить пример из раздела CopyHigh():
Вот что получилось у меня, все показывает верно.
весь массив копировать данных???
помоему очень не экономично можно же 1 элемент скопировать
Prival:
Так и должно быть ? или я что то не то сделал.
Привет, Сергей. Статья писалась с пылу с жару, для самых первых публичных билдов. С тех пор очень многое поменялось, возможно, некоторые индикаторы требуют доработки.
Пересмотрю, как только будет время.
Здравствуйте.. Почитал .. посмотрел..
В RSI_Color в написании есть лишние строки:
Tак как цвета восходящих и нисходящих линий графика описаны в блоке input color, то, как говорится в справочнике: " Изменять значение переменной с модификатором input внутри mql5-программы нельзя, переменные доступны только для чтения. значения input-переменных может менять только пользователь из окна свойств программы."
Зафлешил в комменты функцию установки цветов // PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,Down); // PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,Up); Результат, действительно, не изменился
Здравствуйте.. Почитал .. посмотрел..
Здравствуйте. То, что коды из статьи, написанной еще во времена, когда МТ5 был в публичной бете, вообще работают, говорит о том, что система индикаторов в МТ5 была сразу целостной и тщательно продуманной.
Но с тех пор многие вещи поменялись, некоторые кардинально. Если вам понятны общие принципы, более конкретную актуальную информацию лучше брать из справки и свежих статей.
Спасибо за уточнения (хотя честно говоря не понял как приведенный код нарушает утверждение из справки), но думаю статья давно сослужила свою службу, поэтому исправлений не планируется
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Переход на новые рельсы: пользовательские индикаторы в MQL5:
Описание особенностей создания индикаторов в MQL5 в сравнении с MQL4, а также описание новых возможностей.
Автор: Андрей