Перейти к содержимому


Фотография
- - - - -

Время исполнения (как измерять)


  • Please log in to reply
Сообщений в теме: 26

#1 Rann

Rann

    AMTS

  • Администраторы
  • 2133 сообщений

Отправлено 10 July 2013 - 15:39

у ФОЮ статистика приводится за месяц

Вы ей безоговорочно верите?

Вот мы, например, даем статистику спредов. Ей верить можно, т.к. любой клиент может скачать тики и посчитать самостоятельно.

 

Вот кусок кода из моего советника, который замеряет скорость исполнения и проскальзывание:

 

 

        type = OP_BUY;
        RefreshRates();
        price = Ask;
        Print("going to BUY: " + DoubleToStr(lot, 2) + "  ask: " + DoubleToStr(price, Digits));
        ticket = OrderSend(Symbol(),OP_BUY,lot,Ask,0,0,0,NULL,ExpertMagicNumber,0,Blue);
        if (ticket != 0) {  
        OrderSelect(ticket, SELECT_BY_TICKET); 
        if (close) { 
                slippage = price - OrderClosePrice(); 
                if (type == OP_BUY) slippage = -slippage; 
        } else { 
                slippage = price - OrderOpenPrice(); 
                if (type == OP_SELL) slippage = -slippage; 
        }        
        Print("" 
                + "ticket #" + ticket 
                + "  ms: " + (GetTickCount() - ticks) 
                + "  slip: " + DoubleToStr(slippage / Point, 0) 
                + "  cmnt: " + OrderComment() 
        );    
 

Из него же можно сделать скрипт, которым слать ручные приказы.

 

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


  • 0
С Уважением, Дмитрий Раннев.
Генеральный Директор AMTS Solutions
(софт для брокеров, ECN, Bridge, PAMM etc)
 
rannev.ru - мой сайт, там есть крутой индикатор

#2 Rann

Rann

    AMTS

  • Администраторы
  • 2133 сообщений

Отправлено 10 July 2013 - 15:40

Да, хочу заморочиться, научите пожалуйста. Это как, на стороне клиента от МТ4 перехватывать реконнект и сразу отвечать МТ4 успехом? Как-то так?

Суть такая, что надо каждые 28 секунд делать какую-нибудь операцию, например с отложенным ордером далеко от рынка, тогда связь не будет рваться.

Если Ковалев тут появится, то может и кусок кода даст.


  • 0
С Уважением, Дмитрий Раннев.
Генеральный Директор AMTS Solutions
(софт для брокеров, ECN, Bridge, PAMM etc)
 
rannev.ru - мой сайт, там есть крутой индикатор

#3 Rann

Rann

    AMTS

  • Администраторы
  • 2133 сообщений

Отправлено 10 July 2013 - 15:51

Вот небольшая выборка по времени исполнения у нас на сервере за последние несколько минут.

Мы считаем время исполнения от отправки ордера контрагенту до прихода отчета об исполнении.

Ts это Trade server.

Ноль это выставление отложенников.

Время в миллисекундах.

Все что, при измерении в терминале больше, это просто сжирает МТ4.

 

 

[Ts: 94]
[Ts: 94]
[Ts: 203]
[Ts: 343]
[Ts: 187]
[Ts: 94]
[Ts: 562]
[Ts: 93]
[Ts: 94]
[Ts: 94]
[Ts: 93]
[Ts: 94]
[Ts: 141]
[Ts: 94]
[Ts: 94]
[Ts: 796]
[Ts: 93]
[Ts: 499]
[Ts: 312]
[Ts: 172]
[Ts: 94]
[Ts: 0]
[Ts: 109]
[Ts: 94]
[Ts: 94]
[Ts: 94]
[Ts: 94]
[Ts: 93]
[Ts: 94]
[Ts: 78]
[Ts: 171]
[Ts: 109]
[Ts: 94]
[Ts: 93]
[Ts: 93]
[Ts: 312]
[Ts: 218]
[Ts: 93]
[Ts: 0]
[Ts: 93]
[Ts: 94]
[Ts: 94]
[Ts: 78]
[Ts: 780]
[Ts: 94]
[Ts: 94]
[Ts: 94]
[Ts: 811]
[Ts: 94]
[Ts: 328]
[Ts: 468]
[Ts: 0]
[Ts: 343]
[Ts: 312]
[Ts: 296]
[Ts: 93]
[Ts: 78]
[Ts: 94]
[Ts: 78]
[Ts: 624]
[Ts: 202]
[Ts: 94]
[Ts: 93]
[Ts: 94]
[Ts: 94]
[Ts: 266]
[Ts: 172]
[Ts: 93]
[Ts: 187]
[Ts: 94]
[Ts: 93]
[Ts: 795]
[Ts: 94]
[Ts: 94]
[Ts: 203]
[Ts: 483]
[Ts: 343]
[Ts: 312]
[Ts: 93]
[Ts: 78]
[Ts: 187]
[Ts: 624]
[Ts: 94]
[Ts: 94]
[Ts: 62]
[Ts: 78]

  • 0
С Уважением, Дмитрий Раннев.
Генеральный Директор AMTS Solutions
(софт для брокеров, ECN, Bridge, PAMM etc)
 
rannev.ru - мой сайт, там есть крутой индикатор

#4 kanua

kanua

    Свой

  • Пользователи
  • PipPip
  • 372 сообщений
  • МестоположениеКиев

Отправлено 10 July 2013 - 16:25

Вы ей безоговорочно верите?

Почему безоговорочно верю? Оговорочно, конечно! Т.е. я её проверяю, правда по логам. Но так как там речь идёт о 1.5 - 2 сек, то это возможно.

 

Вот мы, например, даем статистику спредов. Ей верить можно, т.к. любой клиент может скачать тики и посчитать самостоятельно.

И правильно делаете. Эта Ваша прозрачность даёт мне уверенность. Почему бы не дать статистику времени исполнения? А я её уже буду иногда проверять.

 

Вот кусок кода из моего советника, который замеряет скорость исполнения и проскальзывание:

        type = OP_BUY;
        RefreshRates();
        price = Ask;
        Print("going to BUY: " + DoubleToStr(lot, 2) + "  ask: " + DoubleToStr(price, Digits));
        ticket = OrderSend(Symbol(),OP_BUY,lot,Ask,0,0,0,NULL,ExpertMagicNumber,0,Blue);
        if (ticket != 0) {  
        OrderSelect(ticket, SELECT_BY_TICKET); 
        if (close) { 
                slippage = price - OrderClosePrice(); 
                if (type == OP_BUY) slippage = -slippage; 
        } else { 
                slippage = price - OrderOpenPrice(); 
                if (type == OP_SELL) slippage = -slippage; 
        }        
        Print("" 
                + "ticket #" + ticket 
                + "  ms: " + (GetTickCount() - ticks) 
                + "  slip: " + DoubleToStr(slippage / Point, 0) 
                + "  cmnt: " + OrderComment() 
        );    
 

Спасибо за код. Тут главное для нашей задачи функция GetTickCount(). Только наверное лучше замеры времени делать перед самой посылкой ордера и сразу после исполнения: ticks=GetTickCount();ticket = OrderSend(...);execution_time=GetTickCount()-ticks; Если ордер не исполнился, то уже потом это можно учесть.

 

На большом количестве ордеров постепенно появится статитстика.

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

 

Но нужно понимать, что отчасти она будет зависеть от пинга и устойчивости связи, которые не в каждой сети одинаковы.

Это понятно. А вот Вы у себя на сервере, могли бы вычислять статистику без учёта пинга от клиента и устойчивости связи сети.


Сообщение отредактировал kanua: 10 July 2013 - 16:26

  • 0

#5 kanua

kanua

    Свой

  • Пользователи
  • PipPip
  • 372 сообщений
  • МестоположениеКиев

Отправлено 10 July 2013 - 16:29

Суть такая, что надо каждые 28 секунд делать какую-нибудь операцию, например с отложенным ордером далеко от рынка, тогда связь не будет рваться.

Если Ковалев тут появится, то может и кусок кода даст.

А не достаточно ли вместо выставления отложенного ордера (лишняя нагрузка на сервер и историю ордеров) перед посылкой ордера простой проверки связи функциями типа IsConnected(), IsTradeContextBusy() или RefreshRates() ?


Сообщение отредактировал kanua: 10 July 2013 - 16:30

  • 0

#6 kanua

kanua

    Свой

  • Пользователи
  • PipPip
  • 372 сообщений
  • МестоположениеКиев

Отправлено 10 July 2013 - 16:34

Вот небольшая выборка по времени исполнения у нас на сервере за последние несколько минут.

Мы считаем время исполнения от отправки ордера контрагенту до прихода отчета об исполнении.

Ts это Trade server.

Ноль это выставление отложенников.

Время в миллисекундах.

Все что, при измерении в терминале больше, это просто сжирает МТ4.

Спасибо за выборку. 86 значений - это уже кое-что. Обработаю - дам статистику.


  • 0

#7 Rann

Rann

    AMTS

  • Администраторы
  • 2133 сообщений

Отправлено 10 July 2013 - 16:40

а ведь хочется знать заранее, на каком типе счёта торговать на новостях, например

У нас одинаковое везде исполнение. ECN одна, и никаких настроек, отжимающих мелких или токсичных клиентов, у нас нет. Все правила едины для всех и всегда максимально хорошие.
Исполнение отложенных ордеров на всех типах счетов одинаковое. разница лишь в том, что на STP комиссия перенесена в спред.

 

А вот Вы у себя на сервере, могли бы вычислять статистику без учёта пинга от клиента и устойчивости связи сети.

Я в предыдущем посте и дал такую статистику за небольшой кусок, мы ее вычисляем. Стоит ли ее публиковать на сайте. Я просто уверен, что стоит начать это делать, то сразу появятся помойки, у которых исполнение будет в разы быстрее. Так же как стоило Альпари в свое время начать публиковать количество клиентов на сайте, как у некоторых компаний (которые очевидно в разы меньше) сразу стали миллионы клиентов.
Не хочется начинать подобную очередную гонку рисованных цифр. Вот со спредами, там особо не пожульничаешь, там все замеряется.


  • 1
С Уважением, Дмитрий Раннев.
Генеральный Директор AMTS Solutions
(софт для брокеров, ECN, Bridge, PAMM etc)
 
rannev.ru - мой сайт, там есть крутой индикатор

#8 Rann

Rann

    AMTS

  • Администраторы
  • 2133 сообщений

Отправлено 10 July 2013 - 16:43

А не достаточно ли вместо выставления отложенного ордера (лишняя нагрузка на сервер и историю ордеров) перед посылкой ордера простой проверки связи функциями типа IsConnected(), IsTradeContextBusy() или RefreshRates() ?

Это я не знаю, надо проверять.


  • 0
С Уважением, Дмитрий Раннев.
Генеральный Директор AMTS Solutions
(софт для брокеров, ECN, Bridge, PAMM etc)
 
rannev.ru - мой сайт, там есть крутой индикатор

#9 kanua

kanua

    Свой

  • Пользователи
  • PipPip
  • 372 сообщений
  • МестоположениеКиев

Отправлено 10 July 2013 - 18:08

Вот небольшая выборка по времени исполнения у нас на сервере за последние несколько минут.

Мы считаем время исполнения от отправки ордера контрагенту до прихода отчета об исполнении.

Ts это Trade server.

Ноль это выставление отложенников.

Время в миллисекундах.

Все что, при измерении в терминале больше, это просто сжирает МТ4.

Удалив нули (отложенники), получаем такое.

 

Время исполнения приказов (мс):

Минимальное:    62
Максимальное:    811
Среднее:    198
 
Из функций распределения видно, что 60% приказов исполнилось за время не превышающее 100 мс, более 90% приказов - за время не превышающее 0,5 с.
 
stat.png
 
Правда выборка (83 значения) маловата. И она сделана только за несколько минут, а нужна за неделю. А если будут также указаны дата+время приказов, то можно было бы смотреть как меняется статискика со временем (по часам и по дням недели). Можно анализировать и по инструментам торговли, а для внутреннего использования в ДЦ, наверное, было бы интересно смотреть зависимость статистики от контрагента.
 
Конечно, хотелось бы знать времена исполнения начиная от момента прихода приказа в ДЦ (именно это время характеризует качество Вашего сервиса), а не от момента отправки контрагенту. А уже время между отправкой трейдером и получения приказа в ДЦ - забота трейдера (ну, и разрабов МТ4, конечно).

Сообщение отредактировал kanua: 10 July 2013 - 18:34

  • 2

#10 Rann

Rann

    AMTS

  • Администраторы
  • 2133 сообщений

Отправлено 10 July 2013 - 23:35

А если будут также указаны дата+время приказов

Это будет очень подробная информация. Наверное, сильно понравится нашим конкурентам.  :good:


  • 0
С Уважением, Дмитрий Раннев.
Генеральный Директор AMTS Solutions
(софт для брокеров, ECN, Bridge, PAMM etc)
 
rannev.ru - мой сайт, там есть крутой индикатор

#11 kanua

kanua

    Свой

  • Пользователи
  • PipPip
  • 372 сообщений
  • МестоположениеКиев

Отправлено 11 July 2013 - 00:34

А не достаточно ли вместо выставления отложенного ордера (лишняя нагрузка на сервер и историю ордеров) перед посылкой ордера простой проверки связи функциями типа IsConnected(), IsTradeContextBusy() или RefreshRates() ?

 

Это я не знаю, надо проверять.

А как Вы думаете можно это проверить на демо-счёте? Думаю, что МТ4 всё равно какой счёт демо или реал.


  • 0

#12 Rann

Rann

    AMTS

  • Администраторы
  • 2133 сообщений

Отправлено 11 July 2013 - 08:33

А как Вы думаете можно это проверить на демо-счёте? Думаю, что МТ4 всё равно какой счёт демо или реал.

Уверен, можно.


  • 0
С Уважением, Дмитрий Раннев.
Генеральный Директор AMTS Solutions
(софт для брокеров, ECN, Bridge, PAMM etc)
 
rannev.ru - мой сайт, там есть крутой индикатор

#13 Sergey Kovalyov

Sergey Kovalyov

    Свой

  • Пользователи +
  • PipPip
  • 1062 сообщений
  • МестоположениеKiev

Отправлено 11 July 2013 - 14:00

Спасибо за код. Тут главное для нашей задачи функция GetTickCount(). Только наверное лучше замеры времени делать перед самой посылкой ордера и сразу после исполнения: ticks=GetTickCount();ticket = OrderSend(...);execution_time=GetTickCount()-ticks; Если ордер не исполнился, то уже потом это можно учесть.

Это изначально мой код был. =)
Точность GetTickCount() в пределах 16-ти тиков (по словам Рената). Print() и пара присваиваний выполняются быстрее, поэтому было сделано так, как сделано, для красивости кода. =)
 

