Подскажите, пожалуйста, как создать буфер для сохранения только последних расчетных значений из цикла?

 
Подскажите, пожалуйста, как создать буфер для сохранения только последних расчетных значений из цикла?
Имеется расчет некоторых параметров в функции int start(),

int id=0;

int start()
{//0
if(prevtime == Time[0]) return(0);
prevtime = Time[0];
for(int i=0; i<1000; i++)
{//1
GL1[i] = 0.0758680 +0.113366*Close[i] -0.0180964*Open[i];
.............................
.............................
}//1
ExtMapBuffer1[id]=GL1[0] ;
id++;
}//0

Нужно при каждом старте функции по приходу нового бара сохранять и реверсивно сдвигать в буфере только одно значение GL1[0]. Как показано в примере - не проходит.
 
1) Вставляйте пожайлуста код так:
int id=0;
 
int start()
  {//0
   if(prevtime == Time[0]) return(0);
        prevtime = Time[0];
  for(int i=0; i<1000; i++)
    {//1
     GL1[i] = 0.0758680 +0.113366*Close[i] -0.0180964*Open[i];
.............................
.............................
     }//1
 ExtMapBuffer1[id]=GL1[999] ;
     id++;
   }//0
2) В вашем примере цикл заканчивается когда достигает 999 соответственно последнее значение будет GL1[999]
Но в данном примере цикл всеравно неимеет смысла
int id=0;
 
int start()
  {//0
   if(prevtime == Time[0]) return(0);
        prevtime = Time[0];
 // for(int i=0; i<1000; i++)
 //   {//1
     GL1 = 0.0758680 +0.113366*Close[0] -0.0180964*Open[0];
.............................
.............................
  //   }//1
 ExtMapBuffer1[id]=GL1;
     id++;
   }//0
будет фактически то-же самое
 

Заведите второй массив с числом элементов на 1 меньше. Для сдвига значений исходного массива сначала скопируйте все элементы кроме последнего во второй массив. Потом скопируйте их обратно в первый так чтобы первый элемент второго массива попал во второй первого. Затем занесите в GL1[0] новое значение.

Эту операцию можно было бы делать и без второго массива. Но из-за глюка в функции ArrayCopy() этого без извратов сделать нельзя.

 
bstone - Я пробовал создавать второй массив, но из-за того, что при выходе из функции int start() значения переменных в массивах не сохраняются, а как объявить массивы на глобальном уровне - я не знаю (пробовал, как написано в документации по MQL - не получилось), у меня ничего не получается. А обеспечить реверс в ExtMapBuffer1, без использования дополнительных массивов мне тоже не удается.
xeon - Вы правы, я просто описался.
 
Погмойму вы просто запутались, попробуйте сформулировать четче задачу, возможно вам второй массив и не понадобится.
 

а как объявить массивы на глобальном уровне - я не знаю


Очень просто:

double data[ 100 ];
 
int start()
{
    ...
}
Массив data будет на глобальном уровне.
 
bstone:

а как объявить массивы на глобальном уровне - я не знаю


Очень просто:

double data[ 100 ];
 
int start()
{
    ...
}
Массив data будет на глобальном уровне.




Я так и делал, но при выходе из функции значения в этом массиве не сохранялись, сохранялось только одно последнее значение.

Еще раз сформулирую задачу. Внутри функции int start() по поступлению нового бара запускается цикл
for(int i=0; i<1000; i++)
{//1
GL1[i] = 0.0758680 +0.113366*Close[i] -0.0180964*Open[i];
.............................
.............................
}//1
, который производит некоторый расчет. По завершению этого цикла мне нужно сохранить только одно его значение
GL1[999], и записать его в массив, который либо увеличивается в размере на 1 при каждом старте функции int start() , либо сдвигает все значения предыдущих циклов на 1 и записывает GL1[999] из последнего цикла (последний вариант - предпочтительней). Вроде простая задача, но ничего не получается.
 
double GL1[1000]; //Инициализируем массив
double ArrayNEW[10]; //Инициализируем массив еще один
int NewBar,bar;
//+------------------------------------------------------------------+
// Еще раз сформулирую задачу. Внутри функции int start() по поступлению нового бара  запускается цикл
//+------------------------------------------------------------------+
int start()
  {
   if(NewBar!=Bars){             //Определим наличие нового бара
      
      int ar =ArrayResize(ArrayNEW,bar+1); //Увеличивается размер массива на 1 при каждом появлении нового бара 
      for(int i=0; i<1000; i++){
          GL1[i] = 0.0758680 +0.113366*Close[i] -0.0180964*Open[i];
      }
      ArrayNEW[bar]=GL1[999];
      Print(bar," ",GL1[999],"  ",ArrayNEW[bar]);
      Comment(bar," ",GL1[999],"  ",ArrayNEW[bar]);
      bar++;   
      NewBar=Bars;
    }
 
// который производит некоторый расчет. По завершению этого цикла мне нужно сохранить только одно его значение 
//GL1[999], и записать его в массив, который либо увеличивается в размере на 1 при каждом старте функции int start() , 
//либо сдвигает  все значения предыдущих циклов на 1 и записывает GL1[999] из последнего цикла 
//(последний вариант - предпочтительней). Вроде простая задача, но ничего не получается.
 
 
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
2 Piligrimm

1. Скажите, для начала, вам это нужно в индикаторе или в другой программе. Если в индикаторе, то обычный индикаторный буфер все это делает автоматически без всяких ухищрений.

2. Если вы, конечно, не выбросили что-либо существенное из своего цикла, то он вообще-то не имеет смысла. Последнее значение все-таки относится к Close[0] и Open[0]. А GL1[999] - это уже история. Прогонять весь цикл ради последнего значения не нужно. Достаточно вычислить это значение одним оператором.
 
Yurixx:
2 Piligrimm

1. Скажите, для начала, вам это нужно в индикаторе или в другой программе. Если в индикаторе, то обычный индикаторный буфер все это делает автоматически без всяких ухищрений.

2. Если вы, конечно, не выбросили что-либо существенное из своего цикла, то он вообще-то не имеет смысла. Последнее значение все-таки относится к Close[0] и Open[0]. А GL1[999] - это уже история. Прогонять весь цикл ради последнего значения не нужно. Достаточно вычислить это значение одним оператором.
1. Это не индикатор, а экспертный модуль, который не рисует линии, а непосредственно вырабатывает торговые сигналы для управления торговой системой.
2. Что касается цикла, то в нем много различных полиномов, а также вложенные циклы, то что я привет - только для примера, небольшая часть одного полинома.

xeon  - спасибо за пример, я попробую.
 
xeon:
double GL1[1000]; //Инициализируем массив
double ArrayNEW[10]; //Инициализируем массив еще один
int NewBar,bar;
//+------------------------------------------------------------------+
// Еще раз сформулирую задачу. Внутри функции int start() по поступлению нового бара  запускается цикл
//+------------------------------------------------------------------+
int start()
  {
   if(NewBar!=Bars){             //Определим наличие нового бара
      
      int ar =ArrayResize(ArrayNEW,bar+1); //Увеличивается размер массива на 1 при каждом появлении нового бара 
      for(int i=0; i<1000; i++){
          GL1[i] = 0.0758680 +0.113366*Close[i] -0.0180964*Open[i];
      }
      ArrayNEW[bar]=GL1[999];
      Print(bar," ",GL1[999],"  ",ArrayNEW[bar]);
      Comment(bar," ",GL1[999],"  ",ArrayNEW[bar]);
      bar++;   
      NewBar=Bars;
    }
 
// который производит некоторый расчет. По завершению этого цикла мне нужно сохранить только одно его значение 
//GL1[999], и записать его в массив, который либо увеличивается в размере на 1 при каждом старте функции int start() , 
//либо сдвигает  все значения предыдущих циклов на 1 и записывает GL1[999] из последнего цикла 
//(последний вариант - предпочтительней). Вроде простая задача, но ничего не получается.
 
 
//----
   return(0);
  }
//+------------------------------------------------------------------+


Я сделал, что Вы предложили, частично проблема решина, данные начали сохраняться, но только в реальном режиме времени при подключении к серверу и только с момента подключения.
Но на предыстории и в автономе - не получается. Мне нужно, чтобы это работало и в автономном режиме на предыстории, иначе я не могу вести отладку программы.
Причина обращения: