Появление в торговом терминале  QUIK встроенного скриптового языка LUA создает предпосылки разработки полноценных и универсальных торговых роботов на его основе. Однако, существенным недостатком любых скриптовых языков, реализованных с использованием виртуальных машин, является их относительно низкое быстродействие.

Язык LUA считается сравнительно быстродействующим скриптовым языком.

Однако, хотелось бы знать, насколько велики потери в скорости вычислений при его применении и имеет ли практический смысл использовать комбинированные способы реализации роботов на основе торгового терминала QUIK.

Для ответа на поставленные вопросы, я реализовал следующее тестовое решение.

Я написал на C++ API для QLUA два варианта получения информации из торгового терминала.

Полученные результаты полезнее рассматривать не в абсолютных величинах, а в относительных.

Вариант 1: 

Все функции обратного вызова ( OnAllTrade, OnQuote и т д) реализованы на С++.

На C++ реализованы таблицы для приема и хранения всех доступных на стороне виртуальной машины QLUA таблиц QUIK.

Скорость обращение к таблицам на С++ составляет не более 0.1 мкс на ячейку. Поэтому в дальнейших расчетах, их влиянием я пренебрегаю.

Вариант 2:

На стороне QLUA на С++ реализован сервер DDE.

Таким образом, получаем возможность  сравнить скорость  получения данных из торгового терминала QUIK через встроенные функции обратного вызова ( далее этот способ называется  QLUA ) и DDE.

Замечу, что я оцениваю  скорость преобразования этих данных лишь на стороне QLUA.

Полное быстродействие робота определяется как минимум тремя составляющими : скоростью канала связи, скоростью преобразования информации в торговом терминале и скоростью преобразований на стороне QLUA.

В результате изучения работы QUIK стало ясно, что на стороне QUIK наиболее удачно решена задача формирования данных для функций обратного вызова  QLUA.

В этом случае данные формируются на основе первичных данных QUIK и раньше  формирования информации для передачи по каналу DDE.

Информация для DDE формируется на основе данных подготовленных для отображения в экранных окнах торгового терминала QUIK.

Таким образом, потенциально на стороне торгового терминала QUIK мы имеем более высокую скорость подготовки данных для функций обратного вызова QLUA, по сравнению с DDE.

Казалось бы, что QLUA быстрее, чем DDE.

Увы, как показали эксперименты, скорость обработки информации на стороне QLUA полностью устраняет указанное преимущество.

 Эксперимент 1:

Передача таблицы всех сделок через  OnAllTrade QLUA показала время 15 мкс на строку таблицы для функций обратного вызова и 50 мкс для получения строки с использованием функции getItem.

Для механизма DDE  удалось достичь времени  приема и преобразования данных на стороне QLUA в 6- 11 мкс.

  Эксперимент 2:

Передача очереди заявок (стаканов)  через  OnQuote  QLUA показал время 480-500 мкс для функций обратного вызова. Основное время в этом случае затрачивается  на получение стакана функцией getQouteLevel2.

Для механизма DDE  удалось достичь времени  приема и преобразования данных на стороне QLUA в 6- 11 мкс.

Резюме:

1) В существующей реализации функций обратного вызова, в тех случаях, когда из QUIK в LUA передается таблица, содержащая строку таблицы QUIK ( к ним не относятся такие важные для создания робота  функции обратного вызова, как  OnParam, OnQuote)  , скорость получения информации через механизм функций обратного вызова сопоставим со скоростью  DDE .

2)  Но , скорость существенно меньше ( для OnQuote  в 40-50 раз ), если для получения строки таблицы QUIK приходится применять встроенные функции QLUA ( getQouteLevel2 и getItem ) . 

В 2013 году я заинтересовался практическими вопросами прогнозирования на коротких интервалах.

Мне стало интересно, каких результатов можно достичь,

возможно ли создать общий подход к решению данной задачи.

В данном сообщении продемонстрирую достигнутые результаты.

Период с 15 февраля 2013 г по настоящее время.

Длительность периода связана с длиной истории ,получаемой с сервера QUIK,  это 3000 свечей на 5 минутном тайме.

Робот как всегда без плеч без реинвестирования, торгует на постоянную сумму.

сделки совершаются на открытии следующей за сигналом свечи.

На графиках изображены сигналы. Сделки на следующей свече после сигнала.

Интересен тот факт, что я не использовал стоп-сигналов, т е нет сделок внутри свеч и на их закрытии.

Все сделки лишь на следующей за сигналом свече.

Вот результаты:

