Реально ли оптимизировать код ?

 

У меня вот есть один этап кода, при полной загрузке котировок на 30 минутном графике думает на четырех котловом проце и 3-мя гигами оперативки! минуты 4. Можно ли его как то оптимизировать что бы думал шустрее ?

Размер массива около 60 000 строк, параметр kolichestvo задается, по умолчанию равен 5-ти! Функция

chek_Type(check_Mass,mass,kolichestvo) //сравнивает неольшие массивы переданные в нее!
   for(i=(ArraySize(ArrayStrg)/6)-kolichestvo;i>0;i--) ///Размер массива порядка 60 000 строк! 
   {  
      sam="";
      for(j=0;j<kolichestvo;j++)
      {
         check_Mass[j][0] = StrToDouble(ArrayStrg[i+j][5]); //Отвечает за время Time
         check_Mass[j][1] = StrToDouble(ArrayStrg[i+j][3]); //Отвечает за Максимум High
         check_Mass[j][2] = StrToDouble(ArrayStrg[i+j][4]); //Отвечает за минимум Low 
         check_Mass[j][3] = StrToDouble(ArrayStrg[i+j][1]); //Отвечает за закрытие Close
         check_Mass[j][4] = StrToDouble(ArrayStrg[i+j][2]); //Отвечает за открытие Open
         if(StrToDouble(ArrayStrg[i+j][1]) > StrToDouble(ArrayStrg[i+j][2]) || StrToDouble(ArrayStrg[i+j][1]) < StrToDouble(ArrayStrg[i+j][2]))
               {
                  if(StrToDouble(ArrayStrg[i+j][1]) > StrToDouble(ArrayStrg[i+j][2]))
                     {
                        check_Mass[j][5] = 0;//если закрытие выше открытия значит свеча бычья
                     }
                  else
                     {
                        check_Mass[j][5] = 1;//если закрытие ниже открытия значит свеча медвежья
                     }
               }
         else {check_Mass[j][5] = 2;}//если закрытие ниже открытия значит свеча доже         
         //sam = sam + check_Mass[j][1]+" =>";     
         count++;
      }
      arrc++;
      //Alert(ArraySize(check_Mass));
      if(chek_Type(check_Mass,mass,kolichestvo)==1)
      {
         for(j=0;j<kolichestvo;j++)
               {
                  Buf_0[i+j] = StrToDouble(ArrayStrg[i+j][3])+ 0.0004;
                  Buf_1[i+j] = StrToDouble(ArrayStrg[i+j][4]) - 0.0004;
               }
      }
      sov = sov + chek_Type(check_Mass,mass,kolichestvo); //Вызываем проверку на совпадение по типу свечей...
     
   }
 
DetRoyD писал(а) >>

У меня вот есть один этап кода, при полной загрузке котировок на 30 минутном графике думает на четырех котловом проце и 3-мя гигами оперативки! минуты 4. Можно ли его как то оптимизировать что бы думал шустрее ?

Размер массива около 60 000 строк, параметр kolichestvo задается, по умолчанию равен 5-ти! Функция

Оптимизировать можно. Но по кусочку это делать не стоит.

 

Количество котлов, кажись, ни на что не влияет. Влияет оператива, но ее вроде как немало. Вообще-то столько строк - многовато.

 

Конкретно этот кусок я б поправил так:

for(i=(ArraySize(ArrayStrg)/6)-kolichestvo;i>0;i--) ///Размер массива порядка 60 000 строк! 
   {  
      int ii;
      sam="";
      for(j=0,ii=i;j<kolichestvo;j++,ii++)
      {
         check_Mass[j][0] = StrToDouble(ArrayStrg[ii][5]); //Отвечает за время Time
         check_Mass[j][1] = StrToDouble(ArrayStrg[ii][3]); //Отвечает за Максимум High
         check_Mass[j][2] = StrToDouble(ArrayStrg[ii][4]); //Отвечает за минимум Low 
         check_Mass[j][3] = StrToDouble(ArrayStrg[ii][1]); //Отвечает за закрытие Close
         check_Mass[j][4] = StrToDouble(ArrayStrg[ii][2]); //Отвечает за открытие Open
         if(StrToDouble(ArrayStrg[ii][1]) > StrToDouble(ArrayStrg[ii][2]) || StrToDouble(ArrayStrg[ii][1]) < StrToDouble(ArrayStrg[ii][2]))
               {
                  if(StrToDouble(ArrayStrg[ii][1]) > StrToDouble(ArrayStrg[ii][2]))
                     {
                        check_Mass[j][5] = 0;//если закрытие выше открытия значит свеча бычья
                     }
                  else
                     {
                        check_Mass[j][5] = 1;//если закрытие ниже открытия значит свеча медвежья
                     }
               }
         else {check_Mass[j][5] = 2;}//если закрытие ниже открытия значит свеча доже         
         //sam = sam + check_Mass[j][1]+" =>";     
         count++;
      }
      arrc++;
      //Alert(ArraySize(check_Mass));
      if(chek_Type(check_Mass,mass,kolichestvo)==1)
      {
         for(j=0,ii=i;j<kolichestvo;j++,ii++)
               {
                  Buf_0[ii] = StrToDouble(ArrayStrg[ii][3])+ 0.0004;
                  Buf_1[ii] = StrToDouble(ArrayStrg[ii][4]) - 0.0004;
               }
      }
      sov = sov + chek_Type(check_Mass,mass,kolichestvo); //Вызываем проверку на совпадение по типу свечей...
     
   }
 
DetRoyD писал(а) >>

Размер массива около 60 000 строк

Вы, кстати, уверены, что Вам нужно столько данных на этапе инициализации?

 
Всем спасибо за комменты, буду думать! Попробую упростить, если уменьшить кол-во строк то статистические данные не будут полными, а следовательно будет утеряна какая то часть данных которая возможно будет влиять на определенный период работы советника.
 
DetRoyD писал(а) >>
Всем спасибо за комменты, буду думать! Попробую упростить, если уменьшить кол-во строк то статистические данные не будут полными, а следовательно будет утеряна какая то часть данных которая возможно будет влиять на определенный период работы советника.

Количество данных конечно имеет значение, но нужно сперва саму логику оптимизировать. Отказываться от строковых переменных и многое другое.

 
PapaYozh >>:

Вы, кстати, уверены, что Вам нужно столько данных на этапе инициализации?

Суть заключается в оперировании историческими данными по заданном алгоритму, чем меньше исторических данных, тем больше погрешьность расчета! :(

 

В чем главная причина такого типа данных - строчного? Почему, скажем, не double? У Вас разные валютные пары?

 
Vinin >>:

Количество данных конечно имеет значение, но нужно сперва саму логику оптимизировать. Отказываться от строковых переменных и многое другое.

Хм а как отказаться от строковых переменных, если архив данных записан в файле в виде строки ?

 
DetRoyD писал(а) >>

Хм а как отказаться от строковых переменных, если архив данных записан в файле в виде строки ?

После загрузки файла в строковый массив перекнуть его в double и забыть про строковый.

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