Как использовать индикатор который не влазит в iCustom - страница 4

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Как использовать индикатор который не влазит в iCustom

Galina Bobro, 2017.12.24 09:50

Проверила - на 59-м пераметре iCustom не лезет. 

'iCustom' - wrong parameters count      _add_indicator.mq4      476     11

Вроде как "количество неправильных параметров" - ни где про ограничения не пишут.

В справке есть такое дело - Если в пользовательском индикаторе используется функция OnCalculate первого вида (то есть, индикатор считается на одном массиве данных), то в качестве последнего параметра при вызове такого пользовательского индикатора должно выступать одно из значений ENUM_APPLIED_PRICE либо хэндл другого индикатора. При этом все параметры, соответствующие input-переменным, должны быть явно указаны.

 
Galina Bobro:

Индикатор не мой, это заказ. 

Что вы имеете ввиду под прокладкой? каким образом? Эту тему и открыла для того чтоб узнать как

Показываю изготовление прокладки на примере. Есть индикатор Alligator.mq4 - думаю, у всех есть в индикаторах. У него  6 параметров - хочу 2. Делаю прокладку с нужными параметрами. Вот скрипт вызова индикатора и прокладки. Максимум в функции iCustom 64 параметра. Первые 3: Символ, таймфрейм, Имя индикатора. Далее до 59 параметров индикатора - неужели у Вашего индикатора больше?!!    И в конце ОБЯЗАТЕЛЬНО !!! номер буфера и номер бара
//+----------------------------------------------------------+
//| Примеры вызова индикатора и прокладки                    |
//+----------------------------------------------------------+
#property strict

void start() 
{
   Alert("-------------------");
   double                                      // Последние 2 параметра: Номера буфера и бара обязательны!!!
   x=iCustom(NULL,0,"Alligator", /* пропускаю параметры*/    0,0); 
   Alert(x);
                                  // Параметры по умолчанию - но результат тот же
   x=iCustom(NULL,0,"Alligator",    13,   8, 8, 5,5,3,       0,0); 
   Alert(x);
                                  // Часть параметров - но результат тот же
   x=iCustom(NULL,0,"Alligator",    13,   8,/*часть пропущ*/ 0,0); 
   Alert(x);

   // Максимум 64 параметра: Символ, таймфрейм, Имя,
   //                        59 параметров индикатора
   //                        Буфер, Бар
   x=iCustom(NULL,0,"Alligator",    13,   8, 8, 5,5,3,
                       3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,        // Параметры лишние - но результат тот же
                       3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
                       3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,  0,0); 
   Alert(x);

// А это вызов с нужными мне параметрами 
   x=iCustom(NULL,0,"Alligator",    13,  11, 11, 5,5,3,      0,0); 
   Alert(x);

   // Вызываю прокладку с нужными мне параметрами - результат тот же
   x=iCustom(NULL,0,"Alliga",            11,11,              0,0); 
   Alert(x);
}

Первые 4 вызова нижние дают один и тот же результат. Скрин:

//+------------------------------------------------------------------+
//| Прокладка к аллигатору                                Alliga.mq4 |
//+------------------------------------------------------------------+
#property strict

#property indicator_chart_window  // Или indicator_separate_window
#property indicator_buffers 3     // Сколько нужно
#property indicator_color1  Blue  // Цвет который нужно
#property indicator_color2  Red
#property indicator_color3  Lime

//---- input parameters
input int Param_1=8;   // Jaws Shift  Названия из окна данных
input int Param_2=8;   // Teeth Period

double Buf_0[], Buf_1[], Buf_2[];  //---- indicator buffers сколько надо

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit(void)
  {
   IndicatorDigits(Digits);

   SetIndexDrawBegin(0,1000);
   SetIndexDrawBegin(1,1000);
   SetIndexDrawBegin(2,1000);

   SetIndexBuffer(0,Buf_0);
   SetIndexBuffer(1,Buf_1);
   SetIndexBuffer(2,Buf_2);

   SetIndexStyle(0,DRAW_LINE);   // Или что надо
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_LINE);

   SetIndexLabel(0,"Gator Jaws");  // Названия взять в Окне Данных
   SetIndexLabel(1,"Gator Teeth");
   SetIndexLabel(2,"Gator Lips");
  }

