К сожалению не нужно чтобы индикатор что либо не отрисовывал . То что сейчас рисует как раз и нужно , Стоит задача создать дополнительный буфер который состоит из модифицированных значений индикатора , а именно из которых убран НОЛЬ . Чтобы потом из этого буфера функцией iCustom() шли данные в другой индикатор , для целей дальнейших расчетов . Получается что в буфер нельзя без нуля , тогда просто создать массив , а как тогда из этого массива я получу данные в другой индикатор , или мне придется весь код тащить в новый индикатор ?
LookingFor: К сожалению не нужно чтобы индикатор что либо не отрисовывал . То что сейчас рисует как раз и нужно , Стоит задача создать дополнительный буфер который состоит из модифицированных значений индикатора , а именно из которых убран НОЛЬ . Чтобы потом из этого буфера функцией iCustom() шли данные в другой индикатор , для целей дальнейших расчетов . Получается что в буфер нельзя без нуля , тогда просто создать массив , а как тогда из этого массива я получу данные в другой индикатор , или мне придется весь код тащить в новый индикатор ?
Сейчас есть желание получить новый массив, без нулей, в индикаторе А и передать его в индикатор В.
Просто поменяйте последовательность действий.
Передайте полный буфет из индикатора А в индикатор В и там уберите из массива получателя нули.
//+------------------------------------------------------------------+//| PULSE_SWING_LINE.mq5 |//| Copyright 2017, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2017, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"#property indicator_separate_window#property indicator_buffers1#property indicator_plots1//---- plot Label1 #property indicator_label1 "PSL"#property indicator_type1 DRAW_LINE#property indicator_color1 clrRed#property indicator_style1 STYLE_SOLID#property indicator_width1 1inputdouble points=0.0050;
inputdouble begin_price_level=1.1250;
double PSL[] ,SWO[] , SWO2 [];
int SWING_LINE_Handle ;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
SetIndexBuffer(0,PSL,INDICATOR_DATA);
PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);
ResetLastError();
SWING_LINE_Handle = iCustom(NULL,0,"SWING_LINE",
0.005, // Points1.125// begin_price_level
);
Print("SWING_LINE_Handle",SWING_LINE_Handle," error = ",GetLastError());
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//---int count =0 , quantity , quantity2 , j ,k ;
if (prev_calculated ==0) // Если запускаем в первый раз
{CopyBuffer(SWING_LINE_Handle,5,0,rates_total,SWO); // копируем значения из другого индикатора из 5ого буфера, сюда в SWO все значения
quantity = ArraySize(SWO);// Сколько всего ? количество данных в массив из буфера другого индикатора получено ?Print(IntegerToString(quantity));
j = 0 ;
for(count = 0; count < quantity; count++)
if(SWO[count]!=0) {{SWO2[j]=SWO[count]; j++;} // Копируем данные в новый массив уже без нулей// Проверяем правильность выполненияstring s="";
for(int ii=0;ii<j;ii++) s+=IntegerToString(SWO2[ii])+" ";
Print(s);}
elsecontinue ;
}
else// если не первый запуск , тогда все данные уже скопированы , калькулируем на новом последнем баре
{
quantity = ArraySize(SWO);// Сколько всего ? количество данных в массив из буфера другого индикатора получено ?
quantity2= ArraySize(SWO2); //Сколько сейчас данных в массиве без нулей ?
j = quantity2;
for ( k = quantity ; k < rates_total ; k++)
CopyBuffer(SWING_LINE_Handle,5,quantity,1,SWO);//копируем значение на каждом новом бареif (SWO[k]!=0){SWO2[j]=SWO[k]; j++;} // Копируем данные в новый массив уже без нулей На каждом баре.
}
// Проверяем правильность выполненияstring s="";
for(int i=0;i<j;i++) s+=IntegerToString(SWO[i])+" ";
Print(s);
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+
теперь какие то косяки с отрисовкой массива SWO3 , который является суммой предыдущих значений массива SWO2 на каждом индексе. То есть итогом SWO3 это индикатор на графике (красная линия) только без горизонтальных полосок . Поскольку этот индикатор в длинну короче чем сам график , я изменил способ доступа к этому массиву через ArraySetAsSeries , чтобы рисовал с конца . но рисует он как будто задом наперед . Первый вопрос = действительно ли он рисует задом наперед из за ArraySetAsSeries
Второй вопрос = есть ли какой либо другой способ нарисовать Индикатор в отдельном окне , без экспорта в файл а оттуда в custom symbol ?
И почему опять вылетел за пределы массива который буферный динамический , там же все программа делает ...
Строка предпоследняя
SWO3[q3]= SWO2[j]+SWO3[q3-1];
//+------------------------------------------------------------------+//| PULSE_SWING_LINE.mq5 |//| Copyright 2017, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2017, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"#property indicator_separate_window#property indicator_buffers1#property indicator_plots1//---- plot Label1 #property indicator_label1 "PSL"#property indicator_type1 DRAW_LINE#property indicator_color1 clrRed#property indicator_style1 STYLE_SOLID#property indicator_width1 1double PSL[] ,SWO[] , SWO2 [] , SWO3[];
int SWING_LINE_Handle ;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
SetIndexBuffer(0,SWO3,INDICATOR_DATA);
ArraySetAsSeries(SWO3,true);
PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);
ResetLastError();
SWING_LINE_Handle = iCustom(NULL,0,"SWING_LINE",
0.005, // Points1.125// begin_price_level
);
Print("SWING_LINE_Handle",SWING_LINE_Handle," error = ",GetLastError());
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//---int count =0 , quantity , quantity2 , j ,k ,q3;
if (prev_calculated ==0) // Если запускаем в первый раз
{CopyBuffer(SWING_LINE_Handle,5,0,rates_total,SWO); // копируем значения из другого индикатора из 5ого буфера, сюда в SWO все значения
quantity = ArraySize(SWO);// Сколько всего ? количество данных в массив из буфера другого индикатора получено ?ArrayResize(SWO,quantity+100);// Задаем размер донорского массива , он равен количеству данных в нем плюс запасArrayResize(SWO2,quantity );// Задаем размер нового массива , он равен размеру массива донораPrint(IntegerToString(quantity));
j = 1 ;
for(count = 1; count < quantity; count++)
if(SWO[count]!=0) {{SWO2[j]=SWO[count]; j++;// Копируем данные в новый массив уже без нулей
SWO3[j]= SWO2[j]+SWO3[j-1]; }
// Проверяем правильность выполненияstring s="";
for(int ii=0;ii<j;ii++) s+=IntegerToString(SWO2[ii])+" ";
Print(s);}
elsecontinue ;
}
else// если не первый запуск , тогда все данные уже скопированы , калькулируем на новом последнем баре
{
quantity = ArraySize(SWO);// Сколько всего ? количество данных в массив из буфера другого индикатора получено ?ArrayResize(SWO,quantity+100);// Задаем размер донорского массива , он равен количеству данных в нем плюс запас
quantity2= ArraySize(SWO2); //Сколько сейчас данных в массиве без нулей ?
q3=ArraySize(SWO3);//Сколько сейчас данных в массиве SWO3 ?ArrayResize(SWO2,quantity2+100 );// Задаем размер нового массива , он равен размеру массива донора плюс запас
j = quantity2;
for ( k = quantity ; k < rates_total ; k++)
CopyBuffer(SWING_LINE_Handle,5,quantity,1,SWO);//копируем значение на каждом новом бареif (SWO[k]!=0){SWO2[j]=SWO[k]; j++;// Копируем данные в новый массив уже без нулей На каждом баре.
SWO3[q3]= SWO2[j]+SWO3[q3-1];}
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+-----------------------------
Может быть просто надо чтобы буфер не отображался на элементах значением ноль?
Если так то в ините PlotIndexSetDouble() и 0 или PLOT_EMPTY_VALUE
LookingFor:
1. тогда просто создать массив
2. а как тогда из этого массива я получу данные в другой индикатор...
1. создать массив, в который собирать данные, убирая из него нули.
2. создать ещё один буфер, в который скидывать значения массива.
К сожалению не нужно чтобы индикатор что либо не отрисовывал . То что сейчас рисует как раз и нужно , Стоит задача создать дополнительный буфер который состоит из модифицированных значений индикатора , а именно из которых убран НОЛЬ . Чтобы потом из этого буфера функцией iCustom() шли данные в другой индикатор , для целей дальнейших расчетов . Получается что в буфер нельзя без нуля , тогда просто создать массив , а как тогда из этого массива я получу данные в другой индикатор , или мне придется весь код тащить в новый индикатор ?
Сейчас есть желание получить новый массив, без нулей, в индикаторе А и передать его в индикатор В.
Просто поменяйте последовательность действий.
Передайте полный буфет из индикатора А в индикатор В и там уберите из массива получателя нули.
Спасибо друзья ,буду пробовать
Не пойму в чем причина выхода за пределы массива , из за чего не могу дальше продолжить проверять алгоритм . Подскажите пожалуйста )
Выходит за пределы вот в этой строке
на переменной "j"
Выходит за пределы вот в этой строке
Не пойму в чем причина выхода за пределы массива , из за чего не могу дальше продолжить проверять алгоритм . Подскажите пожалуйста )
Выходит за пределы вот в этой строке
на переменной "j"
может причина в отсутствии пределов у этих массивов ? :-)
я вот дин.массивы вижу, а где у них появляется размер (ArrayResize(..)) не вижу. И терминал не видит.
Спасибо еще раз ! Я думал если динамический массив то и объявлять сайз не нужно , а такая роскошь оказывается только у индексных буферов есть.
Не понял почему все таки первый ноль таки попал в массив , но это вообще не важно .... работаю дальше ....
теперь какие то косяки с отрисовкой массива SWO3 , который является суммой предыдущих значений массива SWO2 на каждом индексе. То есть итогом SWO3 это индикатор на графике (красная линия) только без горизонтальных полосок . Поскольку этот индикатор в длинну короче чем сам график , я изменил способ доступа к этому массиву через ArraySetAsSeries , чтобы рисовал с конца . но рисует он как будто задом наперед .
Первый вопрос = действительно ли он рисует задом наперед из за ArraySetAsSeries
Второй вопрос = есть ли какой либо другой способ нарисовать Индикатор в отдельном окне , без экспорта в файл а оттуда в custom symbol ?
И почему опять вылетел за пределы массива который буферный динамический , там же все программа делает ...
Строка предпоследняя
SWO3[q3]= SWO2[j]+SWO3[q3-1];