Из любопытства проверил. Результат полученный таков
2011.04.1515:50:34123 (EURUSD,D1) time for'd = a + b + c' = 84453 milliseconds, i = 100000002011.04.1515:51:54123 (EURUSD,D1) time for'StringAdd()' = 80906 milliseconds, i = 100000002011.04.1515:53:22123 (EURUSD,D1) time for'StringConcatenate(d,a,b,c)' = 87359 milliseconds, i = 100000002011.04.1515:55:11123 (EURUSD,D1) time for'd = a + b + c' = 83266 milliseconds, i = 100000002011.04.1515:56:39123 (EURUSD,D1) time for'StringAdd()' = 88390 milliseconds, i = 100000002011.04.1515:58:12123 (EURUSD,D1) time for'StringConcatenate(d,a,b,c)' = 93391 milliseconds, i = 10000000
Но кажется мне что есть тут какой-то косяк (я имею веду алгоритм проверки)...
Получилось, что StringConcatenate работает медленнее, чем связывание строк при помощи операций сложения. В чём загвоздка?
Особенность строк. За первый проход Вы получаете нужный размер буфера для хранения результата сложения и преобразований строк, т.е. релокации буферов для строк d,(string)b и (string)c не происходит.
mql5: Особенность строк. За первый проход Вы получаете нужный размер буфера для хранения результата сложения и преобразований строк, т.е. релокации буферов для строк d,(string)b и (string)c не происходит.
Пробовал разные варианты сравнения - не получается нужный результат. Дошёл вот до такого кода:
uint start,stop;
long i,length=1000000;
string a1[1000000]; for(i=0;i<length;i++) a1[i]="Пример";
string a2[1000000]; for(i=0;i<length;i++) a2[i]="Пример";
string a3[1000000]; for(i=0;i<length;i++) a3[i]="Пример";
double b1[1000000]; ArrayInitialize(b1,1.26);
double b2[1000000]; ArrayInitialize(b2,1.26);
double b3[1000000]; ArrayInitialize(b3,1.26);
double c1[1000000]; ArrayInitialize(c1,1.27);
double c2[1000000]; ArrayInitialize(c2,1.27);
double c3[1000000]; ArrayInitialize(c3,1.27);
string d1[1000000]; for(i=0;i<length;i++) d1[i]=NULL;
string d2[1000000]; for(i=0;i<length;i++) d2[i]=NULL;
string d3[1000000]; for(i=0;i<length;i++) d3[i]=NULL;
//////////////////////////////////////////////////////////////////////////////////----------------------------------------------------------------------------////Work variables//----------------------------------------------------------------------------//
start=GetTickCount();
for(i=0;i<length;i++)
{
d1[i]=a1[i]+(string)b1[i]+(string)c1[i];
}
stop=GetTickCount();
Print("time for 'd = a + b + c' = ",(stop-start)," milliseconds, i = ",i);
//Второй способ
start=GetTickCount();
for(i=0;i<length;i++)
{
StringAdd(d2[i],a2[i]);
StringAdd(d2[i],(string)b2[i]);
StringAdd(d2[i],(string)c2[i]);
}
stop=GetTickCount();
Print("time for 'StringAdd()' = ",(stop-start)," milliseconds, i = ",i);
//Третий способ
start=GetTickCount();
for(i=0;i<length;i++)
{
StringConcatenate(d3[i],a3[i],b3[i],c3[i]);
}
stop=GetTickCount();
Print("time for 'StringConcatenate(d,a,b,c)' = ",(stop-start)," milliseconds, i = ",i);
Результаты:
KL 0 DoubleToString (EURGBP,M1) 23:53:01 time for'd = a + b + c' = 15766 milliseconds, i = 1000000
HD 0 DoubleToString (EURGBP,M1) 23:53:26 time for'StringAdd()' = 25390 milliseconds, i = 1000000
FK 0 DoubleToString (EURGBP,M1) 23:54:03 time for'StringConcatenate(d,a,b,c)' = 36516 milliseconds, i = 1000000
KS 0 DoubleToString (EURGBP,M1) 23:54:56 time for'd = a + b + c' = 15781 milliseconds, i = 1000000
FL 0 DoubleToString (EURGBP,M1) 23:55:21 time for'StringAdd()' = 25375 milliseconds, i = 1000000
OR 0 DoubleToString (EURGBP,M1) 23:55:57 time for'StringConcatenate(d,a,b,c)' = 35828 milliseconds, i = 1000000
Вопрос. Функция OrdersTotal() возвращает общее количество действующих ордеров применительно к торговому счету. А есть ли простой способ получить количество действующих ордеров по конкретному символу?
Yedelkin: Вопрос. Функция OrdersTotal() возвращает общее количество действующих ордеров применительно к торговому счету. А есть ли простой способ получить количество действующих ордеров по конкретному символу?
Вопрос. Функции HistorySelect() и HistorySelectByPosition() запрашивают историю ордеров и историю сделок. Запустил поясняющий скрипт из Справочника, там список сделок упорядочен по возрастанию. Это так случайно получилось, или функции HistorySelect() и HistorySelectByPosition() запрограммированы на возвращение списков, упорядоченных по возрастанию?
Вопрос. Функции HistorySelect() и HistorySelectByPosition() запрашивают историю ордеров и историю сделок. Запустил поясняющий скрипт из Справочника, там список сделок упорядочен по возрастанию. Это так случайно получилось, или функции HistorySelect() и HistorySelectByPosition() запрограммированы на возвращение списков, упорядоченных по возрастанию?
Сколько не экспериментировал результат один, возвращается список упорядоченный определенным образом.
Однажды даже хотел писать заявку на счет того чтобы дополнительный параметр сделали - указывающий как именно должны сортироваться записи.
Но потом хорошо подумал и решил что не стоит (могут ответить что сортируйте сами и все такое), хотя может и зря что не отписал...
Yedelkin: Просто если есть предустановленная принудительная сортировка - это одно, а создавать вручную дополнительную сортировку - это другое.
Просто в МТ4 я в ручную сортировал (и фильтровал тоже), если не ошибаюсь то сортировку "пузырьками" делал.
Код сортировки брал в тамошней базе, так что это можно уточнить.
А вот как лучше сортировать в MQL5 пока не решил, поскольку как я понял запросы истории теперь не завязаны на вкладку "история" (сортировка и содержание не зависит от того что творит юзер на вкладке).
Из любопытства проверил. Результат полученный таков
Но кажется мне что есть тут какой-то косяк (я имею веду алгоритм проверки)...
Yedelkin:
Получилось, что StringConcatenate работает медленнее, чем связывание строк при помощи операций сложения. В чём загвоздка?
За первый проход Вы получаете нужный размер буфера для хранения результата сложения и преобразований строк, т.е. релокации буферов для строк d,(string)b и (string)c не происходит.
Особенность строк.
За первый проход Вы получаете нужный размер буфера для хранения результата сложения и преобразований строк, т.е. релокации буферов для строк d,(string)b и (string)c не происходит.
Пробовал разные варианты сравнения - не получается нужный результат. Дошёл вот до такого кода:
Результаты:
Вопрос. Функция OrdersTotal() возвращает общее количество действующих ордеров применительно к торговому счету. А есть ли простой способ получить количество действующих ордеров по конкретному символу?
Получите всю историю и сделайте выборку.
Вопрос. Функции HistorySelect() и HistorySelectByPosition() запрашивают историю ордеров и историю сделок. Запустил поясняющий скрипт из Справочника, там список сделок упорядочен по возрастанию. Это так случайно получилось, или функции HistorySelect() и HistorySelectByPosition() запрограммированы на возвращение списков, упорядоченных по возрастанию?
Вопрос. Функции HistorySelect() и HistorySelectByPosition() запрашивают историю ордеров и историю сделок. Запустил поясняющий скрипт из Справочника, там список сделок упорядочен по возрастанию. Это так случайно получилось, или функции HistorySelect() и HistorySelectByPosition() запрограммированы на возвращение списков, упорядоченных по возрастанию?
Сколько не экспериментировал результат один, возвращается список упорядоченный определенным образом.
Однажды даже хотел писать заявку на счет того чтобы дополнительный параметр сделали - указывающий как именно должны сортироваться записи.
Но потом хорошо подумал и решил что не стоит (могут ответить что сортируйте сами и все такое), хотя может и зря что не отписал...
... сортируйте сами и все такое
Просто если есть предустановленная принудительная сортировка - это одно, а создавать вручную дополнительную сортировку - это другое.
Просто в МТ4 я в ручную сортировал (и фильтровал тоже), если не ошибаюсь то сортировку "пузырьками" делал.
Код сортировки брал в тамошней базе, так что это можно уточнить.
А вот как лучше сортировать в MQL5 пока не решил, поскольку как я понял запросы истории теперь не завязаны на вкладку "история" (сортировка и содержание не зависит от того что творит юзер на вкладке).