Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 545

 
GSB:

Какой еще дубль? Можно вызывать один и тот же индикатор с совершенно разными параметрами



Если в самом индикаторе
extern int       periodAMA=10;
в советнике
extern int periodAMA_1= 8; 
extern int periodAMA_2=13; 

как код индикатора распознает передаваемые параметры названия у них разные?

Но, впрочем все как Вы сказали. Проверил опять скриптом)

 
Forexman77:
Если в самом индикаторе в советнике

как код индикатора распознает передаваемые параметры названия у них разные?

Но, впрочем все как Вы сказали. Проверил опять скриптом)


Переменную(ые) в вызывающей программе можете называть как угодно, ее название никак не связано с названием переменной в индикаторе, это разные переменные и вообще они вызываются из разных потоков терминала.

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

Если объявлена переменная per1=9; и стоит на 4 месте iCustom() то индикатор будет расчитываться с периодом 9, поставите другую переменную - при расчете будет использоваться ее значение и это касается всех параметров индикатора, главное проставляйте их в правильной очередности, как в самом индикаторе. Переменную которая будет передаваться (ссылка на нее) в качестве первого параметра индикатора - на четвертом месте iCustom() второгог на пятом и т.д.



 
GSB:

Переменную(ые) в вызывающей программе можете называть как угодно, ее название никак не связано с названием переменной в индикаторе, это разные переменные и вообще они вызываются из разных потоков терминала.

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

Если объявлена переменная per1=9; и стоит на 4 месте iCustom() то индикатор будет расчитываться с периодом 9, поставите другую переменную - при расчете будет использоваться ее значение и это касается всех параметров индикатора, главное проставляйте их в правильной очередности, как в самом индикаторе. Переменную которая будет передаваться (ссылка на нее) в качестве первого параметра индикатора - на четвертом месте iCustom() второгог на пятом и т.д.



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

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

double ma=iCustom(NULL,0,"TestMA",0,1);

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

//+------------------------------------------------------------------+
//|                                                       TestMA.mq4 |
//|                                  Copyright 2014, Semyon Polyakov |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Semyon Polyakov"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
 
   SetIndexStyle(0,DRAW_LINE,EMPTY,1,clrRed);
   SetIndexBuffer(0,ExtMapBuffer1);