All trades Long trades Short trades
Initial capital 100000 100000 100000
Net Profit % 117.10% 54.44% 62.66%
Exposure % 71.37% 33.42% 37.95%
Net Risk Adjusted Return % 164.07% 162.89% 165.11%
Annual Return % 71952.68% 3900.82% 6115.56%
Risk Adjusted Return % 100815.59% 11672.93% 16113.53%
All trades 419 210(50.12%) 209(49.88 %)
 Avg. Profit/Loss 279.47 259.22 299.82
 Avg. Profit/Loss % 0.28% 0.26% 0.30%
 Avg. Bars Held 8.65 8.11 9.19
Winners 349(83.29%) 172(41.05%) 177(42.24%)
 Avg. Profit % 0.36% 0.34% 0.38%
 Avg. Bars Held 9.21 8.78 9.62
 Max. Consecutive 28 26 19
 # bars in largest win 19 23 19
Losers 70(16.71%) 38(9.07%) 32(7.64%)
 Avg. Loss % -0.11% -0.11% -0.11%
 Max. Consecutive 3 3 4
Max. trade % drawdown -0.66% -0.66% -0.62%
 
Max. system % drawdown -0.84% -0.98% -0.93%
Recovery Factor 131.78 55.41 64.97
CAR/MaxDD 85850.43 3970.68 6555.64
RAR/MaxDD 120288.25 11881.99 17273.07
Profit Factor 16.28 14.52 18.22
Payoff Ratio 3.27 3.21 3.29
Standard Error 7601.84 3316.64 4409.78
Risk-Reward Ratio 129.82 137.98 120.01
Ulcer Index 0.17 0.15 0.19
Ulcer Performance Index 434894.14 26693.96 32636.79
Sharpe Ratio of trades 41.87 42.3 39.41
K-Ratio 0.0779 0.0828 0.072

А вот картинка ее работы:

рг_2013_m_001

 

 

 

 

 

 

 

 

Более подробная картинка( для любителей подсматривать)

рг_2013_m_002

 

 

 

 

 

 

 

 

Заслуживает внимание величина просадки , которая не превосходит 1%.

Число успешных сделок превышает 83%.

Впрочем это и не удивительно, так как прогноз на коротких интервалах именно эту проблему и решает,

ну и еще конечно создает профит, величина которого за 45 дней получилась неплохой.

Данного робота  я тестирую с начала 2013 года.

В отличии от предыдущих, в нем нет отрицательного опыта кризиса,

поэтому он радостно смотрит вперед в будущее и не оглядывается назад.

 

 

Сегодня 2.03.2013

рг_2013_4_001

 

 

 

 

 

 

 

 

All trades Long trades Short trades
Initial capital 100000 100000 100000
Net Profit % 56.87% 28.47% 28.39%
Exposure % 83.86% 45.28% 38.58%
Net Risk Adjusted Return % 67.81% 62.88% 73.60%
Annual Return % 4903.04% 782.29% 777.58%
Risk Adjusted Return % 5846.82% 1727.72% 2015.52%
All trades 174 87(50.00%) 87(50.00 )
 Avg. Profit/Loss % 0.33% 0.33% 0.33%
 Avg. Bars Held 19.41 20.76 18.07
Winners 125(71.84%) 58(33.33%) 67(38.51%)
 Avg. Profit % 0.54% 0.60% 0.48%
 Avg. Bars Held 23.03 26.07 20.4
 Max. Consecutive 12 8 7
 # bars in largest win 159 159 60
Losers 49(28.16%) 29(16.67%) 20(11.49%)
 Avg. Loss % -0.20% -0.22% -0.18%
 Avg. Bars Held 10.18 10.14 10.25
 Max. Consecutive 4 3 2
 # bars in largest loss 4 8 4
Max. trade % drawdown -1.43% -1.02% -1.43%
Max. system % drawdown -1.70% -2.25% -1.64%
Recovery Factor 29.48 11.37 17.02
CAR/MaxDD 2887.71 347.43 473.79
RAR/MaxDD 3443.56 767.32 1228.09
Profit Factor 6.74 5.52 8.87
Payoff Ratio 2.64 2.76 2.65
Standard Error 2965.56 1194.39 2217.28
Risk-Reward Ratio 160.39 204.01 104.62
Ulcer Index 0.41 0.55 0.31
Ulcer Performance Index 11875.84 1421.96 2520.83
Sharpe Ratio of trades 20.1 17.77 23.37
K-Ratio 0.094 0.1195 0.0613