Вопрос к профи

 

В индикаторе используется пересечение двух линий другого пользовательского индикатора

1-я - текущего тайм-фрейма, 2-я следующего. Проблема в том, что если через несколько минут обновить окна с индикатором взаимное

расположение линий меняется. Например:

///////////////////////////////////////////////////////////////////////

#property indicator_separate_window


#property indicator_buffers 2

#property indicator_color1 DarkGreen // Линия для медленной МА

#property indicator_color2 Maroon // Линия для быстрой МА


//---- input parameters

extern int MAPeriod = 2; // Период МА основной линии MBI(MBI)

extern int DigitsUsed= 4; // Значимое количество знаков после запятой в значениях индикатора

extern int History =1500; // Колич.баров в расчётной истории

//---- buffers

double LineSlow[]; // Буфер для медленной МА

double LineFast[]; // Буфер для быстрой МА

int PeriodSlow, PeriodFast;// Периоды для расчетов МА

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

//| Custom indicator initialization function |

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

int init()

{

//---- indicator line

SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);

SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1);

IndicatorDigits(DigitsUsed);

//---- 1 дополнительный (промежуточный) буфер индикатора

SetIndexBuffer(0,LineSlow);

SetIndexBuffer(1,LineFast);

// SetIndexBuffer(2,MBICalc);

//---- name for DataWindow and indicator subwindow label

string ShortName;

//---- name for DataWindow and indicator subwindow label

IndicatorShortName("MA+MA");

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

switch(Period()) // Расчёт коэффициентов для различных ТФ.

{

case 1: PeriodSlow=PERIOD_M5; break; // Коэффициент для-Таймфрейма М1

case 5: PeriodSlow=PERIOD_M15; break;// -Таймфрейма М5

case 15: PeriodSlow=PERIOD_H1; break; // -Таймфрейма М15 т.е. след. период Н1

case 30: PeriodSlow=PERIOD_H1; break; // -Таймфрейма М30

case 60: PeriodSlow=PERIOD_H4; break; // -Таймфрейма H1

case 240: PeriodSlow=PERIOD_D1; break; // -Таймфрейма H4

case 1440: PeriodSlow=PERIOD_W1; break; // -Таймфрейма D1

case 10080: PeriodSlow=PERIOD_MN1; break;// -Таймфрейма W1

case 43200: PeriodSlow=PERIOD_W1; break; // -Таймфрейма МN

}

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

PeriodFast = 0;

return(0);

}

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

int start()

{

double MaSlow,MaFast; // SlowMa-MA большего периода, FastMa-MA текущего периода

int limit, CountedBars=IndicatorCounted();

if(CountedBars>0) CountedBars--;

limit=Bars-CountedBars;

if(limit>History) limit=History;

for(int i=0; i<limit; i++)

{

MaSlow=iMA(NULL,PeriodSlow,MAPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);

MaFast=iMA(NULL,PeriodFast,MAPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);

LineSlow[i]=MaSlow;

LineFast[i]=MaFast;

}

//---- done

return(0);

}

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

Может кто подскажет, что неправильно?

 
Albyt:

В индикаторе используется пересечение двух линий другого пользовательского индикатора

1-я - текущего тайм-фрейма, 2-я следующего. Проблема в том, что если через несколько минут обновить окна с индикатором взаимное

расположение линий меняется. Например:

///////////////////////////////////////////////////////////////////////

#property indicator_separate_window


#property indicator_buffers 2

#property indicator_color1 DarkGreen // Линия для медленной МА

#property indicator_color2 Maroon // Линия для быстрой МА


//---- input parameters

extern int MAPeriod = 2; // Период МА основной линии MBI(MBI)

extern int DigitsUsed= 4; // Значимое количество знаков после запятой в значениях индикатора

extern int History =1500; // Колич.баров в расчётной истории

//---- buffers

double LineSlow[]; // Буфер для медленной МА

double LineFast[]; // Буфер для быстрой МА

int PeriodSlow, PeriodFast;// Периоды для расчетов МА

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

//| Custom indicator initialization function |

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

int init()

{

//---- indicator line

SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);

SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1);

IndicatorDigits(DigitsUsed);

//---- 1 дополнительный (промежуточный) буфер индикатора

SetIndexBuffer(0,LineSlow);

SetIndexBuffer(1,LineFast);

// SetIndexBuffer(2,MBICalc);

//---- name for DataWindow and indicator subwindow label

string ShortName;

//---- name for DataWindow and indicator subwindow label

IndicatorShortName("MA+MA");

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

switch(Period()) // Расчёт коэффициентов для различных ТФ.

{

case 1: PeriodSlow=PERIOD_M5; break; // Коэффициент для-Таймфрейма М1

case 5: PeriodSlow=PERIOD_M15; break;// -Таймфрейма М5

case 15: PeriodSlow=PERIOD_H1; break; // -Таймфрейма М15 т.е. след. период Н1

case 30: PeriodSlow=PERIOD_H1; break; // -Таймфрейма М30

case 60: PeriodSlow=PERIOD_H4; break; // -Таймфрейма H1

case 240: PeriodSlow=PERIOD_D1; break; // -Таймфрейма H4

case 1440: PeriodSlow=PERIOD_W1; break; // -Таймфрейма D1

case 10080: PeriodSlow=PERIOD_MN1; break;// -Таймфрейма W1

case 43200: PeriodSlow=PERIOD_W1; break; // -Таймфрейма МN

}

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

PeriodFast = 0;

return(0);

}

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

int start()

{

double MaSlow,MaFast; // SlowMa-MA большего периода, FastMa-MA текущего периода

int limit, CountedBars=IndicatorCounted();

if(CountedBars>0) CountedBars--;

limit=Bars-CountedBars;

if(limit>History) limit=History;

for(int i=0; i<limit; i++)

{

MaSlow=iMA(NULL,PeriodSlow,MAPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);

MaFast=iMA(NULL,PeriodFast,MAPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);

LineSlow[i]=MaSlow;

LineFast[i]=MaFast;

}

//---- done

return(0);

}

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

Может кто подскажет, что неправильно?

рассмотрим самое простое.

сейчас 20:00:01, вы кинули на M1

график построен, посчитаны и построены LineSlow и LineFast

прошло 3 минуты, сейчас 20:03:01

на M1 прошло 3 бара. соответственно 3 раза был произведен новый расчет. при этом все 3 раза i одинаково и MaSlow=iMA(NULL,PeriodSlow,MAPeriod,0,MODE_SMMA,PRICE_MEDIAN,i); одинаково

а теперь кинем индикатор еще раз..

и получим другой график, ибо для тех же самых 3 баров будет браться i = 1, 2, 3 + сдвинется вся остальная история

 
ilunga:

рассмотрим самое простое.

сейчас 20:00:01, вы кинули на M1

график построен, посчитаны и построены LineSlow и LineFast

прошло 3 минуты, сейчас 20:03:01

на M1 прошло 3 бара. соответственно 3 раза был произведен новый расчет. при этом все 3 раза i одинаково и MaSlow=iMA(NULL,PeriodSlow,MAPeriod,0,MODE_SMMA,PRICE_MEDIAN,i); одинаково

а теперь кинем индикатор еще раз..

и получим другой график, ибо для тех же самых 3 баров будет браться i = 1, 2, 3 + сдвинется вся остальная история


Благодарю за внимание. Если не затруднит, еще вопрос - а что можно сделать, чтобы получить одинаковые графики?
 
Albyt:

Благодарю за внимание. Если не затруднит, еще вопрос - а что можно сделать, чтобы получить одинаковые графики?
для начала опишите, что вы хотите видеть со старшего графика словами
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DarkGreen // Линия для медленной МА
#property indicator_color2 Maroon // Линия для быстрой МА

//---- input parameters
extern int MAPeriod = 2; // Период МА основной линии MBI(MBI)
extern int DigitsUsed= 4; // Значимое количество знаков после запятой в значениях индикатора
extern int History =1500; // Колич.баров в расчётной истории
//---- buffers
double LineSlow[]; // Буфер для медленной МА
double LineFast[]; // Буфер для быстрой МА
int PeriodSlow, PeriodFast;// Периоды для расчетов МА
//+------------------------------------------------------------------+

//| Custom indicator initialization function |