Это понятно. А вот Вы у себя на сервере, могли бы вычислять статистику без учёта пинга от клиента и устойчивости связи сети.

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

http://www.lmax.com/...ion-performance красиво же. =)

Суть такая, что надо каждые 28 секунд делать какую-нибудь операцию, например с отложенным ордером далеко от рынка, тогда связь не будет рваться.
Если Ковалев тут появится, то может и кусок кода даст.

У меня сегодня поезд, так что уже, думаю, на выходных забубеню веточку, выложу там для "ручников" рабочие скрипты (а не эти непонятные большинству отрывки), для торговли в ручном режиме. И выложу код для борьбы с реконнектами.

Сообщение отредактировал Sergey Kovalyov: 11 July 2013 - 14:05

  • 1

#14 Sergey Kovalyov

Sergey Kovalyov

    Свой

  • Пользователи +
  • PipPip
  • 1062 сообщений
  • МестоположениеKiev

Отправлено 11 July 2013 - 14:03

А не достаточно ли вместо выставления отложенного ордера (лишняя нагрузка на сервер и историю ордеров) перед посылкой ордера простой проверки связи функциями типа IsConnected(), IsTradeContextBusy() или RefreshRates() ?

Нет. Если мы будем беречь сервер, то реконнекта и не будет. А нам надо, чтобы был. =)
  • 0

