написал: Это означает, что данные мы получаем не чаще чем один раз в 0.7 секунды в виде пакета, Потом этот пакет пересылается нам в колбеки. В итоге вам кажется, что вы получаете данные в реальном времени, а в действительности с задержкой на 0.7 секунды. В реальных торгах задержка возможно и меньше, но передачу пакетом никто не отменял.
По моему опыту мне кажется, что данные я получаю чаще, чем один раз в 0.7 секунды. Но, как говорится, частота получения данных и задержка - это две большие разницы. В реальных торгах задержка может достигать нескольких секунд или более. Хоть получать вы можете данные с высокой частотой, но это будут "старые" данные с большой задержкой.
У меня данные с сервера приходят с задержкой 0.03 сек - это задержка канала связи (смотрим в информационном окне терминала QUIK в расширенном режиме) . ----------------------------------- Но как быстро обновляются данные в пакетах среза - это вопрос открытый. ---------------------------------- Ранее встречал информацию, что биржа рассылает широковещательно информацию с интервалом 0.5 сек. ================= При большой очереди к серверу брокера задержка реакции на транзакцию может составить и секунды. ------------------------ Сами разработчики QUIK сообщали ранее, что скорость обслуживания транзакции сервером QUIK составляет 0.001 сек. ============== Пример задержки реакции сервера брокера на транзакцию клиента. ----------------------- У известного брокера число клиентов 800 тысяч. Предположим, у него 100 серверов. Предположим, что все клиенты выставляют заявки. В среднем на каждом сервере будет очередь 8000. ----------------------------------------- Последний в очереди будет стоять в очереди 8 секунд.
TWS - это терминал как и QUIK Терминал к терминалу подключать смысла нет. ---------------------------- Вам надо терминал QUIK подключать к серверу TWS. Но это вам не дадут сделать разработчики QUIK ------------------------ Если Вы хотите сделать робота для TWS то для этого их API - аналог QLUA в терминале QUIK ---------------------
тейк профит, отступ от мах, мин.
Пользователь
Сообщений: Регистрация: 30.01.2015
25.04.2022 12:16:36
Цитата
Алексей написал: Здравствуйте, почитал пост но все равно не разобрался. Помогите пожалуйста. Оставлял тейк профит заявку на покупку одного лота AGRO по цене 865 отступ и спред стояли 0,стояла галочка "купить по рыночной цене" в итоге цена пришла на 864 заявка висит как исполнена но лот не купился. Указано "Не прошла контроль лимитов" Если не сложно покажите на примере какие параметры заявки тейк профит на покупку должны стоять если я хочу взять 1 лот по цене 865. Заранее спасибо
У Вас пробема в том, что Вы указали -купить по рынку. Поставьте конкретную цену и все будет OK
Кривые шибки в QLua
Пользователь
Сообщений: Регистрация: 30.01.2015
08.04.2022 08:41:27
Цитата
Старатель написал: QUIK 9.3.1.11, Lua 5.4 Ещё парочка "неуловимых" косяков. Обе ошибки были в main. Никаких сторонних библиотек не подключено, только QLua-код.
1.
Код
local Time = tonumber(( os.date ( '%H%M' )))
if Time > = 2300 then
Вопрос к любителям ловли ошибок в QLUA ----------------- Представим , что в момент вывода функцией main параметров некоторой таблицы QUIK происходит вызов терминалом колбека QLUA и изменение этой таблицы., ------------ Вопросы: 1) что будет выводить функция main в этом случае, то что было до вызова колбека или то, что осталось после вызова. ------------------------------- 2) если будут в параметрах nil, то это ошибка QLUA, или ошибка писателя main, который использует потоко не безопасные функции в ней? Например, использовал функцию getParamEx.
Если его запустить, то length = 5. Если закомментировать a[4] length = 3. Если закомментировать a[2] или a[3], то сразу или с какого то раза length = 5.
Все работает правильно. Чтобы проверить это набираем Ваш пример в Scite -редакторе текста со встроенным отладчиком версия вот ваш скрипт:
Если его запустить, то length = 5. ----------------- a[1]=1 a[2]=3 a[3]=5 a[4]=7 a[5]=9 a[6]=nil length=5 >Exit code: 0 >D:/lua54/lua54.exe -e "io.stdout:setvbuf 'no'" "test_.lua" ===================== Если закомментировать a[4] length = 3. a[1]=1 a[2]=3 a[3]=5 a[4]=nil a[5]=9 a[6]=nil length=3 >Exit code: 0 ========================== Т е QLUA не виновата __________________ В документации на Lua Вы можете прочитать, что длина массив #a - не является действительной длиной, если в массиве есть дырки - nil --------------------------
[CODE][/CODE]
доработка таблицы Позиции по инструментам
Пользователь
Сообщений: Регистрация: 30.01.2015
08.04.2022 08:06:41
Цитата
написал: Вы должны сами решить, в каком классе из возможных продавать ваши бумаги. Кроме вас, никто об этом не знает.
вы сами писали в первом сообщении, что можете перебрать доступные торговому счету классы и найти там тот в котором можно продать ваши бумаги. Ну и делайте так, если все равно, как превратить бумаги в деньги.
ваш ответ, еще больше усилил проблему. то, что можно найти класс не решает проблемы совершения сделки по рынку. Например, как Вы пишите, докупили в классе не полных лотов. И при поиске класса нашли именно его В нем Вы и выставите стоп по рыночной цене. А когда стоп сработает, то там либо будет мало ликвидности либо ее вообще нет. И Ваш робот огребет по полной. как Вам такой расклад?
Найдите, где правильно?, Вопрос к разработчикам QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
08.04.2022 07:38:16
плечо - это то же самое что риск (почти тоже самое)
Найдите, где правильно?, Вопрос к разработчикам QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
08.04.2022 07:36:23
Добрый день,
Вопрос к разработчикам:
Что считает терминал QUIK в таблице купить/продать и что же считает функция getBuySellInfo . ------------------- Казалось бы должны считать одно и тоже. ====================== Если -нет, то дайте ссылку на документацию. =============== Проверяем: Берем данные из таблицы терминала купить продать и по этим данным считаем функцией getBuySellInfo =========== результат ниже: Сумма - это произведение цены на количество. --------------------------------- Отличия: 1) Все суммы различные , даже там , где цена и количество одинаковые Например ===========================================
28
MGNT
4201
71
298 271
71
298 662
=============================================
2) QUIK для всех акций считает как не маржинальные, а формула очевидно учитывает маржинальные Но учитывает как то странно Например:
Риск 5.9, но для физ лиц не может быть более 5, а для юр. лиц может быть аж 8. Откуда 5.9 ? ------------------------ Там, где риск=1, количество не совпадает в большинстве случаях.
Например:
================================================
20
ISKJ
85.2
3512
299 222
3518
299 804
1.0
================================================
QUIK Позиции
getBuySellInfo
плечо
Код инструмента
Цена
Купить
Сумма
Купить
Сумма
Риск
2
AFKS
13.821
21709
300 040
62013
855 283
2.9
3
AFLT
38.14
7867
300 047
46576
1 760 573
5.9
4
AGRO
1041
288
299 808
288
299 520
1.0
5
ALRS
93
3226
300 018
18921
1 759 653
5.9
6
BANEP
671
445
298 595
1250
843 750
2.8
7
BSPB
63.12
4753
300 009
4753
299 772
1.0
8
CHMF
1077.4
278
299 517
1627
1 753 906
5.8
9
CNTL
10.2
28685
292 587
29394
299 819
1.0
10
DSKY
85.31
3515
299 865
3527
299 795
1.0
11
ENRU
0.5283
567206
299 655
564219
299 826
1.0
12
ETLN
71.58
4177
298 990
4166
299 785
1.0
13
FIVE
1360
220
299 200
223
299 378
1.0
14
FLOT
53.27
5632
300 017
5634
299 785
1.0
15
GAZP
242.8
1234
299 615
7110
1 728 868
5.8
16
GCHE
3197.5
93
297 368
93
297 182
1.0
17
GLTR
384
781
299 904
781
299 826
1.0
18
HYDR
0.7816
381357
298 069
2203275
1 727 368
5.8
19
IRAO
2.678
112043
300 051
112206
299 826
1.0
20
ISKJ
85.2
3512
299 222
3518
299 804
1.0
21
KAZT
474.8
631
299 599
639
299 691
1.0
22
KMAZ
101.3
2947
298 531
2959
299 747
1.0
23
KZOSP
21.51
13801
296 860
13906
299 813
1.0
24
LKOH
5306.5
56
297 164
326
1 733 994
5.8
25
LSRG
540
555
299 700
555
299 700
1.0
26
MAGN
43.34
6919
299 869
6893
299 811
1.0
27
MDMG
597
500
298 500
500
299 250
1.0
28
MGNT
4201
71
298 271
71
298 662
1.0
29
MOEX
104.2
2872
299 262
2869
299 811
1.0
30
MRKC
0.2622
1131419
296 658
1135705
299 826
1.0
31
MRKP
0.1718
1731404
297 455
1744205
299 829
1.0
32
MSNG
1.78
168568
300 051
168633
299 829
1.0
33
MTLR
102.2
2935
299 957
2956
299 768
1.0
34
MTLRP
195.8
1525
298 595
1524
299 695
1.0
35
MTSS
217.8
1376
299 693
1375
299 750
1.0
36
MVID
248.8
1205
299 804
1200
299 640
1.0
37
NKNCP
81.18
3696
300 041
3699
299 767
1.0
38
NLMK
161.9
1852
299 839
1852
299 728
1.0
39
NMTP
4.94
60191
297 344
60510
299 827
1.0
40
NVTK
1288
232
298 816
232
299 466
1.0
41
OGKB
0.4179
718000
300 052
720558
299 824
1.0
42
OKEY
27.93
10735
299 829
10738
299 805
1.0
43
OZON
1302.5
230
299 575
232
299 280
1.0
44
PIKK
589.9
508
299 669
510
299 625
1.0
45
PLZL
13479.5
22
296 549
22
296 472
1.0
46
POGR
12.69
23644
300 042
23608
299 822
1.0
47
POLY
942.3
318
299 651
318
299 810
1.0
48
POSI
1051.8
285
299 763
285
299 820
1.0
49
QIWI
443.5
675
299 363
674
299 728
1.0
50
RASP
389
771
299 919
771
299 803
1.0
51
RENI
46.98
6386
300 014
6382
299 826
1.0
52
RNFT
103.4
2901
299 963
2910
299 730
1.0
53
ROSN
407
737
299 959
736
299 552
1.0
54
RSTI
0.7177
417842
299 885
417528
299 827
1.0
55
RTKM
62.35
4793
298 844
4833
299 791
1.0
56
RTKMP
62.65
4785
299 780
13640
854 546
2.8
57
RUAL
70.74
4238
299 796
4243
299 768
1.0
58
RUGR
25.2
11906
300 031
12260
299 806
1.0
59
SBER
145.86
2055
299 742
12076
1 760 560
5.9
60
SBERP
153.34
1956
299 933
1949
299 737
1.0
61
SELG
46.86
6403
300 045
6434
299 824
1.0
62
SFTL
289
1038
299 982
1037
299 589
1.0
63
SGZH
9.298
32267
300 019
32347
299 824
1.0
64
SIBN
434.95
689
299 681
692
299 705
1.0
65
SMLT
2709
110
297 990
110
299 233
1.0
66
SNGS
26.13
11483
300 051
11395
299 825
1.0
67
SNGSP
35.15
8535
300 005
8528
299 802
1.0
68
TATN
395.5
758
299 789
758
299 789
1.0
69
TATNP
348
861
299 628
861
299 628
1.0
70
TCSG
3542
84
297 528
84
298 746
1.0
71
UPRO
1.647
181410
298 782
181935
299 829
1.0
72
VKCO
511.4
586
299 680
581
299 680
1.0
73
VTBR
0.022835
13140021
300 052
13225443
299 821
1.0
74
YNDX
2108.4
142
299 393
142
298 654
1.0
доработка таблицы Позиции по инструментам
Пользователь
Сообщений: Регистрация: 30.01.2015
08.04.2022 07:12:38
Цитата
написал: Вы должны сами решить, в каком классе из возможных продавать ваши бумаги. Кроме вас, никто об этом не знает.
вы сами писали в первом сообщении, что можете перебрать доступные торговому счету классы и найти там тот в котором можно продать ваши бумаги. Ну и делайте так, если все равно, как превратить бумаги в деньги.
я и решаю сам. Но предложение мое направлено на то, чтобы не заниматься этим . Никто не мешает поставить туда класс по которому куплена первое количество, либо последнее количество, А если кому-то хочется поплясать с бубном, так никто не запрещает.
Цена последней сделки
Пользователь
Сообщений: Регистрация: 30.01.2015
07.04.2022 21:58:59
Цитата
Андрей написал: Коллеги, подскажите, пожалуйста, как будет полностью выглядеть скрит Qlua для получения последней цены фьючерса? Заранее спасибо
local last = getParamEx(class, sec, "last").param_value;
Задержка в выставлении заявок.
Пользователь
Сообщений: Регистрация: 30.01.2015
07.04.2022 21:56:42
Цитата
Сергей написал: Добрый день! Вчера, начиная с 18:20 не выставлялись заявки на срочном рынке, при этом терминал никаких ошибок не выдавал(но заявки в таблице заявок не появлялись), свечи обновлялись. sendTransaction ошибок не выдавал. OnTransReply - тоже ничего не зафиксировал, как будто заявок и не было. В 18:44 попытался выйти в деньги и выставить заявку вручную - тоже не получилось. В 19:00 посыпались ошибки "невозможно выставить заявку т.к. сессия неактивна". Брокер(Альфа-директ) сообщил, что у них всё работало штатно, проблема, вероятно, с моей стороны. Что это могло быть, и как избежать подобных ситуаций.
выводите сообщения транзакций и колбеков в лог-файл. сможете разобраться что и как было и почему.
Дисконты применяются только при маржинальной торговле.
nikolz, как обычно, сел в лужу
как обычно, это вы из нее вылезли ,чтобы прокукарекать чушь. ------------------ Вы прочитайте внимательно. речь идет о функции, которая при расчетах дает не то, что дает терминал КВИК. А он считает без учета плечей, ---------------------- Про заемные средства Вы тоже не в теме. ---------------------- Если У вас нет никаких бумаг то нахрен Вам дисконты. ---------------------- Заемные средства считаются лишь с учетом плеча. --------------------------- Торгую с маржинальными сделками давно. ================= но в данной теме никакие плечи не учитываются, а дисконты вообще применять можно лишь к тупой голове, так как акций для залога в данном расчете нет. --------------------------- Тему уже засрали все, кому не лень, аА объяснить на числах, почему формула и КВИК дает разные результаты никто не может. =================== Хотелось бы услышать автора этой формулы. Просьба разработчиков рассказать , что эта формула считает и почему такое расхождение в результатах расчета КВИКа и этой формулы.
чтобы это значило?
Пользователь
Сообщений: Регистрация: 30.01.2015
07.04.2022 21:36:44
Читаем таблицу, которую получает колбек OnDepoLimit ---------------- currentbal=0.0 locked_sell=0.0 locked_buy=0.0 wa_position_price=0.0 sec_code=CNTL firmid=NC0011100000 client_code=1737 limit_kind=-3 locked_buy_value=9.96 awg_position_price=0.0 wa_price_currency=SUR openbal=0.0 trdaccid=NL0011100043 locked_sell_value=-1e+48 -- Стоимость инструментов , заблокированных на продажу currentlimit=0.0 openlimit=0.0 ----------------------- Вопрос к знатокам: сколько стоят инструменты, заблокированные на продажу?
доработка таблицы Позиции по инструментам
Пользователь
Сообщений: Регистрация: 30.01.2015
07.04.2022 21:30:51
да, напомню, что в документации по квику сказано:
CLASSCODE
Код класса, по которому выполняется транзакция, например TQBR. Обязательный параметр
доработка таблицы Позиции по инструментам
Пользователь
Сообщений: Регистрация: 30.01.2015
07.04.2022 21:21:24
Цитата
написал: Акции в вашем портфеле не привязаны к классам. Это кажется необычным, но это так. Акци. Лукойла теоретически вы можете купить в разных классах, при этом они будут учтены вместе одним количеством.
стандартный случай, когда вы купили тот же Лукойл в классе tqbr и потом догнались тем же лукойлом в классе неполных лотов
Вот именно. Но Вы не поняли проблемы. Вопрос в том, как выставить заявку на число акций в позиции, если класс вам не известен? или вы можете выставить заявку без указания класса?
доработка таблицы Позиции по инструментам
Пользователь
Сообщений: Регистрация: 30.01.2015
07.04.2022 10:31:50
Добрый день, Предлагаю зарегистрировать следующее пожелание. Добавить в таблицу "Позиции по инструментам" class_code. -------------------- Объясняю в чем проблема. ================= При написании скриптов возникает необходимость получить параметры по инструментам, чтобы выставлять какие-либо заявки. ------------- Для формирования заявки по позиции инструмента нужен класс этого инструмента, а его в таблице позиций нет. ---------------- В результате, чтобы найти класс надо делать "танцы с бубном" извлекать клиента по нему находить торговый счет по счету находить фирму и получать список торгуемых классов потом в классах искать тот, в каком есть данный инструмент. ----------------- Напоминает наблюдение гланд через зад. Занятие занятное , но бесполезное. ================= Спасибо
Таких глюков ещё не было. брокер Открытие, В таблице отображаются не существующие заявки, которые нельзя не увидеть, не снять.
В таблице отображаются не существующие заявки, которые нельзя не увидеть, не снять
А короткая продажа на фьючерсе сейчас разрешена?
Чудно считает CalcBuySell
Пользователь
Сообщений: Регистрация: 30.01.2015
05.04.2022 19:20:11
Для тех,кто не понял либо не знает, но что-то советует. -------------------- Показываю, что считает QUIK ---------------- Квик считает именно так, как посчитал Я. --------------------------- Сумма 300 тысяч.
Дисконты вообще не из той оперы. ---------------------------------- Удивляюсь, как Вы вообще торгуете, если ничего не понимаете, но даете советы.
сильно тормозит quik
Пользователь
Сообщений: Регистрация: 30.01.2015
05.04.2022 10:30:00
Цитата
Павел написал: P.S.S. Торгую через Сбербанк, ВТБ, ПСБ. Картина везде одинаковая.
посмотрите в информационном окне задержку обмена с сервером.
сильно тормозит quik
Пользователь
Сообщений: Регистрация: 30.01.2015
04.04.2022 19:49:47
Цитата
Павел написал: P.S.S. Торгую через Сбербанк, ВТБ, ПСБ. Картина везде одинаковая.
посмотрите пинг до сервера брокера, а также в диспетчере задач загрузку процессора и использование памяти. и напишите результат.
Два Quik с одним брокером, Конфликты ?
Пользователь
Сообщений: Регистрация: 30.01.2015
04.04.2022 15:18:41
Цитата
Александр П написал: добрый день. подскажите, а возможно ли установить один квик и в нём уже переключаться между двумя-тремя брокерами?
PS: не нашел подходящей темы, поэтому пишу тут)
Интересно, как терминал будет создавать архивы под разных брокеров и защищенные каналы связи. сейчас все брокеры используют двухфакторное соединение, Тоже прикольно посмотреть как QUIK с этим справится. --------------- Проще откройте кучу квиков, но в одном окна и все индикаторы, а в других лишь стаканы торгуемых интсрументов. и будет Вам счастье.
Программа не запускается, не хватает памяти под объекты
Пользователь
Сообщений: Регистрация: 30.01.2015
02.04.2022 17:04:01
Цитата
Вячеслав написал: При запуске приложения ошибка , пишет не хватает памяти под объекты, без которых приложение не может работать. Памяти на компьютере свободной дост аточно, программ запущенных больше нет. Как это все можно исправить ?
Можно, надо показать, что Вы написали.
Не могу заставить работать функцию Subscribe_Level_II_Quotes()
Пользователь
Сообщений: Регистрация: 30.01.2015
02.04.2022 17:02:03
Цитата
Вася написал: function Subscribe(list) for i = 1, #list do local classCode = list[1] local secCode = list[2] local x = Subscribe_Level_II_Quotes(class_code, sec_code) while not x do sleep(10) end Calculate(classCode, secCode) endendВ ней я по очереди подписываюсь на котировки по каждому инструменту функцией Subscribe_Level_II_Quotes(). Дальше цикл (на всякий случай), чтобы убедиться, что функция вернула true. И дальше какое-то вычисление.Здесь у меня все работает нормально.Дальше я прохожусь циклом по этому же списку, чтобы отписаться от каждой котировки.function Unsubscribe(list) for i = 1, 100 do local classCode = list[1] local secCode = list[2] local x =Unsubscribe_Level_II_Quotes(class_code, sec_code) while not x do sleep(10) end endendЗдесь на первом же элементе из списка я застреваю в цикле while. Если цикл убрать, то функция отрабатывает, а отписка не происходит.Подскажите как справиться с этой проблемой. Нужно сначала подписаться на инструменты, потом отписаться от них.Версия квика 9.2.3.15. Может дело не в моих кривых руках, а в версии?
если актуально, то ловите решение: -------------------------- фрагмент скрипта
Код
while Subscribe_Level_II_Quotes(cl,se)==false do sleep(5) end --подписываемся на стакан
local z=IsSubscribed_Level_II_Quotes (cl,se); --проверяем подписку
Log:write(tostring(cl)..","..tostring(se)..",z="..tostring(z).."\n"); --выводим в файл результат
while Unsubscribe_Level_II_Quotes(cl,se)==false do sleep(5) end -- отписываемся от стакана
z=IsSubscribed_Level_II_Quotes (cl,se); --проверяем отписку
Log:write(tostring(cl)..","..tostring(se)..",z="..tostring(z).."\n"); --выводим в лог файл результат
Что думают по этому поводу разработчики этой функции? --------------------------- Хотелось бы услышать начальника транспортного цеха.
Чудно считает CalcBuySell
Пользователь
Сообщений: Регистрация: 30.01.2015
29.03.2022 06:30:12
Цитата
Дмитрий написал: ,а что не так? Бумаги маржинальные, соответственно, и покупка больше, чем на 300 тыс. Откройте таблицу Купить/Продать и сравните
На учебном сервере плечо 2. Т е максимум 600 тысяч, но не 1 млн.759тыс982. Даже, если предположить, что плечо максимальное (для квалифицированных инвесторов, которым я являюсь, плечо 5 ) , то все равно не выходит каменная чаша.
Чудно считает CalcBuySell
Пользователь
Сообщений: Регистрация: 30.01.2015
28.03.2022 15:26:29
Добрый день, -------------- Вопрос к знатокам: ----------------------------- Вычисляю функцией CalcBuySell сколько акций можно купить.
фрагмент кода: local qty1,comis1=CalcBuySell(clas, sec,"1737","NL0011100043",price, true,false); ------------------------- Поясняю, что ожидаю: ------------------ На учебном сервере денежных средств 300 тысяч рублей. ---------------- Данная функция должна считать комиссию и число лотов для покупки по указанной цене. Полагаю, что коммиссия должна быть примерно одинаковой (сумма денег одна) А число акций умноженное на цену одной и на количество их в лоте должна составлять примерно 300 тыс рублей ------------------- Для проверки, считаю количество и комиссию по формуле. -------------------------- В результате обозначено: ------------------- qt1,comis1 - расчет функции qt,comis - расчет формулы m - сумма денег исходная m1- расчет суммы денег по результатам функции ----------------------- результат вычисления: ============= акции, для которых результат функции и по формуле примерно одинаковый: ------------------ TATNP,m=299983, lotsize=1., qty1=937, m1=299881, qty=935, comis1=229.26, comis=749, price=319.8 ROSN,m=299983, lotsize=1., qty1=844, m1=299887, qty=842, comis1=225.54, comis=749, price=355.05 ------------- "чудеса в решете": -------------------- CHMF,m=299983, lotsize=1., qty1=1530, m1=1759940, qty=260, comis1=746.54, comis=749, price=1149.8 ---------- при цене 1150 рублей по формуле можно купить 260 акций, что вполне похоже на правду. ----------------------------- функция считает, что можно купить 1530 акций, при этом комиссия примерно одинаковая, что указывает что затрачено примено 300 тыс рубг ---------------------- следующее чудо: SBER,m=299983, lotsize=10., qty1=1349, m1=1759982, qty=229, comis1=751.81, comis=749, price=130.41 ----------- Сбербанк акция 130 рублей по формуле можно купить 229 лотов или 2290 акций, что правда. функция считает, что можно купить 1349 лотов, на сумму 1млн759 тыс 982 рублей Величина комиссии указывает что ее считали с суммы 300 тысяч. --------------------- еще один прикол: AFLT,m=299983, lotsize=10., qty1=6567, m1=1760716, qty=1116, comis1=760.2, comis=749, price=26.8 ================== Кто сие может объяснить? Спасибо
написал: вычисления без этой функции можно ускорить, если запомнить размер лота и не извлекать его из хранилища а также не извлекать размер свободных денежных средств а рассчитывать их при совершении сделки и иногда сверять с портфелем.
Чтобы поделить количество свободных денежных средств на цену действительно не нужна никакая функция. Но существует такая вещь, как маржинальная торговля. Есть бумаги разного типа: маржинальные/не маржинальные, принимаемые и не принимаемые в в обеспечение маржинального кредита и пр. Почитайте, узнаете много интересного.
Я это знаю, но торгую лишь ликвидом, которые принимают. Поэтому такой проблемы нет. При расчете количества учитываю плечо. -------------------- Обратил внимание, что эта функция в некоторых случаях дает завышенные результаты. Как это объяснить не знаю.
не все то золото, что блестит
Пользователь
Сообщений: Регистрация: 30.01.2015
27.03.2022 20:54:16
Цитата
Старатель написал: Теперь напишите функцию CalcBuySell, чтобы время её выполнения составляло единицы (на худой конец - десятки) микросекунд, а то у Арки не получается.
вычисления без этой функции можно ускорить, если запомнить размер лота и не извлекать его из хранилища а также не извлекать размер свободных денежных средств а рассчитывать их при совершении сделки и иногда сверять с портфелем. ----------------- результат теста для этого варианта позволяет укорить рассчеты примерно в 10..20 раз. AFLT,money=299983,lot=10,qty=1136,price=26.32,comis=749,,time(мкс)39.7 DSKY,money=299983,lot=10,qty=399,price=74.88,comis=749,,time(мкс)38.8 PHOR,money=299983,lot=1,qty=43,price=6900.0,comis=749,,time(мкс)12.7 SBER,money=299983,lot=10,qty=227,price=131.43,comis=749,,time(мкс)38.7 AFLT,money=299983,lot=10,qty=1136,price=26.32,comis=749,,time(мкс)20.3 LKOH,money=299983,lot=1,qty=56,price=5332.5,comis=749,,time(мкс)17.3 RUAL,money=299983,lot=10,qty=449,price=66.5,comis=749,,time(мкс)17.5 TATN,money=299983,lot=1,qty=706,price=423.5,comis=749,,time(мкс)14.5 AFLT,money=299983,lot=10,qty=1136,price=26.32,comis=749,,time(мкс)14.8 LKOH,money=299983,lot=1,qty=56,price=5320.5,comis=749,,time(мкс)13.7 SBER,money=299983,lot=10,qty=227,price=131.43,comis=749,,time(мкс)20.9 AFLT,money=299983,lot=10,qty=1136,price=26.32,comis=749,,time(мкс)84.9 LKOH,money=299983,lot=1,qty=56,price=5320.5,comis=749,,time(мкс)81.3 ROSN,money=299983,lot=1,qty=831,price=360.0,comis=749,,time(мкс)22.5 SBER,money=299983,lot=10,qty=227,price=131.43,comis=749,,time(мкс)27.2
не все то золото, что блестит
Пользователь
Сообщений: Регистрация: 30.01.2015
27.03.2022 20:42:54
Цитата
Старатель написал: Теперь напишите функцию CalcBuySell, чтобы время её выполнения составляло единицы (на худой конец - десятки) микросекунд, а то у Арки не получается.
если вместо CalcBuySell считать по параметрам портфеля и инструмента, то получится примерно в 2 раза быстрее. результат теста: AFLT,money=299983,lot=10,qty=1138,price=26.28,comis=749,,time(мкс)213.1 GAZP,money=299983,lot=10,qty=124,price=240.2,comis=749,,time(мкс)174.3 MOEX,money=299983,lot=10,qty=309,price=96.68,comis=749,,time(мкс)124.6 SBER,money=299983,lot=10,qty=227,price=131.35,comis=749,,time(мкс)171.2 AFLT,money=299983,lot=10,qty=1138,price=26.28,comis=749,,time(мкс)384.6 GAZP,money=299983,lot=10,qty=124,price=240.08,comis=749,,time(мкс)144.3 NVTK,money=299983,lot=1,qty=221,price=1349.0,comis=749,,time(мкс)139.0 ROSN,money=299983,lot=1,qty=832,price=359.5,comis=749,,time(мкс)101.5 SBER,money=299983,lot=10,qty=227,price=131.35,comis=749,,time(мкс)136.4 AFLT,money=299983,lot=10,qty=1138,price=26.28,comis=749,,time(мкс)294.6 LKOH,money=299983,lot=1,qty=55,price=5370.0,comis=749,,time(мкс)195.8 MOEX,money=299983,lot=10,qty=309,price=96.68,comis=749,,time(мкс)198.0 SBER,money=299983,lot=10,qty=227,price=131.36,comis=749,,time(мкс)186.5 AFLT,money=299983,lot=10,qty=1138,price=26.28,comis=749,,time(мкс)239.0 IRAO,money=299983,lot=100,qty=1306,price=2.2895,comis=749,,time(мкс)116.6 MAGN,money=299983,lot=10,qty=650,price=46.0,comis=749,,time(мкс)150.9 SBER,money=299983,lot=10,qty=227,price=131.4,comis=749,,time(мкс)117.3
Старатель написал: Теперь напишите функцию CalcBuySell, чтобы время её выполнения составляло единицы (на худой конец - десятки) микросекунд, а то у Арки не получается.
сделал тест (фрагмент)
Код
local is_buy=true;
local is_market=true;
nklib.startA();
local qty,comis=CalcBuySell(clas, sec,"1737","NL0011100043", 0, is_buy, is_market);
x1=nklib.stopA();
Log:write(tostring(sec)..",qty="..tostring(qty)..",comis="..tostring(comis)..","..",time(мкс)"..tostring(0.1*x1).."\n");Log:flush()
на демо сервере получилось: время расчета не более 0.0005 сек. т е не более 500 микросекунд при расчете по рынку. ----------------------------------------- AFLT,qty=4309,comis=487.23,,time(мкс)412.3 MOEX,qty=277,comis=203.15,,time(мкс)259.2 SBER,qty=876,comis=490.81,,time(мкс)333.9 AFLT,qty=4309,comis=487.23,,time(мкс)542.0 ROSN,qty=786,comis=207.33,,time(мкс)468.0 AFLT,qty=4309,comis=487.23,,time(мкс)459.4 AFLT,qty=4309,comis=487.23,,time(мкс)418.2 ROSN,qty=786,comis=207.33,,time(мкс)321.3 AFLT,qty=4309,comis=487.23,,time(мкс)344.7 AFLT,qty=4309,comis=487.23,,time(мкс)314.1 NVTK,qty=206,comis=204.82,,time(мкс)206.1 TATN,qty=648,comis=208.2,,time(мкс)188.9 AFLT,qty=4309,comis=487.23,,time(мкс)240.8 AFLT,qty=4309,comis=487.23,,time(мкс)515.5 LKOH,qty=210,comis=483.08,,time(мкс)434.5 AFLT,qty=4309,comis=487.23,,time(мкс)435.4 VTBR,qty=1558,comis=207.15,,time(мкс)562.9 AFKS,qty=528,comis=394.79,,time(мкс)296.8 MGNT,qty=80,comis=203.1,,time(мкс)206.1 ROSN,qty=786,comis=207.33,,time(мкс)204.5 AFLT,qty=4309,comis=487.23,,time(мкс)237.7 AFKS,qty=528,comis=394.79,,time(мкс)364.7 LKOH,qty=210,comis=483.08,,time(мкс)290.4 ROSN,qty=786,comis=207.33,,time(мкс)264.4 AFLT,qty=4309,comis=487.23,,time(мкс)288.6
sleep
Пользователь
Сообщений: Регистрация: 30.01.2015
27.03.2022 16:25:12
Цитата
Старатель написал: sleep с отрицательным числом, видимо длится бесконечно долго. Скрытый текст То, что в sleep попало отрицательное число - моя ошибка. Но реализация слипа - ошибка ваша.
Читаем документацию у майкрософт на функцию sleep Значение INFINITE указывает, что время ожидания приостановки не должно истекать. INFINITE =-1 предположу, что любое отрицательное число даст тоже самое т е время ожидания - вечность.
Значения param из функции CreateDataSource, Получение значений param из функции CreateDataSource
Пользователь
Сообщений: Регистрация: 30.01.2015
26.03.2022 18:05:11
сделал тестовый скрипт:
Код
name="main";
paths = "D:/QUIK_SCRIPT/"
function cb(i)
O=ds:O(i); H=ds:H(i); L=ds:L(i); C=ds:C(i); V=ds:V(i) Ti=ds:T(i)
Log:write("ds "..tostring(O)..","..tostring(H)..","..tostring(L)..","..tostring(C).."\n");Log:flush()
end
function cb1(i)
O=ds1:O(i); H=ds1:H(i); L=ds1:L(i); C=ds1:C(i); V=ds1:V(i) Ti=ds1:T(i)
Log:write("ds1 "..tostring(O)..","..tostring(H)..","..tostring(L)..","..tostring(C).."\n");Log:flush()
end
function main()
while true do
sleep(10);
if ds==nil then ds=CreateDataSource("QJSIM","SBER",INTERVAL_M1)
Log:write("ds="..tostring(ds).."\n");Log:flush()
ds: SetUpdateCallback (cb)
end
if ds1==nil then ds1=CreateDataSource("QJSIM","SBER",INTERVAL_M1,"Last")
Log:write("ds1="..tostring(ds1).."\n");Log:flush()
ds1: SetUpdateCallback (cb1)
end
if ds~=nil then local count=ds:Size();
local i=count; O=ds:O(i); H=ds:H(i); L=ds:L(i); C=ds:C(i); V=ds:V(i) Ti=ds:T(i)
Log:write("ds:count="..count..","..tostring(O)..","..tostring(H)..","..tostring(L)..","..tostring(C).."/"..tostring(i).."\n");Log:flush()
end
if ds1~=nil then local count=ds1:Size();
local i=count O=ds1:O(i); H=ds1:H(i); L=ds1:L(i); C=ds1:C(i); V=ds1:V(i) Ti=ds1:T(i) i=i+1;
Log:write("ds1:coint="..count..","..O..","..H..","..L..","..C.."/"..i.."\n");Log:flush()
end
end
end
--------------
function OnInit(pfile)
Log=io.open(paths..name..".log","w")
end
В тесте открываются два источника: ds - это свечи обычные d1- это свечи "Last" тест пускаем на демо сервере. ----------------- Результаты ниже. Поясню что там. сначала смотрим ds и ds1 - они есть значит подписались ------------------ потом смотрим результат обычные свечи - есть а свечи last - нет ---------------------------- ds=table: 00000119201F8290 ds1=table: 00000119201F8BD0 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ------------------------
Значения param из функции CreateDataSource, Получение значений param из функции CreateDataSource
Пользователь
Сообщений: Регистрация: 30.01.2015
26.03.2022 17:17:26
Цитата
написал: nikolz,
терминал на графике может нарисовать как свечи котировок, так и свечи параметров. Для получения свечей параметров необходимо в качестве источника указать один из параметров инструментов при построении графика. Вы можете это сами попробовать и (наверное) вы сможете это сделать.
функция createdatasource при указании названия параметра инструмента выводит не свечи котировок инструмента, а свечи истории этого параметра.
формат возвращаемых данных тот же самый и вы его правильно скопировали из документации.
таким образом, вы можете получать историю параметров в том же самом виде и формате, как и историю котировок.
спорить не стоит, но если потребуется помощь, спрашивайте.
правильно Вас понял, что без рисования принять параметры невозможно? -------------- и еще вопрос. При прорисовке параметров на графиках КВИК создает файл хранения истории данного параметра. Как правило это огромный файл на диске. Верно?
не все то золото, что блестит
Пользователь
Сообщений: Регистрация: 30.01.2015
26.03.2022 17:12:45
К вопросу о скорости передачи по DDE ---------------------- Переписал сервер DDE для LUA 5.4. ---------------------- Время передачи обезличенных сделок 16385 сделок по 8 параметров составляет 750 мкс. =============== Переписал программу обращения к источнику данных ds. Работает на 30% быстрее, чем исходная QLUA, но не быстрее DDE. ------------------------------ Время передачи 6 параметров свечи составляет 3 мкс, ===================== Время передачи по DDE 6 сделок по 8 параметров составляет 0.3 мкс.
Значения param из функции CreateDataSource, Получение значений param из функции CreateDataSource
Пользователь
Сообщений: Регистрация: 30.01.2015
26.03.2022 16:59:55
смотрим документацию: Функция CreateDataSource возвращает таблицу Lua с параметрами:
т е в таблице нет каких либо других функций. Возможно функция возвращает параметры, но читать их очевидно надо этими функциями. Попытка вызвать с параметром Last на демо сервере дает нули, а свечи выдает нормально.
Параметр
Тип
Описание
SetUpdateCallback
function
Позволяет задать пользователю функцию обратного вызова для обработки изменившихся свечек
O
function
Получить значение Open для указанной свечи
H
function
Получить значение High для указанной свечи
L
function
Получить значение Low для указанной свечи
C
function
Получить значение Close для указанной свечи
V
function
Получить значение Volume для указанной свечи
T
function
Получить значение Time для указанной свечи
Size
function
Возвращает текущий размер (количество свечек в источнике данных)
Close
function
Удаляет источник данных, отписывается от получения данных
SetEmptyCallback
function
Позволяет получать данные с сервера без указания функции обратного вызова
Значения param из функции CreateDataSource, Получение значений param из функции CreateDataSource
Пользователь
Сообщений: Регистрация: 30.01.2015
26.03.2022 16:54:32
Цитата
написал: У функции createdatasource есть последний параметр.
если вы его не указываете, функция возвращает свечи котировок инструмента. Если укажете ("bid" например), то будут свечи истории параметров инструментов.
таблица обезличенных сделок тут не при чем
Вопрос был, как прочитать то, что получили. Пример приведите.
Значения param из функции CreateDataSource, Получение значений param из функции CreateDataSource
Пользователь
Сообщений: Регистрация: 30.01.2015
26.03.2022 15:34:54
Цитата
BENDER написал: Здравствуйте. Только начал изучать LUA. Есть функция CreateDataSource (class_code, sec_code, interval , param); В описании говорится param - (STRING) необязательный параметр. Если параметр не задан, то заказываются данные на основании таблицы всех сделок.
Есть список param для акций
"LOTSIZE" -- Размер лота "BID" -- Лучшая цена спроса "BIDDEPTH" -- Спрос по лучшей цене "BIDDEPTHT" -- Суммарный спрос "NUMBIDS" -- Количество заявок на покупку "OFFER" -- Лучшая цена предложения "OFFERDEPTH" -- Предложение по лучшей цене "OFFERDEPTHT" -- Суммарное предложение "NUMOFFERS" -- Количество заявок на продажу "OPEN" -- Цена открытия "HIGH" -- Максимальная цена сделки "LOW" -- Минимальная цена сделки "LAST" -- Цена последней сделки "CHANGE" -- Разница цены последней
данные из секции Open, High, Low,Close,Time получаю без проблем. Даже миллисекунды выдаёт.
Код
for i = 1 , Size , 1 do
ds:T(i).ms
end ;
Но вот как мне из ds получить значения параметров для акций, к примеру "LAST" ?
функция CreateDataSource посволяет получить данные либо свечей либо из таблицы обезличенных сделок. Она создает таблицу ds функция CИ: T,function: C,function: H,function: V,function: SetEmptyCallback,function: _DataSource,_dataline_data_metatablegc: L,function: Size,function: SetUpdateCallback,function: Close,function: O,function: ------------------------- Поэтому , читать данные Вы можете лишь обращаясь к этим функциям, вне зависимости от заказанного параметра. =============== В таблице обезличенных сделок нет параметра "BID" -- Лучшая цена спроса "BIDDEPTH" -- Спрос по лучшей цене "BIDDEPTHT" -- Суммарный спрос "NUMBIDS" -- Количество заявок на покупку "OFFER" -- Лучшая цена предложения "OFFERDEPTH" -- Предложение по лучшей цене "OFFERDEPTHT" -- Суммарное предложение "NUMOFFERS" -- Количество заявок на продажу поэтому их Вы этой функцией не получите. ------------------------ Параметр Last - это close последней свечи.
лишний элемент или так задумано?
Пользователь
Сообщений: Регистрация: 30.01.2015
20.03.2022 15:08:15
Делаем список фирм и список счетов
Код
local s=""; for i=0,getNumberOf("firms")-1 do local x=getItem("firms",i); s=s.." "..x.firmid; end; message(s);
s="" for i=0,getNumberOf("trade_accounts")-1 do local x=getItem("trade_accounts",i); s=s.." "..x.firmid.."/"..x.trdaccid; end message(s);
результат: SMS_FIRM NC0014500000 MB1000100000 ALGO NC0011100000/NL0011100043 SPBFUT000000/SPBFUT001qm ====================== Вопросы к разработчикам: ------------------------ 1) Почему в таблице фирм отсутствуют фирмы, которые есть в таблице торговых счетов? -------------------------------- 2) Если так задумано, то где об этом написано. ------------------- 3) Зачем в таблице фирм указаны фирмы,у которых нет торговых счетов? Где об этом написано . ------------------------ Спасибо
лишний элемент или так задумано?
Пользователь
Сообщений: Регистрация: 30.01.2015
20.03.2022 14:02:02
Добрый день На учебном сервере версия 9.4 l------------------- читаем код клиента
Код
message("всего=.. getNumberOf("client_codes") );
for i=0,getNumberOf("client_codes")-1 do
local x=getItem("client_codes",i);
message("i="..i..",cod="..tostring(x) );
end
получаем результат: всего=2 i=0,cod=1737 i=1,cod= -------------------- если я правильно понял, то должен быть всего один код клиента. и действительно код i=0,cod= 1737 но почему-то их два, i=1, cod=пусто. ------------------------ Что не так я делаю? Какой в этом пустом коде тайный смысл? ======================================= Огласите весь список, п..жалуста, в каких еще таблицах так сделано. Спасибо.
Самое слабое место QLUA
Пользователь
Сообщений: Регистрация: 30.01.2015
19.03.2022 19:27:39
Цитата
написал: Nikolz, используйте классы в луа стиле. Все получится само собой.
Полагаю Вы либо не поняли, либо ошибаетесь. --------------- поясню на примере. В функции main делаем цикл чтения свечей и замеряем время . примерно так:
Код
nklib.startA();
while count>=i do
nklib.startB();
O=ds:O(i); H=ds:H(i); L=ds:L(i); C=ds:C(i); V=ds:V(i) Ti=ds:T(i)
x=nklib.stopB();
i=i+1;
m1=m1+1;
tx[i]={O,H,L,C,V,Ti}
end
x2=nklib.stopA();
Log:write(tostring(O)..","..tostring(H)..","..tostring(L)..","..tostring(C).."/"..tostring(m1)..","..tostring(0.1*x2).." "..tsoc[m].."\n");Log:flush() --
В колбеке oпParam ставим цикл записи данных в таблицу примерно так:
Код
function OnParam (c,s) for m=1,10000 do t_[14]={c,s}; end
ncb=14; ESet(event); end -- изменение текущих параметров
После этого делаем три пуска программы. 1. без цикла 2. с циклом до 10 и 3. с циклом до 10000 ------------------- Что мы ожидаем получить: Если колбеки не влияют на функцию main то время получения свечей должно быть примерно одинаковым для одинакового числа свечей. ===================== Вот что получили 1.136.34,136.34,136.31,136.31/828,2511.1 SBER 2.136.3,136.3,136.29,136.29/829,6201.2 GAZP 3.136.27,136.27,136.26,136.26/830,27710.4 GAZP ============= Как видно время работы колбека влияет на время потока MAIN . без цикла = 2511 с циклом 10 = 6200 с циклом 10000= 27710 ================== Никакие пляски с бубном в написании классов Вам ничего не дадут. так как классы это всего-навсего массив в котором есть указатели на функции и данные. ============== а данная проблема связана с блокировкой глобального стека виртуальной машины луа. об этом я и рассказал ранее в этой теме.
Самое слабое место QLUA
Пользователь
Сообщений: Регистрация: 30.01.2015
18.03.2022 22:02:00
Известно, что колбеки в QLUA блокируют основной поток терминала QUIK. Решение изначально было спорное, но в ту пору попытка переубедить разработчиков в их ошибке была безрезультатна. ----------------------- Как мера, якобы устраняющая данную проблему, по задумке разработчика QLUA был введен еще один поток для функции main. ----------------------- Поэтому Всем известна рекомендация разработчиков делать минимальные вычисления в колбеках и выполнять основные расчеты в функции main. ================== Однако, это кажущееся ускорение вычислений легко можно свести к нулю, что уверен и делается большинством программистов роботов на QLUA. =================== Рассказываю в чем фишка. ================ Экспериментируя с реализацией пула потоков, обнаружил, что потоки, использующие область глобальных переменных, а также функция main на самом деле не работают независимо от колбеков, а тоже останавливаются на время их работы. Очевидно, это связано с блокировкой области глобальных переменных при работе колбеков. ==================== В итоге, если у Вас в функции main используются глобальные переменные, а это, в том числе , источники данных, то параллельная работа функции main не получится. ------------------ В итоге поток Main будет останавливаться вместе с основным потоком терминала и Ваш робот на QLUA будет фактически работать в одном потоке с остановками на каждом колбеке. ========================== Прикольно, но есть решение, которое позволяет: во-первых, полностью убрать из QLUA эти монстры-колбеки, останавливающие основной поток и функцию main в указанных выше случаях. во-вторых, не останавливать основной поток вообще для передачи данных в другие потоки, которых может быть любое число. ========================= я сомневаюсь, что разработчики когда-нибудь решат это сделать, так как им платят брокеры, а брокерам это до лампочки. ---------------------------- Поэтому могу лишь рекомендовать писателям роботов свести к минимуму использование глобальных переменных в функции main.
Отладка QUIK 9.3
Пользователь
Сообщений: Регистрация: 30.01.2015
18.03.2022 14:10:47
тестил версию 9.4 на демо сервере и отлаживал на ней софт для работы с потоками. ----------------- Версия понравилась. ------------------------- странно, но работает быстрее , чем 8.3. ------------------------ правда последняя - это на боевом сервере у Сбербанка. ---------------------- может сбербанк мышей не ловит? ------------------------------- кто бы их бы пнул под зад, чтобы движение у них вперед началось
не все то золото, что блестит
Пользователь
Сообщений: Регистрация: 30.01.2015
18.03.2022 14:01:01
и еще... любая задача в потоке имеет доступ ко всем глобальным параметрам основного потока и основной функции MAIN. Время обращения к этой информации такое же.
не все то золото, что блестит
Пользователь
Сообщений: Регистрация: 30.01.2015
18.03.2022 13:56:28
Добрый день,Всем! Предлагаю вашему вниманию сравнение быстродействия различных способов получения параметров свечи. ------------------------ фрагменты тестируемых скриптов: --------------------по документации-----------
Код
local tx=candel[m]; if tx==nil then tx={} candel[m]=tx; i=1; else i=#tx; end --таблица сделок по инструменту
local m1=0;
if tsoc[m]=="SBER" then
nklib.startA();
while count>=i do
nklib.start();
Ti=ds:T(i) O=ds:O(i); H=ds:H(ind); L=ds:L(i); C=ds:C(i); V=ds:V(i)
x=nklib.stop();
tx[i]={O,H,L,C,V,Ti}; i=i+1; m1=m1+1;
end
x1=nklib.stopA();
----------------передача в пул потоков--------------------
Код
local ev=nkevent.wait(event_Sber,0);
if ev==0 then
nklib.start();
nkevent.Res(event_Sber);
z=nkini.VMLua(pVMSber,"main",t,count);
x2=nklib.stop();
end
--фрагмент из скрипта отдельного потока
Код
nklib.startB();
local m=#candel; if m==0 then m=1 end
local m1=0;
while count>=m do
if PData==nil then PData,j=nkini.IniPData("ds"); end
O,H,L,C,V,T,x=nkini.GetData(m,PData);
candel[m]={O,H,L,C,V,T};
m=m+1;
m1=m1+1
end
======результат расчета в main ===================== count=484,x1=1948.1,x2=70.1 count=1,x1=239.1,x2=7.3 count=1,x1=66.5,x2=7.5 count=1,x1=59.6,x2=4.0 =======результат расчета в main потока ================ Sber,count=484,x1=1931.1 Sber,count=1,x1=146.6 Sber,count=1,x1=119.5 Sber,count=1,x1=9.5, =============================== итоги: в первой сточке указано время для получения 484 свечей x1- время затраченное на 484 свечи (~2 ms) x2 -время затраченное на передачу задачи в поток(0.07 ms) ------------ Далее обработка одной новой свечи x1=0.2 ms, x2=0.007 ms ======= Из результатов теста видно, что время передачи задачи в поток примерно в 20 раз меньше, чем время расчета в функции MAIN. --------------------------- Это время не зависит от сложности задачи. --------------------------- т е чтобы запустить алгоритм любой сложности в потоке для любого инструмента потребуется не более 0.0001 секунды. ------------------------ При этом колбеки не дублируются и выполняют минимум работы - устанавливают событие и передают свои данные в MAIN MAIN определяет текущую задачу и передает ее в свободный в пуле поток. -----------------------
написал: Теоретически справедливая цена фьючерса рассчитывается по следующей формуле Pфьючерс = Pспот * (1+R*(T/365) , где Pфьючерс – цена контракта Pспот – цена актива на спот-рынке R – безрисковая процентная ставка T – срок до истечения контракта в днях
Предлагаю посчитать. Базовым активом для фьючерсов Si является USDRUB_TOM Безрисковая процентная ставка наверное около 20% годовых (ставка ЦБ на текущий день?).
Дата 17 марта 2022 г., время около 12:30 мск - экспирация SiH2, можно сказать 1 день до экспирации. Теор.цена SiH2 по данным Quik: 104504 BID стакана БА: 104.7 ASK стакана БА: 104.65
Дата 17 марта 2022 г., время около 12:30 мск - до экспирации SiM2 91 день. Теор.цена SiM2 по данным Quik: 110412 BID стакана БА: 104.6550 AKS стакана БА: 104.6512
Вот конкретно у меня не сходятся цифры даже близко.
Если есть возможность, то посмотрите алгоритм расчета на бирже. Видел его там раньше. Сейчас у меня сайт биржи не открывается.
подключение библиотеки qlua.dll к скриптам в новых потоках
Пользователь
Сообщений: Регистрация: 30.01.2015
17.03.2022 11:16:45
всем спасибо, что молчали. Разобрался, тема закрыта. --------------- В итоге на каждый инструмент работает свой поток. --------------- Свободные потоки не закрываются, а ждут в пуле. -------------- Колбеки не дублируются. ---------------- Все скрипты запускаются одним кликом. --------------------------- И Вам того же желаю.
Сбербанк не позволяет скачать со своего сайта Quik 8
Пользователь
Сообщений: Регистрация: 30.01.2015
17.03.2022 07:06:14
Цитата
Автоном написал: Позвонил в службу техподдержки Сбера, ответили: действительно есть такая проблема, над ней работают, попробуйте другой браузер. Прошло 12 часов, Квик не скачивается ни Edge, ни Chrome. Предполагаю, что это дискриминация программы Quik, чтобы навязать пользователям приложение для торговли от Сбера. Что делать?
скачивается:
подключение библиотеки qlua.dll к скриптам в новых потоках
Пользователь
Сообщений: Регистрация: 30.01.2015
16.03.2022 19:33:20
Добрый день, ------------- Вопрос к разработчикам QUIK или к тем, кто это решил. ------------- версия QUIK 9.4. -------------------- Возникла следующая проблема. =========== Написал библиотеку запуска произвольных скриптов Луа по событиям в отдельных потоках из пула потоков. ============ Все работает замечательно. ============= Решил в скрипте, запущенном в моем потоке, обратиться к функциям из библиотеки QLUA. ============ Например, подключиться к источнику данных: ----------------------- if ds==nil then ds=CreateDataSource("QJSIM","SBER",INTERVAL_M1) end -------------------- Мой скрипт имеет функцию main и запускается из функции main Вашего скрипта. ---------------- В вашей main все работает, а в моей - пишет ds=nil.
Попытка подключить через require "qlua" дает ошибку: ---------------- D:/lua-5.4.2/lua54.exe: error loading module 'qlua' from file 'D:/QUIK_SCRIPT/qlua.dll': Не найдена указанная процедура. ---------------------- Проверяю зависимости - Все находит. ------------------------- Что делаю не так? Спасибо.
не все то золото, что блестит
Пользователь
Сообщений: Регистрация: 30.01.2015
14.03.2022 07:03:41
Зачем же измерять время реакции робота на приход информации и знать время запаздывания этой информации спросите Вы? ----------------------- Поясняю, для тех, кому интересно.
Торговый робот - это система реального времени. Что это означает? Это означает то, что такая система должна успеть обработать пришедшие данные до момента прихода новых. Если робот не успевает их обработать, то данные либо теряются, либо Вы должны их накапливать для отложенной обработки. ----------------- Выше я показал время прихода информации Таблицы текущих параметров. Чаще всего именно по этой информации определяется изменение цены инструмента. Из данных выше следует что для демо сервера, информация об этом изменении может запаздывать до 1 секунды, а значения из пакета данных могут передаваться в колбек через 10 мкс. --------------- Ну и что? Это означает, что при задержке данных в 1 секунду не надо мечтать о создании HFT робота. ---------------- А получение данных из пакета с интервалом в 10 мкс может привести к тому, что Вы пропустите сильное изменение цены инструмента и узнаете об это по сливу вашего депозита на данном инструменте или с большим опозданием войдете в тренд.