hikyuu 2.7.1.1__py3-none-manylinux2014_aarch64.whl → 2.7.2__py3-none-manylinux2014_aarch64.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 +4 -1
- hikyuu/__init__.pyi +17 -11
- hikyuu/analysis/__init__.pyi +5 -1
- hikyuu/analysis/analysis.pyi +6 -2
- hikyuu/core.pyi +7 -3
- hikyuu/cpp/core310.pyi +49 -6
- hikyuu/cpp/core310.so +0 -0
- hikyuu/cpp/core311.pyi +49 -6
- hikyuu/cpp/core311.so +0 -0
- hikyuu/cpp/core312.pyi +49 -6
- hikyuu/cpp/core312.so +0 -0
- hikyuu/cpp/core313.pyi +49 -6
- hikyuu/cpp/core313.so +0 -0
- hikyuu/cpp/i18n/zh_CN/hikyuu.mo +0 -0
- hikyuu/cpp/i18n/zh_CN/hikyuu_plugin.mo +0 -0
- hikyuu/cpp/libhikyuu.so +0 -0
- hikyuu/data/clickhouse_upgrade/0001.sql +2 -0
- hikyuu/data/common_clickhouse.py +1 -3
- hikyuu/data/hku_config_template.py +6 -0
- hikyuu/data/mysql_upgrade/0029.sql +2 -0
- hikyuu/data/pytdx_to_clickhouse.py +85 -31
- hikyuu/data/pytdx_to_h5.py +74 -29
- hikyuu/data/pytdx_to_mysql.py +63 -19
- hikyuu/data/pytdx_weight_to_clickhouse.py +2 -0
- hikyuu/data/pytdx_weight_to_mysql.py +2 -0
- hikyuu/data/pytdx_weight_to_sqlite.py +2 -0
- hikyuu/data/sqlite_upgrade/0029.sql +4 -0
- hikyuu/draw/drawplot/bokeh_draw.pyi +10 -6
- hikyuu/draw/drawplot/echarts_draw.pyi +10 -6
- hikyuu/draw/drawplot/matplotlib_draw.py +8 -2
- hikyuu/draw/drawplot/matplotlib_draw.pyi +10 -6
- hikyuu/extend.pyi +6 -2
- hikyuu/gui/HikyuuTDX.py +12 -2
- hikyuu/gui/data/MainWindow.py +166 -142
- hikyuu/hub.pyi +6 -6
- hikyuu/include/hikyuu/StockManager.h +4 -0
- hikyuu/include/hikyuu/StrategyContext.h +4 -4
- hikyuu/include/hikyuu/data_driver/kdata/mysql/MySQLKDataDriver.h +5 -1
- hikyuu/include/hikyuu/data_driver/kdata/sqlite/SQLiteKDataDriver.h +1 -1
- hikyuu/include/hikyuu/global/sysinfo.h +24 -5
- hikyuu/include/hikyuu/indicator/IndicatorImp.h +1 -1
- hikyuu/include/hikyuu/plugin/KDataToClickHouseImporter.h +40 -0
- hikyuu/include/hikyuu/plugin/KDataToMySQLImporter.h +40 -0
- hikyuu/include/hikyuu/plugin/checkdata.h +20 -0
- hikyuu/include/hikyuu/plugin/hkuextra.h +2 -0
- hikyuu/include/hikyuu/plugin/interface/CheckDataPluginInterface.h +25 -0
- hikyuu/include/hikyuu/plugin/interface/HkuExtraPluginInterface.h +2 -0
- hikyuu/include/hikyuu/plugin/interface/ImportKDataToClickHousePluginInterface.h +44 -0
- hikyuu/include/hikyuu/plugin/interface/ImportKDataToMySQLPluginInterface.h +42 -0
- hikyuu/include/hikyuu/plugin/interface/plugins.h +6 -0
- hikyuu/include/hikyuu/python/convert_any.h +9 -6
- hikyuu/include/hikyuu/strategy/Strategy.h +1 -1
- hikyuu/include/hikyuu/trade_manage/TradeRecord.h +2 -1
- hikyuu/include/hikyuu/trade_sys/allocatefunds/build_in.h +1 -0
- hikyuu/include/hikyuu/trade_sys/allocatefunds/crt/AF_FixedAmount.h +26 -0
- hikyuu/include/hikyuu/trade_sys/allocatefunds/imp/FixAmountFunds.h +18 -0
- hikyuu/include/hikyuu/utilities/Log.h +6 -7
- hikyuu/include/hikyuu/utilities/Parameter.h +17 -0
- hikyuu/include/hikyuu/utilities/config.h +28 -0
- hikyuu/include/hikyuu/utilities/plugin/PluginBase.h +17 -2
- hikyuu/include/hikyuu/utilities/plugin/PluginManager.h +41 -22
- hikyuu/include/hikyuu/utilities/thread/GlobalStealThreadPool.h +1 -2
- hikyuu/include/hikyuu/utilities/thread/GlobalThreadPool.h +1 -1
- hikyuu/include/hikyuu/utilities/thread/MQStealThreadPool.h +285 -0
- hikyuu/include/hikyuu/utilities/thread/StealThreadPool.h +296 -0
- hikyuu/include/hikyuu/utilities/thread/WorkStealQueue.h +9 -8
- hikyuu/include/hikyuu/utilities/thread/algorithm.h +64 -14
- hikyuu/include/hikyuu/version.h +4 -4
- hikyuu/plugin/libbacktest.so +0 -0
- hikyuu/plugin/libcheckdata.so +0 -0
- hikyuu/plugin/libclickhousedriver.so +0 -0
- hikyuu/plugin/libdataserver.so +0 -0
- hikyuu/plugin/libdataserver_parquet.so +0 -0
- hikyuu/plugin/libdevice.so +0 -0
- hikyuu/plugin/libextind.so +0 -0
- hikyuu/plugin/libhkuextra.so +0 -0
- hikyuu/plugin/libimport2ch.so +0 -0
- hikyuu/plugin/libimport2hdf5.so +0 -0
- hikyuu/plugin/libimport2mysql.so +0 -0
- hikyuu/plugin/libtmreport.so +0 -0
- hikyuu/trade_manage/__init__.pyi +10 -6
- hikyuu/trade_manage/trade.pyi +10 -6
- hikyuu/trade_sys/trade_sys.py +3 -1
- hikyuu/util/singleton.pyi +1 -1
- {hikyuu-2.7.1.1.dist-info → hikyuu-2.7.2.dist-info}/METADATA +5 -1
- {hikyuu-2.7.1.1.dist-info → hikyuu-2.7.2.dist-info}/RECORD +89 -72
- {hikyuu-2.7.1.1.dist-info → hikyuu-2.7.2.dist-info}/WHEEL +0 -0
- {hikyuu-2.7.1.1.dist-info → hikyuu-2.7.2.dist-info}/entry_points.txt +0 -0
- {hikyuu-2.7.1.1.dist-info → hikyuu-2.7.2.dist-info}/top_level.txt +0 -0
hikyuu/cpp/core313.pyi
CHANGED
|
@@ -3,7 +3,7 @@ import collections.abc
|
|
|
3
3
|
import numpy
|
|
4
4
|
import numpy.typing
|
|
5
5
|
import typing
|
|
6
|
-
__all__: list[str] = ['ABS', 'ACOS', 'AD', 'ADVANCE', 'AF_EqualWeight', 'AF_FixedWeight', 'AF_FixedWeightList', 'AF_MultiFactor', 'AGG_COUNT', 'AGG_FUNC', 'AGG_MAD', 'AGG_MAX', 'AGG_MEAN', 'AGG_MEDIAN', 'AGG_MIN', 'AGG_PROD', 'AGG_QUANTILE', 'AGG_STD', 'AGG_SUM', 'AGG_VAR', 'ALIGN', 'AMA', 'ASIN', 'ATAN', 'ATR', 'AVEDEV', 'AllocateFundsBase', 'BACKSET', 'BARSCOUNT', 'BARSLAST', 'BARSLASTCOUNT', 'BARSSINCE', 'BARSSINCEN', 'BETWEEN', 'BLOCKSETNUM', 'BUSINESS', 'Block', 'BlockInfoDriver', 'BorrowRecord', 'BrokerPositionRecord', 'CEILING', 'CN_Bool', 'CN_OPLine', 'CONTEXT', 'CONTEXT_K', 'CORR', 'COS', 'COST', 'COUNT', 'CROSS', 'CVAL', 'CYCLE', 'C_AMO', 'C_CLOSE', 'C_HIGH', 'C_KDATA', 'C_LOW', 'C_OPEN', 'C_VOL', 'ConditionBase', 'Constant', 'CostRecord', 'DATE', 'DAY', 'DEBUG', 'DECLINE', 'DEVSQ', 'DIFF', 'DISCARD', 'DMA', 'DOWNNDAY', 'DROPNA', 'DataDriverFactory', 'Datetime', 'DatetimeList', 'Days', 'EMA', 'ERROR', 'EVERY', 'EV_Bool', 'EV_TwoLine', 'EXIST', 'EXP', 'EnvironmentBase', 'FATAL', 'FILTER', 'FINANCE', 'FLOOR', 'FundsRecord', 'GROUP_COUNT', 'GROUP_FUNC', 'GROUP_MAX', 'GROUP_MEAN', 'GROUP_MIN', 'GROUP_PROD', 'GROUP_SUM', 'HHV', 'HHVBARS', 'HKUException', 'HOUR', 'HSL', 'Hours', 'IC', 'ICIR', 'IF', 'INBLOCK', 'INDEXA', 'INDEXADV', 'INDEXC', 'INDEXDEC', 'INDEXH', 'INDEXL', 'INDEXO', 'INDEXV', 'INFO', 'INSUM', 'INTPART', 'IR', 'ISINF', 'ISINFA', 'ISLASTBAR', 'ISNA', 'IndParam', 'Indicator', 'IndicatorImp', 'JUMPDOWN', 'JUMPUP', 'KALMAN', 'KDATA_PART', 'KData', 'KDataDriver', 'KDataToHdf5Importer', 'KRecord', 'KRecordList', 'LAST', 'LASTVALUE', 'LIUTONGPAN', 'LLV', 'LLVBARS', 'LN', 'LOG', 'LOG_LEVEL', 'LONGCROSS', 'LoanRecord', 'MA', 'MACD', 'MAX', 'MDD', 'MF_EqualWeight', 'MF_ICIRWeight', 'MF_ICWeight', 'MF_Weight', 'MIN', 'MINUTE', 'MM_FixedCapital', 'MM_FixedCapitalFunds', 'MM_FixedCount', 'MM_FixedCountTps', 'MM_FixedPercent', 'MM_FixedRisk', 'MM_FixedUnits', 'MM_Nothing', 'MM_WilliamsFixedRisk', 'MOD', 'MONTH', 'MRR', 'MarketInfo', 'Microseconds', 'Milliseconds', 'Minutes', 'MoneyManagerBase', 'MultiFactorBase', 'NDAY', 'NORM_MinMax', 'NORM_NOTHING', 'NORM_Quantile', 'NORM_Quantile_Uniform', 'NORM_Zscore', 'NOT', 'NormalizeBase', 'OFF', 'OrderBrokerBase', 'PF_Simple', 'PF_WithoutAF', 'PG_FixedHoldDays', 'PG_FixedPercent', 'PG_NoGoal', 'POS', 'POW', 'PRICELIST', 'Parameter', 'Performance', 'Portfolio', 'PositionRecord', 'PositionRecordList', 'ProfitGoalBase', 'QUANTILE_TRUNC', 'Query', 'RANK', 'RECOVER_BACKWARD', 'RECOVER_EQUAL_BACKWARD', 'RECOVER_EQUAL_FORWARD', 'RECOVER_FORWARD', 'REF', 'REFX', 'REPLACE', 'RESULT', 'REVERSE', 'ROC', 'ROCP', 'ROCR', 'ROCR100', 'ROUND', 'ROUNDDOWN', 'ROUNDUP', 'RSI', 'SAFTYLOSS', 'SCFilter_AmountLimit', 'SCFilter_Group', 'SCFilter_IgnoreNan', 'SCFilter_LessOrEqualValue', 'SCFilter_Price', 'SCFilter_TopN', 'SE_EvaluateOptimal', 'SE_Fixed', 'SE_MaxFundsOptimal', 'SE_MultiFactor', 'SE_MultiFactor2', 'SE_PerformanceOptimal', 'SE_Signal', 'SGN', 'SG_Add', 'SG_AllwaysBuy', 'SG_And', 'SG_Band', 'SG_Bool', 'SG_Buy', 'SG_Cross', 'SG_CrossGold', 'SG_Cycle', 'SG_Div', 'SG_Flex', 'SG_Mul', 'SG_OneSide', 'SG_Or', 'SG_Sell', 'SG_Single', 'SG_Single2', 'SG_Sub', 'SIN', 'SLICE', 'SLOPE', 'SMA', 'SPEARMAN', 'SP_FixedPercent', 'SP_FixedValue', 'SP_LogNormal', 'SP_Normal', 'SP_TruncNormal', 'SP_Uniform', 'SQRT', 'STDEV', 'STDP', 'ST_FixedPercent', 'ST_Indicator', 'ST_Saftyloss', 'SUM', 'SUMBARS', 'SYS_Simple', 'SYS_WalkForward', 'ScoreRecord', 'ScoreRecordList', 'ScoresFilterBase', 'Seconds', 'SelectorBase', 'SignalBase', 'SlippageBase', 'SpotRecord', 'Stock', 'StockManager', 'StockTypeInfo', 'StockWeight', 'StockWeightList', 'StoplossBase', 'Strategy', 'StrategyContext', 'System', 'SystemPart', 'SystemWeight', 'SystemWeightList', 'TAN', 'TA_ACCBANDS', 'TA_ACOS', 'TA_AD', 'TA_ADD', 'TA_ADOSC', 'TA_ADX', 'TA_ADXR', 'TA_APO', 'TA_AROON', 'TA_AROONOSC', 'TA_ASIN', 'TA_ATAN', 'TA_ATR', 'TA_AVGDEV', 'TA_AVGPRICE', 'TA_BBANDS', 'TA_BETA', 'TA_BOP', 'TA_CCI', 'TA_CDL2CROWS', 'TA_CDL3BLACKCROWS', 'TA_CDL3INSIDE', 'TA_CDL3LINESTRIKE', 'TA_CDL3OUTSIDE', 'TA_CDL3STARSINSOUTH', 'TA_CDL3WHITESOLDIERS', 'TA_CDLABANDONEDBABY', 'TA_CDLADVANCEBLOCK', 'TA_CDLBELTHOLD', 'TA_CDLBREAKAWAY', 'TA_CDLCLOSINGMARUBOZU', 'TA_CDLCONCEALBABYSWALL', 'TA_CDLCOUNTERATTACK', 'TA_CDLDARKCLOUDCOVER', 'TA_CDLDOJI', 'TA_CDLDOJISTAR', 'TA_CDLDRAGONFLYDOJI', 'TA_CDLENGULFING', 'TA_CDLEVENINGDOJISTAR', 'TA_CDLEVENINGSTAR', 'TA_CDLGAPSIDESIDEWHITE', 'TA_CDLGRAVESTONEDOJI', 'TA_CDLHAMMER', 'TA_CDLHANGINGMAN', 'TA_CDLHARAMI', 'TA_CDLHARAMICROSS', 'TA_CDLHIGHWAVE', 'TA_CDLHIKKAKE', 'TA_CDLHIKKAKEMOD', 'TA_CDLHOMINGPIGEON', 'TA_CDLIDENTICAL3CROWS', 'TA_CDLINNECK', 'TA_CDLINVERTEDHAMMER', 'TA_CDLKICKING', 'TA_CDLKICKINGBYLENGTH', 'TA_CDLLADDERBOTTOM', 'TA_CDLLONGLEGGEDDOJI', 'TA_CDLLONGLINE', 'TA_CDLMARUBOZU', 'TA_CDLMATCHINGLOW', 'TA_CDLMATHOLD', 'TA_CDLMORNINGDOJISTAR', 'TA_CDLMORNINGSTAR', 'TA_CDLONNECK', 'TA_CDLPIERCING', 'TA_CDLRICKSHAWMAN', 'TA_CDLRISEFALL3METHODS', 'TA_CDLSEPARATINGLINES', 'TA_CDLSHOOTINGSTAR', 'TA_CDLSHORTLINE', 'TA_CDLSPINNINGTOP', 'TA_CDLSTALLEDPATTERN', 'TA_CDLSTICKSANDWICH', 'TA_CDLTAKURI', 'TA_CDLTASUKIGAP', 'TA_CDLTHRUSTING', 'TA_CDLTRISTAR', 'TA_CDLUNIQUE3RIVER', 'TA_CDLUPSIDEGAP2CROWS', 'TA_CDLXSIDEGAP3METHODS', 'TA_CEIL', 'TA_CMO', 'TA_CORREL', 'TA_COS', 'TA_COSH', 'TA_DEMA', 'TA_DIV', 'TA_DX', 'TA_EMA', 'TA_EXP', 'TA_FLOOR', 'TA_HT_DCPERIOD', 'TA_HT_DCPHASE', 'TA_HT_PHASOR', 'TA_HT_SINE', 'TA_HT_TRENDLINE', 'TA_HT_TRENDMODE', 'TA_IMI', 'TA_KAMA', 'TA_LINEARREG', 'TA_LINEARREG_ANGLE', 'TA_LINEARREG_INTERCEPT', 'TA_LINEARREG_SLOPE', 'TA_LN', 'TA_LOG10', 'TA_MA', 'TA_MACD', 'TA_MACDEXT', 'TA_MACDFIX', 'TA_MAMA', 'TA_MAVP', 'TA_MAX', 'TA_MAXINDEX', 'TA_MEDPRICE', 'TA_MFI', 'TA_MIDPOINT', 'TA_MIDPRICE', 'TA_MIN', 'TA_MININDEX', 'TA_MINMAX', 'TA_MINMAXINDEX', 'TA_MINUS_DI', 'TA_MINUS_DM', 'TA_MOM', 'TA_MULT', 'TA_NATR', 'TA_OBV', 'TA_PLUS_DI', 'TA_PLUS_DM', 'TA_PPO', 'TA_ROC', 'TA_ROCP', 'TA_ROCR', 'TA_ROCR100', 'TA_RSI', 'TA_SAR', 'TA_SAREXT', 'TA_SIN', 'TA_SINH', 'TA_SMA', 'TA_SQRT', 'TA_STDDEV', 'TA_STOCH', 'TA_STOCHF', 'TA_STOCHRSI', 'TA_SUB', 'TA_SUM', 'TA_T3', 'TA_TAN', 'TA_TANH', 'TA_TEMA', 'TA_TRANGE', 'TA_TRIMA', 'TA_TRIX', 'TA_TSF', 'TA_TYPPRICE', 'TA_ULTOSC', 'TA_VAR', 'TA_WCLPRICE', 'TA_WILLR', 'TA_WMA', 'TC_FixedA', 'TC_FixedA2015', 'TC_FixedA2017', 'TC_TestStub', 'TC_Zero', 'TIME', 'TIMELINE', 'TIMELINEVOL', 'TR', 'TRACE', 'TURNOVER', 'TimeDelta', 'TimeLineList', 'TimeLineRecord', 'TradeCostBase', 'TradeManager', 'TradeRecord', 'TradeRecordList', 'TradeRequest', 'TransList', 'TransRecord', 'UPNDAY', 'UTCOffset', 'VAR', 'VARP', 'VIGOR', 'WARN', 'WEAVE', 'WEEK', 'WINNER', 'WITHDAY', 'WITHHALFYEAR', 'WITHHOUR', 'WITHHOUR2', 'WITHHOUR4', 'WITHKTYPE', 'WITHMIN', 'WITHMIN15', 'WITHMIN30', 'WITHMIN5', 'WITHMIN60', 'WITHMONTH', 'WITHQUARTER', 'WITHWEEK', 'WITHYEAR', 'WMA', 'YEAR', 'ZHBOND10', 'ZONGGUBEN', 'ZSCORE', 'active_device', 'backtest', 'batch_calculate_inds', 'bind_email', 'can_upgrade', 'close_ostream_to_python', 'close_spend_time', 'combinate_ind', 'combinate_index', 'constant', 'crtBrokerTM', 'crtSEOptimal', 'crtTM', 'crt_pf_strategy', 'crt_sys_strategy', 'dates_to_np', 'df_to_krecords', 'fetch_trial_license', 'find_optimal_system', 'find_optimal_system_multi', 'get_block', 'get_business_name', 'get_data_from_buffer_server', 'get_date_range', 'get_expire_date', 'get_funds_list', 'get_kdata', '
|
|
6
|
+
__all__: list[str] = ['ABS', 'ACOS', 'AD', 'ADVANCE', 'AF_EqualWeight', 'AF_FixedAmount', 'AF_FixedWeight', 'AF_FixedWeightList', 'AF_MultiFactor', 'AGG_COUNT', 'AGG_FUNC', 'AGG_MAD', 'AGG_MAX', 'AGG_MEAN', 'AGG_MEDIAN', 'AGG_MIN', 'AGG_PROD', 'AGG_QUANTILE', 'AGG_STD', 'AGG_SUM', 'AGG_VAR', 'ALIGN', 'AMA', 'ASIN', 'ATAN', 'ATR', 'AVEDEV', 'AllocateFundsBase', 'BACKSET', 'BARSCOUNT', 'BARSLAST', 'BARSLASTCOUNT', 'BARSSINCE', 'BARSSINCEN', 'BETWEEN', 'BLOCKSETNUM', 'BUSINESS', 'Block', 'BlockInfoDriver', 'BorrowRecord', 'BrokerPositionRecord', 'CEILING', 'CN_Bool', 'CN_OPLine', 'CONTEXT', 'CONTEXT_K', 'CORR', 'COS', 'COST', 'COUNT', 'CROSS', 'CVAL', 'CYCLE', 'C_AMO', 'C_CLOSE', 'C_HIGH', 'C_KDATA', 'C_LOW', 'C_OPEN', 'C_VOL', 'ConditionBase', 'Constant', 'CostRecord', 'DATE', 'DAY', 'DEBUG', 'DECLINE', 'DEVSQ', 'DIFF', 'DISCARD', 'DMA', 'DOWNNDAY', 'DROPNA', 'DataDriverFactory', 'Datetime', 'DatetimeList', 'Days', 'EMA', 'ERROR', 'EVERY', 'EV_Bool', 'EV_TwoLine', 'EXIST', 'EXP', 'EnvironmentBase', 'FATAL', 'FILTER', 'FINANCE', 'FLOOR', 'FundsRecord', 'GROUP_COUNT', 'GROUP_FUNC', 'GROUP_MAX', 'GROUP_MEAN', 'GROUP_MIN', 'GROUP_PROD', 'GROUP_SUM', 'HHV', 'HHVBARS', 'HKUException', 'HOUR', 'HSL', 'Hours', 'IC', 'ICIR', 'IF', 'INBLOCK', 'INDEXA', 'INDEXADV', 'INDEXC', 'INDEXDEC', 'INDEXH', 'INDEXL', 'INDEXO', 'INDEXV', 'INFO', 'INSUM', 'INTPART', 'IR', 'ISINF', 'ISINFA', 'ISLASTBAR', 'ISNA', 'IndParam', 'Indicator', 'IndicatorImp', 'JUMPDOWN', 'JUMPUP', 'KALMAN', 'KDATA_PART', 'KData', 'KDataDriver', 'KDataToClickHouseImporter', 'KDataToHdf5Importer', 'KDataToMySQLImporter', 'KRecord', 'KRecordList', 'LAST', 'LASTVALUE', 'LIUTONGPAN', 'LLV', 'LLVBARS', 'LN', 'LOG', 'LOG_LEVEL', 'LONGCROSS', 'LoanRecord', 'MA', 'MACD', 'MAX', 'MDD', 'MF_EqualWeight', 'MF_ICIRWeight', 'MF_ICWeight', 'MF_Weight', 'MIN', 'MINUTE', 'MM_FixedCapital', 'MM_FixedCapitalFunds', 'MM_FixedCount', 'MM_FixedCountTps', 'MM_FixedPercent', 'MM_FixedRisk', 'MM_FixedUnits', 'MM_Nothing', 'MM_WilliamsFixedRisk', 'MOD', 'MONTH', 'MRR', 'MarketInfo', 'Microseconds', 'Milliseconds', 'Minutes', 'MoneyManagerBase', 'MultiFactorBase', 'NDAY', 'NORM_MinMax', 'NORM_NOTHING', 'NORM_Quantile', 'NORM_Quantile_Uniform', 'NORM_Zscore', 'NOT', 'NormalizeBase', 'OFF', 'OrderBrokerBase', 'PF_Simple', 'PF_WithoutAF', 'PG_FixedHoldDays', 'PG_FixedPercent', 'PG_NoGoal', 'POS', 'POW', 'PRICELIST', 'Parameter', 'Performance', 'Portfolio', 'PositionRecord', 'PositionRecordList', 'ProfitGoalBase', 'QUANTILE_TRUNC', 'Query', 'RANK', 'RECOVER_BACKWARD', 'RECOVER_EQUAL_BACKWARD', 'RECOVER_EQUAL_FORWARD', 'RECOVER_FORWARD', 'REF', 'REFX', 'REPLACE', 'RESULT', 'REVERSE', 'ROC', 'ROCP', 'ROCR', 'ROCR100', 'ROUND', 'ROUNDDOWN', 'ROUNDUP', 'RSI', 'SAFTYLOSS', 'SCFilter_AmountLimit', 'SCFilter_Group', 'SCFilter_IgnoreNan', 'SCFilter_LessOrEqualValue', 'SCFilter_Price', 'SCFilter_TopN', 'SE_EvaluateOptimal', 'SE_Fixed', 'SE_MaxFundsOptimal', 'SE_MultiFactor', 'SE_MultiFactor2', 'SE_PerformanceOptimal', 'SE_Signal', 'SGN', 'SG_Add', 'SG_AllwaysBuy', 'SG_And', 'SG_Band', 'SG_Bool', 'SG_Buy', 'SG_Cross', 'SG_CrossGold', 'SG_Cycle', 'SG_Div', 'SG_Flex', 'SG_Mul', 'SG_OneSide', 'SG_Or', 'SG_Sell', 'SG_Single', 'SG_Single2', 'SG_Sub', 'SIN', 'SLICE', 'SLOPE', 'SMA', 'SPEARMAN', 'SP_FixedPercent', 'SP_FixedValue', 'SP_LogNormal', 'SP_Normal', 'SP_TruncNormal', 'SP_Uniform', 'SQRT', 'STDEV', 'STDP', 'ST_FixedPercent', 'ST_Indicator', 'ST_Saftyloss', 'SUM', 'SUMBARS', 'SYS_Simple', 'SYS_WalkForward', 'ScoreRecord', 'ScoreRecordList', 'ScoresFilterBase', 'Seconds', 'SelectorBase', 'SignalBase', 'SlippageBase', 'SpotRecord', 'Stock', 'StockManager', 'StockTypeInfo', 'StockWeight', 'StockWeightList', 'StoplossBase', 'Strategy', 'StrategyContext', 'System', 'SystemPart', 'SystemWeight', 'SystemWeightList', 'TAN', 'TA_ACCBANDS', 'TA_ACOS', 'TA_AD', 'TA_ADD', 'TA_ADOSC', 'TA_ADX', 'TA_ADXR', 'TA_APO', 'TA_AROON', 'TA_AROONOSC', 'TA_ASIN', 'TA_ATAN', 'TA_ATR', 'TA_AVGDEV', 'TA_AVGPRICE', 'TA_BBANDS', 'TA_BETA', 'TA_BOP', 'TA_CCI', 'TA_CDL2CROWS', 'TA_CDL3BLACKCROWS', 'TA_CDL3INSIDE', 'TA_CDL3LINESTRIKE', 'TA_CDL3OUTSIDE', 'TA_CDL3STARSINSOUTH', 'TA_CDL3WHITESOLDIERS', 'TA_CDLABANDONEDBABY', 'TA_CDLADVANCEBLOCK', 'TA_CDLBELTHOLD', 'TA_CDLBREAKAWAY', 'TA_CDLCLOSINGMARUBOZU', 'TA_CDLCONCEALBABYSWALL', 'TA_CDLCOUNTERATTACK', 'TA_CDLDARKCLOUDCOVER', 'TA_CDLDOJI', 'TA_CDLDOJISTAR', 'TA_CDLDRAGONFLYDOJI', 'TA_CDLENGULFING', 'TA_CDLEVENINGDOJISTAR', 'TA_CDLEVENINGSTAR', 'TA_CDLGAPSIDESIDEWHITE', 'TA_CDLGRAVESTONEDOJI', 'TA_CDLHAMMER', 'TA_CDLHANGINGMAN', 'TA_CDLHARAMI', 'TA_CDLHARAMICROSS', 'TA_CDLHIGHWAVE', 'TA_CDLHIKKAKE', 'TA_CDLHIKKAKEMOD', 'TA_CDLHOMINGPIGEON', 'TA_CDLIDENTICAL3CROWS', 'TA_CDLINNECK', 'TA_CDLINVERTEDHAMMER', 'TA_CDLKICKING', 'TA_CDLKICKINGBYLENGTH', 'TA_CDLLADDERBOTTOM', 'TA_CDLLONGLEGGEDDOJI', 'TA_CDLLONGLINE', 'TA_CDLMARUBOZU', 'TA_CDLMATCHINGLOW', 'TA_CDLMATHOLD', 'TA_CDLMORNINGDOJISTAR', 'TA_CDLMORNINGSTAR', 'TA_CDLONNECK', 'TA_CDLPIERCING', 'TA_CDLRICKSHAWMAN', 'TA_CDLRISEFALL3METHODS', 'TA_CDLSEPARATINGLINES', 'TA_CDLSHOOTINGSTAR', 'TA_CDLSHORTLINE', 'TA_CDLSPINNINGTOP', 'TA_CDLSTALLEDPATTERN', 'TA_CDLSTICKSANDWICH', 'TA_CDLTAKURI', 'TA_CDLTASUKIGAP', 'TA_CDLTHRUSTING', 'TA_CDLTRISTAR', 'TA_CDLUNIQUE3RIVER', 'TA_CDLUPSIDEGAP2CROWS', 'TA_CDLXSIDEGAP3METHODS', 'TA_CEIL', 'TA_CMO', 'TA_CORREL', 'TA_COS', 'TA_COSH', 'TA_DEMA', 'TA_DIV', 'TA_DX', 'TA_EMA', 'TA_EXP', 'TA_FLOOR', 'TA_HT_DCPERIOD', 'TA_HT_DCPHASE', 'TA_HT_PHASOR', 'TA_HT_SINE', 'TA_HT_TRENDLINE', 'TA_HT_TRENDMODE', 'TA_IMI', 'TA_KAMA', 'TA_LINEARREG', 'TA_LINEARREG_ANGLE', 'TA_LINEARREG_INTERCEPT', 'TA_LINEARREG_SLOPE', 'TA_LN', 'TA_LOG10', 'TA_MA', 'TA_MACD', 'TA_MACDEXT', 'TA_MACDFIX', 'TA_MAMA', 'TA_MAVP', 'TA_MAX', 'TA_MAXINDEX', 'TA_MEDPRICE', 'TA_MFI', 'TA_MIDPOINT', 'TA_MIDPRICE', 'TA_MIN', 'TA_MININDEX', 'TA_MINMAX', 'TA_MINMAXINDEX', 'TA_MINUS_DI', 'TA_MINUS_DM', 'TA_MOM', 'TA_MULT', 'TA_NATR', 'TA_OBV', 'TA_PLUS_DI', 'TA_PLUS_DM', 'TA_PPO', 'TA_ROC', 'TA_ROCP', 'TA_ROCR', 'TA_ROCR100', 'TA_RSI', 'TA_SAR', 'TA_SAREXT', 'TA_SIN', 'TA_SINH', 'TA_SMA', 'TA_SQRT', 'TA_STDDEV', 'TA_STOCH', 'TA_STOCHF', 'TA_STOCHRSI', 'TA_SUB', 'TA_SUM', 'TA_T3', 'TA_TAN', 'TA_TANH', 'TA_TEMA', 'TA_TRANGE', 'TA_TRIMA', 'TA_TRIX', 'TA_TSF', 'TA_TYPPRICE', 'TA_ULTOSC', 'TA_VAR', 'TA_WCLPRICE', 'TA_WILLR', 'TA_WMA', 'TC_FixedA', 'TC_FixedA2015', 'TC_FixedA2017', 'TC_TestStub', 'TC_Zero', 'TIME', 'TIMELINE', 'TIMELINEVOL', 'TR', 'TRACE', 'TURNOVER', 'TimeDelta', 'TimeLineList', 'TimeLineRecord', 'TradeCostBase', 'TradeManager', 'TradeRecord', 'TradeRecordList', 'TradeRequest', 'TransList', 'TransRecord', 'UPNDAY', 'UTCOffset', 'VAR', 'VARP', 'VIGOR', 'WARN', 'WEAVE', 'WEEK', 'WINNER', 'WITHDAY', 'WITHHALFYEAR', 'WITHHOUR', 'WITHHOUR2', 'WITHHOUR4', 'WITHKTYPE', 'WITHMIN', 'WITHMIN15', 'WITHMIN30', 'WITHMIN5', 'WITHMIN60', 'WITHMONTH', 'WITHQUARTER', 'WITHWEEK', 'WITHYEAR', 'WMA', 'YEAR', 'ZHBOND10', 'ZONGGUBEN', 'ZSCORE', 'active_device', 'backtest', 'batch_calculate_inds', 'bind_email', 'can_upgrade', 'check_data', 'close_ostream_to_python', 'close_spend_time', 'combinate_ind', 'combinate_index', 'constant', 'crtBrokerTM', 'crtSEOptimal', 'crtTM', 'crt_pf_strategy', 'crt_sys_strategy', 'dates_to_np', 'df_to_krecords', 'fetch_trial_license', 'find_optimal_system', 'find_optimal_system_multi', 'get_block', 'get_business_name', 'get_data_from_buffer_server', 'get_date_range', 'get_expire_date', 'get_funds_list', 'get_kdata', 'get_latest_version_info', 'get_log_level', 'get_spot_from_buffer_server', 'get_stock', 'get_system_part_enum', 'get_system_part_name', 'get_version', 'get_version_git', 'get_version_with_build', 'hikyuu_init', 'inner_analysis_sys_list', 'inner_combinate_ind_analysis', 'inner_combinate_ind_analysis_with_block', 'is_valid_license', 'isinf', 'isnan', 'krecords_to_df', 'krecords_to_np', 'open_ostream_to_python', 'open_spend_time', 'parallel_run_pf', 'parallel_run_sys', 'positions_to_df', 'positions_to_np', 'register_extra_ktype', 'release_extra_ktype', 'remove_license', 'roundDown', 'roundEx', 'roundUp', 'run_in_strategy', 'scorerecords_to_df', 'scorerecords_to_np', 'set_log_level', 'set_python_in_interactive', 'set_python_in_jupyter', 'spot_agent_is_connected', 'spot_agent_is_running', 'start_data_server', 'start_spot_agent', 'stop_data_server', 'stop_spot_agent', 'systemweights_to_df', 'systemweights_to_np', 'timeline_to_df', 'timeline_to_np', 'toPriceList', 'trades_to_df', 'trades_to_np', 'translist_to_df', 'translist_to_np', 'view_license', 'weights_to_df', 'weights_to_np']
|
|
7
7
|
class AllocateFundsBase:
|
|
8
8
|
"""
|
|
9
9
|
资产分配算法基类, 子类接口:
|
|
@@ -154,6 +154,8 @@ class BUSINESS:
|
|
|
154
154
|
|
|
155
155
|
RETURN_STOCK
|
|
156
156
|
|
|
157
|
+
SUOGU
|
|
158
|
+
|
|
157
159
|
INVALID
|
|
158
160
|
"""
|
|
159
161
|
BONUS: typing.ClassVar[BUSINESS] # value = <BUSINESS.BONUS: 4>
|
|
@@ -167,12 +169,13 @@ class BUSINESS:
|
|
|
167
169
|
CHECKOUT_STOCK: typing.ClassVar[BUSINESS] # value = <BUSINESS.CHECKOUT_STOCK: 8>
|
|
168
170
|
GIFT: typing.ClassVar[BUSINESS] # value = <BUSINESS.GIFT: 3>
|
|
169
171
|
INIT: typing.ClassVar[BUSINESS] # value = <BUSINESS.INIT: 0>
|
|
170
|
-
INVALID: typing.ClassVar[BUSINESS] # value = <BUSINESS.INVALID:
|
|
172
|
+
INVALID: typing.ClassVar[BUSINESS] # value = <BUSINESS.INVALID: 16>
|
|
171
173
|
RETURN_CASH: typing.ClassVar[BUSINESS] # value = <BUSINESS.RETURN_CASH: 10>
|
|
172
174
|
RETURN_STOCK: typing.ClassVar[BUSINESS] # value = <BUSINESS.RETURN_STOCK: 12>
|
|
173
175
|
SELL: typing.ClassVar[BUSINESS] # value = <BUSINESS.SELL: 2>
|
|
174
176
|
SELL_SHORT: typing.ClassVar[BUSINESS] # value = <BUSINESS.SELL_SHORT: 13>
|
|
175
|
-
|
|
177
|
+
SUOGU: typing.ClassVar[BUSINESS] # value = <BUSINESS.SUOGU: 15>
|
|
178
|
+
__members__: typing.ClassVar[dict[str, BUSINESS]] # value = {'INIT': <BUSINESS.INIT: 0>, 'BUY': <BUSINESS.BUY: 1>, 'SELL': <BUSINESS.SELL: 2>, 'BUY_SHORT': <BUSINESS.BUY_SHORT: 14>, 'SELL_SHORT': <BUSINESS.SELL_SHORT: 13>, 'GIFT': <BUSINESS.GIFT: 3>, 'BONUS': <BUSINESS.BONUS: 4>, 'CHECKIN': <BUSINESS.CHECKIN: 5>, 'CHECKOUT': <BUSINESS.CHECKOUT: 6>, 'CHECKIN_STOCK': <BUSINESS.CHECKIN_STOCK: 7>, 'CHECKOUT_STOCK': <BUSINESS.CHECKOUT_STOCK: 8>, 'BORROW_CASH': <BUSINESS.BORROW_CASH: 9>, 'RETURN_CASH': <BUSINESS.RETURN_CASH: 10>, 'BORROW_STOCK': <BUSINESS.BORROW_STOCK: 11>, 'RETURN_STOCK': <BUSINESS.RETURN_STOCK: 12>, 'SUOGU': <BUSINESS.SUOGU: 15>, 'INVALID': <BUSINESS.INVALID: 16>}
|
|
176
179
|
def __eq__(self, other: typing.Any) -> bool:
|
|
177
180
|
...
|
|
178
181
|
def __getstate__(self) -> int:
|
|
@@ -2391,6 +2394,20 @@ class KDataDriver:
|
|
|
2391
2394
|
"""
|
|
2392
2395
|
驱动名称
|
|
2393
2396
|
"""
|
|
2397
|
+
class KDataToClickHouseImporter:
|
|
2398
|
+
"""
|
|
2399
|
+
K线数据导入器
|
|
2400
|
+
"""
|
|
2401
|
+
def __init__(self) -> None:
|
|
2402
|
+
...
|
|
2403
|
+
def remove(self, arg0: str, arg1: str, arg2: str, arg3: Datetime) -> None:
|
|
2404
|
+
"""
|
|
2405
|
+
删除指定时间及其之后的K线数据
|
|
2406
|
+
"""
|
|
2407
|
+
def set_config(self, host: str, port: typing.SupportsInt = 9000, usr: str = 'default', pwd: str = '') -> bool:
|
|
2408
|
+
"""
|
|
2409
|
+
设置数据保存路径和数据源列表
|
|
2410
|
+
"""
|
|
2394
2411
|
class KDataToHdf5Importer:
|
|
2395
2412
|
"""
|
|
2396
2413
|
K线数据导入器
|
|
@@ -2425,6 +2442,20 @@ class KDataToHdf5Importer:
|
|
|
2425
2442
|
"""
|
|
2426
2443
|
更新索引
|
|
2427
2444
|
"""
|
|
2445
|
+
class KDataToMySQLImporter:
|
|
2446
|
+
"""
|
|
2447
|
+
K线数据导入器
|
|
2448
|
+
"""
|
|
2449
|
+
def __init__(self) -> None:
|
|
2450
|
+
...
|
|
2451
|
+
def remove(self, arg0: str, arg1: str, arg2: str, arg3: Datetime) -> None:
|
|
2452
|
+
"""
|
|
2453
|
+
删除指定时间及其之后的K线数据
|
|
2454
|
+
"""
|
|
2455
|
+
def set_config(self, host: str, port: typing.SupportsInt = 9000, usr: str = 'default', pwd: str = '') -> bool:
|
|
2456
|
+
"""
|
|
2457
|
+
设置数据保存路径和数据源列表
|
|
2458
|
+
"""
|
|
2428
2459
|
class KRecord:
|
|
2429
2460
|
"""
|
|
2430
2461
|
K线记录,组成K线数据,属性可读写
|
|
@@ -8126,6 +8157,14 @@ def AF_EqualWeight() -> AllocateFundsBase:
|
|
|
8126
8157
|
|
|
8127
8158
|
等权重资产分配,对选中的资产进行等比例分配
|
|
8128
8159
|
"""
|
|
8160
|
+
def AF_FixedAmount(amount: typing.SupportsFloat = 20000.0) -> AllocateFundsBase:
|
|
8161
|
+
"""
|
|
8162
|
+
AF_FixedAmount(amount)
|
|
8163
|
+
|
|
8164
|
+
等金额资产分配,对选中的资产进行等金额分配
|
|
8165
|
+
|
|
8166
|
+
:param float amount: 交易最大金额
|
|
8167
|
+
"""
|
|
8129
8168
|
def AF_FixedWeight(weight: typing.SupportsFloat = 0.1) -> AllocateFundsBase:
|
|
8130
8169
|
"""
|
|
8131
8170
|
AF_FixedWeight(weight)
|
|
@@ -9943,13 +9982,13 @@ def MF_Weight() -> MultiFactorBase:
|
|
|
9943
9982
|
@typing.overload
|
|
9944
9983
|
def MF_Weight(inds: collections.abc.Sequence, stks: collections.abc.Sequence, weights: collections.abc.Sequence, query: Query, ref_stk: typing.Any = None, ic_n: typing.SupportsInt = 5, spearman: bool = True, mode: typing.SupportsInt = 0, save_all_factors: bool = False) -> MultiFactorBase:
|
|
9945
9984
|
"""
|
|
9946
|
-
|
|
9985
|
+
MF_Weight(inds, stks, weights, query, ref_stk[, ic_n=5, spearman=True, mode=0, save_all_factors=False])
|
|
9947
9986
|
|
|
9948
9987
|
按指定权重合成因子 = ind1 * weight1 + ind2 * weight2 + ... + indn * weightn
|
|
9949
9988
|
|
|
9950
9989
|
:param sequense(Indicator) inds: 原始因子列表
|
|
9951
|
-
:param sequense(float) weights: 权重列表(需和 inds 等长)
|
|
9952
9990
|
:param sequense(stock) stks: 计算证券列表
|
|
9991
|
+
:param sequense(float) weights: 权重列表(需和 inds 等长)
|
|
9953
9992
|
:param Query query: 日期范围
|
|
9954
9993
|
:param Stock ref_stk: 参考证券 (未指定时,默认为 sh000300 沪深300)
|
|
9955
9994
|
:param int ic_n: 默认 IC 对应的 N 日收益率
|
|
@@ -14031,6 +14070,10 @@ def bind_email(arg0: str, arg1: str) -> None:
|
|
|
14031
14070
|
"""
|
|
14032
14071
|
def can_upgrade() -> bool:
|
|
14033
14072
|
...
|
|
14073
|
+
def check_data(stock_list: collections.abc.Sequence, start_date: Datetime, end_date: Datetime, ktype: str) -> tuple:
|
|
14074
|
+
"""
|
|
14075
|
+
检查数据
|
|
14076
|
+
"""
|
|
14034
14077
|
def close_ostream_to_python() -> None:
|
|
14035
14078
|
...
|
|
14036
14079
|
def close_spend_time() -> None:
|
|
@@ -14191,7 +14234,7 @@ def get_kdata(market_code: str, start: Datetime = ..., end: Datetime = ..., ktyp
|
|
|
14191
14234
|
:param Query.KType ktype: K 线类型, 'DAY'|'WEEK'|'MONTH'|'QUARTER'|'HALFYEAR'|'YEAR'|'MIN'|'MIN5'|'MIN15'|'MIN30'|'MIN60'
|
|
14192
14235
|
:param Query.RecoverType recover_type: 复权类型
|
|
14193
14236
|
"""
|
|
14194
|
-
def
|
|
14237
|
+
def get_latest_version_info() -> dict:
|
|
14195
14238
|
...
|
|
14196
14239
|
def get_log_level() -> LOG_LEVEL:
|
|
14197
14240
|
"""
|
hikyuu/cpp/core313.so
CHANGED
|
Binary file
|
hikyuu/cpp/i18n/zh_CN/hikyuu.mo
CHANGED
|
Binary file
|
|
Binary file
|
hikyuu/cpp/libhikyuu.so
CHANGED
|
Binary file
|
hikyuu/data/common_clickhouse.py
CHANGED
|
@@ -69,11 +69,9 @@ def create_database(connect):
|
|
|
69
69
|
and int(x.stem) > db_version and not x.is_dir()]
|
|
70
70
|
files.sort()
|
|
71
71
|
for file in files:
|
|
72
|
-
print(file)
|
|
73
72
|
sql = file.read_text(encoding='utf8')
|
|
74
73
|
statements = sql.split(';')
|
|
75
74
|
for stmt in statements:
|
|
76
|
-
print(stmt)
|
|
77
75
|
stmt = stmt.strip()
|
|
78
76
|
if stmt: # 跳过空语句
|
|
79
77
|
try:
|
|
@@ -163,7 +161,7 @@ def get_last_krecord(connect, tablename):
|
|
|
163
161
|
# hku_info(f"{tablename} {a}")
|
|
164
162
|
if not a:
|
|
165
163
|
return None
|
|
166
|
-
return (Datetime.from_timestamp_utc(a[0][0]*1000000).ymdhm, a[0][1]*0.001, a[0][2]*0.001, a[0][3]*0.001, a[0][4]*0.001, a[0][5]
|
|
164
|
+
return (Datetime.from_timestamp_utc(a[0][0]*1000000).ymdhm, a[0][1]*0.001, a[0][2]*0.001, a[0][3]*0.001, a[0][4]*0.001, float(a[0][5]), a[0][6]*0.001)
|
|
167
165
|
except:
|
|
168
166
|
return None
|
|
169
167
|
|
|
@@ -28,6 +28,7 @@ tmpdir = {dir}/tmp
|
|
|
28
28
|
datadir = {dir}
|
|
29
29
|
reload_time = {reload_time}
|
|
30
30
|
quotation_server = {quotation_server}
|
|
31
|
+
lazy_preload = {lazy_preload}
|
|
31
32
|
|
|
32
33
|
[block]
|
|
33
34
|
type = sqlite3
|
|
@@ -97,6 +98,7 @@ tmpdir = {dir}
|
|
|
97
98
|
datadir = {dir}
|
|
98
99
|
reload_time = {reload_time}
|
|
99
100
|
quotation_server = {quotation_server}
|
|
101
|
+
lazy_preload = {lazy_preload}
|
|
100
102
|
|
|
101
103
|
[block]
|
|
102
104
|
type = mysql
|
|
@@ -153,6 +155,7 @@ tmpdir = {dir}
|
|
|
153
155
|
datadir = {dir}
|
|
154
156
|
reload_time = {reload_time}
|
|
155
157
|
quotation_server = {quotation_server}
|
|
158
|
+
lazy_preload = {lazy_preload}
|
|
156
159
|
|
|
157
160
|
[block]
|
|
158
161
|
type = clickhouse
|
|
@@ -272,6 +275,9 @@ phase1_end = 11:35:00
|
|
|
272
275
|
phase2_start = 12:00:00
|
|
273
276
|
phase2_end = 15:05:00
|
|
274
277
|
|
|
278
|
+
[lazy_preload]
|
|
279
|
+
enable = False
|
|
280
|
+
|
|
275
281
|
[preload]
|
|
276
282
|
day = True
|
|
277
283
|
week = True
|
|
@@ -23,13 +23,15 @@
|
|
|
23
23
|
# SOFTWARE.
|
|
24
24
|
|
|
25
25
|
import sys
|
|
26
|
+
import os
|
|
26
27
|
import math
|
|
27
28
|
import datetime
|
|
28
29
|
from pytdx.hq import TDXParams
|
|
30
|
+
from configparser import ConfigParser
|
|
29
31
|
|
|
30
32
|
from hikyuu.util import hku_error, hku_debug, hku_run_ignore_exception
|
|
31
33
|
|
|
32
|
-
from hikyuu import Datetime, roundEx
|
|
34
|
+
from hikyuu import Datetime, roundEx, is_valid_license, KDataToClickHouseImporter
|
|
33
35
|
from hikyuu.data.common import *
|
|
34
36
|
from hikyuu.data.common_pytdx import to_pytdx_market, pytdx_get_day_trans
|
|
35
37
|
from hikyuu.data.common_clickhouse import (
|
|
@@ -134,6 +136,9 @@ def import_stock_name(connect, api, market, quotations=None):
|
|
|
134
136
|
if code not in deSet:
|
|
135
137
|
newStockDict[code] = stock["name"]
|
|
136
138
|
|
|
139
|
+
# 号码前缀
|
|
140
|
+
codepre_list = get_codepre_list(connect, market, quotations)
|
|
141
|
+
|
|
137
142
|
stktype_list = get_stktype_list(quotations)
|
|
138
143
|
stktype_list = list(stktype_list)
|
|
139
144
|
stktype_list.remove(STOCKTYPE.INDEX) # 移除指数类型
|
|
@@ -149,23 +154,29 @@ def import_stock_name(connect, api, market, quotations=None):
|
|
|
149
154
|
|
|
150
155
|
oldname, oldtype, oldvalid, oldstartDate, oldendDate = oldstock[2], oldstock[3], oldstock[4], oldstock[5], oldstock[6]
|
|
151
156
|
|
|
157
|
+
# 检测是否类型发生变化
|
|
158
|
+
newtype = oldtype
|
|
159
|
+
for codepre in codepre_list:
|
|
160
|
+
length = len(codepre[0])
|
|
161
|
+
if oldcode[:length] == codepre[0]:
|
|
162
|
+
if oldtype != codepre[1]:
|
|
163
|
+
newtype = codepre[1]
|
|
164
|
+
break
|
|
165
|
+
|
|
152
166
|
# 新的代码表中无此股票,则置为无效
|
|
153
|
-
# if (oldvalid == 1) and (oldcode not in newStockDict):
|
|
154
167
|
if (oldvalid == 1) and ((oldcode not in newStockDict) or oldcode in deSet):
|
|
155
168
|
sql = f"delete from hku_base.stock where market='{market}' and code='{oldcode}'"
|
|
156
169
|
connect.command(sql)
|
|
157
|
-
insert_records.append((market, oldcode, oldname,
|
|
170
|
+
insert_records.append((market, oldcode, oldname, newtype, 0, oldstartDate, oldendDate))
|
|
158
171
|
|
|
159
172
|
# 股票名称发生变化,更新股票名称;如果原无效,则置为有效
|
|
160
173
|
if oldcode in newStockDict:
|
|
161
|
-
if oldname != newStockDict[oldcode] or oldvalid == 0:
|
|
174
|
+
if oldname != newStockDict[oldcode] or oldvalid == 0 or oldtype != newtype:
|
|
162
175
|
sql = f"delete from hku_base.stock where market='{market}' and code='{oldcode}'"
|
|
163
176
|
connect.command(sql)
|
|
164
|
-
insert_records.append((market, oldcode, newStockDict[oldcode],
|
|
177
|
+
insert_records.append((market, oldcode, newStockDict[oldcode], newtype, 1, oldstartDate, 99999999))
|
|
165
178
|
|
|
166
179
|
# 处理新出现的股票
|
|
167
|
-
codepre_list = get_codepre_list(connect, market, quotations)
|
|
168
|
-
|
|
169
180
|
today = datetime.date.today()
|
|
170
181
|
today = today.year * 10000 + today.month * 100 + today.day
|
|
171
182
|
count = 0
|
|
@@ -274,10 +285,10 @@ def import_one_stock_data(
|
|
|
274
285
|
today.year * 10000 + today.month * 100 + today.day
|
|
275
286
|
) * 10000 + 1500
|
|
276
287
|
else:
|
|
277
|
-
return 0
|
|
288
|
+
return (0, True, Datetime(last_datetime))
|
|
278
289
|
|
|
279
290
|
if today_datetime <= last_datetime:
|
|
280
|
-
return 0
|
|
291
|
+
return (0, True, Datetime(last_datetime))
|
|
281
292
|
|
|
282
293
|
get_bars = (
|
|
283
294
|
api.get_index_bars if stktype == STOCKTYPE.INDEX else api.get_security_bars
|
|
@@ -312,27 +323,27 @@ def import_one_stock_data(
|
|
|
312
323
|
if abs(last_krecord[1] - bar["open"]) / last_krecord[1] > 0.01:
|
|
313
324
|
hku_error(
|
|
314
325
|
f"fetch data from tdx error! {bar_datetime} {ktype} {market}{code} last_krecord open: {last_krecord[1]}, bar: {bar['open']}")
|
|
315
|
-
return 0
|
|
326
|
+
return (0, False, Datetime(last_datetime))
|
|
316
327
|
if abs(last_krecord[2] - bar["high"]) / last_krecord[2] > 0.01:
|
|
317
328
|
hku_error(
|
|
318
329
|
f"fetch data from tdx error! {bar_datetime} {ktype} {market}{code} last_krecord high: {last_krecord[2]}, bar: {bar['high']}")
|
|
319
|
-
return 0
|
|
330
|
+
return (0, False, Datetime(last_datetime))
|
|
320
331
|
if abs(last_krecord[3] - bar["low"]) / last_krecord[3] > 0.01 and abs(last_krecord[3] - bar["low"]) > 0.01:
|
|
321
332
|
hku_error(
|
|
322
333
|
f"fetch data from tdx error! {bar_datetime} {ktype} {market}{code} last_krecord low: {last_krecord[3]}, bar: {bar['low']}")
|
|
323
|
-
return 0
|
|
334
|
+
return (0, False, Datetime(last_datetime))
|
|
324
335
|
if abs(last_krecord[4] - bar["close"]) / last_krecord[4] > 0.01:
|
|
325
336
|
hku_error(
|
|
326
337
|
f"fetch data from tdx error! {bar_datetime} {ktype} {market}{code} last_krecord close: {last_krecord[4]}, bar: {bar['close']}")
|
|
327
|
-
return 0
|
|
328
|
-
if ktype == 'DAY' and last_krecord[5] != 0.0 and abs(last_krecord[5] - bar["amount"]
|
|
338
|
+
return (0, False, Datetime(last_datetime))
|
|
339
|
+
if ktype == 'DAY' and last_krecord[5] != 0.0 and abs(last_krecord[5] - bar["amount"]) > 10000:
|
|
329
340
|
hku_error(
|
|
330
|
-
f"fetch data from tdx error! {bar_datetime} {ktype} {market}{code} last_krecord amount: {last_krecord[5]}, bar: {bar['amount']
|
|
331
|
-
return 0
|
|
332
|
-
if ktype == 'DAY' and last_krecord[6] != 0.0 and last_krecord[6] != 0.0 and abs(last_krecord[6] - bar["vol"]) >
|
|
341
|
+
f"fetch data from tdx error! {bar_datetime} {ktype} {market}{code} last_krecord amount: {last_krecord[5]}, bar: {bar['amount']}")
|
|
342
|
+
return (0, False, Datetime(last_datetime))
|
|
343
|
+
if ktype == 'DAY' and last_krecord[6] != 0.0 and last_krecord[6] != 0.0 and abs(last_krecord[6] - bar["vol"]) > 10000:
|
|
333
344
|
hku_error(
|
|
334
345
|
f"fetch data from tdx error! {bar_datetime} {ktype} {market}{code} last_krecord count: {last_krecord[6]}, bar: {bar['vol']}")
|
|
335
|
-
return 0
|
|
346
|
+
return (0, False, Datetime(last_datetime))
|
|
336
347
|
continue
|
|
337
348
|
|
|
338
349
|
if (
|
|
@@ -365,7 +376,7 @@ def import_one_stock_data(
|
|
|
365
376
|
data=buf)
|
|
366
377
|
connect.insert(context=ic, settings={"prefer_warmed_unmerged_parts_seconds": 86400})
|
|
367
378
|
|
|
368
|
-
return len(buf)
|
|
379
|
+
return (len(buf), True, Datetime(last_datetime))
|
|
369
380
|
|
|
370
381
|
|
|
371
382
|
def update_stock_info(connect, market):
|
|
@@ -409,7 +420,7 @@ def clear_extern_data(connect, market, data_type):
|
|
|
409
420
|
index_list = ('min15', 'min30', 'min60', 'hour2')
|
|
410
421
|
lastdate = connect.command(
|
|
411
422
|
f"select toInt32(max(date)) from hku_data.min5_k where market='SH' and code='000001'")
|
|
412
|
-
lastdate = Datetime.from_timestamp_utc(lastdate*1000000).start_of_day()
|
|
423
|
+
lastdate = Datetime.from_timestamp_utc(int(lastdate*1000000)).start_of_day()
|
|
413
424
|
last_timestamp = Datetime(lastdate).timestamp_utc()//1000000
|
|
414
425
|
for index_type in index_list:
|
|
415
426
|
sql = f"delete from hku_data.{index_type}_k where market='{market}' and date>={last_timestamp}"
|
|
@@ -420,6 +431,16 @@ def clear_extern_data(connect, market, data_type):
|
|
|
420
431
|
hku_info(f"清理 {market} {data_type} 线扩展数据完毕")
|
|
421
432
|
|
|
422
433
|
|
|
434
|
+
@hku_catch(ret=None)
|
|
435
|
+
def get_clickhouse_importer():
|
|
436
|
+
filename = os.path.expanduser('~') + '/.hikyuu/hikyuu.ini'
|
|
437
|
+
config = ConfigParser()
|
|
438
|
+
config.read(filename, encoding='utf-8')
|
|
439
|
+
importer = KDataToClickHouseImporter()
|
|
440
|
+
return importer if importer.set_config(config.get("kdata", "host"), config.getint("kdata", "port", fallback=9000),
|
|
441
|
+
config.get("kdata", "usr"), config.get("kdata", "pwd")) else None
|
|
442
|
+
|
|
443
|
+
|
|
423
444
|
@hku_catch(trace=True, re_raise=True)
|
|
424
445
|
def import_data(
|
|
425
446
|
connect,
|
|
@@ -460,6 +481,9 @@ def import_data(
|
|
|
460
481
|
for index_type in index_list:
|
|
461
482
|
update_data[index_type] = []
|
|
462
483
|
|
|
484
|
+
failed_limit = 20
|
|
485
|
+
failed_count = 0
|
|
486
|
+
failed_list = []
|
|
463
487
|
total = len(stock_list)
|
|
464
488
|
# market, code, valid, type
|
|
465
489
|
for i, stock in enumerate(stock_list):
|
|
@@ -468,9 +492,15 @@ def import_data(
|
|
|
468
492
|
progress(i, total)
|
|
469
493
|
continue
|
|
470
494
|
|
|
471
|
-
this_count = import_one_stock_data(
|
|
495
|
+
this_count, success, lastdate = import_one_stock_data(
|
|
472
496
|
connect, api, market, ktype, stock, startDate
|
|
473
497
|
)
|
|
498
|
+
if not success:
|
|
499
|
+
failed_count += 1
|
|
500
|
+
failed_list.append((market, stock[1], lastdate))
|
|
501
|
+
if failed_count >= failed_limit:
|
|
502
|
+
# hku_error(f"{market} {ktype} 连续失败20个股票,已停止导入, 建议重新导入")
|
|
503
|
+
break
|
|
474
504
|
add_record_count += this_count
|
|
475
505
|
if ktype in ("DAY", "5MIN"):
|
|
476
506
|
if ktype == "DAY":
|
|
@@ -490,6 +520,9 @@ def import_data(
|
|
|
490
520
|
if progress:
|
|
491
521
|
progress(i, total)
|
|
492
522
|
|
|
523
|
+
if total > 0 and progress:
|
|
524
|
+
progress(total, total)
|
|
525
|
+
|
|
493
526
|
if ktype in ("DAY", "5MIN"):
|
|
494
527
|
for index_type in index_list:
|
|
495
528
|
if len(update_data[index_type]) > 0:
|
|
@@ -501,6 +534,25 @@ def import_data(
|
|
|
501
534
|
update_data[index_type].clear()
|
|
502
535
|
update_data.clear()
|
|
503
536
|
|
|
537
|
+
if 0 < failed_count < failed_limit and is_valid_license():
|
|
538
|
+
# 删除最后记录
|
|
539
|
+
ktype_dict = {
|
|
540
|
+
'DAY': 'DAY',
|
|
541
|
+
'1MIN': 'MIN',
|
|
542
|
+
'5MIN': 'MIN5'
|
|
543
|
+
}
|
|
544
|
+
nktype = ktype_dict[ktype]
|
|
545
|
+
ch_importer = get_clickhouse_importer()
|
|
546
|
+
if ch_importer is not None:
|
|
547
|
+
for r in failed_list:
|
|
548
|
+
hku_warn(f"清理 {r[0]} {r[1]} {nktype} {r[2].start_of_day()}")
|
|
549
|
+
ch_importer.remove(r[0], r[1], nktype, r[2].start_of_day())
|
|
550
|
+
hku_warn(f"已清理 {market} {failed_count} 个失败股票的最后记录,建议重新导入")
|
|
551
|
+
|
|
552
|
+
if failed_count >= failed_limit:
|
|
553
|
+
hku_error(f"{market} {ktype} 连续失败20个股票,已停止导入, 建议重新导入")
|
|
554
|
+
return add_record_count
|
|
555
|
+
|
|
504
556
|
cur_year = Datetime.today().year
|
|
505
557
|
if ktype == "DAY":
|
|
506
558
|
update_stock_info(connect, market)
|
|
@@ -592,15 +644,16 @@ def import_on_stock_trans(connect, api, market, stock_record, max_days):
|
|
|
592
644
|
if second > 59:
|
|
593
645
|
continue
|
|
594
646
|
|
|
595
|
-
|
|
596
|
-
(
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
647
|
+
if record['price'] > 0.0 and record['vol'] >= 0.0:
|
|
648
|
+
trans_buf.append(
|
|
649
|
+
(
|
|
650
|
+
market, code,
|
|
651
|
+
Datetime(cur_date * 1000000 + minute * 100 + second).timestamp_utc()//1000000,
|
|
652
|
+
int(roundEx(record["price"], 3) * 1000.0),
|
|
653
|
+
int(record["vol"]),
|
|
654
|
+
record["buyorsell"],
|
|
655
|
+
)
|
|
602
656
|
)
|
|
603
|
-
)
|
|
604
657
|
except Exception as e:
|
|
605
658
|
hku_error("Failed trans to record! {}", e)
|
|
606
659
|
|
|
@@ -701,8 +754,9 @@ def import_on_stock_time(connect, api, market, stock_record, max_days):
|
|
|
701
754
|
elif time == 1360:
|
|
702
755
|
time = 1400
|
|
703
756
|
try:
|
|
704
|
-
|
|
705
|
-
|
|
757
|
+
if record['price'] > 0.0 and record['vol'] >= 0.0:
|
|
758
|
+
time_buf.append((market, code, Datetime(this_date + time).timestamp_utc() //
|
|
759
|
+
ticks, int(roundEx(record['price'], 3) * 1000.0), int(record['vol'])))
|
|
706
760
|
time += 1
|
|
707
761
|
except Exception as e:
|
|
708
762
|
hku_error("Failed trans record {}! {}".format(record, e))
|