hikyuu 2.6.0__py3-none-win_amd64.whl → 2.6.1__py3-none-win_amd64.whl
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.
- hikyuu/__init__.py +19 -50
- hikyuu/__init__.pyi +528 -523
- hikyuu/analysis/__init__.pyi +498 -497
- hikyuu/analysis/analysis.pyi +499 -498
- hikyuu/core.pyi +500 -499
- hikyuu/cpp/__init__.pyi +2 -2
- hikyuu/cpp/boost_date_time-mt.dll +0 -0
- hikyuu/cpp/boost_serialization-mt.dll +0 -0
- hikyuu/cpp/boost_wserialization-mt.dll +0 -0
- hikyuu/cpp/core310.pyd +0 -0
- hikyuu/cpp/core310.pyi +38 -4
- hikyuu/cpp/core311.pyd +0 -0
- hikyuu/cpp/core311.pyi +38 -4
- hikyuu/cpp/core312.pyd +0 -0
- hikyuu/cpp/core312.pyi +38 -4
- hikyuu/cpp/core313.pyd +0 -0
- hikyuu/cpp/core313.pyi +38 -4
- hikyuu/cpp/core39.pyd +0 -0
- hikyuu/cpp/core39.pyi +38 -4
- hikyuu/cpp/hikyuu.dll +0 -0
- hikyuu/cpp/hikyuu.lib +0 -0
- hikyuu/draw/__init__.pyi +1 -1
- hikyuu/draw/drawplot/__init__.pyi +8 -8
- hikyuu/draw/drawplot/bokeh_draw.pyi +517 -512
- hikyuu/draw/drawplot/common.pyi +1 -1
- hikyuu/draw/drawplot/echarts_draw.pyi +519 -514
- hikyuu/draw/drawplot/matplotlib_draw.pyi +529 -524
- hikyuu/draw/elder.pyi +11 -11
- hikyuu/draw/kaufman.pyi +18 -18
- hikyuu/draw/volume.pyi +10 -10
- hikyuu/extend.pyi +507 -507
- hikyuu/gui/HikyuuTDX.py +66 -12
- hikyuu/gui/data/ImportQmtToH5Task.py +209 -0
- hikyuu/gui/data/ImportTdxToH5Task.py +8 -1
- hikyuu/gui/data/MainWindow.py +68 -50
- hikyuu/gui/data/UseQmtImportToH5Thread.py +316 -0
- hikyuu/gui/data/UseTdxImportToH5Thread.py +221 -65
- hikyuu/gui/importdata.py +24 -11
- hikyuu/hub.pyi +6 -6
- hikyuu/include/hikyuu/KData.h +5 -0
- hikyuu/include/hikyuu/KDataImp.h +4 -0
- hikyuu/include/hikyuu/data_driver/kdata/mysql/KRecordTable.h +41 -2
- hikyuu/include/hikyuu/indicator/crt/COUNT.h +3 -3
- hikyuu/include/hikyuu/indicator/crt/DISCARD.h +1 -1
- hikyuu/include/hikyuu/indicator/crt/ISINF.h +1 -1
- hikyuu/include/hikyuu/indicator/crt/ISINFA.h +1 -1
- hikyuu/include/hikyuu/indicator/crt/ISNA.h +1 -1
- hikyuu/include/hikyuu/indicator/crt/LAST.h +2 -2
- hikyuu/include/hikyuu/indicator/crt/MAX.h +1 -1
- hikyuu/include/hikyuu/indicator/crt/MIN.h +1 -1
- hikyuu/include/hikyuu/indicator/crt/PRICELIST.h +1 -15
- hikyuu/include/hikyuu/indicator/crt/SUMBARS.h +1 -1
- hikyuu/include/hikyuu/plugin/KDataToHdf5Importer.h +33 -0
- hikyuu/include/hikyuu/plugin/interface/ImportKDataToHdf5PluginInterface.h +33 -0
- hikyuu/include/hikyuu/plugin/interface/plugins.h +2 -0
- hikyuu/include/hikyuu/strategy/Strategy.h +3 -6
- hikyuu/include/hikyuu/trade_sys/portfolio/Portfolio.h +2 -1
- hikyuu/include/hikyuu/trade_sys/selector/SelectorBase.h +12 -9
- hikyuu/include/hikyuu/trade_sys/selector/imp/MultiFactorSelector.h +1 -1
- hikyuu/include/hikyuu/trade_sys/selector/imp/logic/OperatorSelector.h +12 -12
- hikyuu/include/hikyuu/trade_sys/selector/imp/logic/OperatorValueSelector.h +2 -2
- hikyuu/include/hikyuu/trade_sys/selector/imp/optimal/PerformanceOptimalSelector.h +1 -1
- hikyuu/include/hikyuu/trade_sys/system/System.h +12 -3
- hikyuu/include/hikyuu/trade_sys/system/imp/DelegateSystem.h +0 -1
- hikyuu/include/hikyuu/trade_sys/system/imp/WalkForwardSystem.h +0 -1
- hikyuu/include/hikyuu/utilities/arithmetic.h +32 -22
- hikyuu/include/hikyuu/utilities/datetime/Datetime.h +1 -0
- hikyuu/include/hikyuu/version.h +4 -4
- hikyuu/plugin/backtest.dll +0 -0
- hikyuu/plugin/dataserver.dll +0 -0
- hikyuu/plugin/device.dll +0 -0
- hikyuu/plugin/import2hdf5.dll +0 -0
- hikyuu/trade_manage/__init__.pyi +517 -512
- hikyuu/trade_manage/broker.pyi +3 -3
- hikyuu/trade_manage/broker_easytrader.pyi +1 -1
- hikyuu/trade_manage/trade.pyi +517 -512
- hikyuu/util/__init__.py +1 -0
- hikyuu/util/__init__.pyi +3 -2
- hikyuu/util/mylog.py +30 -3
- hikyuu/util/mylog.pyi +3 -1
- hikyuu/util/singleton.pyi +1 -1
- {hikyuu-2.6.0.dist-info → hikyuu-2.6.1.dist-info}/METADATA +1 -1
- {hikyuu-2.6.0.dist-info → hikyuu-2.6.1.dist-info}/RECORD +87 -82
- {hikyuu-2.6.0.dist-info → hikyuu-2.6.1.dist-info}/LICENSE +0 -0
- {hikyuu-2.6.0.dist-info → hikyuu-2.6.1.dist-info}/WHEEL +0 -0
- {hikyuu-2.6.0.dist-info → hikyuu-2.6.1.dist-info}/entry_points.txt +0 -0
- {hikyuu-2.6.0.dist-info → hikyuu-2.6.1.dist-info}/top_level.txt +0 -0
hikyuu/gui/HikyuuTDX.py
CHANGED
|
@@ -27,6 +27,7 @@ from hikyuu.gui.data.EscapetimeThread import EscapetimeThread
|
|
|
27
27
|
from hikyuu.gui.data.UseTdxImportToH5Thread import UseTdxImportToH5Thread
|
|
28
28
|
from hikyuu.gui.data.ImportTdxToH5Task import ImportTdxToH5Task
|
|
29
29
|
from hikyuu.gui.data.UsePytdxImportToH5Thread import UsePytdxImportToH5Thread
|
|
30
|
+
from hikyuu.gui.data.UseQmtImportToH5Thread import UseQmtImportToH5Thread
|
|
30
31
|
# from hikyuu.gui.data.CollectToMySQLThread import CollectToMySQLThread
|
|
31
32
|
# from hikyuu.gui.data.CollectToMemThread import CollectToMemThread
|
|
32
33
|
from hikyuu.gui.data.CollectSpotThread import CollectSpotThread
|
|
@@ -316,11 +317,23 @@ class MyMainWindow(QMainWindow, Ui_MainWindow):
|
|
|
316
317
|
self.tdx_dir_lineEdit.setEnabled(tdx_enable)
|
|
317
318
|
self.select_tdx_dir_pushButton.setEnabled(tdx_enable)
|
|
318
319
|
self.tdx_dir_lineEdit.setText(tdx_dir)
|
|
320
|
+
if tdx_enable:
|
|
321
|
+
self.use_download = 'tdx'
|
|
319
322
|
|
|
320
323
|
# 初始化pytdx配置及显示
|
|
321
|
-
|
|
324
|
+
use_pytdx_download = import_config.getboolean('pytdx', 'enable', fallback=True)
|
|
325
|
+
self.pytdx_radioButton.setChecked(use_pytdx_download)
|
|
326
|
+
if use_pytdx_download:
|
|
327
|
+
self.use_download = 'pytdx'
|
|
322
328
|
self.use_tdx_number_spinBox.setValue(import_config.getint('pytdx', 'use_tdx_number', fallback=10))
|
|
323
329
|
|
|
330
|
+
# 屏蔽,qmt下载缓慢到发指,且容易中断
|
|
331
|
+
# use_qmt_download = import_config.getboolean('qmt', 'enable', fallback=False)
|
|
332
|
+
# self.qmt_radioButton.setChecked(use_qmt_download)
|
|
333
|
+
# if use_qmt_download:
|
|
334
|
+
# self.use_download = 'qmt'
|
|
335
|
+
self.qmt_radioButton.setEnabled(False)
|
|
336
|
+
|
|
324
337
|
self.on_tdx_or_pytdx_toggled()
|
|
325
338
|
|
|
326
339
|
# 初始化hdf5设置
|
|
@@ -434,6 +447,7 @@ class MyMainWindow(QMainWindow, Ui_MainWindow):
|
|
|
434
447
|
'enable': self.pytdx_radioButton.isChecked(),
|
|
435
448
|
'use_tdx_number': self.use_tdx_number_spinBox.value()
|
|
436
449
|
}
|
|
450
|
+
import_config['qmt'] = {'enable': self.qmt_radioButton.isChecked()}
|
|
437
451
|
import_config['hdf5'] = {
|
|
438
452
|
'enable': self.enable_hdf55_radioButton.isChecked(),
|
|
439
453
|
'dir': self.hdf5_dir_lineEdit.text()
|
|
@@ -514,23 +528,50 @@ class MyMainWindow(QMainWindow, Ui_MainWindow):
|
|
|
514
528
|
def on_pytdx_radioButton_clicked(self):
|
|
515
529
|
if self.pytdx_radioButton.isChecked():
|
|
516
530
|
self.tdx_radioButton.setChecked(False)
|
|
531
|
+
self.qmt_radioButton.setChecked(False)
|
|
532
|
+
self.use_download = 'pytdx'
|
|
517
533
|
self.on_tdx_or_pytdx_toggled()
|
|
518
534
|
|
|
519
535
|
@pyqtSlot()
|
|
520
536
|
def on_tdx_radioButton_clicked(self):
|
|
521
537
|
if self.tdx_radioButton.isChecked():
|
|
522
538
|
self.pytdx_radioButton.setChecked(False)
|
|
539
|
+
self.qmt_radioButton.setChecked(False)
|
|
540
|
+
self.use_download = 'tdx'
|
|
541
|
+
self.on_tdx_or_pytdx_toggled()
|
|
542
|
+
|
|
543
|
+
def on_qmt_radioButton_clicked(self):
|
|
544
|
+
if self.qmt_radioButton.isChecked():
|
|
545
|
+
self.tdx_radioButton.setChecked(False)
|
|
546
|
+
self.pytdx_radioButton.setChecked(False)
|
|
547
|
+
self.use_download = 'qmt'
|
|
523
548
|
self.on_tdx_or_pytdx_toggled()
|
|
524
549
|
|
|
525
550
|
def on_tdx_or_pytdx_toggled(self):
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
551
|
+
if self.use_download == 'tdx':
|
|
552
|
+
self.tdx_dir_lineEdit.setEnabled(True)
|
|
553
|
+
self.select_tdx_dir_pushButton.setEnabled(True)
|
|
554
|
+
self.import_trans_checkBox.setEnabled(False)
|
|
555
|
+
self.import_time_checkBox.setEnabled(False)
|
|
556
|
+
self.trans_start_dateEdit.setEnabled(False)
|
|
557
|
+
self.time_start_dateEdit.setEnabled(False)
|
|
558
|
+
self.use_tdx_number_spinBox.setEnabled(False)
|
|
559
|
+
elif self.use_download == 'pytdx':
|
|
560
|
+
self.tdx_dir_lineEdit.setEnabled(False)
|
|
561
|
+
self.select_tdx_dir_pushButton.setEnabled(False)
|
|
562
|
+
self.import_trans_checkBox.setEnabled(True)
|
|
563
|
+
self.import_time_checkBox.setEnabled(True)
|
|
564
|
+
self.trans_start_dateEdit.setEnabled(True)
|
|
565
|
+
self.time_start_dateEdit.setEnabled(True)
|
|
566
|
+
self.use_tdx_number_spinBox.setEnabled(True)
|
|
567
|
+
elif self.use_download == 'qmt':
|
|
568
|
+
self.tdx_dir_lineEdit.setEnabled(False)
|
|
569
|
+
self.select_tdx_dir_pushButton.setEnabled(False)
|
|
570
|
+
self.import_trans_checkBox.setEnabled(False)
|
|
571
|
+
self.import_time_checkBox.setEnabled(False)
|
|
572
|
+
self.trans_start_dateEdit.setEnabled(False)
|
|
573
|
+
self.time_start_dateEdit.setEnabled(False)
|
|
574
|
+
self.use_tdx_number_spinBox.setEnabled(False)
|
|
534
575
|
|
|
535
576
|
@pyqtSlot()
|
|
536
577
|
def on_select_tdx_dir_pushButton_clicked(self):
|
|
@@ -662,7 +703,10 @@ class MyMainWindow(QMainWindow, Ui_MainWindow):
|
|
|
662
703
|
if ktype != 'FINISHED':
|
|
663
704
|
self.hdf5_import_progress_bar[ktype].setValue(progress)
|
|
664
705
|
else:
|
|
665
|
-
self.
|
|
706
|
+
if self.use_download == 'qmt':
|
|
707
|
+
self.import_detail_textEdit.append('导入 {} 记录数:{}'.format(msg[4], msg[5]))
|
|
708
|
+
else:
|
|
709
|
+
self.import_detail_textEdit.append('导入 {} {} 记录数:{}'.format(msg[3], msg[4], msg[5]))
|
|
666
710
|
|
|
667
711
|
elif msg_task_name == 'IMPORT_TRANS':
|
|
668
712
|
ktype, progress = msg[2:4]
|
|
@@ -748,10 +792,20 @@ class MyMainWindow(QMainWindow, Ui_MainWindow):
|
|
|
748
792
|
self.import_status_label.setText("正在启动任务....")
|
|
749
793
|
QApplication.processEvents()
|
|
750
794
|
|
|
751
|
-
if self.
|
|
795
|
+
if self.use_download == 'tdx':
|
|
752
796
|
self.hdf5_import_thread = UseTdxImportToH5Thread(self, config)
|
|
753
|
-
|
|
797
|
+
elif self.use_download == 'pytdx':
|
|
754
798
|
self.hdf5_import_thread = UsePytdxImportToH5Thread(self, config)
|
|
799
|
+
elif self.use_download == 'qmt':
|
|
800
|
+
if sys.platform != 'win32':
|
|
801
|
+
QMessageBox.about(self, "错误", "qmt导入功能仅支持Windows系统!")
|
|
802
|
+
return
|
|
803
|
+
try:
|
|
804
|
+
import xtquant
|
|
805
|
+
except ImportError:
|
|
806
|
+
QMessageBox.about(self, "错误", "请安装xtquant后再次尝试!")
|
|
807
|
+
return
|
|
808
|
+
self.hdf5_import_thread = UseQmtImportToH5Thread(self, config)
|
|
755
809
|
|
|
756
810
|
self.hdf5_import_thread.message.connect(self.on_message_from_thread)
|
|
757
811
|
self.hdf5_import_thread.start()
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# coding:utf-8
|
|
2
|
+
#
|
|
3
|
+
# The MIT License (MIT)
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2010-2017 fasiondog/hikyuu
|
|
6
|
+
#
|
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
# furnished to do so, subject to the following conditions:
|
|
13
|
+
#
|
|
14
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
# copies or substantial portions of the Software.
|
|
16
|
+
#
|
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
# SOFTWARE.
|
|
24
|
+
|
|
25
|
+
import time
|
|
26
|
+
import logging
|
|
27
|
+
import sqlite3
|
|
28
|
+
import mysql.connector
|
|
29
|
+
from hikyuu.util.check import hku_catch
|
|
30
|
+
|
|
31
|
+
from hikyuu.util.mylog import class_logger
|
|
32
|
+
from hikyuu.util import capture_multiprocess_all_logger, get_default_logger
|
|
33
|
+
from hikyuu.data.common import g_market_list
|
|
34
|
+
from hikyuu.data.common_sqlite3 import get_stock_list as sqlite_get_stock_list
|
|
35
|
+
from hikyuu.data.common_mysql import get_stock_list as mysql_get_stock_list
|
|
36
|
+
from hikyuu import KDataToHdf5Importer, Query, KRecord, Datetime, KRecordList
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def ktype_to_qmt_period(ktype):
|
|
40
|
+
if ktype == 'DAY':
|
|
41
|
+
return '1d'
|
|
42
|
+
elif ktype == '5MIN':
|
|
43
|
+
return '5m'
|
|
44
|
+
elif ktype == '1MIN':
|
|
45
|
+
return '1m'
|
|
46
|
+
else:
|
|
47
|
+
raise ValueError('ktype must be DAY, 1MIN or 5MIN')
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class ProgressBar:
|
|
51
|
+
def __init__(self, src, market, ktype):
|
|
52
|
+
self.src = src
|
|
53
|
+
self.market = market
|
|
54
|
+
self.ktype = ktype
|
|
55
|
+
self.finished = False
|
|
56
|
+
self.total = 0
|
|
57
|
+
self.cur = 0
|
|
58
|
+
|
|
59
|
+
def __call__(self, data):
|
|
60
|
+
print(data)
|
|
61
|
+
self.total = data['total']
|
|
62
|
+
self.cur = data['finished']
|
|
63
|
+
if self.src.queue:
|
|
64
|
+
self.src.queue.put([self.src.task_name, self.market, self.ktype, (self.cur + 1) * 100 // self.total, 0])
|
|
65
|
+
if self.cur == self.total:
|
|
66
|
+
self.finished = True
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class ImportQmtToH5Task:
|
|
70
|
+
def __init__(self, log_queue, queue, config, ktype_list, quotations, dest_dir):
|
|
71
|
+
super(ImportQmtToH5Task, self).__init__()
|
|
72
|
+
self.logger = logging.getLogger(self.__class__.__name__)
|
|
73
|
+
self.task_name = 'IMPORT_KDATA'
|
|
74
|
+
self.log_queue = log_queue
|
|
75
|
+
self.queue = queue
|
|
76
|
+
self.config = config
|
|
77
|
+
self.ktype_list = [ktype.upper() for ktype in ktype_list]
|
|
78
|
+
self.quotations = quotations
|
|
79
|
+
self.dest_dir = dest_dir
|
|
80
|
+
self.status = "no run"
|
|
81
|
+
|
|
82
|
+
def __del__(self):
|
|
83
|
+
# print(self.__class__.__name__, self.market, self.ktype, "__del__")
|
|
84
|
+
pass
|
|
85
|
+
|
|
86
|
+
@hku_catch(trace=True)
|
|
87
|
+
def __call__(self):
|
|
88
|
+
self.status = "no run"
|
|
89
|
+
capture_multiprocess_all_logger(self.log_queue)
|
|
90
|
+
use_hdf = False
|
|
91
|
+
if self.config.getboolean('hdf5', 'enable', fallback=True):
|
|
92
|
+
sqlite_file = "{}/stock.db".format(self.config['hdf5']['dir'])
|
|
93
|
+
connect = sqlite3.connect(sqlite_file, timeout=1800)
|
|
94
|
+
get_stock_list = sqlite_get_stock_list
|
|
95
|
+
self.logger.debug('use hdf5 import kdata')
|
|
96
|
+
use_hdf = True
|
|
97
|
+
else:
|
|
98
|
+
db_config = {
|
|
99
|
+
'user': self.config['mysql']['usr'],
|
|
100
|
+
'password': self.config['mysql']['pwd'],
|
|
101
|
+
'host': self.config['mysql']['host'],
|
|
102
|
+
'port': self.config['mysql']['port']
|
|
103
|
+
}
|
|
104
|
+
connect = mysql.connector.connect(**db_config)
|
|
105
|
+
get_stock_list = mysql_get_stock_list
|
|
106
|
+
self.logger.debug('use mysql import kdata')
|
|
107
|
+
|
|
108
|
+
from xtquant import xtdata
|
|
109
|
+
total = 0
|
|
110
|
+
for ktype in self.ktype_list:
|
|
111
|
+
for market in g_market_list:
|
|
112
|
+
import time
|
|
113
|
+
start_time = time.time()
|
|
114
|
+
process = ProgressBar(self, market, ktype)
|
|
115
|
+
try:
|
|
116
|
+
code_list = []
|
|
117
|
+
only_code_list = []
|
|
118
|
+
stock_list = get_stock_list(connect, market, self.quotations)
|
|
119
|
+
tmp_list = [f'{stock[2]}.{market}' for stock in stock_list]
|
|
120
|
+
code_list.extend(tmp_list)
|
|
121
|
+
tmp_list = [f'{stock[2]}' for stock in stock_list]
|
|
122
|
+
only_code_list.extend(tmp_list)
|
|
123
|
+
xtdata.download_history_data2(code_list[:1], period=ktype_to_qmt_period(ktype), start_time='', end_time='',
|
|
124
|
+
callback=process, incrementally=True)
|
|
125
|
+
except Exception as e:
|
|
126
|
+
self.logger.error(e)
|
|
127
|
+
|
|
128
|
+
while not process.finished:
|
|
129
|
+
time.sleep(0.1)
|
|
130
|
+
end_time = time.time()
|
|
131
|
+
if (end_time - start_time) > 30 and process.total == 0:
|
|
132
|
+
self.logger.error(f'QMT 超时没反应 {market} {ktype}')
|
|
133
|
+
break
|
|
134
|
+
|
|
135
|
+
total += process.total
|
|
136
|
+
|
|
137
|
+
self.import_qmt_to_h5(market, only_code_list[:1], ktype, self.dest_dir)
|
|
138
|
+
|
|
139
|
+
if self.queue:
|
|
140
|
+
self.queue.put([self.task_name, 'ALL', 'ALL', None, total])
|
|
141
|
+
|
|
142
|
+
self.status = "finished"
|
|
143
|
+
|
|
144
|
+
@hku_catch(trace=True)
|
|
145
|
+
def import_qmt_to_h5(self, market, code_list, ktype, dest_dir):
|
|
146
|
+
im = KDataToHdf5Importer()
|
|
147
|
+
if not im.set_config(dest_dir, [market]):
|
|
148
|
+
self.logger.error('KDataToHdf5Importer set config error! Maybe no license!')
|
|
149
|
+
return
|
|
150
|
+
if ktype == '1MIN':
|
|
151
|
+
nktype = Query.MIN
|
|
152
|
+
elif ktype == '5MIN':
|
|
153
|
+
nktype = Query.MIN5
|
|
154
|
+
elif ktype == 'DAY':
|
|
155
|
+
nktype = Query.DAY
|
|
156
|
+
else:
|
|
157
|
+
self.logger.error(f'Error ktype! {ktype}')
|
|
158
|
+
return
|
|
159
|
+
total = len(code_list)
|
|
160
|
+
cnt = 0
|
|
161
|
+
from xtquant import xtdata
|
|
162
|
+
for code in code_list:
|
|
163
|
+
last_date = im.get_last_datetime(market, code, nktype)
|
|
164
|
+
if not last_date.is_null():
|
|
165
|
+
if last_date >= Datetime.today():
|
|
166
|
+
cnt += 1
|
|
167
|
+
print(f"已导入 {cnt}, 总数: {total}, {market}{code}")
|
|
168
|
+
continue
|
|
169
|
+
df = xtdata.get_local_data(field_list=['open', 'high', 'low', 'close', 'amount', 'volume'],
|
|
170
|
+
stock_list=[f"{code}.{market}",], period=ktype_to_qmt_period(ktype),
|
|
171
|
+
start_time=str(last_date.number*100+1),
|
|
172
|
+
end_time='', count=-1, dividend_type='none', fill_data=False)
|
|
173
|
+
else:
|
|
174
|
+
df = xtdata.get_local_data(field_list=['open', 'high', 'low', 'close', 'amount', 'volume'],
|
|
175
|
+
stock_list=[f"{code}.{market}",], period=ktype_to_qmt_period(ktype),
|
|
176
|
+
dividend_type='none', fill_data=False)
|
|
177
|
+
|
|
178
|
+
if df:
|
|
179
|
+
df = df[f"{code}.{market}"]
|
|
180
|
+
ks = KRecordList()
|
|
181
|
+
for index, row in df.iterrows():
|
|
182
|
+
k = KRecord()
|
|
183
|
+
k.datetime = Datetime(index) if ktype == 'DAY' else Datetime(index/100)
|
|
184
|
+
k.open, k.high, k.low, k.close, k.volume, k.amount = row
|
|
185
|
+
ks.append(k)
|
|
186
|
+
if len(ks) > 0:
|
|
187
|
+
im.add_krecord_list(market, code, ks, nktype)
|
|
188
|
+
if nktype in (Query.DAY, Query.MIN5):
|
|
189
|
+
im.update_index(market, code, nktype)
|
|
190
|
+
|
|
191
|
+
cnt += 1
|
|
192
|
+
print(f"导入hikyuu 已完成: {cnt}, 总数: {total}, {market}{code}")
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
if __name__ == '__main__':
|
|
196
|
+
from hikyuu import *
|
|
197
|
+
from configparser import ConfigParser
|
|
198
|
+
import os
|
|
199
|
+
|
|
200
|
+
filename = os.path.expanduser('~') + '/.hikyuu' + '/importdata-gui.ini'
|
|
201
|
+
import_config = ConfigParser()
|
|
202
|
+
import_config.read(filename, encoding='utf-8')
|
|
203
|
+
|
|
204
|
+
from xtquant import xtdata
|
|
205
|
+
# get_default_logger()
|
|
206
|
+
|
|
207
|
+
# self, log_queue, queue, config, ktype, quotations, dest_dir
|
|
208
|
+
task = ImportQmtToH5Task(None, None, import_config, ['DAY'], ['stock', 'fund'], 'd:\\tmp\\stock')
|
|
209
|
+
task()
|
|
@@ -66,11 +66,18 @@ class ImportTdxToH5Task:
|
|
|
66
66
|
self.src_dir = src_dir + "/vipdoc/sz/minline"
|
|
67
67
|
elif self.ktype == '5MIN':
|
|
68
68
|
self.src_dir = src_dir + "/vipdoc/sz/fzline"
|
|
69
|
+
elif self.market == 'BJ':
|
|
70
|
+
if self.ktype == 'DAY':
|
|
71
|
+
self.src_dir = src_dir + "/vipdoc/bj/lday"
|
|
72
|
+
elif self.ktype == '1MIN':
|
|
73
|
+
self.src_dir = src_dir + "/vipdoc/bj/minline"
|
|
74
|
+
elif self.ktype == '5MIN':
|
|
75
|
+
self.src_dir = src_dir + "/vipdoc/bj/fzline"
|
|
69
76
|
self.dest_dir = dest_dir
|
|
70
77
|
self.status = "no run"
|
|
71
78
|
|
|
72
79
|
def __del__(self):
|
|
73
|
-
#print(self.__class__.__name__, self.market, self.ktype, "__del__")
|
|
80
|
+
# print(self.__class__.__name__, self.market, self.ktype, "__del__")
|
|
74
81
|
pass
|
|
75
82
|
|
|
76
83
|
@hku_catch(trace=True)
|
hikyuu/gui/data/MainWindow.py
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# Form implementation generated from reading ui file 'MainWindow.ui'
|
|
4
4
|
#
|
|
5
|
-
# Created by: PyQt5 UI code generator 5.15.
|
|
5
|
+
# Created by: PyQt5 UI code generator 5.15.10
|
|
6
6
|
#
|
|
7
7
|
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
|
8
8
|
# run again. Do not edit this file unless you know what you are doing.
|
|
@@ -75,6 +75,14 @@ class Ui_MainWindow(object):
|
|
|
75
75
|
self.gridLayout_2 = QtWidgets.QGridLayout()
|
|
76
76
|
self.gridLayout_2.setContentsMargins(10, -1, -1, 10)
|
|
77
77
|
self.gridLayout_2.setObjectName("gridLayout_2")
|
|
78
|
+
self.select_tdx_dir_pushButton = QtWidgets.QPushButton(self.groupBox_2)
|
|
79
|
+
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
|
|
80
|
+
sizePolicy.setHorizontalStretch(0)
|
|
81
|
+
sizePolicy.setVerticalStretch(0)
|
|
82
|
+
sizePolicy.setHeightForWidth(self.select_tdx_dir_pushButton.sizePolicy().hasHeightForWidth())
|
|
83
|
+
self.select_tdx_dir_pushButton.setSizePolicy(sizePolicy)
|
|
84
|
+
self.select_tdx_dir_pushButton.setObjectName("select_tdx_dir_pushButton")
|
|
85
|
+
self.gridLayout_2.addWidget(self.select_tdx_dir_pushButton, 0, 3, 1, 1)
|
|
78
86
|
self.label_2 = QtWidgets.QLabel(self.groupBox_2)
|
|
79
87
|
self.label_2.setObjectName("label_2")
|
|
80
88
|
self.gridLayout_2.addWidget(self.label_2, 0, 0, 1, 1)
|
|
@@ -86,15 +94,14 @@ class Ui_MainWindow(object):
|
|
|
86
94
|
self.tdx_dir_lineEdit.setSizePolicy(sizePolicy)
|
|
87
95
|
self.tdx_dir_lineEdit.setObjectName("tdx_dir_lineEdit")
|
|
88
96
|
self.gridLayout_2.addWidget(self.tdx_dir_lineEdit, 0, 1, 1, 2)
|
|
89
|
-
self.select_tdx_dir_pushButton = QtWidgets.QPushButton(self.groupBox_2)
|
|
90
|
-
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
|
|
91
|
-
sizePolicy.setHorizontalStretch(0)
|
|
92
|
-
sizePolicy.setVerticalStretch(0)
|
|
93
|
-
sizePolicy.setHeightForWidth(self.select_tdx_dir_pushButton.sizePolicy().hasHeightForWidth())
|
|
94
|
-
self.select_tdx_dir_pushButton.setSizePolicy(sizePolicy)
|
|
95
|
-
self.select_tdx_dir_pushButton.setObjectName("select_tdx_dir_pushButton")
|
|
96
|
-
self.gridLayout_2.addWidget(self.select_tdx_dir_pushButton, 0, 3, 1, 1)
|
|
97
97
|
self.verticalLayout_12.addLayout(self.gridLayout_2)
|
|
98
|
+
self.horizontalLayout_24 = QtWidgets.QHBoxLayout()
|
|
99
|
+
self.horizontalLayout_24.setContentsMargins(10, 0, -1, -1)
|
|
100
|
+
self.horizontalLayout_24.setObjectName("horizontalLayout_24")
|
|
101
|
+
self.qmt_radioButton = QtWidgets.QRadioButton(self.groupBox_2)
|
|
102
|
+
self.qmt_radioButton.setObjectName("qmt_radioButton")
|
|
103
|
+
self.horizontalLayout_24.addWidget(self.qmt_radioButton)
|
|
104
|
+
self.verticalLayout_12.addLayout(self.horizontalLayout_24)
|
|
98
105
|
self.verticalLayout_13.addWidget(self.groupBox_2)
|
|
99
106
|
spacerItem2 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
|
|
100
107
|
self.verticalLayout_13.addItem(spacerItem2)
|
|
@@ -165,7 +172,7 @@ class Ui_MainWindow(object):
|
|
|
165
172
|
self.label_6.setObjectName("label_6")
|
|
166
173
|
self.gridLayout_4.addWidget(self.label_6, 3, 0, 1, 1)
|
|
167
174
|
self.min5_start_dateEdit = QtWidgets.QDateEdit(self.groupBox_7)
|
|
168
|
-
self.min5_start_dateEdit.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(1989, 12,
|
|
175
|
+
self.min5_start_dateEdit.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(1989, 12, 27), QtCore.QTime(8, 0, 0)))
|
|
169
176
|
self.min5_start_dateEdit.setCalendarPopup(True)
|
|
170
177
|
self.min5_start_dateEdit.setObjectName("min5_start_dateEdit")
|
|
171
178
|
self.gridLayout_4.addWidget(self.min5_start_dateEdit, 1, 1, 1, 1)
|
|
@@ -187,7 +194,7 @@ class Ui_MainWindow(object):
|
|
|
187
194
|
self.trans_start_dateEdit.setObjectName("trans_start_dateEdit")
|
|
188
195
|
self.gridLayout_4.addWidget(self.trans_start_dateEdit, 3, 1, 1, 1)
|
|
189
196
|
self.day_start_dateEdit = QtWidgets.QDateEdit(self.groupBox_7)
|
|
190
|
-
self.day_start_dateEdit.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(1989, 12,
|
|
197
|
+
self.day_start_dateEdit.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(1989, 12, 27), QtCore.QTime(8, 0, 0)))
|
|
191
198
|
self.day_start_dateEdit.setCalendarPopup(True)
|
|
192
199
|
self.day_start_dateEdit.setObjectName("day_start_dateEdit")
|
|
193
200
|
self.gridLayout_4.addWidget(self.day_start_dateEdit, 0, 1, 1, 1)
|
|
@@ -685,29 +692,36 @@ class Ui_MainWindow(object):
|
|
|
685
692
|
self.tab_star.setEnabled(True)
|
|
686
693
|
self.tab_star.setObjectName("tab_star")
|
|
687
694
|
self.label_44 = QtWidgets.QLabel(self.tab_star)
|
|
688
|
-
self.label_44.setGeometry(QtCore.QRect(40,
|
|
695
|
+
self.label_44.setGeometry(QtCore.QRect(40, 380, 291, 171))
|
|
689
696
|
self.label_44.setText("")
|
|
690
697
|
self.label_44.setPixmap(QtGui.QPixmap("../images/star.png"))
|
|
691
698
|
self.label_44.setScaledContents(True)
|
|
692
699
|
self.label_44.setObjectName("label_44")
|
|
693
700
|
self.label_46 = QtWidgets.QLabel(self.tab_star)
|
|
694
|
-
self.label_46.setGeometry(QtCore.QRect(30,
|
|
701
|
+
self.label_46.setGeometry(QtCore.QRect(30, 20, 561, 221))
|
|
702
|
+
self.label_46.setWordWrap(True)
|
|
695
703
|
self.label_46.setObjectName("label_46")
|
|
696
704
|
self.line_2 = QtWidgets.QFrame(self.tab_star)
|
|
697
|
-
self.line_2.setGeometry(QtCore.QRect(30,
|
|
705
|
+
self.line_2.setGeometry(QtCore.QRect(30, 240, 531, 16))
|
|
698
706
|
self.line_2.setFrameShape(QtWidgets.QFrame.HLine)
|
|
699
707
|
self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
|
|
700
708
|
self.line_2.setObjectName("line_2")
|
|
701
709
|
self.label_47 = QtWidgets.QLabel(self.tab_star)
|
|
702
|
-
self.label_47.setGeometry(QtCore.QRect(40,
|
|
710
|
+
self.label_47.setGeometry(QtCore.QRect(40, 260, 151, 16))
|
|
711
|
+
font = QtGui.QFont()
|
|
712
|
+
font.setBold(True)
|
|
713
|
+
self.label_47.setFont(font)
|
|
703
714
|
self.label_47.setObjectName("label_47")
|
|
704
715
|
self.line_3 = QtWidgets.QFrame(self.tab_star)
|
|
705
|
-
self.line_3.setGeometry(QtCore.QRect(30,
|
|
716
|
+
self.line_3.setGeometry(QtCore.QRect(30, 330, 531, 16))
|
|
706
717
|
self.line_3.setFrameShape(QtWidgets.QFrame.HLine)
|
|
707
718
|
self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken)
|
|
708
719
|
self.line_3.setObjectName("line_3")
|
|
709
720
|
self.label_48 = QtWidgets.QLabel(self.tab_star)
|
|
710
|
-
self.label_48.setGeometry(QtCore.QRect(40,
|
|
721
|
+
self.label_48.setGeometry(QtCore.QRect(40, 356, 331, 16))
|
|
722
|
+
font = QtGui.QFont()
|
|
723
|
+
font.setBold(True)
|
|
724
|
+
self.label_48.setFont(font)
|
|
711
725
|
self.label_48.setObjectName("label_48")
|
|
712
726
|
self.line_4 = QtWidgets.QFrame(self.tab_star)
|
|
713
727
|
self.line_4.setGeometry(QtCore.QRect(30, 560, 531, 16))
|
|
@@ -716,23 +730,26 @@ class Ui_MainWindow(object):
|
|
|
716
730
|
self.line_4.setObjectName("line_4")
|
|
717
731
|
self.label_49 = QtWidgets.QLabel(self.tab_star)
|
|
718
732
|
self.label_49.setGeometry(QtCore.QRect(40, 580, 81, 16))
|
|
733
|
+
font = QtGui.QFont()
|
|
734
|
+
font.setBold(True)
|
|
735
|
+
self.label_49.setFont(font)
|
|
719
736
|
self.label_49.setObjectName("label_49")
|
|
720
737
|
self.label_license = QtWidgets.QLabel(self.tab_star)
|
|
721
738
|
self.label_license.setGeometry(QtCore.QRect(40, 610, 521, 91))
|
|
722
739
|
self.label_license.setObjectName("label_license")
|
|
723
|
-
self.
|
|
724
|
-
self.
|
|
725
|
-
self.
|
|
726
|
-
self.horizontalLayout_20 = QtWidgets.QHBoxLayout(self.
|
|
740
|
+
self.layoutWidget = QtWidgets.QWidget(self.tab_star)
|
|
741
|
+
self.layoutWidget.setGeometry(QtCore.QRect(40, 290, 511, 33))
|
|
742
|
+
self.layoutWidget.setObjectName("layoutWidget")
|
|
743
|
+
self.horizontalLayout_20 = QtWidgets.QHBoxLayout(self.layoutWidget)
|
|
727
744
|
self.horizontalLayout_20.setContentsMargins(0, 0, 0, 0)
|
|
728
745
|
self.horizontalLayout_20.setObjectName("horizontalLayout_20")
|
|
729
|
-
self.label_45 = QtWidgets.QLabel(self.
|
|
746
|
+
self.label_45 = QtWidgets.QLabel(self.layoutWidget)
|
|
730
747
|
self.label_45.setObjectName("label_45")
|
|
731
748
|
self.horizontalLayout_20.addWidget(self.label_45)
|
|
732
|
-
self.email_lineEdit = QtWidgets.QLineEdit(self.
|
|
749
|
+
self.email_lineEdit = QtWidgets.QLineEdit(self.layoutWidget)
|
|
733
750
|
self.email_lineEdit.setObjectName("email_lineEdit")
|
|
734
751
|
self.horizontalLayout_20.addWidget(self.email_lineEdit)
|
|
735
|
-
self.fetch_trial_pushButton = QtWidgets.QPushButton(self.
|
|
752
|
+
self.fetch_trial_pushButton = QtWidgets.QPushButton(self.layoutWidget)
|
|
736
753
|
self.fetch_trial_pushButton.setObjectName("fetch_trial_pushButton")
|
|
737
754
|
self.horizontalLayout_20.addWidget(self.fetch_trial_pushButton)
|
|
738
755
|
self.tabWidget.addTab(self.tab_star, "")
|
|
@@ -758,12 +775,13 @@ class Ui_MainWindow(object):
|
|
|
758
775
|
_translate = QtCore.QCoreApplication.translate
|
|
759
776
|
MainWindow.setWindowTitle(_translate("MainWindow", "数据导入工具"))
|
|
760
777
|
self.groupBox_2.setTitle(_translate("MainWindow", "数据源设置"))
|
|
761
|
-
self.pytdx_radioButton.setText(_translate("MainWindow", "使用Pytdx
|
|
778
|
+
self.pytdx_radioButton.setText(_translate("MainWindow", "使用Pytdx下载数据"))
|
|
762
779
|
self.label_16.setText(_translate("MainWindow", "同时使用"))
|
|
763
780
|
self.label_17.setText(_translate("MainWindow", "个通达信服务器进行下载"))
|
|
764
781
|
self.tdx_radioButton.setText(_translate("MainWindow", "使用通达信盘后数据(不支持分笔、分时数据,需要配置安装路径)"))
|
|
765
|
-
self.label_2.setText(_translate("MainWindow", "通达信安装目录:"))
|
|
766
782
|
self.select_tdx_dir_pushButton.setText(_translate("MainWindow", "选择"))
|
|
783
|
+
self.label_2.setText(_translate("MainWindow", "通达信安装目录:"))
|
|
784
|
+
self.qmt_radioButton.setText(_translate("MainWindow", "使用 qmt 数据下载(需要 miniqmt)(屏蔽,qmt下载数据太慢,且不稳定)"))
|
|
767
785
|
self.groupBox_7.setTitle(_translate("MainWindow", "导入设置"))
|
|
768
786
|
self.import_weight_checkBox.setText(_translate("MainWindow", "下载权息数据"))
|
|
769
787
|
self.import_stock_checkBox.setText(_translate("MainWindow", "股票"))
|
|
@@ -814,19 +832,19 @@ class Ui_MainWindow(object):
|
|
|
814
832
|
"hr { height: 1px; border-width: 0; }\n"
|
|
815
833
|
"li.unchecked::marker { content: \"\\2610\"; }\n"
|
|
816
834
|
"li.checked::marker { content: \"\\2612\"; }\n"
|
|
817
|
-
"</style></head><body style=\" font-family:\'
|
|
818
|
-
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'
|
|
819
|
-
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'
|
|
820
|
-
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'
|
|
821
|
-
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'
|
|
822
|
-
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'
|
|
823
|
-
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'
|
|
824
|
-
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'
|
|
825
|
-
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'
|
|
826
|
-
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'
|
|
827
|
-
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'
|
|
828
|
-
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'
|
|
829
|
-
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'
|
|
835
|
+
"</style></head><body style=\" font-family:\'Microsoft YaHei UI\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
|
|
836
|
+
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">导入上证日线记录:</span></p>\n"
|
|
837
|
+
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">导入深证日线记录:</span></p>\n"
|
|
838
|
+
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">导入上证5分钟线记录:</span></p>\n"
|
|
839
|
+
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">导入深证5分钟线记录:</span></p>\n"
|
|
840
|
+
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">导入上证1分钟线记录:</span></p>\n"
|
|
841
|
+
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">导入深证1分钟线记录:</span></p>\n"
|
|
842
|
+
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">导入上证分笔记录:</span></p>\n"
|
|
843
|
+
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">导入深证分笔记录:</span></p>\n"
|
|
844
|
+
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">导入上证分时数据:</span></p>\n"
|
|
845
|
+
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">导入深证分时数据:</span></p>\n"
|
|
846
|
+
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">导入权息数据数:</span></p>\n"
|
|
847
|
+
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">导入完毕!</span></p></body></html>"))
|
|
830
848
|
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "执行导入"))
|
|
831
849
|
self.groupBox_6.setTitle(_translate("MainWindow", "预加载设置"))
|
|
832
850
|
self.label_35.setText(_translate("MainWindow", "此处为 Hikyuu 运行时的数据预加载设置,请根据机器内存大小选择"))
|
|
@@ -874,20 +892,20 @@ class Ui_MainWindow(object):
|
|
|
874
892
|
"hr { height: 1px; border-width: 0; }\n"
|
|
875
893
|
"li.unchecked::marker { content: \"\\2610\"; }\n"
|
|
876
894
|
"li.checked::marker { content: \"\\2612\"; }\n"
|
|
877
|
-
"</style></head><body style=\" font-family:\'
|
|
878
|
-
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'
|
|
879
|
-
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'; font-size:10pt; font-weight:600; color:#ff0000;\">1、行情采集服务仅对预加载数据有效</span><span style=\" font-family:\'SimSun\'
|
|
880
|
-
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'SimSun\'
|
|
881
|
-
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'
|
|
882
|
-
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'SimSun\'
|
|
883
|
-
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'; font-
|
|
895
|
+
"</style></head><body style=\" font-family:\'Microsoft YaHei UI\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
|
|
896
|
+
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">注:</span></p>\n"
|
|
897
|
+
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'; font-size:10pt; font-weight:600; color:#ff0000;\">1、行情采集服务仅对预加载数据有效</span><span style=\" font-family:\'SimSun\';\">,在行情采集服务运行期间,hikyuu.interactive运行时将自动连接采集服务获取行情数据,并更新预加载的内容数据。</span></p>\n"
|
|
898
|
+
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'SimSun\';\"><br /></p>\n"
|
|
899
|
+
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\';\">2、如使用芝麻代理(</span><a href=\"http://h.zhimaruanjian.com/\"><span style=\" font-family:\'SimSun\'; text-decoration: underline; color:#0000ff;\">http://h.zhimaruanjian.com/</span></a><span style=\" font-family:\'SimSun\';\">),请自行申请(需付费),并确保ip为其白名单。</span></p>\n"
|
|
900
|
+
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'SimSun\';\"><br /></p>\n"
|
|
901
|
+
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'SimSun\'; font-weight:696; color:#0000ff;\">3、此处采集为网络采集,更推荐直接运行安装目录下gui子目录下的 start_qmt.py ,使用miniqmt 实时服务。该程序独立运行,不用关闭,和这里的采集效果一样。注意:miniqmt需要QMT交易端配合,且在同一机器上执行。</span></p></body></html>"))
|
|
884
902
|
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "行情采集服务"))
|
|
885
|
-
self.label_46.setText(_translate("MainWindow", "<html><head/><body><p>Hikyuu
|
|
886
|
-
self.label_47.setText(_translate("MainWindow", "
|
|
887
|
-
self.label_48.setText(_translate("MainWindow", "
|
|
903
|
+
self.label_46.setText(_translate("MainWindow", "<html><head/><body><p>Hikyuu 作为长期持续维护的开源项目,<span style=\" font-weight:700;\">专注于量化交易领域的核心技术构建,涵盖交易模型开发、极速计算引擎、高效回测框架及实盘拓展能力</span>,定位为量化交易的基础设施级计算引擎,为量化交易爱好者和专业提供高性能底层架构支持。随着社区规模扩大,项目持续迭代及技术支持事务逐渐分散了作者在策略研究上的精力。为保障项目的专注度与可持续性,现推出 "VIP计划",通过提供部分VIP功能作为回馈,构建良性的项目发展生态。诚挚期待社区伙伴的支持,您的参与都将直接助力 Hikyuu 的技术创新,共同推动量化交易基础设施的迭代升级。</p><p>VIP功能以插件的方式提供,采用独立授权许可,完全在 hikyuu 之外,对喜欢自行编译扩展的朋友没有影响。因插件许可授权需要采集硬件信息,如有疑虑只要不申请试用许可和正式许可授权,不会触发硬件信息采集。</p><p><span style=\" font-weight:700;\">正式许可授权除资金支持外,亦可通过其他方式获取,详情参见:</span><a href=\"https://gitee.com/fasiondog/hikyuu/blob/master/vip-plan.md\"><span style=\" font-weight:700; text-decoration: underline; color:#3586ff;\">VIP计划</span></a><span style=\" font-weight:700;\"> 中 "如何获取免费授权和延长授权时间" 章节,已提供的VIP功能亦在其中,可自行查看,感谢大家的支持!</span></p></body></html>"))
|
|
904
|
+
self.label_47.setText(_translate("MainWindow", "申请试用许可(30天试用)"))
|
|
905
|
+
self.label_48.setText(_translate("MainWindow", "加入知识星球,获取星球许可(可同时在3台设备上使用)"))
|
|
888
906
|
self.label_49.setText(_translate("MainWindow", "当前授权信息"))
|
|
889
907
|
self.label_license.setText(_translate("MainWindow", "TextLabel"))
|
|
890
908
|
self.label_45.setText(_translate("MainWindow", "电子邮件地址:"))
|
|
891
909
|
self.fetch_trial_pushButton.setText(_translate("MainWindow", "申请试用许可"))
|
|
892
|
-
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_star), _translate("MainWindow", "
|
|
910
|
+
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_star), _translate("MainWindow", "项目VIP"))
|
|
893
911
|
self.label_41.setText(_translate("MainWindow", "执行日志"))
|