//---
   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[])
  {
//---
    int counted_bars=IndicatorCounted(),
       limit;
 
   if(counted_bars>0)
      counted_bars--;
   
   limit=Bars-counted_bars;
     
   for(int i=0;i<limit;i++)
   {
      ExtMapBuffer1[i]=SimpleMA(i,20,close);
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  
  double SimpleMA(const int position,const int period,const double &price[])
  {
//---
   double result=0.0;
//--- check position
   if(position>=0 && period>0)
     {
      //--- calculate value
      for(int i=0;i<period;i++) result+=price[position+i];
      result/=period;
     }
//---
   return(result);
  }
//+------------------------------------------------------------------+

Далее, фигня с EMPTY_VALUE при тестировании.

Т.е. когда запускаем тестирование у нас есть дата начала работы советника, и все что до этой даты iCustom выдает корректные значения индикатора, все что после, непосредственно тестируется - EMPTY_VALUE. :(
Уже устал листать гугл и форум, пишут про "не заглядывай в будущее", но я такого в коде не наблюдаю. Где я дурак?)

 
Semionn:

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

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

Далее, фигня с EMPTY_VALUE при тестировании.

Т.е. когда запускаем тестирование у нас есть дата начала работы советника, и все что до этой даты iCustom выдает корректные значения индикатора, все что после, непосредственно тестируется - EMPTY_VALUE. :(
Уже устал листать гугл и форум, пишут про "не заглядывай в будущее", но я такого в коде не наблюдаю. Где я дурак?)

Ошибка видимо в коде эксперта, почему отладчик не используете? Поставьте контрольные точки, смотрите значения переменных, да и вообще увидите вызывается ли индикатор, что до и что после вашей даты
 
GSB:
Ошибка видимо в коде эксперта, почему отладчик не используете? Поставьте контрольные точки, смотрите значения переменных, да и вообще увидите вызывается ли индикатор, что до и что после вашей даты

Отладчик можно использовать только в режиме демо-счета, а не на тестировании, кроме того я написал - индикатор вызывается, работает и возвращает значения, даже правильные, но только до указанной даты (даты начала тестирования). Значения переменных я вывожу в советнике, поэтому и говорю что сначала все хорошо, а потом EMPTY_VALUE
 
Semionn:

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


Вы внимательно прочитали, как отслеживать новые бары в пользовательских индикаторах?

[QUOTE]Первый параметр rates_total содержит количество баров, доступных индикатору для расчета, и соответствует количеству баров, доступных на графике.

Необходимо отметить связь между значением, возвращаемым функцией OnCalculate() и вторым входным параметром prev_calculated. Параметр prev_calculated при вызове функции содержит значение, которое вернула функция OnCalculate() на предыдущем вызове. Это позволяет реализовать экономные алгоритмы расчета пользовательского индикатора с тем, чтобы избежать повторных расчетов для тех баров, которые не изменились с предыдущего запуска этой функции.

Для этого обычно достаточно вернуть значение параметра rates_total, которое содержит количество баров при текущем вызове функции. Если с момента последнего вызова функции OnCalculate() ценовые данные были изменены (подкачана более глубокая история или были заполнены пропуски истории), то значение входного параметра prev_calculated будет установлено в нулевое значение самим терминалом. [/QUOTE]

 

Необходимо найти среднюю однодневных моментумов за 20 дней, а затем узнать среднюю 20 дневных за пять дней.

Найти среднюю за 20 дней не составило проблемы. А вот, как из этой средней получить среднюю за пять не знаю.

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Lime

//--- input parameters
extern int       Period_MA_1=1;
extern int       p          =20;
//--- buffers
double ExtMapBuffer1[];
double val20[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),                      
    limit;
    double momentum20;
   if(counted_bars>0)
      counted_bars--;  
   limit=Bars-counted_bars;
    
   for(int i=0;i<limit;i++)
   {
      momentum20=0;
      ArrayInitialize(val20,0);      
      for(int k=p;k>=0;k--)
      {
      ArrayResize(val20,p);
      val20[k]=Close[i+k]-Close[i+k+Period_MA_1];
      momentum20=momentum20+val20[k];
      }
      momentum20=momentum20/p;
      ExtMapBuffer1[i]=momentum20;
   }
   return(0);
  }
 
Forexman77:

Необходимо найти среднюю однодневных моментумов за 20 дней, а затем узнать среднюю 20 дневных за пять дней.

Найти среднюю за 20 дней не составило проблемы. А вот, как из этой средней получить среднюю за пять не знаю.



//+------------------------------------------------------------------+
//|                                                   ForexMan77.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "vinin@mail.ru"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Yellow
#property indicator_color3 Red

//--- input parameters
extern int       Period_MA_1=1;
extern int       p2          =20;
extern int       p3          =5;
//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtMapBuffer3);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted(),
   i,limit1,limit2,limit3;
   limit1=Bars-counted_bars-1;
   limit2=limit1;
   limit3=limit2;
   if(limit1>0) 
     {
      limit1=Bars-Period_MA_1-1;
      limit2=limit1-p2;
      limit3=limit2-p3;
     }

   for(i=limit1;i>=0;i--) ExtMapBuffer1[i]=iMomentum(NULL, 0, Period_MA_1, PRICE_CLOSE, i);
   for(i=limit2;i>=0;i--) ExtMapBuffer2[i]=iMAOnArray(ExtMapBuffer1, 0, p2, 0, MODE_SMA,i);
   for(i=limit3;i>=0;i--) ExtMapBuffer3[i]=iMAOnArray(ExtMapBuffer2, 0, p3, 0, MODE_SMA,i);

   return(0);
  }
//+------------------------------------------------------------------+
 

Хелп

int OnInit()
{
   EventSetTimer(60);
   Print(GetLastError());

   return(INIT_SUCCEEDED);
}

Не работает таймер, возвращает фолс и ошибку 4051

Или в тестере и не должно работать?

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