#15 kazakov.v

kazakov.v

    Не новичок

  • Пользователи
  • Pip
  • 48 сообщений

Отправлено 12 July 2013 - 14:52

Это изначально мой код был. =)
Точность GetTickCount() в пределах 16-ти тиков (по словам Рената). ...

 
Это стандартная виндовая функция возвращает системный таймер, точность 10...16 мс.
Вот я тут гораздо гораздее написал:
 

#import "Kernel32.dll"
int QueryPerformanceFrequency(int &a[]);
int QueryPerformanceCounter(int &a[]);
//+------------------------------------------------------------------+
//| PreciseTime(0) - начало отсчета; точность - микросекунда; |
//| PreciseTime(1) - окончание отсчета, возврат времени в мс; |
//+------------------------------------------------------------------+
double PreciseTime(int c)
{
static int start[2], end[2], freq[2];
if(c==0) QueryPerformanceCounter(start);
else
{
QueryPerformanceCounter(end);
if(QueryPerformanceFrequency(freq)==0) return(0);
double res=end[0]-start[0];
return(NormalizeDouble(res/freq[0]*1000.0,3));
}
}/////////////////////////////////////////////////////////////////////

 

 

 

зы в ие10 коды почему-то "расползаются" :(
 


Сообщение отредактировал kazakov.v: 12 July 2013 - 15:23

  • 0

#16 Rann

Rann

    AMTS

  • Администраторы
  • 2133 сообщений

Отправлено 12 July 2013 - 15:42

 
зы в ие10 коды почему-то "расползаются" :(

Надо в окошко кода обрамлять.

 

 

 

В такое
 

  • 0
С Уважением, Дмитрий Раннев.
Генеральный Директор AMTS Solutions
(софт для брокеров, ECN, Bridge, PAMM etc)
 
rannev.ru - мой сайт, там есть крутой индикатор

#17 kazakov.v

kazakov.v

    Не новичок

  • Пользователи
  • Pip
  • 48 сообщений

Отправлено 12 July 2013 - 15:49

 

Надо в окошко кода обрамлять.

 

 

 

В такое
 

У меня вот так выглядит:

Новый точечный рисунок.jpg

 

Да фиг с ним. Win8 меня уже достала, возвернусь на Win7 :)


  • 0

#18 kanua

kanua

    Свой

  • Пользователи
  • PipPip
  • 372 сообщений
  • МестоположениеКиев

Отправлено 12 July 2013 - 21:48

 
Это стандартная виндовая функция возвращает системный таймер, точность 10...16 мс.
Вот я тут гораздо гораздее написал:
 

#import "Kernel32.dll"
int QueryPerformanceFrequency(int &a[]);
int QueryPerformanceCounter(int &a[]);
//+------------------------------------------------------------------+
//| PreciseTime(0) - начало отсчета; точность - микросекунда; |
//| PreciseTime(1) - окончание отсчета, возврат времени в мс; |
//+------------------------------------------------------------------+
double PreciseTime(int c)
{
static int start[2], end[2], freq[2];
if(c==0) QueryPerformanceCounter(start);
else
{
QueryPerformanceCounter(end);
if(QueryPerformanceFrequency(freq)==0) return(0);
double res=end[0]-start[0];
return(NormalizeDouble(res/freq[0]*1000.0,3));
}
}/////////////////////////////////////////////////////////////////////

 

 

 

зы в ие10 коды почему-то "расползаются" :(
 

Так я не понял, чем эта функция гораздее? Какова её точность?


  • 0

#19 kazakov.v

kazakov.v

    Не новичок

  • Пользователи
  • Pip
  • 48 сообщений

Отправлено 12 July 2013 - 22:25

Так я не понял, чем эта функция гораздее? Какова её точность?

 

Зависит от компа. Например, i5 3.3ГГц  1 тик = 300 наносекунд. Грубо говоря, любой проц с базовой частотой>1ГГц обеспечит точность в 1 микросекунду.

Ну, т.е. в 10000 - 30000 раз точнее GetTickCount.


  • 0

#20 kanua

kanua

    Свой

  • Пользователи
  • PipPip
  • 372 сообщений
  • МестоположениеКиев

Отправлено 12 July 2013 - 22:36

Зависит от компа. Например, i5 3.3ГГц  1 тик = 300 наносекунд. Грубо говоря, любой проц с базовой частотой>1ГГц обеспечит точность в 1 микросекунду.

Ну, т.е. в 10000 - 30000 раз точнее GetTickCount.

Какая ж точность в 1 микросекунду, если "PreciseTime(1) - окончание отсчета, возврат времени в мс;".

 

А! Извините, всё понял. Результат double.


Сообщение отредактировал kanua: 12 July 2013 - 22:38

  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных