Подскажите, пожалуйста, как создать буфер для сохранения только последних расчетных значений из цикла?
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++; }//02) В вашем примере цикл заканчивается когда достигает 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 - Вы правы, я просто описался.
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] - это уже история. Прогонять весь цикл ради последнего значения не нужно. Достаточно вычислить это значение одним оператором.
1. Скажите, для начала, вам это нужно в индикаторе или в другой программе. Если в индикаторе, то обычный индикаторный буфер все это делает автоматически без всяких ухищрений.
2. Если вы, конечно, не выбросили что-либо существенное из своего цикла, то он вообще-то не имеет смысла. Последнее значение все-таки относится к Close[0] и Open[0]. А GL1[999] - это уже история. Прогонять весь цикл ради последнего значения не нужно. Достаточно вычислить это значение одним оператором.
Yurixx:
2 Piligrimm
1. Скажите, для начала, вам это нужно в индикаторе или в другой программе. Если в индикаторе, то обычный индикаторный буфер все это делает автоматически без всяких ухищрений.
2. Если вы, конечно, не выбросили что-либо существенное из своего цикла, то он вообще-то не имеет смысла. Последнее значение все-таки относится к Close[0] и Open[0]. А GL1[999] - это уже история. Прогонять весь цикл ради последнего значения не нужно. Достаточно вычислить это значение одним оператором.
1. Это не индикатор, а экспертный модуль, который не рисует линии,
а непосредственно вырабатывает торговые сигналы для управления
торговой системой.2 Piligrimm
1. Скажите, для начала, вам это нужно в индикаторе или в другой программе. Если в индикаторе, то обычный индикаторный буфер все это делает автоматически без всяких ухищрений.
2. Если вы, конечно, не выбросили что-либо существенное из своего цикла, то он вообще-то не имеет смысла. Последнее значение все-таки относится к Close[0] и Open[0]. А GL1[999] - это уже история. Прогонять весь цикл ради последнего значения не нужно. Достаточно вычислить это значение одним оператором.
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); } //+------------------------------------------------------------------+
Я сделал, что Вы предложили, частично проблема решина, данные начали сохраняться, но только в реальном режиме времени при подключении к серверу и только с момента подключения.
Но на предыстории и в автономе - не получается. Мне нужно, чтобы это работало и в автономном режиме на предыстории, иначе я не могу вести отладку программы.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Имеется расчет некоторых параметров в функции 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]. Как показано в примере - не проходит.