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.
- hikyuu/__init__.py +4 -1
- hikyuu/__init__.pyi +23 -11
- hikyuu/analysis/__init__.pyi +5 -1
- hikyuu/analysis/analysis.pyi +6 -2
- hikyuu/core.pyi +7 -3
- hikyuu/cpp/core310.pyd +0 -0
- hikyuu/cpp/core310.pyi +55 -6
- hikyuu/cpp/core311.pyd +0 -0
- hikyuu/cpp/core311.pyi +55 -6
- hikyuu/cpp/core312.pyd +0 -0
- hikyuu/cpp/core312.pyi +55 -6
- hikyuu/cpp/core313.pyd +0 -0
- hikyuu/cpp/core313.pyi +55 -6
- hikyuu/cpp/hikyuu.dll +0 -0
- hikyuu/cpp/hikyuu.lib +0 -0
- hikyuu/cpp/i18n/zh_CN/hikyuu.mo +0 -0
- hikyuu/cpp/i18n/zh_CN/hikyuu_plugin.mo +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 +73 -28
- hikyuu/data/pytdx_to_mysql.py +65 -21
- 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 +8 -4
- 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/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/backtest.dll +0 -0
- hikyuu/plugin/checkdata.dll +0 -0
- hikyuu/plugin/clickhousedriver.dll +0 -0
- hikyuu/plugin/dataserver.dll +0 -0
- hikyuu/plugin/dataserver_parquet.dll +0 -0
- hikyuu/plugin/device.dll +0 -0
- hikyuu/plugin/extind.dll +0 -0
- hikyuu/plugin/hkuextra.dll +0 -0
- hikyuu/plugin/import2ch.dll +0 -0
- hikyuu/plugin/import2hdf5.dll +0 -0
- hikyuu/plugin/import2mysql.dll +0 -0
- hikyuu/plugin/tmreport.dll +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/__init__.pyi +1 -1
- hikyuu/util/singleton.pyi +1 -1
- {hikyuu-2.7.1.dist-info → hikyuu-2.7.2.dist-info}/METADATA +5 -1
- {hikyuu-2.7.1.dist-info → hikyuu-2.7.2.dist-info}/RECORD +89 -73
- hikyuu/data/pytdx_to_taos.py +0 -736
- {hikyuu-2.7.1.dist-info → hikyuu-2.7.2.dist-info}/WHEEL +0 -0
- {hikyuu-2.7.1.dist-info → hikyuu-2.7.2.dist-info}/entry_points.txt +0 -0
- {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', '
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
hikyuu/cpp/i18n/zh_CN/hikyuu.mo
CHANGED
|
Binary file
|
|
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[
|
|
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))
|