Изучаем и пишем вместе на MQL5 - страница 14

 

Из любопытства проверил. Результат полученный таков

2011.04.15 15:50:34     123 (EURUSD,D1) time for 'd = a + b + c' = 84453 milliseconds, i = 10000000
2011.04.15 15:51:54     123 (EURUSD,D1) time for 'StringAdd()' = 80906 milliseconds, i = 10000000
2011.04.15 15:53:22     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 87359 milliseconds, i = 10000000
2011.04.15 15:55:11     123 (EURUSD,D1) time for 'd = a + b + c' = 83266 milliseconds, i = 10000000
2011.04.15 15:56:39     123 (EURUSD,D1) time for 'StringAdd()' = 88390 milliseconds, i = 10000000
2011.04.15 15:58:12     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 93391 milliseconds, i = 10000000

Но кажется мне что есть тут какой-то косяк (я имею веду алгоритм проверки)...

 

Yedelkin:

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

Особенность строк.
За первый проход Вы получаете нужный размер буфера для хранения результата сложения и преобразований строк, т.е. релокации буферов для строк d,(string)b и (string)c не происходит.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы - Документация по MQL5
 
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() возвращает общее количество действующих ордеров применительно к торговому счету. А есть ли простой способ получить количество действующих ордеров по конкретному символу?
Получите всю историю и сделайте выборку.
 
Urain:
Получите всю историю и сделайте выборку.
ОК. Значит, простого способа нет.
 

Вопрос. Функции HistorySelect() и HistorySelectByPosition() запрашивают историю ордеров и историю сделок. Запустил поясняющий скрипт из Справочника, там список сделок упорядочен по возрастанию. Это так случайно получилось, или функции HistorySelect() и HistorySelectByPosition() запрограммированы на возвращение списков, упорядоченных по возрастанию?

 
Yedelkin:

Вопрос. Функции HistorySelect() и HistorySelectByPosition() запрашивают историю ордеров и историю сделок. Запустил поясняющий скрипт из Справочника, там список сделок упорядочен по возрастанию. Это так случайно получилось, или функции HistorySelect() и HistorySelectByPosition() запрограммированы на возвращение списков, упорядоченных по возрастанию?

Сколько не экспериментировал результат один, возвращается список упорядоченный определенным образом.

Однажды даже хотел писать заявку на счет того чтобы дополнительный параметр сделали - указывающий как именно должны сортироваться записи.

Но потом хорошо подумал и решил что не стоит (могут ответить что сортируйте сами и все такое), хотя может и зря что не отписал...

 
Interesting:

... сортируйте сами и все такое

Просто если есть предустановленная принудительная сортировка - это одно, а создавать вручную дополнительную сортировку - это другое.
 
Yedelkin:
Просто если есть предустановленная принудительная сортировка - это одно, а создавать вручную дополнительную сортировку - это другое.

Просто в МТ4 я в ручную сортировал (и фильтровал тоже), если не ошибаюсь то сортировку "пузырьками" делал.

Код сортировки брал в тамошней базе, так что это можно уточнить.

А вот как лучше сортировать в MQL5 пока не решил, поскольку как я понял запросы истории теперь не завязаны на вкладку "история" (сортировка и содержание не зависит от того что творит юзер на вкладке).

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