Обсуждение статьи "Переход на новые рельсы: пользовательские индикаторы в MQL5"

 

Опубликована статья Переход на новые рельсы: пользовательские индикаторы в MQL5:

Описание особенностей создания индикаторов в MQL5 в сравнении с MQL4, а также описание новых возможностей.

Автор: Андрей

 

Я вот чего-то теперь не понял, мне чтоб иметь High & Low другого периода в индикаторе надо заводить теперь 2 буфера под них???


и в статье

CopyHigh


почему неправильно работают функции, н-р:

//+------------------------------------------------------------------+
//| Получим 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));
  }
//+------------------------------------------------------------------+

Вот что получилось у меня, все показывает верно.



 
Rosh   :

Что означает - "неправильно"?  Надо ведь приводить конкретные примеры вместо общих заявлений "все плохо".

Попробуйте запустить пример из раздела 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));
  }
//+------------------------------------------------------------------+
 
zfs   :


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

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

Добавим параметр TimeFrame. И протестируем программку под другим параметром, например, равном текущему,т.е. например на дневном графике зададим равным PERIOD_D1.



Проверил Ваш вариант - работает тоже верно. Запускал в виде скрипта на таймфрейме D1  с параметрами H1 и D1. Значения были верны (проверял три последних бара)

Файлы:
 
Rosh   :


Проверил Ваш вариант - работает тоже верно. Запускал в виде скрипта на таймфрейме D1  с параметрами H1 и D1. Значения были верны (проверял три последних бара)



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

только начал изучать. скачал положил в папку D:\MetaTrader 5\MQL5\Indicators 

откомпелировал, накинул на график. некоторые индикаторы ничего не показывают  ((. 

Так и должно быть ? или я что то не то сделал. 

не показывают индикаторы CrossMa.mq5, Toned_WPR.mq5 и HistogramSample.mq5

остальные работают 

 
Rosh:

Что означает - "неправильно"?  Надо ведь приводить конкретные примеры вместо общих заявлений "все плохо".

Попробуйте запустить пример из раздела 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); Результат, действительно, не изменился

 
Yura Fomin:

Здравствуйте.. Почитал .. посмотрел..

Здравствуйте. То, что коды из статьи, написанной еще во времена, когда МТ5 был в публичной бете, вообще работают, говорит о том, что система индикаторов в МТ5 была сразу целостной и тщательно продуманной.

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

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

Причина обращения: