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

 
double GL1[1000]; //Инициализируем массив
double ArrayNEW[10]; //Инициализируем массив еще один
int NewBar,bar,LimitBar;
 
int start()
  {
   if(LimitBar == 0){LimitBar = Bars;}//Уменьшаем количество пересчета после первого
   else{LimitBar = Bars-1000;}           //Глубина постоянного пересчета истории
  
   if(NewBar!=Bars){             //Определим наличие нового бара
      
      for(bar=Bars;bar>LimitBar;bar--){    //Пересчитываем историю
          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]);
      }
      
      NewBar=Bars;
    }

Вы же сразу об этом не сказали, поэтому я и писал - "попробуйте сформулировать четче задачу"
 
xeon:
double GL1[1000]; //Инициализируем массив
double ArrayNEW[10]; //Инициализируем массив еще один
int NewBar,bar,LimitBar;
 
int start()
  {
   if(LimitBar == 0){LimitBar = Bars;}//Уменьшаем количество пересчета после первого
   else{LimitBar = Bars-1000;}           //Глубина постоянного пересчета истории
  
   if(NewBar!=Bars){             //Определим наличие нового бара
      
      for(bar=Bars;bar>LimitBar;bar--){    //Пересчитываем историю
          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]);
      }
      
      NewBar=Bars;
    }

Вы же сразу об этом не сказали, поэтому я и писал - "попробуйте сформулировать четче задачу"
Этот вариант не работает совсем. Посмотрите, пожалуйста, может что-то не совсем правильно, и будет ли он одинаково отрабатывать и историю, и вновь поступающие бары в реальном времени?
Есть ли возможность средствами MQL решить эту задачу более просто, создав массив определенного размера и по типу регистра сдвига, смещать данные на один шаг по каждому старту функции, записывая новое значение из цикла экспертного модуля? Если я правильно понимаю, функция int start() одинаково работает как на истории, так и на новых данных. Я не программист и не знаю MQL, поэтому, пусть мои примитивные вопросы Вас не удивляют.
 
double GL1;
double ArrayNEW[10];                            //Инициализируем массив 
int NewBar,bar,LimitBar,ResBar;
 
int init(){
    start();                                    //Запустим функцию start() при старте программы (чтоб не ждать нового тика) 
return(0);
}
 
int start(){
   
   if(NewBar!=Bars){                            //Определим наличие нового бара
      ArrayResize(ArrayNEW,Bars);               //Изменение размера массива при каждом появлении нового бара 
      if(LimitBar<1){LimitBar=Bars;}            //Первый пересчет истории
      else{LimitBar=Bars-1;}                    //Глубина постоянного пересчета истории (на каждом баре)
      for(bar=LimitBar;bar>=0;bar--){           //Пересчитываем историю
         ArrayNEW[bar] = 0.0758680 +0.113366*Close[bar] -0.0180964*Open[bar];// записываем в массив результат
          Print(bar," ",ArrayNEW[bar]);         //Выводим значения в журнал
          Comment(bar," ",ArrayNEW[bar]);       //Выводим значения в строку коментариев
      }
      NewBar=Bars;                              
    }
//----
   return(0);
  }
работает и на истории и на вновь поступивших котировках.
Но без вашего внутреннего цикла, - если непонятно для чего он нужен, то темболее непонятно как его сделать.
Сделать то незнамо что, я неумею sorry

>Есть ли возможность средствами MQL решить эту задачу более просто, создав массив определенного размера и по типу регистра сдвига, смещать данные на один шаг по каждому старту функции

Сделать регистр сдвига очень просто, для этого даже массив не нужен

