Убрать из Массива нулевые значения - страница 5

 

Может быть просто надо чтобы буфер не отображался на элементах значением ноль?

Если так то в ините PlotIndexSetDouble() и 0 или PLOT_EMPTY_VALUE

 
К сожалению не нужно чтобы индикатор что либо не отрисовывал . То что сейчас рисует как раз и нужно , Стоит задача создать дополнительный буфер который состоит из модифицированных значений индикатора , а именно из которых убран НОЛЬ . Чтобы потом из этого буфера функцией iCustom() шли данные в другой индикатор , для целей дальнейших расчетов . Получается что в буфер нельзя без нуля , тогда просто создать массив , а как тогда из этого массива я получу данные в другой индикатор , или мне придется весь код тащить в новый индикатор ?
 

LookingFor:
1. тогда просто создать массив

2. а как тогда из этого массива я получу данные в другой индикатор...

1. создать массив, в который собирать данные, убирая из него нули.

2. создать ещё один буфер, в который скидывать значения массива.

 
LookingFor:
К сожалению не нужно чтобы индикатор что либо не отрисовывал . То что сейчас рисует как раз и нужно , Стоит задача создать дополнительный буфер который состоит из модифицированных значений индикатора , а именно из которых убран НОЛЬ . Чтобы потом из этого буфера функцией iCustom() шли данные в другой индикатор , для целей дальнейших расчетов . Получается что в буфер нельзя без нуля , тогда просто создать массив , а как тогда из этого массива я получу данные в другой индикатор , или мне придется весь код тащить в новый индикатор ?

Сейчас есть желание получить новый массив, без нулей, в индикаторе А и передать его в индикатор В.

Просто поменяйте последовательность действий.

Передайте полный буфет из индикатора А в индикатор В и там уберите из массива получателя нули.

 

Спасибо друзья  ,буду пробовать

 

Не пойму в чем причина выхода за пределы массива , из за чего не могу дальше продолжить проверять алгоритм . Подскажите пожалуйста )


Выходит за пределы вот в этой строке 

if(SWO[count]!=0) {{SWO2[j]=SWO[count]; j++;} // Копируем данные в новый массив уже без нулей

на переменной "j"


//+------------------------------------------------------------------+
//|                                             PULSE_SWING_LINE.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
//|                                             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_buffers 1 
#property indicator_plots   1 
//---- plot Label1 
#property indicator_label1  "PSL" 
#property indicator_type1   DRAW_LINE 
#property indicator_color1  clrRed 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 
input double    points=0.0050;
input double    begin_price_level=1.1250;
double  PSL[] ,SWO[] , SWO2 [];
int  SWING_LINE_Handle ;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  SetIndexBuffer(0,PSL,INDICATOR_DATA); 
  PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);
  ResetLastError(); 
  SWING_LINE_Handle = iCustom(NULL,0,"SWING_LINE",
                          0.005,          // Points
                          1.125          // begin_price_level
                          );
  Print("SWING_LINE_Handle",SWING_LINE_Handle,"  error = ",GetLastError()); 
//---
   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 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);}
   else 
   continue ;
   }
   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 call
   return(rates_total);
  }
//+------------------------------------------------------------------+

 
LookingFor:

Выходит за пределы вот в этой строке 

if(SWO[count]!=0) {{SWO2[j]=SWO[count]; j++;} // Копируем данные в новый массив уже без нулей



 Исключительно по Вашему коду - перед тем как копировать нужно задать размер SWO2[] .
 
LookingFor:

Не пойму в чем причина выхода за пределы массива , из за чего не могу дальше продолжить проверять алгоритм . Подскажите пожалуйста )


Выходит за пределы вот в этой строке 

на переменной "j"



может причина в отсутствии пределов у этих массивов ? :-)

я вот дин.массивы вижу, а где у них появляется размер (ArrayResize(..)) не вижу. И терминал не видит.

 

Спасибо еще раз ! Я думал если динамический массив то и объявлять сайз не нужно , а такая роскошь оказывается  только  у индексных буферов есть.

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


 

теперь какие то косяки с отрисовкой массива 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_buffers 1 
#property indicator_plots   1 
//---- plot Label1 
#property indicator_label1  "PSL" 
#property indicator_type1   DRAW_LINE 
#property indicator_color1  clrRed 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 
double  PSL[] ,SWO[] , SWO2 [] , SWO3[];
int  SWING_LINE_Handle ;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  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,          // Points
                          1.125          // begin_price_level
                          );
  Print("SWING_LINE_Handle",SWING_LINE_Handle,"  error = ",GetLastError()); 
//---
   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 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);}
   else 
   continue ;
   }
   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 call
   return(rates_total);
  }
//+-----------------------------