Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2606

 
Alexey Viktorov #:

В MQL5 надо создать семь хендлов индикатора и семь массивов для CopyBuffer()

Пусть будет массив с одним значением ind_M1[1], ind_M15[1], но без массива никак.

Проблема в том, что они вызываются только на активном графике.
Вот простой пример:


//---- indicator settings

#property indicator_chart_window

#property indicator_buffers 1

#property indicator_plots   0

//---- plot Label1

#property indicator_label1  "Label1"

#property indicator_type1   DRAW_LINE

#property indicator_color1  clrRed

#property indicator_style1  STYLE_SOLID

#property indicator_width1  1

//--- input parameters

input int      SizeLabel         =  9;

input color    ModifyColorLabel  =  Khaki;


//--- indicator buffers

double         Label1Buffer[];

int SWT_handle;

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

//| Custom indicator initialization function                         |

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

int OnInit()

  {

//--- indicator buffers mapping

   SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);

   ResetLastError();

   SWT_handle = iCustom(NULL, PERIOD_D1, "SWT", true, true);

   Print("SWT_handle = ", SWT_handle, "  error = ", GetLastError());

//---

   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[])

  {

//--- скопируем значения индикатора Custom Moving Average в наш индикаторный буфер

   int copy = CopyBuffer(SWT_handle, 11, 0, rates_total, Label1Buffer);

   Print("copy =", copy, "    rates_total =", rates_total);

//--- если попытка неудачная - сообщим об этом

   if(copy <= 0)

      Print("Неудачная попытка получить значения индикатора Custom Moving Average");

//--- return value of prev_calculated for next call


   ObjectCreate(0, "Mid", OBJ_LABEL, 0, 0, 0);

   ObjectSetInteger(0, "Mid", OBJPROP_CORNER, CORNER_LEFT_UPPER);

   ObjectSetInteger(0, "Mid", OBJPROP_XDISTANCE, 5);

   ObjectSetInteger(0, "Mid", OBJPROP_YDISTANCE, 56);

   ObjectSetInteger(0, "Mid", OBJPROP_FONTSIZE, 9);

   ObjectSetString(0, "Mid", OBJPROP_FONT, "Franklin Gothic Medium");

   ObjectSetString(0, "Mid", OBJPROP_TEXT, "Medium ");

   ObjectSetInteger(0, "Mid", OBJPROP_COLOR, ModifyColorLabel);


   ObjectCreate(0, "Mid _Vol", OBJ_LABEL, 0, 0, 0);

   ObjectSetInteger(0, "Mid _Vol", OBJPROP_CORNER, CORNER_LEFT_UPPER);

   ObjectSetInteger(0, "Mid _Vol", OBJPROP_XDISTANCE, 55);

   ObjectSetInteger(0, "Mid _Vol", OBJPROP_YDISTANCE, 56);

   ObjectSetInteger(0, "Mid _Vol", OBJPROP_FONTSIZE, 9);

   ObjectSetString(0, "Mid _Vol", OBJPROP_FONT, "Franklin Gothic Medium");

   ObjectSetString(0, "Mid _Vol", OBJPROP_TEXT, DoubleToString(Label1Buffer[rates_total-1], _Digits));  // _Digits вместо Digits

   ObjectSetInteger(0, "Mid _Vol", OBJPROP_COLOR, ModifyColorLabel);

   return(rates_total);

  }
Работает только на D1, на остальных т/ф показывает нули...
А мне нужно, чтобы данные отображались на любом таймфрейме.
P.S. Это простой пример, чтобы не загромождать суть.
Указаны данные индикатора с таймфрейма D1

SWT_handle = iCustom(NULL, PERIOD_D1, "SWT", true, true);

Но как только я перехожу на таймфрейм Н4, эти данные перестают получаться.
В МТ4 такого не было. Вызов давал данные для D1 независимо от того, на каком т/ф был установлен индикатор.

 
Nikolay Skrigan #:

Проблема в том, что они вызываются только на активном графике.
Вот простой пример:


Работает только на D1, на остальных т/ф показывает нули...
А мне нужно, чтобы данные отображались на любом таймфрейме.

Научитесь вставлять код.

Я вам сказал, что надо создать 7 хендлов, а у вас всего один

SWT_handle = iCustom(NULL, PERIOD_D1, "SWT", true, true);
 
Tretyakov Rostyslav #:
Семь хендлов согласен, а семь массивов нет необходимости.

Тогда придётся на каждом чихе перезаписывать массив. Конечно в некоторых случаях можно и мизинцем правой ноги почесать левое ухо, а надо ли это?

 
Alexey Viktorov #:

Тогда придётся на каждом чихе перезаписывать массив. Конечно в некоторых случаях можно и мизинцем правой ноги почесать левое ухо, а надо ли это?

В данном случае человеку нужны текущие показания

//+------------------------------------------------------------------+
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[])
  {
//---
   double m01 = GetIndicator(m01Handle,0);
   double m05 = GetIndicator(m05Handle,0);
   double m15 = GetIndicator(m15Handle,0);
   double m30 = GetIndicator(m30Handle,0);
   double h01 = GetIndicator(h01Handle,0);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
double GetIndicator(const int handle, const int i)
{
   double res[1];
   if(CopyBuffer(handle, 0, i, 1, res) <= 0) return 0;
   return res[0];
}
 
Alexey Viktorov #:

Научитесь вставлять код.

Я вам сказал, что надо создать 7 хендлов, а у вас всего один

Ну и?
У меня это реализовано, но что толку, если на каждом т/ф работает только один из них, для активного т/ф. А остальные нулевые.
Я конечно могу привести код со всей семеркой, но вопрос то не в этом. 
Вопрос в том, как сделать так, и можно ли сделать так, чтобы данные для D1 получались вне зависимости от того, на D1 я нахожусь или на М15 или другом т/ф.
Сейчас же данные для D1 получаются только на D1. На остальных параметр просто не рассчитывается.

 
Tretyakov Rostyslav #:

В данном случае человеку нужны текущие показания

Да, текущие. И для всех т/ф одновременно.
И мне сказали, что в MQL5 это невозможно. Хочу уточнить ситуацию.

В МТ4 у меня был простенький списочек:

      VolIhT   =   iCustom(NULL, 1, "SWT",  10, 0) ;
      VolHT    =  iCustom(NULL, 1, "SWT",  15, 0) ;
      VolIT    =  iCustom(NULL, 5, "SWT",  15, 0) ;
      VolDT    =  iCustom(NULL, 15, "SWT", 15, 0);
      VolWT    = (iCustom(NULL, 60, "SWT", 15, 0);
      VolST    =  iCustom(NULL, 240, "SWT", 15, 0);
      VolMT    = (iCustom(NULL, 1440, "SWT", 15, 0);
      VolLT    =  iCustom(NULL, 10080, "SWT", 15, 0);
      VolBT    =  iCustom(NULL, 10080, "SWT", 17, 0);

И я имел все 9 значений независимо от текущего т/ф графика. В МТ5  я имею данные только для текущего т/ф.

 
Nikolay Skrigan #:

Ну и?
У меня это реализовано, но что толку, если на каждом т/ф работает только один из них, для активного т/ф. А остальные нулевые.
Я конечно могу привести код со всей семеркой, но вопрос то не в этом. 
Вопрос в том, как сделать так, и можно ли сделать так, чтобы данные для D1 получались вне зависимости от того, на D1 я нахожусь или на М15 или другом т/ф.
Сейчас же данные для D1 получаются только на D1. На остальных параметр просто не рассчитывается.

Почему мы это не видим?

 
Nikolay Skrigan #:
И мне сказали, что в MQL5 это невозможно.

Не там, и не с теми общаетесь... Говорить можно что угодно...

— Доктор, больше 3-х раз в неделю с женой не получается.
— Дед, а лет тебе сколько?
— 85.
— Дед, ну это же превосходно!
— Да? А мой сосед говорит, что с женой ежедневно, а ему 95!
— Ну так и вы говорите!

 
Nikolay Skrigan #:
      VolIhT   =   iCustom(NULL, 1, "SWT",  10, 0) ;
      VolHT    =  iCustom(NULL, 1, "SWT",  15, 0) ;
      VolIT    =  iCustom(NULL, 5, "SWT",  15, 0) ;
      VolDT    =  iCustom(NULL, 15, "SWT", 15, 0);
      VolWT    = (iCustom(NULL, 60, "SWT", 15, 0);
      VolST    =  iCustom(NULL, 240, "SWT", 15, 0);
      VolMT    = (iCustom(NULL, 1440, "SWT", 15, 0);
      VolLT    =  iCustom(NULL, 10080, "SWT", 15, 0);
      VolBT    =  iCustom(NULL, 10080, "SWT", 17, 0);

Я Вам показал.

Сделайте хендлы для кажого ТФ и запрашивайте текущее значение

//+------------------------------------------------------------------+
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[])
  {
//---
   double m01 = GetIndicator(m01Handle,0);
   double m05 = GetIndicator(m05Handle,0);
   double m15 = GetIndicator(m15Handle,0);
   double m30 = GetIndicator(m30Handle,0);
   double h01 = GetIndicator(h01Handle,0);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
double GetIndicator(const int handle, const int i)
{
   double res[1];
   if(CopyBuffer(handle, 0, i, 1, res) <= 0) return 0;
   return res[0];
}

 
Tretyakov Rostyslav #:

Я Вам показал.

Сделайте хендлы для кажого ТФ и запрашивайте текущее значение

Ок, спасибо. Попробую разобраться. Я с MQL5 только начинаю. У меня на МТ4 давно реализован комплект из 5 индикаторов. И все устраивает, но МТ4 умирает и приходится думать о будущем. Три основных на МТ5 переделал. А два сервисных, для отображения сводной информации, осталось, в них идут вызовы данных из внешних индикаторов и с этим у меня пока что полный затык. Я уже не говорю, что куча проблем ожидается с роботом.
Кавалерийским наскоком не получится, буду разбираться...