double BidOld0,BidOld1,BidOld2,BidOld3,BidOld4,BidOld5,BidOld6,BidOld7,BidOld8,BidOld9;
 int start(){
         BidOld9=BidOld8;BidOld8=BidOld7;
         BidOld7=BidOld6;BidOld6=BidOld5;
         BidOld5=BidOld4;BidOld4=BidOld3;
         BidOld3=BidOld2;BidOld2=BidOld1;
         BidOld1=BidOld0;BidOld0=Bid;
 
         Comment(BidOld0,BidOld1,BidOld2,BidOld3,BidOld4,BidOld5,BidOld6,BidOld7,BidOld8,BidOld9);
         
 return(0);
 }
 
xeon - спасибо за Ваши советы, попробую. И если не затруднит, подскажите, пожалуйста, как решить еще одну проблему.
Для формирования торговых сигналов я предварительно создаю 20 моделей различных гармоник тренда, далее из них будет выбираться своя оптимальная группа для каждого инструмента, и формироваться торговый сигнал - Buy, Sell, а также сигнал управления трейлиг стопом. Создать универсальное решение дающее высокую точность оценки для всех инструментов - не представляется возможным, каждый инструмент имеет свою специфику, и одна и таже модель на разных инструментах имеет совершенно разную динамику. Вопрос: как автоматически определять к какому инструменту подключен модуль, и формировать соответствующее решение типа:
if ( a==USDCHF)
то решение принимается по одному полиному,
if (a== EURUSD)
то решение принимается по другому полиному,
и т.д.
И как в функции в iClose("?",PERIOD_M1,i) автоматически подставлялось имя того инструмента, к которому подключен модуль?
 
       bool mode1,mode2,mode3,mode4;
       if (Symbol()=="EURUSD"){mode1=true;}
       if (Symbol()=="GBPUSD"){mode2=true;}
       if (Symbol()=="USDJPY"){mode3=true;}
       if (Symbol()=="USDCHF"){mode4=true;}
 
xeon - спасибо.
Извините, что я задаю слишком "тупые" вопросы, например с регистром сдвина, ответ очевиден инапрашивается сам - собой, но посто я побую и у меня не получается, поэтому приходиться спрашивать.

double BidOld0,BidOld1,BidOld2,BidOld3,BidOld4,BidOld5,BidOld6,BidOld7,BidOld8,BidOld9;
 int start(){
         BidOld9=BidOld8;BidOld8=BidOld7;
         BidOld7=BidOld6;BidOld6=BidOld5;
         BidOld5=BidOld4;BidOld4=BidOld3;
         BidOld3=BidOld2;BidOld2=BidOld1;
         BidOld1=BidOld0;BidOld0=Bid;
 
         Comment(BidOld0,BidOld1,BidOld2,BidOld3,BidOld4,BidOld5,BidOld6,BidOld7,BidOld8,BidOld9);
         
 return(0);
 }
Я делал так:
double Buffer2[1000];
int start()
{
........
for (int iq=1; iq<1000; iq++)
Buffer2[iq-1]=Buffer2[iq];
Buffer2[999]=GM[999];

for(int i=0; i<1000; i++)

ExtMapBuffer6[999-i]=Buffer2[i]*Bid;
но не работает, сохраняется и рисуется только одно последнее значение GM[999].

double GL1;
double ArrayNEW[10]; //Инициализируем массив
int NewBar,bar,LimitBar,ResBar;

int init(){
start(); //Запустим функцию start() при старте программы (чтоб не ждать нового тика)
return(0);
}

int start(){
...................
В динамике я проверить сегодня не могу, рынок не работает, но в статике, тоже не реботает как надо, сохраняется только последнее значение, которое заполняет весь массив ArrayNEW, на графике выводится прямая линия.
"Но без вашего внутреннего цикла, - если непонятно для чего он нужен, то темболее непонятно как его сделать.
Сделать то незнамо что, я неумею sorry" - внутренний цикл, никак не влияет на эту часть программы, он самостоятельно выполняется, и на выходе можно выдавать даже не массив, а одну переменную, он может выполняться сразу по запуску функции int start и сформировать значение переменной, которое сохраняется на всем протяжении работы функции int start. После его выполнения запускается программа которую Вы написали.
 
 
 double Buffer2[1000];
int start()
  {
  ........
  for (int  iq=1; iq<1000; iq++)
      Buffer2[iq-1]=Buffer2[iq];
      Buffer2[999]=GM[999];
 
    for(int i=0; i<1000; i++)
    
     ExtMapBuffer6[999-i]=Buffer2[i]*Bid;


Еще бы знать что вы хотели этим кодом добится :-)

Еще раз говорю - без понимания задачи очень трудно сообразить что этим кодом вы хотели добится.
Попробуйте сформулировать задачу:
1) Для чего нужен регистр сдвига?
2) Какие данные нужно заносить в массив
3) Что должно получится на выходе
Если вы нехотите рассказывать сам алгоритм, то придумайте альтернативу,
главное нужно понимать какой результат ожидается, а так задача непонятна и соответственно неизвесно решение.
По поводу представленного кода я ниче не понял что нужно то. Вы бы хотя бы коментарии в строках написали.
 
"1) Для чего нужен регистр сдвига? " - он мне нужен на этапе отладки алгоритма, для хранения всех сигналов управления торговой системой, которые формирует экспертный модуль.
При каждом старте функции int start строится 20 моделей различных гармоник тренда, производится анализ этих моделей и формируется управляющий сигнал - Buy=1, если нужно покупать или Buy=0, если нужно закрыть ордер, при последующих стартах функции идет или подтверждение сигнала, если ситуация не изменилась, или смена его на противоположный. Аналогично и с Sell. Чтобы посмотреть как и в какие моменты сформировались сигналы управления на истории, а также при отладке на демо счете, мне нужно накопить всю последовательность сформированных сигналов Buy и Sell, и отобразить это на графике.
double Buffer2[1000]; //- буферный массив в который записывается один из сигналов при каждом старте функции
int start()
{
........
for (int iq=1; iq<1000; iq++)
Buffer2[iq-1]=Buffer2[iq]; //- цикл, в котором осушествляется реверсивный сдвиг всех накопленных сигналов Buy на один шаг. В моем экспертном модуле используется обратная индексация массивов по отношению МТ4.
Buffer2[999]=GM[999]; // - заносится в буфер вновь сформированный сигнал.

for(int i=0; i<1000; i++)
ExtMapBuffer6[999-i]=Buffer2[i]*Bid; // - цикл в котором происходит масштабирование сигналов буфера по Bid, для вывода на график цен. Все по аналогии делается и для Sell.
Sell и Buy - логические сигналы, принимающие значения либо 0, либо 1, но пока я еще не сделал эту часть экспертного модуля, и пытаюсь вместо них вывести последнее расчетное значение сигнала модели одной из гармоник тренда - GM[999].
Но по выше приведенному коду программы сохраняется и выводится на график только значение последнего цикла функции, а то, что рассчитывалось на всей предыстории не накапливается в буфер, почему, - не могу понять.
 
Piligrimm:
"1) Для чего нужен регистр сдвига? " - он мне нужен на этапе отладки алгоритма, для хранения всех сигналов управления торговой системой, которые формирует экспертный модуль.
При каждом старте функции int start строится 20 моделей различных гармоник тренда, производится анализ этих моделей и формируется управляющий сигнал - Buy=1, если нужно покупать или Buy=0, если нужно закрыть ордер, при последующих стартах функции идет или подтверждение сигнала, если ситуация не изменилась, или смена его на противоположный. Аналогично и с Sell. Чтобы посмотреть как и в какие моменты сформировались сигналы управления на истории, а также при отладке на демо счете, мне нужно накопить всю последовательность сформированных сигналов Buy и Sell, и отобразить это на графике.

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

Такие расчеты следует в виде индикаторов реализовывать, если конечно не лень в ините написать кучу кода по работе с историей. Чтобы было как можно меньше сложностей, все что не связано непосредственно с ордерами должно реализовываться в виде индикаторов.
Причина обращения: