Скачать MetaTrader 5

iCustom

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
speedyFr
62
speedyFr  

всем привет. у меня не получается использовать функцию iCustom на базе хэндла от другого индикатора:


handle_P=iCustom( Symbol(), PERIOD_CURRENT,

  "My custom indicators\\P",

  range, // some input parameter 

  handle // handle of an other indicator that works well

);


Проблема в том что, без инпут параметра range в индикаторе P iCustom работает (правда толко для буффера 0 для индикатора hadle)



В данном примере (инпут параметер присутствует) iCustom возвращает данные, но не из handle, а из price = close, значение по умолчанию


----------------

Есть ли у вас пример индикатора iCustom который запускается на данных из handle, и имеет инпут параметры? В чем моя ошибка?


спасибо!



Документация по MQL5: Технические индикаторы / iCustom
Документация по MQL5: Технические индикаторы / iCustom
  • www.mql5.com
Технические индикаторы / iCustom - Документация по MQL5
Rashid Umarov
Админ
12155
Rashid Umarov  
Посмотрите в справке пример в разделе констант - "Ценовые константы"
speedyFr
62
speedyFr  
Rosh :
Посмотрите в справке пример в разделе констант - "Ценовые константы"


 

Вы хотите сказать что функция iCustom работает только на ценовых константах? так как на хандле ее запустить не получается... причем только в том случае когда есть хоть какие-нибудь параметры у пользовательского индикатора..


 

 

более того я заметил (в курсе тестированя) что функция показывает погоду... то ошибка 4003.. один и тот же индикатор не работает, когда терминал запускается.. и работает (тоже не очень стабильно) когда терминал запущен.. !  

 

Наверняка вы уже в курсе что другие таймфрэймы работают плохо когда используется iCustom или CopyTime. Pечь идет о таймфрэймах отличных от текущего..

Файлы:
bug.mq5 4 kb
Rashid Umarov
Админ
12155
Rashid Umarov  
speedyFr :

 

Наверняка вы уже в курсе что другие таймфрэймы работают плохо когда используется iCustom или CopyTime. Pечь идет о таймфрэймах отличных от текущего..

 


Посмотрите в справке раздел Организация доступа к данным
Rashid Umarov
Админ
12155
Rashid Umarov  
speedyFr :


 

Вы хотите сказать что функция iCustom работает только на ценовых константах? так как на хандле ее запустить не получается... причем только в том случае когда есть хоть какие-нибудь параметры у пользовательского индикатора..




Пользовательский индикатор должен использовать функцию OnCalculate() первого вида:

Если в индикаторе используется первая форма вызова, то при запуске пользовательского индикатора на вкладке "Parameters" можно дополнительно указать на каких данных он будет рассчитываться. Если параметр "Apply to" не выбран явно, то по умолчанию расчет производится по значениям "Close".



При вызове пользовательского индикатора из mql5-программы параметр Applied_Price или хэндл другого индикатора должен передаваться последним после всех предусмотренных пользовательским индикатором входных переменных.

speedyFr
62
speedyFr  
Rosh :


Посмотрите в справке раздел Организация доступа к данным

Спасибо за ответ и ссылку на интересный раздел справки.

 

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

 

В принципе разрабатывая индикаторы на разных таймфреймах надо все время об этом думать...

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

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

 

 

Кстати, скрипт из примера (TestLoadHistory) выдает ошибку Load Failed, что говорит о том что все же какие-то проблемы возможно все еще есть.. B любом случае спасибо, за своевременный ответ!

speedyFr
62
speedyFr  

Привет,

Eсть еще одна неполадка в функции iCustom Когда функция вызывается для периода отличного от PERIOD_CURRENT, скажем таймфрейм ТФ

 

 

int  iCustom(
   string           symbol,     // имя символа
   ENUM_TIMEFRAMES  period,     // период
   string           name        // папка/имя_пользовательского индикатора
   ...                          // список входных параметров индикатора
   );

 


Значение PERIOD_CURRENT в пользовательском индикаторе равно PERIOD_CURRENT, вместо ТФ !

Переход на новые рельсы: пользовательские индикаторы в MQL5
Переход на новые рельсы: пользовательские индикаторы в MQL5
  • 2009.11.23
  • Андрей
  • www.mql5.com