//+------------------------------------------------------------------+
//| Bill Williams' Alligator                                         |
//+------------------------------------------------------------------+
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 limit=rates_total-prev_calculated;
   for(int i=0; i<limit; i++)
   {
      //---- Заполнение буферов сколько надо                              № буфера
      Buf_0[i]=iCustom(NULL,0, "Alligator", 13, Param_1, Param_2, 5,5,3,  0,        i);
      Buf_1[i]=iCustom(NULL,0, "Alligator", 13, Param_1, Param_2, 5,5,3,  1,        i);
      Buf_2[i]=iCustom(NULL,0, "Alligator", 13, Param_1, Param_2, 5,5,3,  2,        i);
   }

   return(rates_total);
}
 
Galina Bobro:

Индикатор не мой, это заказ.

Скажите название - сами найдем на просторах НЕТА

 
STARIJ:

Скажите название - сами найдем на просторах НЕТА

Приеду кину подключение что не работает.
Не пойдёт с вашей прокладкой, отписывалась в первом ещё ответе - даже самые важные настройки в 59 не лезут.
 
Galina Bobro:

Уже изобрела "систему нипель" на основании анализа пикселей графика, если нет нормального иного решения - скорей всего и выложу потом.

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

 
Stanislav Korotky:

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

Важный параметр индикатора находится на 60 или далее месте. Использование iCustom отпадает. Тогда она запускает на графике индикатор с нужными параметрами и анализирует по пикселям рисунок на экране. Есть функция, которая возвращает цвет пикселя по заданным координатам ЭКРАНА. Всего-то и надо: определить, где находится на экране окно терминала - а вдруг поверху открыли чужое окно. Далее найти, где в окне терминала дочернее окно нужного графика - а вдруг оно свернуто или закрыто другим графиком. Далее, анализируя цвета пикселей распознать стрелку ...

 
STARIJ:

Важный параметр индикатора находится на 60 или далее месте. Использование iCustom отпадает. Тогда она запускает на графике индикатор с нужными параметрами и анализирует по пикселям рисунок на экране. Есть функция, которая возвращает цвет пикселя по заданным координатам ЭКРАНА. Всего-то и надо: определить, где находится на экране окно терминала - а вдруг поверху открыли чужое окно. Далее найти, где в окне терминала дочернее окно нужного графика - а вдруг оно свернуто или закрыто другим графиком. Далее, анализируя цвета пикселей распознать стрелку ...

Мысль у вас верная, только пиксели не длл берутся, в этом плане проще решение. Выложу думаю на КБ. 
 
Олег avtomat:

Не об этом речь.  (у меня и мысли не было подкалывать)


Сор, если не так выразилась. Просто, судя с пред. комментариев остальных, задача воспринята как что-то довольно тривиальное (убрать инпуты, засунуть 2 параметра в один, вызвать с настройками по умолчанию и т.д.). Имела ввиду, что из-за таких простых задач я бы даже не спрашивала на форуме. Подумала что имеете ввиду ситуацию если индикатор рисует объектами. 

Если не так, то аж интересно зачем скрин, чего такого по нем можно сказать 


 ----------

Задачу хоть как нибудь я то решила, но просто закрадывается сомнение что а вдруг можно проще и без костылей решить.Например, где-то в памяти терминала считать буфер, задать как-то параметры по умолчанию, кроме тех что в коде и т.д.   

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

----

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

Файлы:
 

inp_name_ind+".ex4"  - это маленькое излишество, достаточно inp_name_ind

в справке: Пример:   double val=iCustom(NULL,0,"SampleInd",13,1,0);

 
В MT5 сабж решается очень легко, а для MT4 в КБ, вроде, было решение (через DLL), позволяющее считывать значения буферов запущенных на чарте индикаторов.
Причина обращения: