Я вот чего-то теперь не понял, мне чтоб иметь 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:
Так и должно быть ? или я что то не то сделал.
Привет, Сергей. Статья писалась с пылу с жару, для самых первых публичных билдов. С тех пор очень многое поменялось, возможно, некоторые индикаторы требуют доработки.
Пересмотрю, как только будет время.
- 2010.02.25
- MetaQuotes Software Corp.
- www.mql5.com
Я смог решить эту проблему, определив только один буфер, помеченный как INDICATOR_DATA, и переместив все остальные в INDICATOR_CALCULATIONS, таким образом CopyBuffer/GetData возвращают правильные скопированные элементы в целевые массивы.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Переход на новые рельсы: пользовательские индикаторы в MQL5:
Описание особенностей создания индикаторов в MQL5 в сравнении с MQL4, а также описание новых возможностей.
Автор: Андрей