Я не буду перечислять все новые возможности и особенности нового терминала и языка. Их действительно много, и некоторые новинки вполне достойны освещения в отдельной статье. Вы не увидите здесь кода, написанного по принципам объектно-ориентированного программирования — это слишком серьезная тема для того, чтобы просто быть упомянутой в контексте как дополнительная вкусность для кодописателей. В этой статье остановимся подробней на индикаторах, их строении, отображении, видах, а также особенностях их написания по сравнению с MQL4.
Alexey Da
Модератор
6636
Alexey Da  
speedyFr :

Привет,

Eсть еще одна неполадка в функции iCustom Когда функция вызывается для периода отличного от PERIOD_CURRENT, скажем таймфрейм ТФ

 

 

int  iCustom(
   string           symbol,     // имя символа
   ENUM_TIMEFRAMES  period,     // период
   string           name        // папка/имя_пользовательского индикатора
   ...                          // список входных параметров индикатора
   );

 


Значение PERIOD_CURRENT в пользовательском индикаторе равно PERIOD_CURRENT, вместо ТФ !

Расскажите поподробнее, как вы это запрашиваете и как проверяете?

speedyFr
62
speedyFr  
alexvd :

Расскажите поподробнее, как вы это запрашиваете и как проверяете?

запускать индицатор надо на таймфрайме M30, H1, H4

 

Вот пример использования функции

 

 

 bug2.mq5:

 

//---

#property indicator_separate_window

#property indicator_buffers       1

#property indicator_plots         1

#property indicator_type1         DRAW_LINE

double     Buffer[];

int handle;

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

void OnInit()

  {

   SetIndexBuffer(0,Buffer);

   

   Print("Call user_indicator PERIOD_H12");

   

   handle=iCustom(

                     Symbol(),

                     PERIOD_H12,

                     "user_indicator",

                     14

                     );

  }

//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total,

                const int prev_calculated,

                const int begin,

                const double &price[])

  {


   if(BarsCalculated(handle)<=0) return(prev_calculated);

//--- variables


   Print("End..."); 

//---- OnCalculate done. Return new prev_calculated.

   return(rates_total);

  }

//+------------------------------------------------------------------+

Файлы:
bug2.mq5 2 kb
Rashid Umarov
Админ
12155
Rashid Umarov  
speedyFr :


Вот пример иицпользования функции:

 

 bug2.mq5:


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

В справвке для раздела Периоды графиков сказано:

Идентификатор PERIOD_CURRENT означает текущий период графика, на котором запущена mql5-программа.

Итак, Вы вызываете пользовательский индикатор "user_indicator", указав для него период H12, из индикатора bug2.mq5 на графике с периодом H4. Какое значение должна содержать предопределенная переменная _Period в этом случае?


При этом заметьте, что индикатор "user_indicator" с указанным таймфреймом H12 вычисляется правильно, Вы это можете проверить самостоятельно.

//---
#property indicator_separate_window
#property indicator_buffers       1
#property indicator_plots         1
#property indicator_type1         DRAW_LINE
double     Buffer[];
int handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
   SetIndexBuffer(0,Buffer);

   Print("Call user_indicator PERIOD_H12");

   handle=iCustom(
                  Symbol(),
                  PERIOD_H12,
                  "user_indicator",
                  14
                  );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {

   if(BarsCalculated(handle)<=0) return(prev_calculated);
   double value[];
   if(CopyBuffer(handle,0,0,1,value)>0)
     {
     Print("value =",value[0]);
     }

//--- variables

   //Print("End...");
//---- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
speedyFr
62
speedyFr  
Rosh :


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

В справвке для раздела Периоды графиков сказано:

Итак, Вы вызываете пользовательский индикатор "user_indicator", указав для него период H12, из индикатора bug2.mq5 на графике с периодом H4. Какое значение должна содержать предопределенная переменная _Period в этом случае?


При этом заметьте, что индикатор "user_indicator" с указанным таймфреймом H12 вычисляется правильно, Вы это можете проверить самостоятельно.


я не говорил, что индикатор неправильно расчитывается...

 

мне просто хотелось бы знать как узнать текущий таймфрейм в ползовательском индикаторе вызываемого через iCustom

значения PERIOD_CURRENT , Perid(), _Period возвращают таймфрейм основного индикатора, а не пользовательского...

 

 

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