Тестируем 'CopyTicks' - страница 39

 
 
fxsaber:

Тормозить  и зависеть от торгового сервера не должны.

Скорость выдачи: терминал хранит по каждому символу 4096 последних тиков в кеше для быстрого доступа (для символов с запущенным стаканом – 65536 тиков), запросы к этим данным выполняются быстрее всего. При запросе тиков текущей торговой сессии за пределами кеша CopyTicks() обращается уже к тикам, которые хранятся в памяти терминала, эти запросы требуют большего времени на выполнение. Самыми медленными являются запросы тиков за другие дни, так как в этом случае данные читаются уже с диска.

Если терминалы стоят на одном диске, то, по-идее, Вы правы. 

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

 
Alexey Kozitsyn:

Если терминалы стоят на одном диске, то, по-идее, Вы правы. 

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

Воспроизводится 100%. Терминал один и тот же.

 

Как в OnDeinit индикатора получить тики? Хочу получить тики, которые уже есть в tkc-файлах и которые отдаются почти мгновенно. Но как определить, какие тики есть, а каких нет?

За всей внешней привлекательностью простоты CopyTicks на самом деле скрываются подводные камни, обойти которые не представляется возможным из-за ограниченного функционала ради опять же этой внешней привлекательности.

 
fxsaber:

Как в OnDeinit индикатора получить тики? Хочу получить тики, которые уже есть в tkc-файлах и которые отдаются почти мгновенно. Но как определить, какие тики есть, а каких нет?

За всей внешней привлекательностью простоты CopyTicks на самом деле скрываются подводные камни, обойти которые не представляется возможным из-за ограниченного функционала ради опять же этой внешней привлекательности.

Зачем получать тики в OnDeinit()?
 
Alexey Kozitsyn:
Зачем получать тики в OnDeinit()?

Нужно создать кастомный символ и записать в него преобразованную всю тиковую историю (с определенной даты), что уже имеется в tkc-файлах. Тики, которых нет на машине, не интересуют. Поэтому индикатор никак не должен тормозить при такой задаче. Однако, CopyTicks не позволяет так получить тики.

 
Пытаюсь получить тики по чужому символу в OnInit
#include <Trade\Trade.mqh>

bool OpenPos( const string Symb )
{
  static CTrade Trade;
  
  return(Trade.Buy(1, Symb));
}

void OnInit()
{
  Sleep(3600 * 1000);    
  
  OpenPos("NZDUSD"); // Заставляем Агент получить тики по чужому символу

  MqlTick Ticks[];
  
  Print(CopyTicks("NZDUSD", Ticks, COPY_TICKS_INFO, 0, 5)); // 0
  
  ArrayPrint(Ticks);
}


Результат

MetaTester 5 started on 127.0.0.1:3000
initialization finished
login (build 1653)
template file tester.tpl added. 2398 bytes loaded
38520 bytes of account info loaded
1482 bytes of tester parameters loaded
188 bytes of input parameters loaded
3456 bytes of symbols list loaded
expert file added: Experts\Test4.ex5. 44667 bytes loaded
initial deposit 10000000.00 USD, leverage 1:500
successfully initialized
48 Kb of total initialization data received
Intel Core i7-2700K  @ 3.50GHz, 16301 MB
EURUSD: symbol to be synchronized
EURUSD: symbol synchronized, 3464 bytes of symbol info received
EURUSD: history synchronization started
EURUSD: load 27 bytes of history data to synchronize in 0:00:00.000
EURUSD: history synchronized from 2016.01.04 to 2017.10.11
EURUSD: ticks synchronization started
EURUSD: load 34 bytes of tick data to synchronize in 0:00:00.000
EURUSD: history ticks synchronized from 2017.04.03 to 2017.10.10
EURUSD,M1: history cache allocated for 667542 bars and contains 651824 bars from 2016.01.04 00:00 to 2017.09.29 23:59
EURUSD,M1: history begins from 2016.01.04 00:00
EURUSD,M1 (MetaQuotes-Demo): generating based on real ticks
EURUSD,M1: testing of Experts\Test4.ex5 from 2017.10.01 00:00 to 2017.10.11 00:00 started
EURUSD : real ticks begin from 2017.04.03 00:00:00
EURUSD : 2017.10.01 00:00 - 2017.10.11 00:00  last prices absent for 7 whole days, bars built by bid prices
NZDUSD: symbol to be synchronized
NZDUSD: symbol synchronized, 3464 bytes of symbol info received
NZDUSD: history synchronization started
NZDUSD: load 27 bytes of history data to synchronize in 0:00:00.000
NZDUSD: history synchronized from 2016.01.04 to 2017.10.11
NZDUSD: ticks synchronization started
NZDUSD: load 34 bytes of tick data to synchronize in 0:00:00.000
NZDUSD: history ticks synchronized from 2017.10.02 to 2017.10.10
2017.10.01 01:00:00   instant buy 1.00 NZDUSD at 0.72043 (0.72017 / 0.72043)
2017.10.01 01:00:00   deal #2 buy 1.00 NZDUSD at 0.72043 done (based on order #2)
2017.10.01 01:00:00   deal performed [#2 buy 1.00 NZDUSD at 0.72043]
2017.10.01 01:00:00   order performed buy 1.00 at 0.72043 [#2 buy 1.00 NZDUSD at 0.72043]
2017.10.01 01:00:00   CTrade::OrderSend: instant buy 1.00 NZDUSD at 0.72043 [done at 0.72043]
2017.10.01 01:00:00   true
2017.10.01 01:00:00   0
NZDUSD : real ticks begin from 2017.10.02 00:00:00
NZDUSD : 2017.10.01 00:00 - 2017.10.11 00:00  last prices absent for 7 whole days, bars built by bid prices


Т.е. в начале по чужому символу нет никаких тиковых данных. И тики в БД формируются по мере появления OnTick. Так задумано или все же тики по чужим символам должны быть доступны, как и по основному символу тестирования?

 
Что имеется в виду в этой цитате из Документации?

Примечание

Функция CopyTicksRange() предназначена для запроса тиков из строго указанного диапазона, например, за конкретный день истории. В то время как CopyTicks() позволяет указать только начальную дату, например – получить все тики с начала месяца по текущий момент.

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicksRange
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicksRange
  • www.mql5.com
[out]  Cтатический или динамический массив MqlTick для приема тиков. Если в статический массив не вмещаются все тики из запрошенного интервала времени, то будет получено столько тиков, сколько помещается в массив. При этом функция сгенерирует ошибку ERR_HISTORY_SMALL_BUFFER (4407) . ERR_NOT_ENOUGH_MEMORY – не хватает памяти для получения...
 

CopyTicks работает только с символами, которые включены в Обзоре рынка. И это всегда было логично до появления кастом-символов.

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

Поэтому просьба отключить для кастомных символов возврат ошибки CopyTicks, если кастомный не выбран в Обзоре рынка.

 
Для кастомных символов, чтобы узнать общее количество тиков, приходится использовать CopyTicksRange(Symb, Ticks) ( плюс это) и смотреть размер массива. Но это очень расточительно!
Причина обращения: