Почему не работает пример из документации по iCustom?

 

Почему не работает пример из документации по iCustom?


https://www.mql5.com/ru/docs/indicators/icustom

Пример из документации компилируется без ошибок.

При запуске индикатора появляется сообщение

cannot load custom indicator 'Custom Moving Average' [4802] 

и, соответственно, появляются ошибки при выполнении CopyBuffer


Почему не загружается индикатор?

Документация по MQL5: Технические индикаторы / iCustom
Документация по MQL5: Технические индикаторы / iCustom
  • www.mql5.com
Технические индикаторы / iCustom - Документация по MQL5
 
Должен быть такой индикатор "Custom Moving Average" в папке индикаторов, чтобы его можно было вызывать. В примере показано только обращение к нему.
 
marketeer:
Должен быть такой индикатор "Custom Moving Average" в папке индикаторов, чтобы его можно было вызывать. В примере показано только обращение к нему.
Изначально я тоже хотел отписать данный ответ, но продублировав на своем терминале, я не обнаружил ни каких сообщений в логах, хотя только окно индикатора открылось и все... из-за этого у меня появились другие вопросы которые я пытаюсь выяснить/разобраться с этим.
 
marketeer:
Должен быть такой индикатор "Custom Moving Average" в папке индикаторов, чтобы его можно было вызывать. В примере показано только обращение к нему.

Спасибо за наводку, я нашел причину. Индикатор создать догадался, но вызывающий и вызываемый индикатор находились в папке. Работает, если указать "test\Custom Moving Average"

 

Еще один вопрос.

Есть два индикатора, они находятся в одной папке. Второй индикатор вызвается первым. Если я переименовываю папку, связка перестает работать. Как преодолеть такую ситуацию? Вижу такие способы решения:

1) Указать папку в параметрах. Этот вариант мне кажется неудобным.

2) Перекомпиляция. Еще хуже. 

3) Узнать, в какой папке находится вызывающий индикатор, и подставить эту папку в iCustom. Можно ли осуществить это средствами mql5?

4)  Каким-то способом заставить использовать по умолчанию индикаторы из той же папки, где находится вызывающий индикатор. Существует ли такая возможность? Этот вариант мне кажется идеальным.

 
По варианту 4 попробуйте ".\Custom Moving Average". Я сам не проверял.
 
marketeer:
По варианту 4 попробуйте ".\Custom Moving Average". Я сам не проверял.
cannot load custom indicator '.\Custom Moving Average' [4802]
 
alxm:

4)  Каким-то способом заставить использовать по умолчанию индикаторы из той же папки, где находится вызывающий индикатор. Существует ли такая возможность? Этот вариант мне кажется идеальным.

https://www.mql5.com/ru/docs/constants/environment_state/mql5_programm_info

Для функции MQL5InfoString()

ENUM_MQL5_INFO_STRING

Идентификатор

Описание

Тип свойства

MQL5_PROGRAM_NAME

Имя запущенной mql5-программы

string

MQL5_PROGRAM_PATH

Путь для данной запущенной программы

string

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе - Документация по MQL5
 

MetaDriver:

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

Первые два варианта можно смело забыть. Буду рад услышать предложения по четвертому.

 
alxm:

MetaDriver:

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

Первые два варианта можно смело забыть. Буду рад услышать предложения по четвертому.

https://www.mql5.com/ru/docs/constants/namedconstants/compilemacros


Предопределенные макроподстановки

Для облегчения отладки и получения информации о работе mql5-программы введены специальные константы-макросы, значения которых устанавливается в момент компиляции. Самый простой путь использования этих констант – вывод значений с помощью функции Print(), как показано в примере.

Константа

Описание

__DATE__

Дата компиляции файла без времени (часы, минуты и секунды равны 0)

__DATETIME__

Дата и время компиляции файла

__LINE__

Номер строки в исходном коде, на которой расположен данный макрос

__FILE__

Имя текущего компилируемого файла

__PATH__

Абсолютный путь к текущему компилируемому файлу

__FUNCTION__

Имя функции, в теле которой расположен макрос

__FUNCSIG__

Сигнатура функции, в теле которой расположен макрос. Вывод в лог полного описания функции с типами параметров может пригодиться при идентификации перегруженных функций

__MQ5BUILD__

Номер билда компилятора

--

Это лучше.  

Использование:

 MyInd_handle=iCustom(MySymbol,MyTimeFrame, __PATH__+"/IndicatorName.ex5",
                     param1, param2, param3,  ,  , PriceTypeOrInputHandle);
// Нащёт слеша перед IndicatorName точно  не уверен, попробуй и так и без слеша и \\ тоже попробуй.
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки - Документация по MQL5
 
MetaDriver:

Это лучше.  

MyInd_handle=iCustom(MySymbol,MyTimeFrame, __PATH__+"/IndicatorName.ex5", param1, param2, param3, , , PriceTypeOrInputHandle); 

// Нащёт слеша перед IndicatorName точно  не уверен, попробуй и так и без слеша и \\ тоже попробуй.

Это хуже, и слеши вряд ли смогут помочь.

Во-первых,  __PATH__ не дает удобства, все равно потребуется дополнительный код для разбора строки:

__PATH__
C:\Users\user\AppData\Roaming\MetaQuotes\Terminal\...\MQL5\Indicators\test\iFirst.mq5
MQL5InfoString(MQL5_PROGRAM_PATH)
C:\Users\user\AppData\Roaming\MetaQuotes\Terminal\...\MQL5\Indicators\test\iFirst.ex5
Во-вторых, при переименовании папки или переносе уже скомпилировнного индикатора в другую папку __PATH__ не отражает этих изменений, что, собственно, подтверждается документацией.
 
 

Если кому интересно, выкладываю рабочий код:

  const string pathCut = "\\MQL5\\Indicators\\";    //обрезается все, что левее этой строки
  string path = MQL5InfoString(MQL5_PROGRAM_PATH);  //путь к вызывающему индикатору
  //отрезаем физический путь (левая часть)
  int i = StringFind( path, pathCut );
  if( i+1 )
    path = StringSubstr( path, i+StringLen(pathCut) );
  //отрезаем имя файла вызывающего индикатора (правая часть)
  for( i=StringLen(path)-1; i>=0; i-- )
    if( StringGetCharacter(path,i)=='\\' )
      break;
  path = StringSubstr( path, 0, i+1 );
   
  ResetLastError();
  MA_handle=iCustom(NULL,0,path+"Custom Moving Average", MA_Period, MA_Shift, MA_Method, PRICE_CLOSE );
Буду рад услышать о более простых способах решения.


 

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