//+------------------------------------------------------------------+
int init()
{
   //---- indicator line
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1);
   IndicatorDigits(DigitsUsed); 
   //---- 1 дополнительный (промежуточный) буфер индикатора 
   SetIndexBuffer(0,LineSlow);
   SetIndexBuffer(1,LineFast);
   // SetIndexBuffer(2,MBICalc);
   //---- name for DataWindow and indicator subwindow label
   string ShortName;
   //---- name for DataWindow and indicator subwindow label
   IndicatorShortName("MA+MA");
   //-------------------------------------------------------------------+ 
   switch(Period()) // Расчёт коэффициентов для различных ТФ.
   { 
      case 1: PeriodSlow=PERIOD_M5; break; // Коэффициент для-Таймфрейма М1
      case 5: PeriodSlow=PERIOD_M15; break;// -Таймфрейма М5
      case 15: PeriodSlow=PERIOD_H1; break; // -Таймфрейма М15 т.е. след. период Н1
      case 30: PeriodSlow=PERIOD_H1; break; // -Таймфрейма М30
      case 60: PeriodSlow=PERIOD_H4; break; // -Таймфрейма H1
      case 240: PeriodSlow=PERIOD_D1; break; // -Таймфрейма H4
      case 1440: PeriodSlow=PERIOD_W1; break; // -Таймфрейма D1
      case 10080: PeriodSlow=PERIOD_MN1; break;// -Таймфрейма W1
      case 43200: PeriodSlow=PERIOD_W1; break; // -Таймфрейма МN
   } 
//-------------------------------------------------------------------+ 
   PeriodFast = 0; 
   return(0);
}
//+------------------------------------------------------------------+
int start()
{
   double MaSlow,MaFast; // SlowMa-MA большего периода, FastMa-MA текущего периода
   int limit, CountedBars=IndicatorCounted();
   if(CountedBars>0) CountedBars--;
   limit=Bars-CountedBars;
   if(limit>History) limit=History;
   for(int i=0; i<limit; i++)
   {
      MaSlow=iMA(NULL,PeriodSlow,MAPeriod,0,MODE_SMMA,PRICE_MEDIAN,i); 
      MaFast=iMA(NULL,PeriodFast,MAPeriod,0,MODE_SMMA,PRICE_MEDIAN,i); 
      LineSlow[i]=MaSlow; 
      LineFast[i]=MaFast; 
   } 
   //---- done
   return(0);
}
//+------------------------------------------------------------------+
код вставляйте пожалуйста в таком виде (через кнопку SRC)
 

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

   int Counted_bars=IndicatorCounted();   // Количество просчитанных баров 
   int i=Bars-Counted_bars-1;             // Индекс первого непросчитанного
   while(i>=0)                            // Цикл по непосчитанным барам
   {
      //ваш код
   }

то кривые не будут перерисовываться

использование оператора for, как правило, ведёт к перерисовке линий

 
Если хотите чтобы графики не перерисовывал я иногда использую увеличение периода . Например на графике М5 вы хотите видеть мувинг с периодом 13 с графика М15 . М15 больше М5 в 3 раза значит цепляйте мувинг с периодом 13*3 т.е. 39 на график М5. Что будет соответствовать мувингу с М15.
 
valenok2003:

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

то кривые не будут перерисовываться

использование оператора for, как правило, ведёт к перерисовке линий


Это почему?

Использую всегда for() и все нормально

 
Vinin:


Это почему?

Использую всегда for() и все нормально


Смотря как используете.
 
valenok2003:

Смотря как используете.


посните.

по вашему комментарию выше следует, что если один и тот же алгоритм описать через for() и через while(), то получим разные результаты?

 
abolk:


посните.

по вашему комментарию выше следует, что если один и тот же алгоритм описать через for() и через while(), то получим разные результаты?


Я не говорю об алгоритме. Иногда используется for() с пересчётом на каждом тике, если не всей истории, то какого-либо числа последних бар. В результате результат не получается одинаковым каждый раз. Например, стрелка, указывающая направление тренда может появиться и исчезнуть. То есть в процессе своей работы индикатор получая значения на текущем баре правит значения на прошлых барах.

При использовании стандартной конструкции это невозможно.

Конструкция for( ) ведёт к перерисовке графика на каждом тике. Другой вопрос, совпадает ли новый график с предыдущим. Но поскольку индикаторы меняющие свои показания основываются именно на for( ), то я начинаю испытывать недоверие к индюку, как только встречаю этот оператор.

Вот яркий пример подобного индикатора

Файлы:
Причина обращения: