При работе с тиками возникают непонятки...

 

При попытках использовать тиковую историю возникают некоторые непонятные моменты. 
Вот один из них. Предположим, что я не знаю количество тиков истории и хочу скачать все доступные тиковые данные. цепляю на график (в данном случае EURUSD) советник с фрагментом кода:

//---
   MqlTick TICKs[];
   ArrayFree(TICKs);
   int TICKsCopied=CopyTicks(_Symbol,TICKs,COPY_TICKS_ALL,1,150000000);
   if(TICKsCopied>0)
     {
      Alert("TICKsCopied = ",TICKsCopied);
     }
//---

 В результате его работы получаю сообщение о копировании 108725043 тиков. При этом терминал съедает (по данным в диспетчере задач)  5574196КБ оперативной памяти.

Если код слегка изменить:

//---
   MqlTick TICKs[];
   ArrayFree(TICKs);
   int TICKsCopied=CopyTicks(_Symbol,TICKs,COPY_TICKS_ALL,0,150000000);
   if(TICKsCopied>0)
     {
      Alert("TICKsCopied = ",TICKsCopied);
     }
//---

то в результате его работы будет сообщение о таком же количестве 108725043 скопированных тиков, но терминал при этом будет съедать уже 7321552КБ оперативной памяти.

Если же требуемое количество тиков для копирования указать точно, то варианты фрагментов кода

int TICKsCopied=CopyTicks(_Symbol,TICKs,COPY_TICKS_ALL,0,108725043);

 и

int TICKsCopied=CopyTicks(_Symbol,TICKs,COPY_TICKS_ALL,1,108725043);

будут работать одинаково.
Чем это вызвано?

 
Vladimir Suschenko:

При попытках использовать тиковую историю возникают некоторые нпонятные моменты. 
Вот один из них. Предположим, что я не знаю количество тиков истории и хочу скачать все доступные тиковые данные. цепляю на график (в данном случае EURUSD) советник с фрагментом кода:

 В результате его работы получаю сообщение о копировании 108725043 тиков. При этом терминал съедает (по данным в диспетчере задач)  5574196КБ оперативной памяти.

Если код слегка изменить:

то в результате его работы будет сообщение о таком же количестве 108725043 скопированных тиков, но терминал при этом будет съедать уже 7321552КБ оперативной памяти.

Если же требуемое количество тиков для копирования указать точно, то варианты фрагментов кода

 и

будут работать одинаково.
Чем это вызвано?

Сегодня днем попробую, а не пробовали запустить один и тот же код 2-3 раза подряд?
 
Alexey Volchanskiy:
Сегодня днем попробую, а не пробовали запустить один и тот же код 2-3 раза подряд?

Пробовал, и несколько раз подряд, и в разной очерёдности.

 
Ещё одна непонятка при работе с тиками....
В документации структура запроса на копирование тиков указана так:
int  CopyTicks( 
   string           symbol_name,           // имя символа 
   MqlTick&         ticks_array[],         // массив для приема тиков 
   uint             flags=COPY_TICKS_ALL,  // флаг, определяющий тип получаемых тиков 
   ulong            from=0,                // дата, начиная с которой запрашиваются тики 
   uint             count=0                // количество последних тиков, которые необходимо получить 
   );
где
 "from
[in]  Дата, начиная с которой запрашиваются тики. Указывается в миллисекундах с 01.01.1970. Если параметр from=0, то отдаются последние count тиков.
"

А по факту получается, что скопировать какое-либо число (N) тиков возможно только в двух случаях - если сделать запрос на копирование последних N тиков или N тиков от начала имеющейся тиковой истории. В данный момент с сервера можно получить тики с момента 1324252808 в указанном формате даты, что соответствует дате 2011.12.19  00:00. При попытке указать любую другую начальную дату запроса тиков, копирование всё равно будет производиться с даты 1324252808.
 
Vladimir Suschenko:
Ещё одна непонятка при работе с тиками....
В документации структура запроса на копирование тиков указана так:
где
 "from
[in]  Дата, начиная с которой запрашиваются тики. Указывается в миллисекундах с 01.01.1970. Если параметр from=0, то отдаются последние count тиков.
"

А по факту получается, что скопировать какое-либо число (N) тиков возможно только в двух случаях - если сделать запрос на копирование последних N тиков или N тиков от начала имеющейся тиковой истории. В данный момент с сервера можно получить тики с момента 1324252808 в указанном формате даты, что соответствует дате 2011.12.19  00:00. При попытке указать любую другую начальную дату запроса тиков, копирование всё равно будет производиться с даты 1324252808.

Попробуй указать время как должно быть.

int TICKsCopied = CopyTicks(_Symbol, TICKs, COPY_TICKS_ALL, (TimeCurrent()-20)*1000, 100);

Если TimeCurrent() время в секундах с 01.01.1970 то в миллисекундах будет умноженное на 1000. Следовательно вышеприведённый вариант копирует тики за последние 20 секунд.

 
Alexey Viktorov:

Попробуй указать время как должно быть.

Если TimeCurrent() время в секундах с 01.01.1970 то в миллисекундах будет умноженное на 1000. Следовательно вышеприведённый вариант копирует тики за последние 20 секунд.

Спасибо, сработало, ввело в заблуждение, что отсчёт времени идёт в милисекундах, а отображение в секундах.
 
Всем привет! Подскажите как в mt4 получить тики. Нет такой функции CopyTick в mt4. Чем ее можно заменить? Может кто знает дайте ссылку где найти можно.
 
Vladimir Skorina:
Всем привет! Подскажите как в mt4 получить тики. Нет такой функции CopyTick в mt4. Чем ее можно заменить? Может кто знает дайте ссылку где найти можно.
Работа с реальными тикам есть в MQL5. Хотите тики - работайте в MQL5.
 
Vladimir Skorina:
Всем привет! Подскажите как в mt4 получить тики. Нет такой функции CopyTick в mt4. Чем ее можно заменить? Может кто знает дайте ссылку где найти можно.
В МТ4 в онлайне собирать тики нужно самому. Для просмотра истории или теста Вы можете скачать тиковую историю и подсунуть её в качестве нестандартного или стандартного таймфрейма.