индикатор как ресурс в mql5. error 4802

 

Пытаюсь встроить индикатора в советника. Всё делаю по инструкции. НО!

При таком коде

#resource "\\Indicators\\Supertrend.ex5"

int Handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   string path= "::Indicators\\Supertrend.ex5";  
   Handle = iCustom(_Symbol,PERIOD_CURRENT,path,14,20,1);
   if(Handle<0)
   {
      printf("ERROR HANDle [%d]",GetLastError());
      return INIT_FAILED;
   }

Получаю вот такое:

2021.12.01 23:38:50.751 TestIndicator (EURUSD,H1) cannot load custom indicator 'C:\Users\evgen\AppData\Roaming\MetaQuotes\Terminal\9EB2973C469D24060397BB5158EA73A5\MQL5\Experts\TestIndicator\TestIndicator.ex5::Indicators\Supertrend.ex5' [4802]

при замене двоеточек на "косые" всё работает, но индикатор не встраивается.

Помогите разобраться. Может это индикатор какой-то "неправильный"?

 

Если используете что-то отличное от стандартного, начинайте проверку на стандартном:

//+------------------------------------------------------------------+
//|                                                     SampleEA.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#resource "\\Indicators\\Examples\\Accelerator.ex5"
int handle_ind;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   handle_ind=iCustom(_Symbol,_Period,"::Indicators\\Examples\\Accelerator.ex5");
   if(handle_ind==INVALID_HANDLE)
     {
      Print("Expert: iCustom call: Error code=",GetLastError());
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }

так Вы постепенно увидите свою ошибку.


Билд 3116

MetaTrader 5 x64 build 3116 started for MetaQuotes Software Corp.
Windows 11 build 22000, 12 x Intel Core i7-9750H  @ 2.60GHz, 13 / 31 Gb memory, 717 / 947 Gb disk, UAC, GMT+2
C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

даже подсказку даёт и сам компилирует индикатор, если индикатор не был скомпилирован ранее:

'Expert 1.mq5'  Expert 1.mq5    1       1
resource file '\Indicators\Examples\Accelerator.ex5' not found, trying to compile its source... Expert 1.mq5    6       11
'\Indicators\Examples\Accelerator.mq5' compiled successfully    Expert 1.mq5    6       11
code generated          1       1
0 errors, 0 warnings, 319 msec elapsed          1       1
 
Vladimir Karputov #:

Если используете что-то отличное от стандартного, начинайте проверку на стандартном:

так Вы постепенно увидите свою ошибку.


Билд 3116

даже подсказку даёт и сам компилирует индикатор, если индикатор не был скомпилирован ранее:

Так в том то и дело, что со стандартными такой проблемы нет.

И с этим индикатором если не обращаться к нему как к ресурсу через "::" тоже проблем нет.

Но мне он нужен встроенный (как ресурс) а вот тут и проблема.

 

Попробую разъяснить разницу.

вот так не работает. 

#resource "\\Indicators\\Supertrend.ex5"

int Handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   string path= "::Indicators\\Supertrend.ex5";  
   Handle = iCustom(_Symbol,PERIOD_CURRENT,path);
   if(Handle<0)
   {
      printf("ERROR HANDle [%d]",GetLastError());
      return INIT_FAILED;
   }

а вот так работает, но как с внешним:

#resource "\\Indicators\\Supertrend.ex5"

int Handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   string path= "\\Indicators\\Supertrend.ex5";  
   Handle = iCustom(_Symbol,PERIOD_CURRENT,path);
   if(Handle<0)
   {
      printf("ERROR HANDle [%d]",GetLastError());
      return INIT_FAILED;
   }
 
SanAlex #:

а вот так не подойдёт ?


Речь не о стандартном индикаторе.

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

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

 
Evgenii Matveev #:

Речь не о стандартном индикаторе.

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

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

У Вас индикатор НЕ СОЗАДЁТСЯ. Пример на основе папки "\\Indicators\\Examples\\" Вам был дан для изучения. 

В Вашем случае действует один закон: нет полного кода индикатора и советника, нет доказательств что индикатор размещен в нужной папке - никто Вам не сможет помочь, так как все телепаты уехали на корпаратив.

 
Vladimir Karputov #:

