Возможно ли оптимизировать такой цикл?

 

Заметил что код представленный ниже заметно замедляет работу терминала

можно ли как-нибудь ускорить подобные вычисления?

//---- последний посчитанный бар будет пересчитан
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
if(limit>BarsMin-2) limit=BarsMin-2;


//---- основной цикл

for(i=limit;i>=0;i--)

Index_EUR[i] = EUR(i) ;

//---- Вычисление отношения индекса


for(i=limit;i>=0;i--)


{

if (GBP_==1) 

{ I_GBP[i]=
(Index_GBP[i]/Index_GBP[i+1])+
(Index_GBP[i]/Index_GBP[i+2])+
(Index_GBP[i]/Index_GBP[i+3])+
(Index_GBP[i]/Index_GBP[i+5])+
(Index_GBP[i]/Index_GBP[i+8])+
(Index_GBP[i]/Index_GBP[i+13])+
(Index_GBP[i]/Index_GBP[i+21])+
(Index_GBP[i]/Index_GBP[i+34])+
(Index_GBP[i]/Index_GBP[i+55])+
(Index_GBP[i]/Index_GBP[i+89])+ 
(Index_GBP[i]/Index_GBP[i+144])+
(Index_GBP[i]/Index_GBP[i+233]);}

} 
 
Конечно можно.
Делаете длл и по нужным индексам / датам забиваете предвычисленные значения.
Потом значения будут тупо браться уже готовые.

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

Как говорится, оптимизация вычислений отсутствием вычислений.


А можно спросить в какой среде вы делаете библиотеку DLL

Borland Builder C++ 5.0 подойдет

А вот вроде откопал в поиске

Определение Функции DLL

Прежде, чем Вы сможете вызвать функцию DLL от EasyLanguage, Вы должны объявить DLL с использованием DLL инструкции Function Declaration.

Синтаксис:

DefineDLLFunc: "DLLNAME.DLL", Return Type, "FunctionName", Parameters;

DLLNAME.DLL - имя DLL, где функция постоянно находится, Return Type - тип выражения, которое функция возвратит, FunctionName - имя функции как определено в DLL, Parameters - список параметров, ожидаемых функцией (каждый параметр, отделенный запятой).

Очень важно помнить, что 32-разрядные DLLs используют экспортируемые объявленные функции с учетом регистра, используя _cdecl, stdcall, или fastcall. Для DLLs, чтобы быть совместимым с EasyLanguage, экспортируемые функции должны быть созданы с использованием прописных букв и должны объявлены как _stdcall. Эти экспортируемые функции должны быть перечислены в пределах раздела EXPORTS .DEF файла DLL. Использование "_declspec (dllexport)" от прототипа функции недостаточно для EasyLanguage, чтобы определить местонахождение экспортируемых функций DLL.

Например, следующая инструкция объявляет функцию по имени MessageBeep, которая постоянно находится в DLL по имени USER32.DLL. Она возвращает булево (истинное/ложное) значение и ожидает один параметр, int.

DefineDLLFunc: "USER32.DLL", bool, "MessageBeep", int;

Data Types

EasyLanguage поддерживает множество типов достоверных данных, которые могут использоваться, чтобы посылать и получать информацию к функциям, содержавшимся в DLLs. Ниже - список типов данных, поддерживаемых EasyLanguage:

Фундаментальные типы данных:

BYTE
1 byte integer data type.

char
1 byte integer data type.

int
4 byte signed integer data type.

WORD
2 byte unsigned integer data type.

long
4 byte signed integer data type.

DWORD
4 byte unsigned integer data type.

float
4 byte floating point data type.

double
8 byte floating point data type.

BOOL
4 byte boolean data type.




Варианты:


UNSIGNED LONG
Same as DWORD.

VOID
Means "No returned value".

Типы указателей:


LPBYTE
Pointer to a BYTE.

LPINT
Pointer to an int.

LPWORD
Pointer to a WORD.

LPLONG
Pointer to a LONG.

LPDWORD
Pointer to a DWORD.

LPFLOAT
Pointer to a float (in float FAR).

LPDOUBLE
Pointer to a double (in double FAR).

LPSTR
Pointer to a char.


Все указатели - 32-разрядные указатели, и EasyLanguage обрабатывает каждого из них тем же самым способом.

Также, очень важно помнить, что все значения в EasyLanguage - плавающие, кроме значений Open, High, Low and Close, которые являются целыми числами. Чтобы управлять этими ценами, Вы должны послать функции ценовой масштаб символа, который составляет график.

Например, если бумага имеет ценовой масштаб 1/1000, а окончательная цена была 105.125, эту цену будут посылать DLL как 105125. Для DLL, чтобы знать, как читать эту цену, Вы должны послать значение в зарезервированном слове PriceScale, которое в этом случае возвращает значение 1 000.

 
Не вижу смысла морочить мозги именно с этим. на том сайте есть готовая ДЛЛ для вычислений.
 
Берите проект длл из МТ под вижуал студию- и пользуйте.
там без особых размышлений можно будет завести что-то типа
std::map<unsigned long, double> типа дата- к значению.
Причина обращения: