hikyuu 2.7.1__py3-none-win_amd64.whl → 2.7.2__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.
Files changed (90) hide show
  1. hikyuu/__init__.py +4 -1
  2. hikyuu/__init__.pyi +23 -11
  3. hikyuu/analysis/__init__.pyi +5 -1
  4. hikyuu/analysis/analysis.pyi +6 -2
  5. hikyuu/core.pyi +7 -3
  6. hikyuu/cpp/core310.pyd +0 -0
  7. hikyuu/cpp/core310.pyi +55 -6
  8. hikyuu/cpp/core311.pyd +0 -0
  9. hikyuu/cpp/core311.pyi +55 -6
  10. hikyuu/cpp/core312.pyd +0 -0
  11. hikyuu/cpp/core312.pyi +55 -6
  12. hikyuu/cpp/core313.pyd +0 -0
  13. hikyuu/cpp/core313.pyi +55 -6
  14. hikyuu/cpp/hikyuu.dll +0 -0
  15. hikyuu/cpp/hikyuu.lib +0 -0
  16. hikyuu/cpp/i18n/zh_CN/hikyuu.mo +0 -0
  17. hikyuu/cpp/i18n/zh_CN/hikyuu_plugin.mo +0 -0
  18. hikyuu/data/clickhouse_upgrade/0001.sql +2 -0
  19. hikyuu/data/common_clickhouse.py +1 -3
  20. hikyuu/data/hku_config_template.py +6 -0
  21. hikyuu/data/mysql_upgrade/0029.sql +2 -0
  22. hikyuu/data/pytdx_to_clickhouse.py +85 -31
  23. hikyuu/data/pytdx_to_h5.py +73 -28
  24. hikyuu/data/pytdx_to_mysql.py +65 -21
  25. hikyuu/data/pytdx_weight_to_clickhouse.py +2 -0
  26. hikyuu/data/pytdx_weight_to_mysql.py +2 -0
  27. hikyuu/data/pytdx_weight_to_sqlite.py +2 -0
  28. hikyuu/data/sqlite_upgrade/0029.sql +4 -0
  29. hikyuu/draw/drawplot/bokeh_draw.pyi +10 -6
  30. hikyuu/draw/drawplot/echarts_draw.pyi +10 -6
  31. hikyuu/draw/drawplot/matplotlib_draw.py +8 -2
  32. hikyuu/draw/drawplot/matplotlib_draw.pyi +10 -6
  33. hikyuu/extend.pyi +8 -4
  34. hikyuu/gui/HikyuuTDX.py +12 -2
  35. hikyuu/gui/data/MainWindow.py +166 -142
  36. hikyuu/hub.pyi +6 -6
  37. hikyuu/include/hikyuu/StockManager.h +4 -0
  38. hikyuu/include/hikyuu/StrategyContext.h +4 -4
  39. hikyuu/include/hikyuu/global/sysinfo.h +24 -5
  40. hikyuu/include/hikyuu/indicator/IndicatorImp.h +1 -1
  41. hikyuu/include/hikyuu/plugin/KDataToClickHouseImporter.h +40 -0
  42. hikyuu/include/hikyuu/plugin/KDataToMySQLImporter.h +40 -0
  43. hikyuu/include/hikyuu/plugin/checkdata.h +20 -0
  44. hikyuu/include/hikyuu/plugin/hkuextra.h +2 -0
  45. hikyuu/include/hikyuu/plugin/interface/CheckDataPluginInterface.h +25 -0
  46. hikyuu/include/hikyuu/plugin/interface/HkuExtraPluginInterface.h +2 -0
  47. hikyuu/include/hikyuu/plugin/interface/ImportKDataToClickHousePluginInterface.h +44 -0
  48. hikyuu/include/hikyuu/plugin/interface/ImportKDataToMySQLPluginInterface.h +42 -0
  49. hikyuu/include/hikyuu/plugin/interface/plugins.h +6 -0
  50. hikyuu/include/hikyuu/python/convert_any.h +9 -6
  51. hikyuu/include/hikyuu/strategy/Strategy.h +1 -1
  52. hikyuu/include/hikyuu/trade_manage/TradeRecord.h +2 -1
  53. hikyuu/include/hikyuu/trade_sys/allocatefunds/build_in.h +1 -0
  54. hikyuu/include/hikyuu/trade_sys/allocatefunds/crt/AF_FixedAmount.h +26 -0
  55. hikyuu/include/hikyuu/trade_sys/allocatefunds/imp/FixAmountFunds.h +18 -0
  56. hikyuu/include/hikyuu/utilities/Log.h +6 -7
  57. hikyuu/include/hikyuu/utilities/Parameter.h +17 -0
  58. hikyuu/include/hikyuu/utilities/config.h +28 -0
  59. hikyuu/include/hikyuu/utilities/plugin/PluginBase.h +17 -2
  60. hikyuu/include/hikyuu/utilities/plugin/PluginManager.h +41 -22
  61. hikyuu/include/hikyuu/utilities/thread/GlobalStealThreadPool.h +1 -2
  62. hikyuu/include/hikyuu/utilities/thread/GlobalThreadPool.h +1 -1
  63. hikyuu/include/hikyuu/utilities/thread/MQStealThreadPool.h +285 -0
  64. hikyuu/include/hikyuu/utilities/thread/StealThreadPool.h +296 -0
  65. hikyuu/include/hikyuu/utilities/thread/WorkStealQueue.h +9 -8
  66. hikyuu/include/hikyuu/utilities/thread/algorithm.h +64 -14
  67. hikyuu/include/hikyuu/version.h +4 -4
  68. hikyuu/plugin/backtest.dll +0 -0
  69. hikyuu/plugin/checkdata.dll +0 -0
  70. hikyuu/plugin/clickhousedriver.dll +0 -0
  71. hikyuu/plugin/dataserver.dll +0 -0
  72. hikyuu/plugin/dataserver_parquet.dll +0 -0
  73. hikyuu/plugin/device.dll +0 -0
  74. hikyuu/plugin/extind.dll +0 -0
  75. hikyuu/plugin/hkuextra.dll +0 -0
  76. hikyuu/plugin/import2ch.dll +0 -0
  77. hikyuu/plugin/import2hdf5.dll +0 -0
  78. hikyuu/plugin/import2mysql.dll +0 -0
  79. hikyuu/plugin/tmreport.dll +0 -0
  80. hikyuu/trade_manage/__init__.pyi +10 -6
  81. hikyuu/trade_manage/trade.pyi +10 -6
  82. hikyuu/trade_sys/trade_sys.py +3 -1
  83. hikyuu/util/__init__.pyi +1 -1
  84. hikyuu/util/singleton.pyi +1 -1
  85. {hikyuu-2.7.1.dist-info → hikyuu-2.7.2.dist-info}/METADATA +5 -1
  86. {hikyuu-2.7.1.dist-info → hikyuu-2.7.2.dist-info}/RECORD +89 -73
  87. hikyuu/data/pytdx_to_taos.py +0 -736
  88. {hikyuu-2.7.1.dist-info → hikyuu-2.7.2.dist-info}/WHEEL +0 -0
  89. {hikyuu-2.7.1.dist-info → hikyuu-2.7.2.dist-info}/entry_points.txt +0 -0
  90. {hikyuu-2.7.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__ = ['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', 'get_last_version', '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']
6
+ __all__ = ['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
  资产分配算法基类, 子类接口:
@@ -157,6 +157,8 @@ class BUSINESS:
157
157
 
158
158
  RETURN_STOCK
159
159
 
160
+ SUOGU
161
+
160
162
  INVALID
161
163
  """
162
164
  BONUS: typing.ClassVar[BUSINESS] # value = <BUSINESS.BONUS: 4>
@@ -170,12 +172,13 @@ class BUSINESS:
170
172
  CHECKOUT_STOCK: typing.ClassVar[BUSINESS] # value = <BUSINESS.CHECKOUT_STOCK: 8>
171
173
  GIFT: typing.ClassVar[BUSINESS] # value = <BUSINESS.GIFT: 3>
172
174
  INIT: typing.ClassVar[BUSINESS] # value = <BUSINESS.INIT: 0>
173
- INVALID: typing.ClassVar[BUSINESS] # value = <BUSINESS.INVALID: 15>
175
+ INVALID: typing.ClassVar[BUSINESS] # value = <BUSINESS.INVALID: 16>
174
176
  RETURN_CASH: typing.ClassVar[BUSINESS] # value = <BUSINESS.RETURN_CASH: 10>
175
177
  RETURN_STOCK: typing.ClassVar[BUSINESS] # value = <BUSINESS.RETURN_STOCK: 12>
176
178
  SELL: typing.ClassVar[BUSINESS] # value = <BUSINESS.SELL: 2>
177
179
  SELL_SHORT: typing.ClassVar[BUSINESS] # value = <BUSINESS.SELL_SHORT: 13>
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>, 'INVALID': <BUSINESS.INVALID: 15>}
180
+ SUOGU: typing.ClassVar[BUSINESS] # value = <BUSINESS.SUOGU: 15>
181
+ __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>}
179
182
  @staticmethod
180
183
  def _pybind11_conduit_v1_(*args, **kwargs):
181
184
  ...
@@ -2448,6 +2451,23 @@ class KDataDriver:
2448
2451
  """
2449
2452
  驱动名称
2450
2453
  """
2454
+ class KDataToClickHouseImporter:
2455
+ """
2456
+ K线数据导入器
2457
+ """
2458
+ @staticmethod
2459
+ def _pybind11_conduit_v1_(*args, **kwargs):
2460
+ ...
2461
+ def __init__(self) -> None:
2462
+ ...
2463
+ def remove(self, arg0: str, arg1: str, arg2: str, arg3: Datetime) -> None:
2464
+ """
2465
+ 删除指定时间及其之后的K线数据
2466
+ """
2467
+ def set_config(self, host: str, port: typing.SupportsInt = 9000, usr: str = 'default', pwd: str = '') -> bool:
2468
+ """
2469
+ 设置数据保存路径和数据源列表
2470
+ """
2451
2471
  class KDataToHdf5Importer:
2452
2472
  """
2453
2473
  K线数据导入器
@@ -2485,6 +2505,23 @@ class KDataToHdf5Importer:
2485
2505
  """
2486
2506
  更新索引
2487
2507
  """
2508
+ class KDataToMySQLImporter:
2509
+ """
2510
+ K线数据导入器
2511
+ """
2512
+ @staticmethod
2513
+ def _pybind11_conduit_v1_(*args, **kwargs):
2514
+ ...
2515
+ def __init__(self) -> None:
2516
+ ...
2517
+ def remove(self, arg0: str, arg1: str, arg2: str, arg3: Datetime) -> None:
2518
+ """
2519
+ 删除指定时间及其之后的K线数据
2520
+ """
2521
+ def set_config(self, host: str, port: typing.SupportsInt = 9000, usr: str = 'default', pwd: str = '') -> bool:
2522
+ """
2523
+ 设置数据保存路径和数据源列表
2524
+ """
2488
2525
  class KRecord:
2489
2526
  """
2490
2527
  K线记录,组成K线数据,属性可读写
@@ -8327,6 +8364,14 @@ def AF_EqualWeight() -> AllocateFundsBase:
8327
8364
 
8328
8365
  等权重资产分配,对选中的资产进行等比例分配
8329
8366
  """
8367
+ def AF_FixedAmount(amount: typing.SupportsFloat = 20000.0) -> AllocateFundsBase:
8368
+ """
8369
+ AF_FixedAmount(amount)
8370
+
8371
+ 等金额资产分配,对选中的资产进行等金额分配
8372
+
8373
+ :param float amount: 交易最大金额
8374
+ """
8330
8375
  def AF_FixedWeight(weight: typing.SupportsFloat = 0.1) -> AllocateFundsBase:
8331
8376
  """
8332
8377
  AF_FixedWeight(weight)
@@ -10144,13 +10189,13 @@ def MF_Weight() -> MultiFactorBase:
10144
10189
  @typing.overload
10145
10190
  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:
10146
10191
  """
10147
- MF_EqualWeight(inds, stks, query, ref_stk[, ic_n=5])
10192
+ MF_Weight(inds, stks, weights, query, ref_stk[, ic_n=5, spearman=True, mode=0, save_all_factors=False])
10148
10193
 
10149
10194
  按指定权重合成因子 = ind1 * weight1 + ind2 * weight2 + ... + indn * weightn
10150
10195
 
10151
10196
  :param sequense(Indicator) inds: 原始因子列表
10152
- :param sequense(float) weights: 权重列表(需和 inds 等长)
10153
10197
  :param sequense(stock) stks: 计算证券列表
10198
+ :param sequense(float) weights: 权重列表(需和 inds 等长)
10154
10199
  :param Query query: 日期范围
10155
10200
  :param Stock ref_stk: 参考证券 (未指定时,默认为 sh000300 沪深300)
10156
10201
  :param int ic_n: 默认 IC 对应的 N 日收益率
@@ -14232,6 +14277,10 @@ def bind_email(arg0: str, arg1: str) -> None:
14232
14277
  """
14233
14278
  def can_upgrade() -> bool:
14234
14279
  ...
14280
+ def check_data(stock_list: collections.abc.Sequence, start_date: Datetime, end_date: Datetime, ktype: str) -> tuple:
14281
+ """
14282
+ 检查数据
14283
+ """
14235
14284
  def close_ostream_to_python() -> None:
14236
14285
  ...
14237
14286
  def close_spend_time() -> None:
@@ -14392,7 +14441,7 @@ def get_kdata(market_code: str, start: Datetime = ..., end: Datetime = ..., ktyp
14392
14441
  :param Query.KType ktype: K 线类型, 'DAY'|'WEEK'|'MONTH'|'QUARTER'|'HALFYEAR'|'YEAR'|'MIN'|'MIN5'|'MIN15'|'MIN30'|'MIN60'
14393
14442
  :param Query.RecoverType recover_type: 复权类型
14394
14443
  """
14395
- def get_last_version() -> str:
14444
+ def get_latest_version_info() -> dict:
14396
14445
  ...
14397
14446
  def get_log_level() -> LOG_LEVEL:
14398
14447
  """
hikyuu/cpp/hikyuu.dll CHANGED
Binary file
hikyuu/cpp/hikyuu.lib CHANGED
Binary file
Binary file
Binary file
@@ -0,0 +1,2 @@
1
+ ALTER TABLE `hku_base`.`stocktypeinfo` UPDATE `minTradeNumber`=100 WHERE `type`=5 AND `description`='ETF';
2
+ ALTER TABLE `hku_base`.`version` UPDATE `version`=1 WHERE `id`=0;
@@ -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]*0.001, a[0][6]*0.001)
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
@@ -0,0 +1,2 @@
1
+ update `hku_base`.`stocktypeinfo` set `minTradeNumber`=100 where `type`=5 and `description`='ETF';
2
+ UPDATE `hku_base`.`version` set `version` = 29;
@@ -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, oldtype, 0, oldstartDate, oldendDate))
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], oldtype, 1, oldstartDate, 99999999))
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"]*0.001) / last_krecord[5] > 0.1:
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']*0.001}")
331
- return 0
332
- if ktype == 'DAY' and last_krecord[6] != 0.0 and last_krecord[5] != 0.0 and abs(last_krecord[6] - bar["vol"]) / last_krecord[6] > 0.1:
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
- trans_buf.append(
596
- (
597
- market, code,
598
- Datetime(cur_date * 1000000 + minute * 100 + second).timestamp_utc()//1000000,
599
- int(roundEx(record["price"], 3) * 1000.0),
600
- int(record["vol"]),
601
- record["buyorsell"],
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
- time_buf.append((market, code, Datetime(this_date + time).timestamp_utc() //
705
- ticks, int(roundEx(record['price'], 3) * 1000.0), int(record['vol'])))
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))