bn-quik 0.2.1__tar.gz → 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
bn_quik-1.0.0/PKG-INFO ADDED
@@ -0,0 +1,90 @@
1
+ Metadata-Version: 2.4
2
+ Name: bn_quik
3
+ Version: 1.0.0
4
+ Summary: Backtrader-next connector for QUIK terminal
5
+ Project-URL: Homepage, https://github.com/Alex-Shur/bn_quik
6
+ Project-URL: Source, https://github.com/Alex-Shur/bn_quik
7
+ Author: LEX
8
+ License: GPL-3.0-or-later
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 5 - Production/Stable
11
+ Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Programming Language :: Python :: 3
14
+ Requires-Python: >=3.11
15
+ Requires-Dist: backtrader-next>=2.3.2
16
+ Requires-Dist: pytz
17
+ Requires-Dist: quik-python>=1.2.0
18
+ Description-Content-Type: text/markdown
19
+
20
+ <div align="center">
21
+
22
+ # bn_quik
23
+
24
+ [![PyPi Release](https://img.shields.io/pypi/v/bn_quik?color=32a852&label=PyPi)](https://pypi.org/project/bn_quik/)
25
+ [![Total downloads](https://img.shields.io/pepy/dt/bn_quik?label=%E2%88%91&color=skyblue)](https://pypistats.org/packages/bn_quik)
26
+ [![Made with Python](https://img.shields.io/badge/Python-3.11+-c7a002?logo=python&logoColor=white)](https://python.org "Go to Python homepage")
27
+ [![License](https://img.shields.io/github/license/Alex-Shur/bn_quik?color=9c2400)](https://github.com/Alex-Shur/bn_quik/blob/master/LICENSE)
28
+ </div>
29
+
30
+ Интеграция [Backtrader-Next](https://github.com/smalinin/backtrader_next) с торговым терминалом QUIK для реальной торговли
31
+
32
+
33
+ Установка
34
+ ================
35
+ Внимание для работы **bn_quik** необходимо в торговом терминале QUIK установить и запустить Lua коннектор.
36
+ ```
37
+ pip install bn_quik
38
+ ```
39
+
40
+ Параметры объектов
41
+ ================
42
+
43
+ #### QuikStore
44
+ |Параметр| Значение по умолчанию | Обязательный | |
45
+ |---|---|---|---|
46
+ |trade_account_id| | Да | Торговый счет
47
+ |client_code_for_orders| | Да(для Finam) | Номер торгового терминала. У брокера Финам требуется для совершения торговых операций|
48
+ |host| "127.0.0.1"| | Host с Quik Lua коннектором|
49
+ |port| 34130 | | |
50
+ |lots| True | | # Входящий остаток в лотах (задается брокером)
51
+ |limit_kind| 1 | | Основной режим торгов T1 (Для Demo Quik -1)
52
+ |currency| "SUR" | | Валюта |
53
+ |futures_firm_id| "SPBFUT"| | Идентификатор фирмы для фьючерсов|
54
+ |edp| False| | Единая денежная позиция
55
+ |slippage_steps| 10 | | Кол-во шагов цены для проскальзывания, для рыночных ордеров
56
+ |data_dir| "DataQuik" | | Каталог для хранения данных, свечные данные тикеров и состояние объекта Broker с ордерами
57
+ ----
58
+
59
+ #### QuikData
60
+ |Параметр| Значение по умолчанию | Обязательный | |
61
+ |---|---|---|---|
62
+ |drop_price_doji| True | | False - не пропускать дожи 4-х цен, True - пропускать
63
+ |live_bars| False | | False - только история, True - история и новые бары
64
+ |count| 2000 | | Количество запрашиваемых исторических баров по умолчанию
65
+
66
+ Как получить Demo доступ к Quik
67
+ ================
68
+ Демо доступ можно получить на сервере [ARQA](https://arqatech.com/ru/support/demo/)
69
+
70
+ Примеры использования коннектора
71
+ ================
72
+ Все примеры находятся в папке **examples**
73
+
74
+ Использование Lua коннектора
75
+ ================
76
+ Cкопировать содержимое папки **lua** c [GIT репозитария](https://github.com/Alex-Shur/bn_quik)
77
+ в отдельную папку, которая будет доступна приложению QUIK.
78
+
79
+ > ***ВНИМАНИЕ** Для корректной работы с получением свечных данных используйте обновлённые Lua скрипты из [QUIK Python](https://github.com/Alex-Shur/quik_python)
80
+ или [bn_quik](https://github.com/Alex-Shur/bn_quik)
81
+ Данные Lua скрипты будут также корректно работать и с QUIKSharp клиентами.*
82
+
83
+ В терминале QUIK, через диалоговое окно работы со скриптами Lua, запустить "QuikSharp.lua" из скопированной ранее папки. [Подробнее о Lua скриптах](lua/USAGE.RU.md).
84
+
85
+ В случае возникновения проблем с работоспособностью демонстрационных приложений убедитесь что:
86
+ 1. Терминал QUIK загружен и подключен к сереверу.
87
+ 2. Скрипт QuikSharp.lua запущен и не выдает никаких ошибок в соответствующем диалоговом окне.
88
+ 3. Никакие сторонние программы не используют для своих нужд порты 34130 и 34131.
89
+ Данные порты используются по умолчанию для связи библиотеки с терминалом.
90
+ 4. Проверьте настройки что соединения не блокируются в Windows Firewall.
@@ -0,0 +1,71 @@
1
+ <div align="center">
2
+
3
+ # bn_quik
4
+
5
+ [![PyPi Release](https://img.shields.io/pypi/v/bn_quik?color=32a852&label=PyPi)](https://pypi.org/project/bn_quik/)
6
+ [![Total downloads](https://img.shields.io/pepy/dt/bn_quik?label=%E2%88%91&color=skyblue)](https://pypistats.org/packages/bn_quik)
7
+ [![Made with Python](https://img.shields.io/badge/Python-3.11+-c7a002?logo=python&logoColor=white)](https://python.org "Go to Python homepage")
8
+ [![License](https://img.shields.io/github/license/Alex-Shur/bn_quik?color=9c2400)](https://github.com/Alex-Shur/bn_quik/blob/master/LICENSE)
9
+ </div>
10
+
11
+ Интеграция [Backtrader-Next](https://github.com/smalinin/backtrader_next) с торговым терминалом QUIK для реальной торговли
12
+
13
+
14
+ Установка
15
+ ================
16
+ Внимание для работы **bn_quik** необходимо в торговом терминале QUIK установить и запустить Lua коннектор.
17
+ ```
18
+ pip install bn_quik
19
+ ```
20
+
21
+ Параметры объектов
22
+ ================
23
+
24
+ #### QuikStore
25
+ |Параметр| Значение по умолчанию | Обязательный | |
26
+ |---|---|---|---|
27
+ |trade_account_id| | Да | Торговый счет
28
+ |client_code_for_orders| | Да(для Finam) | Номер торгового терминала. У брокера Финам требуется для совершения торговых операций|
29
+ |host| "127.0.0.1"| | Host с Quik Lua коннектором|
30
+ |port| 34130 | | |
31
+ |lots| True | | # Входящий остаток в лотах (задается брокером)
32
+ |limit_kind| 1 | | Основной режим торгов T1 (Для Demo Quik -1)
33
+ |currency| "SUR" | | Валюта |
34
+ |futures_firm_id| "SPBFUT"| | Идентификатор фирмы для фьючерсов|
35
+ |edp| False| | Единая денежная позиция
36
+ |slippage_steps| 10 | | Кол-во шагов цены для проскальзывания, для рыночных ордеров
37
+ |data_dir| "DataQuik" | | Каталог для хранения данных, свечные данные тикеров и состояние объекта Broker с ордерами
38
+ ----
39
+
40
+ #### QuikData
41
+ |Параметр| Значение по умолчанию | Обязательный | |
42
+ |---|---|---|---|
43
+ |drop_price_doji| True | | False - не пропускать дожи 4-х цен, True - пропускать
44
+ |live_bars| False | | False - только история, True - история и новые бары
45
+ |count| 2000 | | Количество запрашиваемых исторических баров по умолчанию
46
+
47
+ Как получить Demo доступ к Quik
48
+ ================
49
+ Демо доступ можно получить на сервере [ARQA](https://arqatech.com/ru/support/demo/)
50
+
51
+ Примеры использования коннектора
52
+ ================
53
+ Все примеры находятся в папке **examples**
54
+
55
+ Использование Lua коннектора
56
+ ================
57
+ Cкопировать содержимое папки **lua** c [GIT репозитария](https://github.com/Alex-Shur/bn_quik)
58
+ в отдельную папку, которая будет доступна приложению QUIK.
59
+
60
+ > ***ВНИМАНИЕ** Для корректной работы с получением свечных данных используйте обновлённые Lua скрипты из [QUIK Python](https://github.com/Alex-Shur/quik_python)
61
+ или [bn_quik](https://github.com/Alex-Shur/bn_quik)
62
+ Данные Lua скрипты будут также корректно работать и с QUIKSharp клиентами.*
63
+
64
+ В терминале QUIK, через диалоговое окно работы со скриптами Lua, запустить "QuikSharp.lua" из скопированной ранее папки. [Подробнее о Lua скриптах](lua/USAGE.RU.md).
65
+
66
+ В случае возникновения проблем с работоспособностью демонстрационных приложений убедитесь что:
67
+ 1. Терминал QUIK загружен и подключен к сереверу.
68
+ 2. Скрипт QuikSharp.lua запущен и не выдает никаких ошибок в соответствующем диалоговом окне.
69
+ 3. Никакие сторонние программы не используют для своих нужд порты 34130 и 34131.
70
+ Данные порты используются по умолчанию для связи библиотеки с терминалом.
71
+ 4. Проверьте настройки что соединения не блокируются в Windows Firewall.
@@ -26,7 +26,7 @@ class MetaQuikData(AbstractDataBase.__class__):
26
26
  class QuikData(with_metaclass(MetaQuikData, AbstractDataBase)):
27
27
  """Данные QUIK"""
28
28
  params = (
29
- ('drop_price_doji', False), # False - не пропускать дожи 4-х цен, True - пропускать
29
+ ('drop_price_doji', False), # True - удалять дожи 4-х цен, False - пропускать
30
30
  ('live_bars', False), # False - только история, True - история и новые бары
31
31
  ('count', 2000),
32
32
  )
@@ -43,7 +43,6 @@ class QuikData(with_metaclass(MetaQuikData, AbstractDataBase)):
43
43
  def __init__(self, **kwargs):
44
44
  self.store = QuikStore(**kwargs) # Хранилище QUIK
45
45
  self.class_code, self.sec_code = QuikStore.run_sync(self.store.parse_ticker_name(self.p.dataname))
46
- # tf = self.store._bt_timeframe_to_str(self.p.timeframe, self.p.compression)
47
46
  self.candle_interval = self.store._bt_timeframe_2_quik(self.p.timeframe, self.p.compression)
48
47
  self._data_id = self.store._get_data_id(self.class_code, self.sec_code, self.candle_interval)
49
48
  self.logger = logging.getLogger(f'QuikData.{self._data_id}')
@@ -56,6 +55,9 @@ class QuikData(with_metaclass(MetaQuikData, AbstractDataBase)):
56
55
  self.last_bar_received = False # Получен последний бар
57
56
  self.live_mode = False # Режим получения баров. False = История, True = Новые бары
58
57
  self.info = {}
58
+ # check if dir exists
59
+ if not os.path.exists(self.store.data_path):
60
+ os.makedirs(self.store.data_path)
59
61
 
60
62
  @property
61
63
  def data_id(self):
@@ -147,7 +149,7 @@ class QuikData(with_metaclass(MetaQuikData, AbstractDataBase)):
147
149
  self.store.stop()
148
150
 
149
151
  def load(self):
150
- with self.store._lock_store_data:
152
+ with self.store.lock_store_data:
151
153
  return super().load()
152
154
 
153
155
  def _load(self):
@@ -150,8 +150,8 @@ class QuikStore(with_metaclass(MetaSingleton, object)):
150
150
  ('host', '127.0.0.1'),
151
151
  ('port', 34130),
152
152
  ('lots', True), # Входящий остаток в лотах (задается брокером)
153
- # ('limit_kind', 1), # Основной режим торгов T1
154
- ('limit_kind', -1), # Quik Demo
153
+ ('limit_kind', 1), # Основной режим торгов T1
154
+ #('limit_kind', -1), # Quik Demo
155
155
  ('currency', 'SUR'), # Валюта
156
156
  ('futures_firm_id', "SPBFUT"), # Идентификатор фирмы для фьючерсов
157
157
  ('edp', False), # Единая денежная позиция
@@ -469,7 +469,7 @@ class QuikStore(with_metaclass(MetaSingleton, object)):
469
469
  self._ticker_info[key] = None
470
470
  return None
471
471
 
472
- def _get_ticker_info_sync(self, class_code: str, sec_code: str) -> dict:
472
+ def get_ticker_info_sync(self, class_code: str, sec_code: str) -> dict:
473
473
  """Синхронное получение информации о тикере из QUIK"""
474
474
  info = QuikStore.run_sync(self.get_ticker_info(class_code, sec_code))
475
475
  return info.to_dict() if info else {}
@@ -680,7 +680,7 @@ class QuikStore(with_metaclass(MetaSingleton, object)):
680
680
  """Получение списка счетов"""
681
681
  with self._lock_accounts:
682
682
  if not self._accounts:
683
- money_limits:MoneyLimitEx = await self._get_money_limits()
683
+ money_limits:MoneyLimitEx = await self.get_money_limits()
684
684
  if len(money_limits) == 0:
685
685
  self.logger.error('get_money_limts: Ошибка нет лимитов по деньгам')
686
686
  return self._accounts
@@ -0,0 +1,28 @@
1
+ ## Основные команды
2
+
3
+ ### Установка и настройка
4
+
5
+ #### Способ 1: Установка UV через встроенный скрипт
6
+ ```bash
7
+ # На Linux/macOS
8
+ curl -LsSf https://astral.sh/uv/install.sh | sh
9
+
10
+ # На Windows (PowerShell)
11
+ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
12
+ ```
13
+
14
+ #### Способ 2: Установка UV через pip
15
+ ```bash
16
+ pip install uv
17
+ ```
18
+
19
+ #### Инициализация проекта
20
+ ```bash
21
+ uv sync
22
+ ```
23
+
24
+ ### Запуск примеров
25
+ ```bash
26
+ uv run ex1.py
27
+ ```
28
+
@@ -0,0 +1,78 @@
1
+ import logging
2
+ import backtrader_next as bt
3
+ from bn_quik import QuikStore
4
+
5
+ # Настройка логирования
6
+ logging.basicConfig(
7
+ # level=logging.DEBUG, # Уровень логирования (DEBUG, INFO, WARNING, ERROR, CRITICAL)
8
+ level=logging.INFO, # Уровень логирования (DEBUG, INFO, WARNING, ERROR, CRITICAL)
9
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', # Формат сообщений
10
+ datefmt='%Y-%m-%d %H:%M:%S' # Формат времени
11
+ )
12
+
13
+
14
+ class StratPrintBars(bt.Strategy):
15
+ """
16
+ - Отображает статус подключения
17
+ - При приходе нового бара отображает его цены/объем
18
+ - Отображает статус перехода к новым барам
19
+ """
20
+ params = ( # Параметры торговой системы
21
+ ('name', None), # Название торговой системы
22
+ ('wait_all_datas', False), # Ждать прихода баров всех тикеров перед обработкой
23
+ ('symbols', None), # Список торгуемых тикеров. По умолчанию торгуем все тикеры
24
+ )
25
+
26
+ def __init__(self):
27
+ """Инициализация торговой системы"""
28
+ self.isLive = False # Сначала будут приходить исторические данные
29
+ self.logger = logging.getLogger('StratPrintBars')
30
+
31
+
32
+ def next(self):
33
+ """Приход нового бара тикера"""
34
+ if self.p.wait_all_datas: # Ждать бары всех тикеров
35
+ lastdatetimes = [data.datetime.datetime(0) for data in self.datas] # Дата и время последнего бара каждого тикера
36
+ if lastdatetimes.count(lastdatetimes[0]) != len(lastdatetimes): # Если дата и время последних баров не идентичны
37
+ return # то еще не пришли все новые бары.
38
+ print("================== NEXT for all datas =================")
39
+
40
+ for data in self.datas: # Пробегаемся по всем запрошенным тикерам
41
+ if not self.p.symbols or data._name in self.p.symbols: # Если торгуем все тикеры или данный тикер
42
+ self.logger.info(f'{data._name} - {bt.TimeFrame.Names[data.p.timeframe]} {data.p.compression} - Open={data.open[0]:.2f}, High={data.high[0]:.2f}, Low={data.low[0]:.2f}, Close={data.close[0]:.2f}, Volume={data.volume[0]:.0f} [{data.datetime.datetime(0)}]')
43
+
44
+ def notify_data(self, data, status, *args, **kwargs):
45
+ """Изменение статсуса приходящих баров"""
46
+ data_status = data._getstatusname(status) # Получаем статус (только при LiveBars=True)
47
+ self.logger.info(f'Notify Data: {data._name} - Status: {data_status}') # Статус приходит для каждого тикера отдельно
48
+ self.isLive = data_status == 'LIVE' # В Live режим переходим после перехода первого тикера
49
+
50
+
51
+ if __name__ == '__main__':
52
+ try:
53
+ # symbol = 'TQBR.SBER' # Тикер
54
+ symbol = 'QJSIM.SBER' # Тикер для симуляции для Demo QUIK
55
+ # symbol = 'SPBFUT.SiZ5' # Для фьючерсов: Si (RTS) - Z (December) - 5 (2025)
56
+
57
+ store = QuikStore(trade_account_id='NL0011XXXXXX', limit_kind=-1) # limit_kind=-1 - только для Demo Quik
58
+ # store = QuikStore(trade_account_id='SPBFUT0XXXXX') # Срочный рынок
59
+
60
+ cerebro = bt.Cerebro(quicknotify=True)
61
+
62
+ # Исторические данные и новые бары будут загружены автоматически при установке live_bars=True
63
+ data = store.getdata(dataname=symbol, timeframe=bt.TimeFrame.Minutes, compression=1, live_bars=True)
64
+
65
+ cerebro.adddata(data)
66
+
67
+ broker = store.getbroker()
68
+ cerebro.setbroker(broker)
69
+
70
+ cerebro.addstrategy(StratPrintBars)
71
+ cerebro.run()
72
+
73
+ except KeyboardInterrupt:
74
+ print("\nПрервано пользователем (Ctrl+C)")
75
+ except Exception as e:
76
+ print(f"\nОшибка: {e}")
77
+ import traceback
78
+ traceback.print_exc()
@@ -0,0 +1,9 @@
1
+ [project]
2
+ name = "examples"
3
+ version = "0.1.0"
4
+ description = "Examples of using bn_quik"
5
+ readme = "README.md"
6
+ requires-python = ">=3.11"
7
+ dependencies = [
8
+ "bn-quik>=1.0.0"
9
+ ]
@@ -0,0 +1,142 @@
1
+ --~ Copyright (c) 2014-2020 QUIKSharp Authors https://github.com/finsight/QUIKSharp/blob/master/AUTHORS.md. All rights reserved.
2
+ --~ Licensed under the Apache License, Version 2.0. See LICENSE.txt in the project root for license information.
3
+
4
+ -- is running from Quik
5
+ function is_quik()
6
+ if getScriptPath then return true else return false end
7
+ end
8
+
9
+ quikVersion = nil
10
+
11
+ script_path = "."
12
+
13
+ if is_quik() then
14
+ script_path = getScriptPath()
15
+
16
+ quikVersion = getInfoParam("VERSION")
17
+
18
+ if quikVersion ~= nil then
19
+ local t={}
20
+ for str in string.gmatch(quikVersion, "([^%.]+)") do
21
+ table.insert(t, str)
22
+ end
23
+ quikVersion = tonumber(t[1]) * 100 + tonumber(t[2])
24
+ end
25
+
26
+ if quikVersion == nil then
27
+ message("QUIK# cannot detect QUIK version", 3)
28
+ return
29
+ else
30
+ libPath = "\\clibs"
31
+ end
32
+
33
+ -- MD dynamic, requires MSVCRT
34
+ -- MT static, MSVCRT is linked statically with luasocket
35
+ -- package.cpath contains info.exe working directory, which has MSVCRT, so MT should not be needed in theory,
36
+ -- but in one issue someone said it doesn't work on machines that do not have Visual Studio.
37
+ local linkage = "MT"
38
+
39
+ if quikVersion >= 811 then
40
+ libPath = libPath .. "64\\54_"..linkage.."\\"
41
+ elseif quikVersion >= 805 then
42
+ libPath = libPath .. "64\\53_"..linkage.."\\"
43
+ elseif quikVersion >= 800 then
44
+ libPath = libPath .. "64\\5.1_"..linkage.."\\"
45
+ else
46
+ libPath = "\\clibs\\5.1_"..linkage.."\\"
47
+ end
48
+ end
49
+ package.path = package.path .. ";" .. script_path .. "\\?.lua;" .. script_path .. "\\?.luac"..";"..".\\?.lua;"..".\\?.luac"
50
+ package.cpath = package.cpath .. ";" .. script_path .. libPath .. '?.dll'..";".. '.' .. libPath .. '?.dll'
51
+
52
+ local util = require("qsutils")
53
+ local qf = require("qsfunctions")
54
+ require("qscallbacks")
55
+
56
+ log("Detected Quik version: ".. quikVersion .." and using cpath: "..package.cpath , 0)
57
+
58
+ local is_started = true
59
+
60
+ -- we need two ports since callbacks and responses conflict and write to the same socket at the same time
61
+ -- I do not know how to make locking in Lua, it is just simpler to have two independent connections
62
+ -- To connect to a remote terminal - replace '127.0.0.1' with the terminal ip-address
63
+ -- All this values could be replaced with values from config.json
64
+ local response_host = '127.0.0.1'
65
+ local response_port = 34130
66
+ local callback_host = '127.0.0.1'
67
+ local callback_port = response_port + 1
68
+
69
+ function do_main()
70
+ log("Entered main function", 0)
71
+ while is_started do
72
+ -- if not connected, connect
73
+ util.connect(response_host, response_port, callback_host, callback_port)
74
+ -- when connected, process queue
75
+ -- receive message,
76
+ local requestMsg = receiveRequest()
77
+ if requestMsg then
78
+ -- if ok, process message
79
+ -- dispatch_and_process never throws, it returns lua errors wrapped as a message
80
+ local responseMsg, err = qf.dispatch_and_process(requestMsg)
81
+ if responseMsg then
82
+ -- send message
83
+ local res = sendResponse(responseMsg)
84
+ else
85
+ log("Could not dispatch and process request: " .. err, 3)
86
+ end
87
+ else
88
+ delay(1)
89
+ end
90
+ end
91
+ end
92
+
93
+ function main()
94
+ setup("QuikSharp")
95
+ run()
96
+ end
97
+
98
+ --- catch errors
99
+ function run()
100
+ local status, err = pcall(do_main)
101
+ if status then
102
+ log("finished")
103
+ else
104
+ log(err, 3)
105
+ end
106
+ end
107
+
108
+ function setup(script_name)
109
+ if not script_name then
110
+ log("File name of this script is unknown. Please, set it explicity instead of scriptFilename() call inside your custom file", 3)
111
+ return false
112
+ end
113
+
114
+ local list = paramsFromConfig(script_name)
115
+ if list then
116
+ response_host = list[1]
117
+ response_port = list[2]
118
+ callback_host = list[3]
119
+ callback_port = list[4]
120
+ printRunningMessage(script_name)
121
+ elseif script_name == "QuikSharp" then
122
+ -- use default values for this file in case no custom config found for it
123
+ printRunningMessage(script_name)
124
+ else -- do nothing when config is not found
125
+ log("File config.json is not found or contains no entries for this script name: " .. script_name, 3)
126
+ return false
127
+ end
128
+
129
+ return true
130
+ end
131
+
132
+ function printRunningMessage(script_name)
133
+ log("Running from ".. script_name .. ", params: response " .. response_host .. ":" .. response_port ..", callback ".. " ".. callback_host ..":".. callback_port)
134
+ end
135
+
136
+ if not is_quik() then
137
+ log("Hello, QUIK#! Running outside Quik.")
138
+ setup("QuikSharp")
139
+ do_main()
140
+ logfile:close()
141
+ end
142
+
@@ -0,0 +1,15 @@
1
+ --~ Copyright (c) 2014-2020 QUIKSharp Authors https://github.com/finsight/QUIKSharp/blob/master/AUTHORS.md. All rights reserved.
2
+ --~ Licensed under the Apache License, Version 2.0. See LICENSE.txt in the project root for license information.
3
+
4
+ script_path = getScriptPath()
5
+ package.path = package.path .. ";" .. script_path .. "\\?.lua;" .. script_path .. "\\?.luac"..";"..".\\?.lua;"..".\\?.luac"
6
+ require("QuikSharp")
7
+
8
+ -- Do not edit this file. Just copy it and save with a different name. Then write required params for it inside config.json file
9
+ -- Не редактируйте этой файл. Просто скопируйте и сохраните под другим именем. После этого укажите настройки для него в файле config.json
10
+
11
+ function main()
12
+ if setup(scriptFilename()) then
13
+ run()
14
+ end
15
+ end
@@ -0,0 +1,63 @@
1
+ Использование Lua скриптов
2
+ ==========
3
+ Lua скрипты из состава библиотеки позволяют работать с несколькими терминалами Quik одновременно.
4
+
5
+ Как подключиться к двум терминалам сразу
6
+ ----------------------------------------
7
+
8
+ Достаточно сделать ряд простых действий:
9
+ 1. Найти в файле `config.json` секцию `servers`, там будет название опции `scriptName` со значением `Quik_2`. В данном случае `Quik_2` является названием файла в папке lua (расширение `.lua` в `config.json` указывать нельзя).
10
+ 2. Изменить опции согласно вашим предпочтениям. По умолчанию, дополнительный сокет сервер будет запущен на localhost'e (т.е. опции `responseHostname` и `callbackHostname` имеют значение `127.0.0.1`), а порты (опции `responsePort` и `callbackPort`) равны `34132` для сервера запросов-ответов и `34133` для сервера коллбэков (данные, которые хочет отправить Квик). Порты не должны конфликтовать с уже указанными портами в файле `config.json`
11
+ 3. Добавить `Quik_2.lua` в Quik и запустить. При этом необязательно запускать `QuikSharp.lua`, если он вами не используется. Если используется и для него указаны другие порты, то, безусловно, можно запускать оба.
12
+
13
+ Возможно, перед запуском скрипта, для его нормальной работы, на компьютере с терминалом потребуется установить DLL библиотеки c сайта MS
14
+ https://learn.microsoft.com/cpp/windows/latest-supported-vc-redist?view=msvc-170#latest-supported-redistributable-version
15
+ для [CPU X64] https://aka.ms/vs/17/release/vc_redist.x64.exe
16
+
17
+ Дополнение:
18
+ Добавлена Lua socket **core.dll** для Lua 5.4.1 MT (static library), скомпилирована из Lua socket 3.1.0
19
+ Для компилирования использовались файла от Lua 5.4.2, успешно протестировано в QUIK Junior 12.6.0.53 .
20
+ Если хотите использовать Lua 5.4.1 в QUIK, надо отредактировать файл QuikShart.lua
21
+ ```
22
+ local linkage = "MT"
23
+
24
+ if quikVersion >= 811 then
25
+ libPath = libPath .. "64\\54_"..linkage.."\\"
26
+ elseif quikVersion >= 805 then
27
+ libPath = libPath .. "64\\53_"..linkage.."\\"
28
+ elseif quikVersion >= 800 then
29
+ libPath = libPath .. "64\\5.1_"..linkage.."\\"
30
+ else
31
+ libPath = "\\clibs\\5.1_"..linkage.."\\"
32
+ end
33
+
34
+ ```
35
+
36
+
37
+
38
+
39
+ Все!
40
+
41
+ Вопросы и ответы
42
+ ----------------
43
+
44
+ - Как добавить еще сервера?
45
+
46
+ Скопируйте файл `Quik_2.lua` и сохраните его в той же папке под другим именем, например, `MyBroker.lua`. В файле `config.json` в секции `servers` скопируйте текст внутри фигурных скобок `{"scriptName"..."responseHostname"..."responsePort"..."callbackHostname"..."callbackPort"...}`, поставьте запятую после `}`, вставьте скопированный текст и измените в нем данные. Как минимум, нужно указать в `scriptName` название файла скрипта (в примере это `MyBroker`), а в опциях портов указать любые свободные номера портов. Такую процедуру можно делать столько раз, сколько серверов вам нужно. Не забудьте, что `responsePort` и `callbackPort` не могут быть одинаковыми и повторяться в файле.
47
+
48
+ - Как обновляться на новые версии библиотеки и скриптов в частности?
49
+
50
+ В новых версиях будет меняться код скриптов и код `config.json`. Но если вы вносили изменения в `config.json`, то сохраните в другом месте файл с вашими изменениями. После этого замените все старые файлы новыми. Обратите внимание, что, возможно, в одном из обновлений содержимое `Quik_2.lua` изменится и все созданные вами лично копии этого файла потребуется пересоздать на основе обновленного файла. Продолжаем. Отредактируйте файл `config.json` в соответствии с настройками из старого файла (если не меняли ничего, делать ничего не надо). Процесс обновления завершен.
51
+
52
+ - Как сделать так, чтобы можно было подключаться к сокету из локальной сети WiFi с другого устройства?
53
+
54
+ Нужно указать в `responseHostname` и `callbackHostname` значение `0.0.0.0`. Лучше так не делать и вот, почему. Когда компьютер подключен к роутеру, то разрешение подключаться к нему извне (а именно это делает `0.0.0.0`) открывает доступ к нему всему миру при допущении, что роутер недостаточно хорошо защищен и настроен. А так как при подключении к сокетам нет ни пароля, ни шифрования, открытый доступ всему миру открывает ваш Квик всем. Т.е. если вы все же хотите подключаться из локальной сети, позаботьтесь о безопасности и верных настройках роутера.
55
+
56
+ - Можно ли переименовать `Quik_2.lua`?
57
+
58
+ Да, только укажите новое имя в `scriptName` файла `config.json`.
59
+
60
+
61
+ - Можно ли переименовать `QuikSharp.lua`?
62
+
63
+ Нет. Этот файл обязательно должен сохранить свое имя, потому что все остальные скрипты используют часть его кода.
@@ -0,0 +1,18 @@
1
+ {
2
+ "servers": [
3
+ {
4
+ "scriptName": "QuikSharp",
5
+ "responseHostname": "127.0.0.1",
6
+ "responsePort": 34130,
7
+ "callbackHostname": "127.0.0.1",
8
+ "callbackPort": 34131
9
+ },
10
+ {
11
+ "scriptName": "Quik_2",
12
+ "responseHostname": "127.0.0.1",
13
+ "responsePort": 34132,
14
+ "callbackHostname": "127.0.0.1",
15
+ "callbackPort": 34133
16
+ }
17
+ ]
18
+ }