fxsaber: Нет, к сожалению. Ренат утверждал, что стакан постоянно стримится на весь маркетвотч. Но это не целесообразное (расточительно) решение для большинства ситуаций.
Это единственно возможный вариант. Стриминг стаканов - это родной и неотделимый поток тиков.
Все в платформе взаимосвязано и требует глобальной синхронизации по данным. И тиковый поток в этом играет важнейшую роль.
Но самое главное - расчеты скоростей выборок выше не имеют значения. Они выполнены настолько топорно (замеряется все что угодно, но не время CopyTicks), что даже удивительно.
На расчеты скоростей не смотрел, измерю сам по методу, который Вы выше описали.
Дело в попадании в близкий кеш на последние 4096 котировок.
Все, что попадает в него, занимает микросекунды, а все что больше, требует обращения к истории (включая диск).
Поэтому мой пример извлечения тиков за 20 минут на редко обновляемом USDCHF укладывался в кеш, а на GBPUSD уже превышал последние 4096 тиков и заставлял лазать в далекую базу.
Если примере поставить ulong from =(TimeTradeServer()-600)*1000, то и на GBPUSD будет укладываться.
Дело в попадании в близкий кеш на последние 4096 котировок.
Все, что попадает в него, занимает микросекунды, а все что больше, требует обращения к истории (включая диск).
На вашем демо, действительно, так. На БКС - нет
Network 'xxx': authorized on BCS-MetaTrader5 through Access Server #2 (ping: 46.66 ms)
2016.10.1815:12:32.949 Test14 (Si-12.16,M1) Time: 29089 msc for1503 records 2016.10.1815:12:32.822 Test14 (Si-12.16,M1) Time: 33207 msc for1501 records 2016.10.1815:12:32.639 Test14 (Si-12.16,M1) Time: 21389 msc for1500 records 2016.10.1815:12:31.959 Test14 (Si-12.16,M1) Time: 21926 msc for1500 records
А на Альпари совсем плохо
Network 'xxx': authorized on Alpari-MT5 through mt5.nl.3 (ping: 61.87 ms)
2016.10.1815:14:47.159 Test14 (GBPUSD,M1) Time: 31086 msc for1836 records 2016.10.1815:14:46.999 Test14 (GBPUSD,M1) Time: 30698 msc for1836 records 2016.10.1815:14:46.779 Test14 (GBPUSD,M1) Time: 46306 msc for1836 records 2016.10.1815:14:46.612 Test14 (GBPUSD,M1) Time: 30440 msc for1836 records 2016.10.1815:14:46.532 Test14 (GBPUSD,M1) Time: 36227 msc for1836 records
Поэтому мой пример извлечения тиков за 20 минут на редко обновляемом USDCHF укладывался в кеш, а на GBPUSD уже превышал последние 4096 тиков и заставлял лазать в далекую базу.
Высказался выше о неудобстве копитикс. Представленный индикатор тормозит по причине того, что вынужден несколько раз вызывать копитикс. И все тормоза именно из-за него. А дело вот в чем
При ненулевом From внутри CopyTicks ищется (наверное, бинарный поиск) место, токуда начинать - индекс во внутренней базе.
Прошу добавить функцию, которая возвращает индекс в базе по времени. Тогда эту задачу будет возможность решить оптимальней
Сейчас же, чтобы закачать тики между датами, надо делать запросы по НЕИЗВЕСТНО сколько тиков, начиная с начальной даты. И затем смотреть каждый раз, а достиг ли конечной даты. А с учетом того, что каждый запрос копитикс дается очень дорого, и получаются такие тормоза.
Хорошо бы, чтобы был кэш из копитикс-данных, запрошенных ранее. Ну и если делается копирование в несколько этапов (от from[i] до from[i+ 1]), то логично запихнуть много в кэш после первого же запроса.
В общем, не ясно, как функция изнутри устроена. Но работать тяжело с ней - 100%.
long LastTime = 0; // time_msc-время последнего тика (самого свежего), полученного из истории int Count = 0; // Количество тиков в последенем запросе, у которых time_msc == LastTime
// Возвращает свежие тики, пришедшие после предыдущего вызова int GetFreshTicks( MqlTick &Ticks[], constuint flags = COPY_TICKS_INFO, constuint count = 2000 ) { int Res = 0;
if ((NewAmount > 0) && (Count < NewAmount)) { Res = ArrayCopy(Ticks, NewTicks, 0, Count);
// Взяли крайнее время из текущей истории LastTime = NewTicks[NewAmount - 1].time_msc; Count = 1;
// Находим (Count) в текущей истории количество тиков со временем LastTime for (int i = NewAmount - 2; i >= 0; i--) { if (NewTicks[i].time_msc < LastTime) break;
// Взяли свеженькие тики Amount = GetFreshTicks(Ticks); } }
Результат на Metaquotes-demo
2016.10.1816:06:18.744 Test15 (GBPUSD,M1) i = 40 Amount = 1453 Sum = 79414GetMicrosecondCount()-StartTime = 584393 2016.10.1816:06:18.744 Test15 (GBPUSD,M1) i = 39 Amount = 1999 Sum = 77961GetMicrosecondCount()-StartTime = 584314 2016.10.1816:06:18.729 Test15 (GBPUSD,M1) i = 38 Amount = 1999 Sum = 75962GetMicrosecondCount()-StartTime = 568509 2016.10.1816:06:18.714 Test15 (GBPUSD,M1) i = 37 Amount = 1999 Sum = 73963GetMicrosecondCount()-StartTime = 552582 2016.10.1816:06:18.696 Test15 (GBPUSD,M1) i = 36 Amount = 1999 Sum = 71964GetMicrosecondCount()-StartTime = 536790 2016.10.1816:06:18.681 Test15 (GBPUSD,M1) i = 35 Amount = 1999 Sum = 69965GetMicrosecondCount()-StartTime = 520432 2016.10.1816:06:18.666 Test15 (GBPUSD,M1) i = 34 Amount = 1999 Sum = 67966GetMicrosecondCount()-StartTime = 504725 2016.10.1816:06:18.649 Test15 (GBPUSD,M1) i = 33 Amount = 1999 Sum = 65967GetMicrosecondCount()-StartTime = 488911 2016.10.1816:06:18.634 Test15 (GBPUSD,M1) i = 32 Amount = 1999 Sum = 63968GetMicrosecondCount()-StartTime = 473372 2016.10.1816:06:18.619 Test15 (GBPUSD,M1) i = 31 Amount = 1999 Sum = 61969GetMicrosecondCount()-StartTime = 458022 2016.10.1816:06:18.604 Test15 (GBPUSD,M1) i = 30 Amount = 1999 Sum = 59970GetMicrosecondCount()-StartTime = 442557 2016.10.1816:06:18.589 Test15 (GBPUSD,M1) i = 29 Amount = 1999 Sum = 57971GetMicrosecondCount()-StartTime = 427044 2016.10.1816:06:18.571 Test15 (GBPUSD,M1) i = 28 Amount = 1999 Sum = 55972GetMicrosecondCount()-StartTime = 411524 2016.10.1816:06:18.556 Test15 (GBPUSD,M1) i = 27 Amount = 1999 Sum = 53973GetMicrosecondCount()-StartTime = 396539 2016.10.1816:06:18.541 Test15 (GBPUSD,M1) i = 26 Amount = 1999 Sum = 51974GetMicrosecondCount()-StartTime = 381185 2016.10.1816:06:18.526 Test15 (GBPUSD,M1) i = 25 Amount = 1999 Sum = 49975GetMicrosecondCount()-StartTime = 366146 2016.10.1816:06:18.511 Test15 (GBPUSD,M1) i = 24 Amount = 1999 Sum = 47976GetMicrosecondCount()-StartTime = 351066 2016.10.1816:06:18.496 Test15 (GBPUSD,M1) i = 23 Amount = 1999 Sum = 45977GetMicrosecondCount()-StartTime = 336183 2016.10.1816:06:18.481 Test15 (GBPUSD,M1) i = 22 Amount = 1999 Sum = 43978GetMicrosecondCount()-StartTime = 321109 2016.10.1816:06:18.466 Test15 (GBPUSD,M1) i = 21 Amount = 1999 Sum = 41979GetMicrosecondCount()-StartTime = 306119 2016.10.1816:06:18.449 Test15 (GBPUSD,M1) i = 20 Amount = 1999 Sum = 39980GetMicrosecondCount()-StartTime = 288558 2016.10.1816:06:18.434 Test15 (GBPUSD,M1) i = 19 Amount = 1999 Sum = 37981GetMicrosecondCount()-StartTime = 273758 2016.10.1816:06:18.419 Test15 (GBPUSD,M1) i = 18 Amount = 1999 Sum = 35982GetMicrosecondCount()-StartTime = 259255 2016.10.1816:06:18.406 Test15 (GBPUSD,M1) i = 17 Amount = 1999 Sum = 33983GetMicrosecondCount()-StartTime = 244750 2016.10.1816:06:18.391 Test15 (GBPUSD,M1) i = 16 Amount = 1999 Sum = 31984GetMicrosecondCount()-StartTime = 230100 2016.10.1816:06:18.371 Test15 (GBPUSD,M1) i = 15 Amount = 1999 Sum = 29985GetMicrosecondCount()-StartTime = 216143 2016.10.1816:06:18.361 Test15 (GBPUSD,M1) i = 14 Amount = 1999 Sum = 27986GetMicrosecondCount()-StartTime = 201830 2016.10.1816:06:18.346 Test15 (GBPUSD,M1) i = 13 Amount = 1999 Sum = 25987GetMicrosecondCount()-StartTime = 186887 2016.10.1816:06:18.331 Test15 (GBPUSD,M1) i = 12 Amount = 1999 Sum = 23988GetMicrosecondCount()-StartTime = 172667 2016.10.1816:06:18.311 Test15 (GBPUSD,M1) i = 11 Amount = 1999 Sum = 21989GetMicrosecondCount()-StartTime = 158356 2016.10.1816:06:18.299 Test15 (GBPUSD,M1) i = 10 Amount = 1999 Sum = 19990GetMicrosecondCount()-StartTime = 143450 2016.10.1816:06:18.289 Test15 (GBPUSD,M1) i = 9 Amount = 1999 Sum = 17991GetMicrosecondCount()-StartTime = 128520 2016.10.1816:06:18.269 Test15 (GBPUSD,M1) i = 8 Amount = 1999 Sum = 15992GetMicrosecondCount()-StartTime = 114209 2016.10.1816:06:18.256 Test15 (GBPUSD,M1) i = 7 Amount = 1999 Sum = 13993GetMicrosecondCount()-StartTime = 100016 2016.10.1816:06:18.246 Test15 (GBPUSD,M1) i = 6 Amount = 1999 Sum = 11994GetMicrosecondCount()-StartTime = 85745 2016.10.1816:06:18.231 Test15 (GBPUSD,M1) i = 5 Amount = 1999 Sum = 9995GetMicrosecondCount()-StartTime = 71438 2016.10.1816:06:18.219 Test15 (GBPUSD,M1) i = 4 Amount = 1999 Sum = 7996GetMicrosecondCount()-StartTime = 57293 2016.10.1816:06:18.204 Test15 (GBPUSD,M1) i = 3 Amount = 1999 Sum = 5997GetMicrosecondCount()-StartTime = 43192 2016.10.1816:06:18.181 Test15 (GBPUSD,M1) i = 2 Amount = 1999 Sum = 3998GetMicrosecondCount()-StartTime = 28943 2016.10.1816:06:18.171 Test15 (GBPUSD,M1) i = 1 Amount = 1999 Sum = 1999GetMicrosecondCount()-StartTime = 15160
80K тиков за пол секунды - медленно! Говорить, что нужно было запрашивать не по 2000 тиков за раз, а больше, конечно, можно. Какое значение запроса оптимально тогда?
fxsaber: 80K тиков за пол секунды - медленно! Говорить, что нужно было запрашивать не по 2000 тиков за раз, а больше, конечно, можно. Какое значение запроса оптимально тогда?
Оптимально скачать что нужно к себе на большую глубину один раз, а потом докачивать только новое из ближнего кеша за микросекунды.
Если каждый раз делать глубокие запросы с проваливанием к диску, то тут конечно сам виноват.
Нет, к сожалению. Ренат утверждал, что стакан постоянно стримится на весь маркетвотч. Но это не целесообразное (расточительно) решение для большинства ситуаций.
Это единственно возможный вариант. Стриминг стаканов - это родной и неотделимый поток тиков.
Все в платформе взаимосвязано и требует глобальной синхронизации по данным. И тиковый поток в этом играет важнейшую роль.
Это единственно возможный вариант. Стриминг стаканов - это родной и неотделимый поток тиков.
Все в платформе взаимосвязано и требует глобальной синхронизации по данным. И тиковый поток в этом играет важнейшую роль.
Ну а если не один советник не подписан на BookEvent?
Для поднятия производительности рекомендуете маркетвотч резать?
Но самое главное - расчеты скоростей выборок выше не имеют значения. Они выполнены настолько топорно (замеряется все что угодно, но не время CopyTicks), что даже удивительно.
Ну а если не один советник не подписан на BookEvent?
Для поднятия производительности рекомендуете маркетвотч резать?
Режьте, если хотите.
Вот как надо тестировать CopyTicks:
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick()
{
ulong from =(TimeTradeServer()-1200)*1000;
ulong ticks =GetMicrosecondCount();
int records=CopyTicks(_Symbol,ExtArr,COPY_TICKS_INFO,from,2048);
ticks=GetMicrosecondCount()-ticks;
Print("Time: ",ticks," msc for ",records," records");
}
Вот вывод в микросекундах: 95 микросекунд на выборку 2048 INFO тиков за прошлые 20 минут
Да кошку распотрошил собаку съел на этом уже. Тестов всяких с копитикс наделал уйму. В этот раз решил, что достаточно индикатор запустить.
Ваш вариант
2016.10.18 14:29:11.966 Test14 (GBPUSD,M1) Time: 20263 msc for 2048 records
2016.10.18 14:29:10.841 Test14 (GBPUSD,M1) Time: 13190 msc for 2048 records
2016.10.18 14:29:07.788 Test14 (GBPUSD,M1) Time: 13344 msc for 2048 records
2016.10.18 14:29:07.738 Test14 (GBPUSD,M1) Time: 12751 msc for 2048 records
Дело в попадании в близкий кеш на последние 4096 котировок.
Все, что попадает в него, занимает микросекунды, а все что больше, требует обращения к истории (включая диск).
Поэтому мой пример извлечения тиков за 20 минут на редко обновляемом USDCHF укладывался в кеш, а на GBPUSD уже превышал последние 4096 тиков и заставлял лазать в далекую базу.
Если примере поставить ulong from =(TimeTradeServer()-600)*1000, то и на GBPUSD будет укладываться.
Дело в попадании в близкий кеш на последние 4096 котировок.
Все, что попадает в него, занимает микросекунды, а все что больше, требует обращения к истории (включая диск).
На вашем демо, действительно, так. На БКС - нет
2016.10.18 15:12:32.949 Test14 (Si-12.16,M1) Time: 29089 msc for 1503 records
2016.10.18 15:12:32.822 Test14 (Si-12.16,M1) Time: 33207 msc for 1501 records
2016.10.18 15:12:32.639 Test14 (Si-12.16,M1) Time: 21389 msc for 1500 records
2016.10.18 15:12:31.959 Test14 (Si-12.16,M1) Time: 21926 msc for 1500 records
А на Альпари совсем плохо
2016.10.18 15:14:47.159 Test14 (GBPUSD,M1) Time: 31086 msc for 1836 records
2016.10.18 15:14:46.999 Test14 (GBPUSD,M1) Time: 30698 msc for 1836 records
2016.10.18 15:14:46.779 Test14 (GBPUSD,M1) Time: 46306 msc for 1836 records
2016.10.18 15:14:46.612 Test14 (GBPUSD,M1) Time: 30440 msc for 1836 records
2016.10.18 15:14:46.532 Test14 (GBPUSD,M1) Time: 36227 msc for 1836 records
Поэтому мой пример извлечения тиков за 20 минут на редко обновляемом USDCHF укладывался в кеш, а на GBPUSD уже превышал последние 4096 тиков и заставлял лазать в далекую базу.
Высказался выше о неудобстве копитикс. Представленный индикатор тормозит по причине того, что вынужден несколько раз вызывать копитикс. И все тормоза именно из-за него. А дело вот в чем
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Тестируем 'CopyTicks'
fxsaber, 2016.10.11 19:23
Каков оптимальный (быстродействие) алгоритм получения тиков с from_time до to_time?Было предложено решение
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Тестируем 'CopyTicks'
fxsaber, 2016.10.12 08:44
При ненулевом From внутри CopyTicks ищется (наверное, бинарный поиск) место, токуда начинать - индекс во внутренней базе.
Прошу добавить функцию, которая возвращает индекс в базе по времени. Тогда эту задачу будет возможность решить оптимальней
Сейчас же, чтобы закачать тики между датами, надо делать запросы по НЕИЗВЕСТНО сколько тиков, начиная с начальной даты. И затем смотреть каждый раз, а достиг ли конечной даты. А с учетом того, что каждый запрос копитикс дается очень дорого, и получаются такие тормоза.
А на Альпари совсем плохо
Альпари починили, похоже. БКС - нет.
Хорошо бы, чтобы был кэш из копитикс-данных, запрошенных ранее. Ну и если делается копирование в несколько этапов (от from[i] до from[i+ 1]), то логично запихнуть много в кэш после первого же запроса.
В общем, не ясно, как функция изнутри устроена. Но работать тяжело с ней - 100%.
int Count = 0; // Количество тиков в последенем запросе, у которых time_msc == LastTime
// Возвращает свежие тики, пришедшие после предыдущего вызова
int GetFreshTicks( MqlTick &Ticks[], const uint flags = COPY_TICKS_INFO, const uint count = 2000 )
{
int Res = 0;
MqlTick NewTicks[];
const int NewAmount = CopyTicks(Symbol(), NewTicks, flags, LastTime, count);
if ((NewAmount > 0) && (Count < NewAmount))
{
Res = ArrayCopy(Ticks, NewTicks, 0, Count);
// Взяли крайнее время из текущей истории
LastTime = NewTicks[NewAmount - 1].time_msc;
Count = 1;
// Находим (Count) в текущей истории количество тиков со временем LastTime
for (int i = NewAmount - 2; i >= 0; i--)
{
if (NewTicks[i].time_msc < LastTime)
break;
Count++;
}
}
return(Res);
}
#define TOSTRING(A) " " + #A + " = " + (string)(A)
void OnTick( void )
{
// возьмем тики с начала утренней сессии
LastTime = (TimeCurrent() - (TimeCurrent() % (24 * 3600))) * 1000;
MqlTick Ticks[];
int i = 0;
int Sum = 0;
const ulong StartTime =GetMicrosecondCount();
// Взяли свеженькие тики
int Amount = GetFreshTicks(Ticks);
while (Amount > 0)
{
Sum += Amount;
i++;
Print(TOSTRING(i) + TOSTRING(Amount) + TOSTRING(Sum) + TOSTRING(GetMicrosecondCount() - StartTime));
// Взяли свеженькие тики
Amount = GetFreshTicks(Ticks);
}
}
2016.10.18 16:06:18.744 Test15 (GBPUSD,M1) i = 39 Amount = 1999 Sum = 77961 GetMicrosecondCount()-StartTime = 584314
2016.10.18 16:06:18.729 Test15 (GBPUSD,M1) i = 38 Amount = 1999 Sum = 75962 GetMicrosecondCount()-StartTime = 568509
2016.10.18 16:06:18.714 Test15 (GBPUSD,M1) i = 37 Amount = 1999 Sum = 73963 GetMicrosecondCount()-StartTime = 552582
2016.10.18 16:06:18.696 Test15 (GBPUSD,M1) i = 36 Amount = 1999 Sum = 71964 GetMicrosecondCount()-StartTime = 536790
2016.10.18 16:06:18.681 Test15 (GBPUSD,M1) i = 35 Amount = 1999 Sum = 69965 GetMicrosecondCount()-StartTime = 520432
2016.10.18 16:06:18.666 Test15 (GBPUSD,M1) i = 34 Amount = 1999 Sum = 67966 GetMicrosecondCount()-StartTime = 504725
2016.10.18 16:06:18.649 Test15 (GBPUSD,M1) i = 33 Amount = 1999 Sum = 65967 GetMicrosecondCount()-StartTime = 488911
2016.10.18 16:06:18.634 Test15 (GBPUSD,M1) i = 32 Amount = 1999 Sum = 63968 GetMicrosecondCount()-StartTime = 473372
2016.10.18 16:06:18.619 Test15 (GBPUSD,M1) i = 31 Amount = 1999 Sum = 61969 GetMicrosecondCount()-StartTime = 458022
2016.10.18 16:06:18.604 Test15 (GBPUSD,M1) i = 30 Amount = 1999 Sum = 59970 GetMicrosecondCount()-StartTime = 442557
2016.10.18 16:06:18.589 Test15 (GBPUSD,M1) i = 29 Amount = 1999 Sum = 57971 GetMicrosecondCount()-StartTime = 427044
2016.10.18 16:06:18.571 Test15 (GBPUSD,M1) i = 28 Amount = 1999 Sum = 55972 GetMicrosecondCount()-StartTime = 411524
2016.10.18 16:06:18.556 Test15 (GBPUSD,M1) i = 27 Amount = 1999 Sum = 53973 GetMicrosecondCount()-StartTime = 396539
2016.10.18 16:06:18.541 Test15 (GBPUSD,M1) i = 26 Amount = 1999 Sum = 51974 GetMicrosecondCount()-StartTime = 381185
2016.10.18 16:06:18.526 Test15 (GBPUSD,M1) i = 25 Amount = 1999 Sum = 49975 GetMicrosecondCount()-StartTime = 366146
2016.10.18 16:06:18.511 Test15 (GBPUSD,M1) i = 24 Amount = 1999 Sum = 47976 GetMicrosecondCount()-StartTime = 351066
2016.10.18 16:06:18.496 Test15 (GBPUSD,M1) i = 23 Amount = 1999 Sum = 45977 GetMicrosecondCount()-StartTime = 336183
2016.10.18 16:06:18.481 Test15 (GBPUSD,M1) i = 22 Amount = 1999 Sum = 43978 GetMicrosecondCount()-StartTime = 321109
2016.10.18 16:06:18.466 Test15 (GBPUSD,M1) i = 21 Amount = 1999 Sum = 41979 GetMicrosecondCount()-StartTime = 306119
2016.10.18 16:06:18.449 Test15 (GBPUSD,M1) i = 20 Amount = 1999 Sum = 39980 GetMicrosecondCount()-StartTime = 288558
2016.10.18 16:06:18.434 Test15 (GBPUSD,M1) i = 19 Amount = 1999 Sum = 37981 GetMicrosecondCount()-StartTime = 273758
2016.10.18 16:06:18.419 Test15 (GBPUSD,M1) i = 18 Amount = 1999 Sum = 35982 GetMicrosecondCount()-StartTime = 259255
2016.10.18 16:06:18.406 Test15 (GBPUSD,M1) i = 17 Amount = 1999 Sum = 33983 GetMicrosecondCount()-StartTime = 244750
2016.10.18 16:06:18.391 Test15 (GBPUSD,M1) i = 16 Amount = 1999 Sum = 31984 GetMicrosecondCount()-StartTime = 230100
2016.10.18 16:06:18.371 Test15 (GBPUSD,M1) i = 15 Amount = 1999 Sum = 29985 GetMicrosecondCount()-StartTime = 216143
2016.10.18 16:06:18.361 Test15 (GBPUSD,M1) i = 14 Amount = 1999 Sum = 27986 GetMicrosecondCount()-StartTime = 201830
2016.10.18 16:06:18.346 Test15 (GBPUSD,M1) i = 13 Amount = 1999 Sum = 25987 GetMicrosecondCount()-StartTime = 186887
2016.10.18 16:06:18.331 Test15 (GBPUSD,M1) i = 12 Amount = 1999 Sum = 23988 GetMicrosecondCount()-StartTime = 172667
2016.10.18 16:06:18.311 Test15 (GBPUSD,M1) i = 11 Amount = 1999 Sum = 21989 GetMicrosecondCount()-StartTime = 158356
2016.10.18 16:06:18.299 Test15 (GBPUSD,M1) i = 10 Amount = 1999 Sum = 19990 GetMicrosecondCount()-StartTime = 143450
2016.10.18 16:06:18.289 Test15 (GBPUSD,M1) i = 9 Amount = 1999 Sum = 17991 GetMicrosecondCount()-StartTime = 128520
2016.10.18 16:06:18.269 Test15 (GBPUSD,M1) i = 8 Amount = 1999 Sum = 15992 GetMicrosecondCount()-StartTime = 114209
2016.10.18 16:06:18.256 Test15 (GBPUSD,M1) i = 7 Amount = 1999 Sum = 13993 GetMicrosecondCount()-StartTime = 100016
2016.10.18 16:06:18.246 Test15 (GBPUSD,M1) i = 6 Amount = 1999 Sum = 11994 GetMicrosecondCount()-StartTime = 85745
2016.10.18 16:06:18.231 Test15 (GBPUSD,M1) i = 5 Amount = 1999 Sum = 9995 GetMicrosecondCount()-StartTime = 71438
2016.10.18 16:06:18.219 Test15 (GBPUSD,M1) i = 4 Amount = 1999 Sum = 7996 GetMicrosecondCount()-StartTime = 57293
2016.10.18 16:06:18.204 Test15 (GBPUSD,M1) i = 3 Amount = 1999 Sum = 5997 GetMicrosecondCount()-StartTime = 43192
2016.10.18 16:06:18.181 Test15 (GBPUSD,M1) i = 2 Amount = 1999 Sum = 3998 GetMicrosecondCount()-StartTime = 28943
2016.10.18 16:06:18.171 Test15 (GBPUSD,M1) i = 1 Amount = 1999 Sum = 1999 GetMicrosecondCount()-StartTime = 15160
80K тиков за пол секунды - медленно! Говорить, что нужно было запрашивать не по 2000 тиков за раз, а больше, конечно, можно. Какое значение запроса оптимально тогда?
Оптимально скачать что нужно к себе на большую глубину один раз, а потом докачивать только новое из ближнего кеша за микросекунды.
Если каждый раз делать глубокие запросы с проваливанием к диску, то тут конечно сам виноват.