В индикаторе используется пересечение двух линий другого пользовательского индикатора
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 + сдвинется вся остальная история
рассмотрим самое простое.
сейчас 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 + сдвинется вся остальная история
Благодарю за внимание. Если не затруднит, еще вопрос - а что можно сделать, чтобы получить одинаковые графики?
Благодарю за внимание. Если не затруднит, еще вопрос - а что можно сделать, чтобы получить одинаковые графики?
#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, как правило, ведёт к перерисовке линий
если вы будете использовать стандартную конструкцию из учебника
то кривые не будут перерисовываться
использование оператора for, как правило, ведёт к перерисовке линий
Это почему?
Использую всегда for() и все нормально
Это почему?
Использую всегда for() и все нормально
Смотря как используете.
Смотря как используете.
посните.
по вашему комментарию выше следует, что если один и тот же алгоритм описать через for() и через while(), то получим разные результаты?
посните.
по вашему комментарию выше следует, что если один и тот же алгоритм описать через for() и через while(), то получим разные результаты?
Я не говорю об алгоритме. Иногда используется for() с пересчётом на каждом тике, если не всей истории, то какого-либо числа последних бар. В результате результат не получается одинаковым каждый раз. Например, стрелка, указывающая направление тренда может появиться и исчезнуть. То есть в процессе своей работы индикатор получая значения на текущем баре правит значения на прошлых барах.
При использовании стандартной конструкции это невозможно.
Конструкция for( ) ведёт к перерисовке графика на каждом тике. Другой вопрос, совпадает ли новый график с предыдущим. Но поскольку индикаторы меняющие свои показания основываются именно на for( ), то я начинаю испытывать недоверие к индюку, как только встречаю этот оператор.
Вот яркий пример подобного индикатора
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В индикаторе используется пересечение двух линий другого пользовательского индикатора
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);
}
//+------------------------------------------------------------------+
Может кто подскажет, что неправильно?