Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1018

 
Alexey Viktorov:

С такими именами сложно что-то понять. У меня с подключением индикаторов в качестве ресурсов проблем нету.


Наличие исходника (.mq5) обязательно?

Alexey Viktorov:

А при каких делах тут

А разве это влияет на подключение ресурса? 

 
Сергей Таболин:

Наличие исходника (.mq5) обязательно?

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

// close.mql5
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

double buff[];

int OnInit()
  {
   SetIndexBuffer(0,buff,INDICATOR_DATA);
   return(INIT_SUCCEEDED);
  }

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[])
  {
   int i,limit;
   if(prev_calculated==0) limit=0; else limit=prev_calculated-1;
   for(i=limit;i<rates_total;i++) buff[i]=close[i];
   return(rates_total);
  }

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

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#resource "close.ex5"

//--- indicator buffers
double         Label1Buffer[];
int handle;

int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   handle = iCustom(Symbol(),0,"::close.ex5");
   if(handle == INVALID_HANDLE)                                         // проверяем наличие хендла индикатора
   {
      Print("Не удалось получить хендл индикатора handle_MA");             // если хендл не получен, то выводим сообщение в лог об ошибке
      return(INIT_FAILED);                                                 // завершаем работу с ошибкой
   }
//---
   return(INIT_SUCCEEDED);
  }

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[])
  {
//---
   int copy=CopyBuffer(handle,0,0,rates_total,Label1Buffer); 
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
Igor Makanu:

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

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

//+------------------------------------------------------------------+
//|                                                       myHMA5.mq5 |
//|                                          Copyright 2019.03, Test |
//|                                         /ru |
//+------------------------------------------------------------------+
#property   copyright               "Copyright 2019, Test"
#property   link                    "/ru"
#property   version                 "1.21"
//----------------------------------------------------------------------------------------------
#resource   "\\Indicators\\Market\\HMA5.ex5"
//----------------------------------------------------------------------------------------------
//#property   strict
#property   indicator_chart_window
#property   indicator_buffers       3
#property   indicator_plots         1

#property   indicator_label1        "myHMA5"
#property   indicator_type1         DRAW_COLOR_LINE
#property   indicator_color1        clrLime,clrRed
#property   indicator_style1        STYLE_SOLID
#property   indicator_width1        2 
//----------------------------------------------------------------------------------------------
//--- input parameters
input int      InpPeriodMA          = 45; // MA period
//--- indicator buffers
double         Buffer0[];
double         Buffer1_Color[];
int            handle_MA;                 // переменная для хранения хэндла индикатора HMA5
double         buffer_MA[];               // массив для хранения значений индикатора HMA5
int            ma_bars_calculated   = 0; 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArraySetAsSeries(Buffer0         ,true);
   ArraySetAsSeries(Buffer1_Color   ,true);
   ArraySetAsSeries(buffer_MA       ,true);

   SetIndexBuffer(0,Buffer0         ,INDICATOR_DATA);
   SetIndexBuffer(1,Buffer1_Color   ,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,buffer_MA       ,INDICATOR_CALCULATIONS);

   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,-1);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,-1);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,-1);
//--- set shortname and change label
   string short_name="myHMA5("+
                              IntegerToString(InpPeriodMA)
                              +")";
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
   PlotIndexSetString(0,PLOT_LABEL,short_name);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpPeriodMA);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpPeriodMA);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,InpPeriodMA);

   handle_MA = iCustom(Symbol(),0,"::Indicators\\Market\\HMA5.ex5",InpPeriodMA);
   if(handle_MA == INVALID_HANDLE)                                         // проверяем наличие хендла индикатора
   {
      Print("Не удалось получить хендл индикатора handle_MA");             // если хендл не получен, то выводим сообщение в лог об ошибке
      return(INIT_FAILED);                                                 // завершаем работу с ошибкой
   }

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
  {
   
   int ma_values_to_copy; 
   int ma_calculated = BarsCalculated(handle_MA); 
   if(ma_calculated <= 0){ 
      PrintFormat("BarsCalculated() вернул %d, код ошибки %d",ma_calculated,GetLastError()); 
      return(0); 
     }  
   if(prev_calculated == 0 || ma_calculated != ma_bars_calculated || rates_total > prev_calculated + 1){ 
      if(ma_calculated > rates_total) ma_values_to_copy = rates_total; 
      else ma_values_to_copy = ma_calculated; 
     } else { 
      ma_values_to_copy = (rates_total - prev_calculated) + 1; 
     } 
     
   if(CopyBuffer(handle_MA,0,0,ma_values_to_copy,buffer_MA) < 0 ) // копируем данные из индикаторного массива в массив buffer_MA
   {                                                                                // если не скопировалось
      Print("Не удалось скопировать данные из индикаторного буфера в buffer_MA");   // то выводим сообщение об ошибке
      return(0);                                                                    // и выходим из функции
   }

   for(int i = 0; i < ma_values_to_copy; i++)
   {
      Buffer0[i]        = buffer_MA[i];
      
      Buffer1_Color[i]  = 0;
      if(NormalizeDouble(Buffer0[i],Digits()) == NormalizeDouble(Buffer0[i+1],Digits())) Buffer1_Color[i] = Buffer1_Color[i+1];
      else
      if(Buffer0[i] > Buffer0[i+1]) Buffer1_Color[i] = 0;
      else
      if(Buffer0[i] < Buffer0[i+1]) Buffer1_Color[i] = 1;
      else                          Buffer1_Color[i] = Buffer1_Color[i+1];
   }
   
   return(rates_total);
  }