У Вас индикатор НЕ СОЗАДЁТСЯ. Пример на основе папки "\\Indicators\\Examples\\" Вам был дан для изучения. 

В Вашем случае действует один закон: нет полного кода индикатора и советника, нет доказательств что индикатор размещен в нужной папке - никто Вам не сможет помочь, так как все телепаты уехали на корпаратив.

Что значит не создаётся?

Вы хотите сказать не встраивается?  ех5 индикатора прекрасно создаётся и я его могу использовать как ВНЕШНИЙ. но мне нужен ВНУТРЕННИЙ

папка индикатора

сам индикатор 

//+------------------------------------------------------------------+
//|                                                   SuperTrend.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                                 https://mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com"
#property version   "1.00"
#property description "Olivier Seban's SuperTrend indicator"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots   1
//--- plot ST
#property indicator_label1  "SuperTrend"
#property indicator_type1   DRAW_COLOR_LINE
#property indicator_color1  clrGreen,clrRed,clrDarkGray
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- enums
enum ENUM_INPUT_YES_NO
  {
   INPUT_YES   =  1, // Yes
   INPUT_NO    =  0  // No
  };
//--- input parameters
input uint              InpPeriod      =  14;         // Period
input uint              InpShift       =  20;         // Shift
input ENUM_INPUT_YES_NO InpUseFilter   =  INPUT_YES;  // Use filter
//--- indicator buffers
double         BufferST[];
double         BufferColors[];
double         BufferFlag[];
double         BufferCCI[];
//--- global variables
double         shift;
int            period_cci;
int            handle_cci;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- set global variables
   period_cci=int(InpPeriod<2 ? 2 : InpPeriod);
   shift=InpShift*Point();
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferST,INDICATOR_DATA);
   SetIndexBuffer(1,BufferColors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,BufferFlag,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,BufferCCI,INDICATOR_CALCULATIONS);
//--- setting indicator parameters
   IndicatorSetString(INDICATOR_SHORTNAME,"SuperTrend ("+(string)period_cci+","+(string)InpShift+")");
   IndicatorSetInteger(INDICATOR_DIGITS,Digits());
//--- setting buffer arrays as timeseries
   ArraySetAsSeries(BufferST,true);
   ArraySetAsSeries(BufferColors,true);
   ArraySetAsSeries(BufferFlag,true);
   ArraySetAsSeries(BufferCCI,true);
//--- create cci handle
   ResetLastError();
   handle_cci=iCCI(NULL,PERIOD_CURRENT,period_cci,PRICE_TYPICAL);
   if(handle_cci==INVALID_HANDLE)
     {
      Print("The iCCI(",(string)period_cci,") object was not created: Error ",GetLastError());
      return INIT_FAILED;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- Установка массивов буферов как таймсерий
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);
//--- Проверка и расчёт количества просчитываемых баров
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-2;
      ArrayInitialize(BufferST,EMPTY_VALUE);
      ArrayInitialize(BufferColors,2);
      ArrayInitialize(BufferFlag,0);
      ArrayInitialize(BufferCCI,0);
     }

//--- Подготовка данных
   int count=(limit>1 ? rates_total : 1);
   ResetLastError();
   int copied=CopyBuffer(handle_cci,0,0,count,BufferCCI);
   if(copied!=count) return 0;

//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      double CCI=BufferCCI[i];
      BufferST[i]=BufferST[i+1];
      BufferFlag[i]=BufferFlag[i+1];
      BufferColors[i]=2;

      if(CCI>0 && BufferFlag[i]<=0)
        {
         BufferFlag[i]=1;
         BufferST[i]=low[i]-shift;
        }

      if(CCI<0 && BufferFlag[i]>=0)
        {
         BufferFlag[i]=-1;
         BufferST[i]=high[i]+shift;
        }

      BufferST[i]=
        (
         BufferFlag[i]>0 && low[i]-shift>BufferST[i+1] ? low[i]-shift :
         BufferFlag[i]<0 && high[i]+shift<BufferST[i+1] ? high[i]+shift :
         BufferST[i]
        );

      if(InpUseFilter)
        {
         if(BufferFlag[i]>0 && BufferST[i]>BufferST[i+1])
           {
            if(close[i]<open[i])
               BufferST[i]=BufferST[i+1];
            if(high[i]<high[i+1])
               BufferST[i]=BufferST[i+1];
           }
         if(BufferFlag[i]<0 && BufferST[i]<BufferST[i+1])
           {
            if(close[i]>open[i])
               BufferST[i]=BufferST[i+1];
            if(low[i]>low[i+1])
               BufferST[i]=BufferST[i+1];
           }
        }

      if(close[i]>BufferST[i])
         BufferColors[i]=0;
      else
         BufferColors[i]=1;
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

сам советник (точнее это просто тест для проверки встраивания) 

//+------------------------------------------------------------------+
//|                                                TestIndicator.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#resource "\\Indicators\\Supertrend.ex5"

int Handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   string path= "::Indicators\\Supertrend.ex5";  
   Handle = iCustom(_Symbol,PERIOD_CURRENT,path,14,20,1);
   if(Handle<0)
   {
      printf("ERROR HANDle [%d]",GetLastError());
      return INIT_FAILED;
   }
   printf("TODAY: %s",TimeToString(iTime(_Symbol,PERIOD_D1,0),TIME_DATE|TIME_SECONDS));
//---
   return(INIT_SUCCEEDED);
  }

Что во всём этом не так?

вот выдержка из справочника

Работа с пользовательскими индикаторами, подключенными в качестве ресурсов

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

Пример подключения и использования пользовательского индикатора SampleIndicator.ex5, расположенного в папке: каталог_данных_терминала\MQL5\Indicators\:



//+------------------------------------------------------------------+ 
//|                                                     SampleEA.mq5 | 
//|                        Copyright 2013, MetaQuotes Software Corp. | 
//|                                             https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#resource "\\Indicators\\SampleIndicator.ex5" 
int handle_ind; 
//+------------------------------------------------------------------+ 
//| Expert initialization function                                   | 
//+------------------------------------------------------------------+ 
int OnInit() 
  { 
//--- 
   handle_ind=iCustom(_Symbol,_Period,"::Indicators\\SampleIndicator.ex5"); 
   if(handle_ind==INVALID_HANDLE) 
     { 
      Print("Expert: iCustom call: Error code=",GetLastError()); 
      return(INIT_FAILED); 
     } 
//--- 
 

Я уже голову сломал.

Может телепаты с кооператива всё же заглянут и посмотрят и объяснят в чём причина.

Предвидя ещё вопросы :  

 
Evgenii Matveev #:

вот так работает 

//+------------------------------------------------------------------+
//|                                              Evgenii Matveev.mq5 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#resource "\\Indicators\\SuperTrend.ex5"
//--- enums
enum ENUM_INPUT_YES_NO
  {
   INPUT_YES   =  1, // Yes
   INPUT_NO    =  0  // No
  };
//--- input parameters
input uint              InpPeriod      =  14;         // Period
input uint              InpShift       =  20;         // Shift
input ENUM_INPUT_YES_NO InpUseFilter   =  INPUT_YES;  // Use filter
int Handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   string path= "::Indicators\\SuperTrend.ex5";  
   Handle = iCustom(_Symbol,PERIOD_CURRENT,path,InpPeriod,InpShift,InpUseFilter);
   if(Handle<0)
   {
      printf("ERROR HANDle [%d]",GetLastError());
      return INIT_FAILED;
   }
   //---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
 
Evgenii Matveev #:

Может телепаты с кооператива всё же заглянут и посмотрят и объяснят в чём причина.

Я думаю вот ваша проблема

   Handle = iCustom(_Symbol,PERIOD_CURRENT,path,14,20,1);
 

Причину нашёл тестовым путём.

Советник лежит в подкаталоге \Experts\TestIndicator.


Если его перенести в основной каталог \Experts  то всё начинает работать и встраиваться.

Подскажите как сделать, чтобы и в подкаталоге это работало?

 
SanAlex #:

вот так работает 

Давайте проведём эксперимент. Перенесите файл в подкаталог и попробуйте скомпилировать и запустить.

результаты Вас сильно удивят.