Здравствуйте, подскажите пожалуйста как исправить ошибку.
У меня все нормально, предупреждений нет.Благодарю, но вылезло другое предупреждение, теперь ему индикатор нужен , если правильно перевод понял.
ну, если попробовать написать все без ошибок, то он все норм рисовать должен... так, к примеруДобрый день
Пишу индикатор который наподобие зигзага по определенному алгоритму должен рисовать хай и лоу на графике
Столкнулся с трудностью при работе с динамическими массивами.
Использую для этого функции
SetIndexBuffer(1,Buf_1);
SetIndexEmptyValue(1,0.0);
Но что то не вяжется, индикатор или рисует линию через каждый бар или вообще не чего не рисует.
Не могли бы помочь разобраться с вопросом?
Ниже мои попытки разобраться с массивом:
...
#property strict
#property indicator_chart_window
#property indicator_buffers 2 // Количество буферов
#property indicator_color1 clrBlue // Цвет первой линии
#property indicator_type1 DRAW_LINE
#property indicator_style1 STYLE_DOT
#property indicator_width1 1
double Buf_1[]; // Открытие индикаторных массивов
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,Buf_1); // Назначение массива буферу
SetIndexEmptyValue(0,EMPTY_VALUE);
//---
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 i=10; // Индекс бара
while(i>=0) // Цикл по непосчитанным барам
{
if(i<=6 && i>=3)
{
Buf_1[i]=0.0;
}
Buf_1[i]=low[i]; // Значение 1 буфера на i-ом баре
i--;
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
#property strict
#property indicator_chart_window // Индик. рисуется в основном окне
#property indicator_buffers 2 // Количество буферов
#property indicator_color1 Blue // Цвет первой линии
double Buf_1[]; // Открытие индикаторных массивов
//--------------------------------------------------------------------
int init() // Специальная функция init()
{
//--------------------------------------------------------------------
SetIndexBuffer(1,Buf_1); // Назначение массива буферу
SetIndexStyle (1,DRAW_LINE,STYLE_DOT,1);// Стиль линии
SetIndexEmptyValue(1,0.0);
//--------------------------------------------------------------------
return (INIT_SUCCEEDED); // Выход из спец. ф-ии init()
}
//--------------------------------------------------------------------
int start() // Специальная функция start()
{
int i; // Индекс бара
//--------------------------------------------------------------------
i=10;
while(i>=0) // Цикл по непосчитанным барам
{
if(i<=6 && i>=3 )
{
Buf_1[i]=0.0;
}
else
{
Buf_1[i]=Low[i]; // Значение 1 буфера на i-ом баре
}
i--;
}
//Alert ("Mas - ",Buf_1[1]);
//--------------------------------------------------------------------
return (INIT_SUCCEEDED); // Выход из спец. ф-ии start()
}
Нужно стиль рисовки задать SetIndexStyle(0,DRAW_SECTION).Как заставить соединить его 2 точки.
#property strict
#property indicator_chart_window // Индик. рисуется в основном окне
#property indicator_buffers 1 // Количество буферов
#property indicator_color1 Blue // Цвет первой линии
double Buf_0[];// Открытие индикаторных массивов
//--------------------------------------------------------------------
int init() // Специальная функция init()
{
//--------------------------------------------------------------------
SetIndexBuffer(0,Buf_0); // Назначение массива буферу
SetIndexStyle(0,DRAW_SECTION); // Стиль линии
//--------------------------------------------------------------------
return (INIT_SUCCEEDED); // Выход из спец. ф-ии init()
}
//--------------------------------------------------------------------
int start() // Специальная функция start()
{
int i; // Индекс бара
i=10;
while(i>=0) // Цикл по непосчитанным барам
{
if(i<=9 && i>=6 || i<=4 && i>=2 )
{
Buf_0[i]=0.0;
}
else
{
Buf_0[i]=Low[i]; // Значение 1 буфера на i-ом баре
}
i--;
}
//--------------------------------------------------------------------
return (INIT_SUCCEEDED); // Выход из спец. ф-ии start()
}
Секционное рисование пропускает пустые значения буфера. По-умолчанию пустые значения заполняются EMPTY_VALUE и 0 не является пустым - значит будет рисовать от 0-ля. Либо пустые приравниваем к EMPTY_VALUE, либо командой SetIndexEmptyValue(0,0.0); присваиваем буферу пустые значения = 0. В файле второй вариант.Спасибо, изначально все заработало как нужно. А потом линия стала учитывать 0. Поставил как Вы и сказали
А если так:
Секционное рисование пропускает пустые значения буфера. По-умолчанию пустые значения заполняются EMPTY_VALUE и 0 не является пустым - значит будет рисовать от 0-ля. Либо пустые приравниваем к EMPTY_VALUE, либо командой SetIndexEmptyValue(0,0.0); присваиваем буферу пустые значения = 0. В файле второй вариант.
Да вроде тип построения DRAW_ZIGZAG должен справляться с этой проблемой. В mql5 точно справляется...Добрый день
Столкнулся с такой проблемой, что иногда на рынке возникает такая ситуация, что нужно записать в массив 2 точки на одном баре. Как можно решить данный вопрос, так как одномерный массив немного не подходит. Как правильно сделать записать в двух мерный массив, что бы решить вопрос на скрине.
Посмотреть вложение 373880
Задай параллельный массив для данных - его не нужно делать "выходным" - просто для расчетов.Столкнулся с такой проблемой, что иногда на рынке возникает такая ситуация, что нужно записать в массив 2 точки на одном баре. Как можно решить данный вопрос, так как одномерный массив немного не подходит. Как правильно сделать записать в двух мерный массив, что бы решить вопрос на скрине.
Влад, а что это даст? Дело в том, что имеющийся ZigZag построен на DRAW_SECTION который имеет только один буфер и следовательно на одном баре буфер можно заполнить только одним значением. А DRAW_ZIGZAG имеет два буфера, соответственно два массива и на одном баре можно заполнить оба буфера.Задай параллельный массив для данных - его не нужно делать "выходным" - просто для расчетов.
Леш, я понятия не имею - челу зачем-то нужно...Влад, а что это даст? Дело в том, что имеющийся ZigZag построен на DRAW_SECTION который имеет только один буфер и следовательно на одном баре буфер можно заполнить только одним значением. А DRAW_ZIGZAG имеет два буфера, соответственно два массива и на одном баре можно заполнить оба буфера.
Я не о том, что человеку нужно, а о том как может помочь «параллельный массив для данных»Леш, я понятия не имею - челу зачем-то нужно...
Я не так давно один индюк переводил из подвала на график - мне пришлось, чтобы сохранить все расчеты, сделать дубль - старые буферы остались чисто расчетными, а в новые (рисующие) я заносил актуальную информацию.Я не о том, что человеку нужно, а о том как может помочь «параллельный массив для данных»