//+------------------------------------------------------------------+

Попробуете?

 
Сергей Таболин:

Попробуете?

Вообще никаких проблем даже без правок вашего кода.


 
Igor Makanu:

увы, это не ко мне, с МТ5 я не сильно дружу, но Вы можете использовать мои примеры, чтобы найти почему у Вас ресурс не подключился, удалите исходник индикатора close.mql5 и попробуйте затем скомпилировать основной индикатор используя close.ex5.... нужно проверять почему не работает, я почему то думаю, что это защита от Маркета не дает Вам сделать ресурс

О! Я сча попробую подключить ресурсом свой индикатор.

 
Alexey Viktorov:

Вообще никаких проблем даже без правок вашего кода.


Прикольно... (((

Что ж у меня не так?....

 
Igor Makanu:

увы, это не ко мне, с МТ5 я не сильно дружу, но Вы можете использовать мои примеры, чтобы найти почему у Вас ресурс не подключился, удалите исходник индикатора close.mql5 и попробуйте затем скомпилировать основной индикатор используя close.ex5.... нужно проверять почему не работает, я почему то думаю, что это защита от Маркета не дает Вам сделать ресурс

Никакая защита маркета не мешает на одном компе в разных терминалах работать подключенному ресурсом индикатору. Пример выше.
 

Вроде заработало. Спасибо.

А теперь столкнулся с другой ошибкой.

array out of range ругается на

   for(int i = 0; i < ma_values_to_copy; i++)
   {
      double   noise    = high[i]-low[i]+high[i+1]-low[i+1]+high[i+2]-low[i+2]; // array out of range

при этом индикатор рисуется...

 
Сергей Таболин:

Вроде заработало. Спасибо.

А теперь столкнулся с другой ошибкой.

array out of range ругается на

при этом индикатор рисуется...

high[i+1]
low[i+1]
high[i+2]
low[i+2] 
при значении i >= ma_values_to_copy даст такую ошибку

И тут у тебя "есть 2 путя":

1 .

for(int i = 0; i < (ma_values_to_copy-2); i++)
2. 
for(int i = 2; i < ma_values_to_copy; i++)
{
        double   noise    = high[i-2]-low[i-2]+high[i-1]-low[i-1]+high[i]-low[i];
      
 
Oleg Peiko:

И тут у тебя "есть 2 путя":

1 .

2.       

Первая путя помогла )))) Спасибо.

Ещё вопрос: Отрываю в индикаторе 3 экземпляра индикатора для получения данных с разных ТФ. Но при прикреплении оного к графику получаю такую распринтовку:

2019.03.23 20:59:05.531 my_HMA5_123 (USDCHF,M30)        Скопирован индикаторный буфер в buffer_MA
2019.03.23 20:59:05.531 my_HMA5_123 (USDCHF,M30)        Не удалось скопировать данные из индикаторного буфера в buffer_MA2
2019.03.23 20:59:05.703 my_HMA5_123 (USDCHF,M30)        Скопирован индикаторный буфер в buffer_MA
2019.03.23 20:59:05.704 my_HMA5_123 (USDCHF,M30)        Скопирован индикаторный буфер в buffer_MA2
2019.03.23 20:59:05.704 my_HMA5_123 (USDCHF,M30)        Скопирован индикаторный буфер в buffer_MA3

Что бы это значило?

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