Вывод параметров индикатора в советник через iCustom()

 

Подскажите, пожалуйста, как вывести через функцию iCustom() необходимые мне параметры из индикатора в советник, для проведения дальнейшей оптимизации советником.
В одной из веток данного форума приводился индикатор Supertrend.
В данном коде я только вынес нужные мне параметры во внешние переменные и убрал работу на нулевом баре, все остальное без изменения.
Вот эти параметры я хотел бы перенести в советник через iCustom() .

extern int CCIperiod=50;
extern int ATRperiod=5;
extern int applied_price=4; 
extern int TimeFrame =60;

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

//+------------------------------------------------------------------+
//|                                                 Supertrend_I.mq4 |
//|                   Copyright © 2005, Jason Robinson (jnrtrading). |
//|                                      http://www.jnrtrading.co.uk |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Jason Robinson (jnrtrading)."
#property link      "http://www.jnrtrading.co.uk"
 
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Lime
#property indicator_color2 Red
 
extern int CCIperiod=50;
extern int ATRperiod=5;
extern int applied_price=4; 
extern int TimeFrame =60;
 
double TrendUp[];
double TrendDown[];
 
 
 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
 
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexBuffer(0, TrendUp);
   SetIndexLabel(0,"Trend Up");
   SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexBuffer(1, TrendDown);
   SetIndexLabel(1,"Trend Down");
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   
   int limit, i;
   double cciTrendCurrent, cciTrendPrevious;
   
    int counted_bars = IndicatorCounted();
//---- последний посчитанный бар будет пересчитан
    if(counted_bars > 0) 
        counted_bars--;
    limit = Bars - counted_bars - 1;
    
//---- основной цикл
  
   for(i = limit; i >= 1; i--) {
      cciTrendCurrent  = iCCI(NULL,TimeFrame, CCIperiod,  applied_price, i);
      cciTrendPrevious = iCCI(NULL,TimeFrame, CCIperiod,  applied_price, i+1);
      
      if (cciTrendCurrent >= 0 && cciTrendPrevious < 0) {
         TrendUp[i+1] = TrendDown[i+1];
      }
      
      if (cciTrendCurrent <= 0 && cciTrendPrevious > 0) {
         TrendDown[i+1] = TrendUp[i+1];
      }
      
      if (cciTrendCurrent >= 0) {
         TrendUp[i] = Low[i] - iATR(NULL,TimeFrame, ATRperiod, i);         
         if (TrendUp[i] < TrendUp[i+1]) {
             TrendUp[i] = TrendUp[i+1];
         }
      }
      else if (cciTrendCurrent <= 0) {
         TrendDown[i] = High[i] + iATR(NULL,TimeFrame, ATRperiod, i); 
         if (TrendDown[i] > TrendDown[i+1]) {
             TrendDown[i] = TrendDown[i+1];
         }
      }
   }
   
//----
   return(0);
  }
//+------------------------------------------------------------------+




С уважением, Вячеслав.


 
Vyacheslav:

Подскажите, пожалуйста, как вывести через функцию iCustom() необходимые мне параметры из индикатора в советник, для проведения дальнейшей оптимизации советником.
В одной из веток данного форума приводился индикатор Supertrend.
В данном коде я только вынес нужные мне параметры во внешние переменные и убрал работу на нулевом баре, все остальное без изменения.
Вот эти параметры я хотел бы перенести в советник через iCustom() .

extern int CCIperiod=50;
extern int ATRperiod=5;
extern int applied_price=4; 
extern int TimeFrame =60;

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

С уважением, Вячеслав.


В cправке к MetaEditor есть пример. Попробуйте для начала его воспроизвести, а потом переходить на другие пользовательские индюки и осциллы. При переходе Вам останется лишь изменить имя индюка и параметры.

А, что касаемо SuperTrend и иже с ним, то на истории не видно, сколько раз он меняет свои же показания. Это еще один индюк - обманщик, т.е. он затирает свои же ложные срабатывания на предыдущем баре. А посему такая красивая картинка на истории.
 
Не знаю, я убрал рассчеты с нулевого бара и перерисовок особо не наблюдал.
 

Перевожу вопрос в практическую плоскость.
Вот часть кода советника.

//+------------------------------------------------------------------+
//|                                                   Supertrend.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/"
 
extern int CCIperiod=50;
extern int ATRperiod=5;
extern int applied_price=4; 
extern int TimeFrame =60;
 
 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  STh=iCustom(NULL, TimeFrame, "Supertrend_I", CCIperiod,ATRperiod, applied_price, 0, 1); 
  STl=iCustom(NULL, TimeFrame, "Supertrend_I", CCIperiod,ATRperiod, applied_price, 1, 1); 
  if((STh-STl)>0) Signal=true; else Signal=false;
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
Правильно ли я ввел необходимые мне параметры из кода индикатора через iCustom()?
Смогу ли я оптимизировать данные параметры в советнике?

С уважением, Вячеслав.
 
Неправильно.

STh=iCustom(NULL, 0, "Supertrend_I", CCIperiod,ATRperiod, applied_price, TimeFrame, 0, 1); 
  STl=iCustom(NULL, 0, "Supertrend_I", CCIperiod,ATRperiod, applied_price, TimeFrame, 1, 1); 
если расчет индикатора идет на текущем графике (см. справку по iCustom). Кроме того, есть еще подводный камень: при передаче значения из буфера индикатора в эксперт надо быть уверенным, что оно там есть. А вообще-то прав Решетов...
 
Я согласен с Решетовым по поводу индюков, которые перерисовывают на нескольких последних свечах линии.
Но в данном коде перерисовка шла на нулевом баре, но я его убрал из рассчетов.
for(i = limit; i >= 1; i--) {
Цикл начинается от первой закрытой свечи. Так что линии не перерисовываются в этом коде.

Что же касается справки и примера, то я не совсем понял о какой справке идет речь.
Об этой что ли?
double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift) 
double val=iCustom(NULL, 0, "SampleInd",13,1,0);
Да, только сейчас увидел в предыдущем коде, что не туда поставил переменную таймфрейма.
В данной функции принтанул все параметры, все нормально, но вот как снять показания с буфера?
    double SThigh=iCustom(NULL, TimeFrame, "Supertrend_I", CCIperiod,ATRperiod, applied_price, 0, 1); 
    double STlow= iCustom(NULL, TimeFrame, "Supertrend_I", CCIperiod,ATRperiod, applied_price, 1, 1); 
    Print("Значение__",applied_price);

А вот как проверить предпоследню в коде "0" и "1" ?
Хотя можно попробовать принтануть через разность величин?
    double Signal;
    if((SThigh - STlow)> 0 ) Signal=1;else Signal=-1;
    Print("Значение__ ",Signal);
Кто еще что скажет по этому вопросу?
 
Для проверки в коде "0" и "1", а точнее, что они выдают в итоге сделал следующее.
extern int CCIperiod=50;
extern int ATRperiod=5;
extern int applied_price=4; 
extern int TimeFrame =1440;
 
    if((SThigh - STlow)< 0 ) Signal=1;else Signal=-1;
    Print("Значение__ ",Signal);
График взял дневной и установил на него индикатор.

Начиная от черной линии вправо на графике идет красная линия с 16 февраля.
И это же подтверждается на тесте советника.




Как раз таким способом я и определил, что у меня были перепутаны сигналы на бай и селл.
Я не знаю что еще добавить, но вот на тесте все результаты графика и советника совпадают.
Что еще сделать не знаю?
 
cciTrendCurrent  = iCCI(NULL,TimeFrame, CCIperiod,  applied_price, i);
      cciTrendPrevious = iCCI(NULL,TimeFrame, CCIperiod,  applied_price, i+1);
      
      if (cciTrendCurrent >= 0 && cciTrendPrevious < 0) {
         TrendUp[i+1] = TrendDown[i+1];
Смотрите, cciTrendCurrent - рассчитывается для i-го бара. После чего на основании этого расчета принимается решение о значении индикатора TrendUp[i+1] для i+1-го бара, т.е. более раннего. Налицо передергивание значения индикатора на один бар в прошлое. Помогает выдавать хорошую картинку.

Но хуже того, не всё золото, что блестит. Не все что называется Супертрендом, супертрендом является. Бросьте на график МА(50). Посмотрите в каких местах закрытие бара пересекает МА (50). Сравните с Супертрендом.

На мой вгляд, приведенный вами Супертренд - это хороший индикатор тренда. Настолько хороший, насколько хорошим индикатором тренда является 50-ти периодная скользящая средняя. Не более.
 
Спасибо, я примерно такого же мнения на счет этого индикатора. Но...
Я это понимаю, но еще раз посмотрите код индикатора, я же изменил его и цикл начинается при i >=1; а не i>=0;
for(i = limit; i >= 1; i--) {
      cciTrendCurrent  = iCCI(NULL,TimeFrame, CCIperiod,  applied_price, i);
      cciTrendPrevious = iCCI(NULL,TimeFrame, CCIperiod,  applied_price, i+1);
      
      if (cciTrendCurrent >= 0 && cciTrendPrevious < 0) {
         TrendUp[i+1] = TrendDown[i+1];
      }

Во-вторых, разговор о золоте не идет. Индикатор мне просто попался на глаза.
Я его слегка подправил и все.
Но вопрос то у меня не по чудо-индикатру, меня интерисует, как правильно вывести то, что в буфере индикатора и дополнительно те внешние переменные, о которых я веду речь.

С уважением, Вячеслав.
 
>меня интерисует, как правильно вывести то, что в буфере индикатора и дополнительно те внешние переменные, о которых я веду речь.

а в чем сложность то?

внешние переменные в индикаторе MACD

extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;
Список параметров (при необходимости). Передаваемые параметры должны соответствовать порядку объявления и типу внешних (extern) переменных пользовательского индикатора.

вставляем в советник

iCustom(NULL, 0, "MACD",FastEMA,SlowEMA,SignalSMA,0,0);
 

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

extern int TimeFrame =1440;
extern int CCIperiod=50;
extern int ATRperiod=5;
extern int applied_price=4; 
 
    double SThigh=iCustom(NULL, TimeFrame, "Supertrend_I", CCIperiod,ATRperiod, applied_price, 0, 1); 
    double STlow= iCustom(NULL, TimeFrame, "Supertrend_I", CCIperiod,ATRperiod, applied_price, 1, 1); 
    if((SThigh - STlow)> 0 ) SIGNAL_BUY=true;  else SIGNAL_BUY=false;
    if((SThigh - STlow)<=0 ) SIGNAL_SELL=true; else SIGNAL_SELL=false;

Вопрос был в том что правильно ли я перенес внешние переменные пользовательского индикатора в функцию iCustom().

Спасибо, всем участникам, что откликнулись помочь.

С уважением, Вячеслав.

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