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

 
Dmitriy Skub:

Спустя год, подводим промежуточный итог:

- функция CopyTicks работает корректно (соответствует описанию);

- текущие тиковые данные срочного рынка, получаемые с помощью указанной функции, совпадают с биржевыми;

- история тиковых данных срочного рынка для наиболее ликвидных инструментов корректна начиная с 28.07.2016 (очевидно, старт последней версии серверной части);

Все выше указанное относится к версии терминала МТ5 1395 и реал-счетам срочного рынка в Open-Broker. В принципе, тема закрыта.

Направления сделок тоже проверяли?
 

У меня был вопрос по CopyBuffer

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Позволяет ли mql5 написать индикатор, рисующий графики в разных окнах или получать доступ к буферам индикаторов в других окнах?

fxsaber, 2016.09.09 10:20

У меня такой вопрос. Целесообразно ли (с точки зрения производительности) при использовании CopyBuffer дописывать буфера на количество измененных значений (входной параметр count не нулевой) или же всегда делать полную копию буфера?

но почти такой же вопрос и по CopyTicks.

Целесообразно ли (с точки зрения производительности) при использовании CopyTicks дописывать к уже собранным тикам новые значения или же всегда делать полный запрос с того места, откуда требуются тики и не хранить собранные значения ранее?

 
При дописывании тиков в динамический массив, сколько лучше всего ставить reserve_size  в ArrayResize?
 
fxsaber:
При дописывании тиков в динамический массив, сколько лучше всего ставить reserve_size  в ArrayResize?
Динамический массив ограничен размером INT_MAX, поэтому лучше сразу задать массиву этот размер.
 
prostotrader:
Динамический массив ограничен размером INT_MAX, поэтому лучше сразу задать массиву этот размер.
Птичкуамять жалко.
 
prostotrader:
Динамический массив ограничен размером INT_MAX, поэтому лучше сразу задать массиву этот размер.
Микалас, это Вы? :-)
 
Dennis Kirichenko:
Микалас, это Вы? :-)
Примечание

Функция может быть применена только к динамическим массивам. При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, 
назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит 
исполняющая подсистема терминала.

Общее число элементов в массиве не может превышать 2147483647.
 
prostotrader:
Вижу по почерку, что Вы ;-)
 

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

#property script_show_inputs

sinput int Count = 10000; // Количество тиков на проверку

#define TOSTRING(A) " " + #A + " = " + (string)Tick.A

string TickToString( const MqlTick &Tick )
{
  static int i = 0;
  
  i++;
  
  return("Tick" + (string)i + ":" + TOSTRING(time) + "." + (string)(Tick.time_msc %1000) +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume));
}

void OnStart()
{
  MqlTick Ticks[];
  
  const int Amount = CopyTicks(_Symbol, Ticks, COPY_TICKS_INFO, 0, Count);
  
  for (int i = 1; i < Amount; i++)
    if (Ticks[i].time_msc == Ticks[i - 1].time_msc) // ищем соседние тики с одним временем (с точностью до мс)
//      if ((Ticks[i].bid > Ticks[i - 1].bid) ||(Ticks[i].ask < Ticks[i - 1].ask)) // ищем выставление лимитной заявки внутрь спреда
        Print(TickToString(Ticks[i - 1]) + "\n" + TickToString(Ticks[i]) + "\n");
}

Часть результата:

2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick14: time = 2016.09.13 10:12:55.819 bid = 98220.0 ask = 98240.0 last = 98240.0 volume = 2
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick13: time = 2016.09.13 10:12:55.819 bid = 98230.0 ask = 98240.0 last = 98240.0 volume = 2

Здесь в течение одной миллисекунды кто-то сумел снять свой BuyLimit= 98230. Именно снял, а не его сматчили с маркетом.

Проверка показала, что все такие действия внутри одной миллисекунды - это снятие (не исполнение) лучшего лимитника из стакана.

 

Еще часть результата:

2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick4: time = 2016.09.13 10:00:00.235 bid = 98490.0 ask = 99040.0 last = 98500.0 volume = 8
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick3: time = 2016.09.13 10:00:00.235 bid = 98490.0 ask = 98600.0 last = 98500.0 volume = 8
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick2: time = 2016.09.13 10:00:00.235 bid = 98490.0 ask = 98600.0 last = 98500.0 volume = 8
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick1: time = 2016.09.13 10:00:00.235 bid = 98500.0 ask = 98600.0 last = 98500.0 volume = 8

Здесь каким-то образом на открытии сессии кто-то за одну миллисекунду сумел снять и SellLimit и BuyLimit. Т.е. два действия уже за одну миллисекунду!

 

Как такое может быть? Ведь даже HFT не могут снять лимитную заявку в течение времени меньше, чем 1мс.

 

Или же если через OrderSendAsync отправить два лимитника (BuyLimit1_price < BuyLimit2_price) внутрь спреда, то будет порождено биржей два подряд идущих тика с улучшением bid-цены в одно и то же время (с точностью до 1мс)?

 
fxsaber:


Как такое может быть? Ведь даже HFT не могут снять лимитную заявку в течение времени меньше, чем 1мс.

 


Откуда у Вас такие познания?

Кроме Plaza II есть ещё протокол FAST/FIX

за 1 мс совершаются сотни операций 

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