Не работает цикл (и цикл в цикле)

 

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

for (int i = 1000; i > 0; i--) // открывается основной цикл для буффера
  {       
      for (int n = 100; n > 0; n--) // открывается вторичный цикл для подсчета данных за определенное количество баров
      {
          x = x_buf + iClose(Symbol1,NULL,n);
          x_buf = x;
      }

      line[i] = middle_x = x / 100; // расчет буфферной линии
  }

То есть вывод такой что цикл работает не верно...

 
uniface:

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

То есть вывод такой что цикл работает не верно...


// открывается вторичный цикл для подсчета данных за определенное количество баров


Добавь к n  букву i

 
Evgeniy Chumakov:



Добавь к n  букву i

for (int i = 1000; i > 0; i--) // открывается основной цикл для буффера
  {       
      for (int ni = 100; ni > 0; ni--) // открывается вторичный цикл для подсчета данных за определенное количество баров
      {
          x = x_buf + iClose(Symbol1,NULL,ni);
          x_buf = x;
      }

      line[i] = middle_x = x / 100; // вычисление средней линии и расчет буфферной линии
  }

так чтоли, не пойму чем это поможет...

 

Напомнило

 

n+i

Но и я также подумал сначала.

 
Dmitry Fedoseev:

Напомнило

 

n+i

Но и я также подумал сначала.

Один хрен ни че не понял...

 
Dmitry Fedoseev:

Напомнило

 

n+i

Но и я также подумал сначала.

Бога ради напиши по русски что надо сделать, я программист делитант и толком сам не понимаю что творю...

 
uniface:

Бога ради напиши по русски что надо сделать, я программист делитант и толком сам не понимаю что творю...

Сначала поясните в чем задумка. Что должен делать сей алгоритм? 

В вашем примере line[i] заполняете одними и теми же данными, а именно средним значением цен закрытия за последние 100 баров. По этому и рисуется прямая линия.

 
Vitalii Ananev:

Сначала поясните в чем задумка. Что должен делать сей алгоритм? 

В вашем примере line[i] заполняете одними и теми же данными, а именно средним значением цен закрытия за последние 100 баров. По этому и рисуется прямая линия.

Это код вычисления кси-квадрата по формуле Пирсона, но со смыслом чтобы в тестере стратегий тоже работал. И в тестере по он работает отлично, но в прошлое по циклу не рисует и линия т-критерия с нулевого бара будет отображаться не правильно, поэтому нужно под цикл пилить... Вот полный цикл доделал. Также возможно проблема в накоплении буферов цикла, но по другому я не умею...

for (int i = 200; i > 0; i--)
  {
        
          for (int n = CountedBars; n > 0; n--)
          {
              x = x_buf + iClose(Symbol1,NULL,n);
              x_buf = x;
          
              y = y_buf + iClose(Symbol2,NULL,n);
              y_buf = y;
          
              middle_x = x / CountedBars;
              middle_y = y / CountedBars;
          }
          for (int k = CountedBars; k > 0; k--)
          {
              MOxy = MOxy_buf + ((iClose(Symbol1,NULL,k) - middle_x) * (iClose(Symbol2,NULL,k) - middle_y));
              MOxy_buf = MOxy;
          
              MOx2 = MOx_buf2 + ((iClose(Symbol1,NULL,k) - middle_x) * (iClose(Symbol1,NULL,k) - middle_x));
              MOx_buf2 = MOx2;
          
              MOy2 = MOy_buf2 + ((iClose(Symbol2,NULL,k) - middle_y) * (iClose(Symbol2,NULL,k) - middle_y));
              MOy_buf2 = MOy2;
          }

      pear_dub = MOxy / MathSqrt(MOx2 * MOy2);
      if(t_krit == 0) t_krit = pear_dub;
      t_krit = pear_dub * 0.01 + t_krit * (1 - 0.01);
      
      Pearson[i] = pear_dub;
      T_Kriteriy[i] = t_krit; // Если он больше значения корреляции, значит значение является статистически верным  
  //---  
  x = 0;
  x_buf = 0;
  y = 0;
  y_buf = 0;
  MOxy = 0;
  MOxy_buf = 0;
  MOx2 = 0;
  MOx_buf2 = 0;
  MOy2 = 0;
  MOy_buf2 = 0;
  //--- 
  }
 
uniface:

Это код вычисления кси-квадрата по формуле Пирсона, но со смыслом чтобы в тестере стратегий тоже работал. И в тестере по он работает отлично, но в прошлое по циклу не рисует и линия т-критерия с нулевого бара будет отображаться не правильно, поэтому нужно под цикл пилить... Вот полный цикл доделал. Также возможно проблема в накоплении буферов цикла, но по другому я не умею...

Формулу Пирсона не знаю, не вникал. Но при беглом взгляде на код: у вас одна и таже, как в первом примере, ошибка. У вас 200 раз выполняются одни и те же вычисления на одних и тех же данных. 

Я предполагаю, что вам надо сначала рассчитать i=200 на одной порции данных, например n=0  до 10, затем i=199 на другой порцией данных n=11 до 20 и так далее. 

 
uniface:

так чтоли, не пойму чем это поможет...


Так действительно ни чем.

Пробуй так. Если и так не то что надо , то..........

for (int i = 1000; i > 0; i--) // открывается основной цикл для буффера
  {       
      for (int n = 100; n > 0; n--) // открывается вторичный цикл для подсчета данных за определенное количество баров
      {
          x = x_buf + iClose(Symbol1,NULL,n + i);
          x_buf = x;
      }

      line[i] = middle_x = x / 100; // расчет буфферной линии
 
Vitalii Ananev:

Формулу Пирсона не знаю, не вникал. Но при беглом взгляде на код: у вас одна и таже, как в первом примере, ошибка. У вас 200 раз выполняются одни и те же вычисления на одних и тех же данных. 

Я предполагаю, что вам надо сначала рассчитать i=200 на одной порции данных, например n=0  до 10, затем i=199 на другой порцией данных n=11 до 20 и так далее. 

так и надо, для каждого бара из 200 нужны данные с предыдущих 100 баров по 5 направлениям, а по другому не умею.

Причина обращения: