Bläddra i källkod

Merge remote-tracking branch 'origin/master'

daniel 2 år sedan
förälder
incheckning
553de91e52

+ 1 - 1
.idea/misc.xml

@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
-  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (jqdata)" project-jdk-type="Python SDK" />
+  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8" project-jdk-type="Python SDK" />
 </project>

+ 1 - 0
.idea/modules.xml

@@ -6,6 +6,7 @@
       <module fileurl="file://$USER_HOME$/Library/CloudStorage/OneDrive-个人/个人/python_stocks/quantify01/.idea/quantify01.iml" filepath="$USER_HOME$/Library/CloudStorage/OneDrive-个人/个人/python_stocks/quantify01/.idea/quantify01.iml" />
       <module fileurl="file://$PROJECT_DIR$/.idea/stock.iml" filepath="$PROJECT_DIR$/.idea/stock.iml" />
       <module fileurl="file://$USER_HOME$/Library/CloudStorage/OneDrive-个人/个人/python_stocks/stocks_to_sql/.idea/stocks_to_sql.iml" filepath="$USER_HOME$/Library/CloudStorage/OneDrive-个人/个人/python_stocks/stocks_to_sql/.idea/stocks_to_sql.iml" />
+      <module fileurl="file://$PROJECT_DIR$/../../OneDrive/个人/python_stocks/xtQMT/.idea/xtQMT.iml" filepath="$PROJECT_DIR$/../../OneDrive/个人/python_stocks/xtQMT/.idea/xtQMT.iml" />
     </modules>
   </component>
 </project>

+ 1 - 1
.idea/stock.iml

@@ -2,7 +2,7 @@
 <module type="PYTHON_MODULE" version="4">
   <component name="NewModuleRootManager">
     <content url="file://$MODULE_DIR$" />
-    <orderEntry type="jdk" jdkName="Python 3.8 (jqdata)" jdkType="Python SDK" />
+    <orderEntry type="jdk" jdkName="Python 3.8" jdkType="Python SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="module" module-name="stocks_to_sql" />
     <orderEntry type="module" module-name="quantify01" />

+ 12 - 9
bk_test.py

@@ -52,24 +52,25 @@ auth('18616891214', 'Ea?*7f68nD.dafcW34d!')
 
 
 
-def calculateEMA(period, closeArray, emaArray=[]):
+def calculateEMA(period, closeArray, emaArray):
     """计算指数移动平均"""
     length = len(closeArray)
     nanCounter = np.count_nonzero(np.isnan(closeArray))
-    if not emaArray:
-        emaArray.extend(np.tile([np.nan], (nanCounter + period - 1)))
-        firstema = np.mean(closeArray[nanCounter:nanCounter + period - 1])
+    if emaArray:
+        # emaArray.extend(np.tile([np.nan], (nanCounter + period - 1)))
+        # firstema = np.mean(closeArray[nanCounter:nanCounter + period - 1])
+        firstema = emaArray[-1]
         emaArray.append(firstema)
-        for i in range(nanCounter + period, length):
+        for i in range(nanCounter, length):
             ema = (2 * closeArray[i] + (period - 1) * emaArray[-1]) / (period + 1)
             emaArray.append(ema)
     return np.array(emaArray)
 
 
-def calculateMACD(closeArray, shortPeriod=12, longPeriod=26, signalPeriod=9):
-    ema12 = calculateEMA(shortPeriod, closeArray, [])
+def calculateMACD(emaArray, closeArray, shortPeriod=12, longPeriod=26, signalPeriod=9):
+    ema12 = calculateEMA(shortPeriod, closeArray, emaArray)
     print(ema12)
-    ema26 = calculateEMA(longPeriod, closeArray, [])
+    ema26 = calculateEMA(longPeriod, closeArray, emaArray)
     print(ema26)
     diff = ema12 - ema26
 
@@ -79,10 +80,12 @@ def calculateMACD(closeArray, shortPeriod=12, longPeriod=26, signalPeriod=9):
 
 stock = '000010.XSHE'
 fre = '1d'
+emaArray = []
 engine_stock = create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/stocks?charset=utf8')
 df = pd.read_sql_query('select date,open,close,high,low,volume,money from `stk%s_%s`' % (stock, fre), engine_stock)
 df_close = df['close']
-df2 = calculateMACD(df_close)
+emaArray.append = EMA(stock, check_date='2010-01-04', timeperiod=fre)[stock]
+df2 = calculateMACD(emaArray, df_close)
 print(df2)
 print(len(df), len(df2[0]))
 df3 = pd.concat([df, pd.Series(df2[0]).rename('macd'), pd.Series(df2[1]).rename('diff'), pd.Series(df2[2]).rename('dea')], axis=1)

+ 50 - 67
futures_backtrader.py

@@ -5,13 +5,11 @@ import pymysql
 import backtrader as bt
 import backtrader.indicators as btind
 import datetime
-import math
 import threading
 from datetime import datetime as dt
 import multiprocessing as mp
-from multiprocessing import Manager
 from backtrader.feeds import PandasData
-import os
+
 # import multiprocessing
 import matplotlib
 
@@ -114,14 +112,15 @@ class TestStrategy(bt.Strategy):
             vola = self.params.Volatility/100
             rate = self.params.rate/100
             # print(f'{self.params.num}日天最低值:{lowest},波动率为{self.params.Volatility/100}')
-            if (self.dataclose[0] > self.dataopen[0]) and ((lowest*(1-vola)) < self.low[0] < (lowest*(1+vola)))\
+            if (self.dataclose[0] > self.dataopen[0]) \
+                    and(((lowest*(1-vola)) < self.low[-2] < (lowest*(1+vola))) or((lowest*(1-vola)) < self.low[-1] < (lowest*(1+vola))))\
                     and (self.dataclose[0] > self.sma5[0]) and self.sma5[0] > self.sma5[-1] \
                     and (not self.position) and (self.sma5[0] > self.sma10[0]) \
                     and (self.net_pct_main[-2] > 5) \
-                    and (self.change_pct[0] > 5):
+                    and (self.change_pct[0] < 5):
                 # self.log('BUY CREATE, %.2f' % self.dataclose[0])
                 self.order = self.buy()
-            elif self.dataclose < self.sma5[0] or self.sma5[0] < self.sma10[0]\
+            elif self.dataclose < self.sma5[0]  or self.sma5[0] < self.sma10[0]\
                     or (self.dataclose[0] > (self.sma5[0] * (1+rate))):
                 self.order = self.close()
                 # self.log('Close, %.2f' % self.dataclose[0])
@@ -132,14 +131,8 @@ class TestStrategy(bt.Strategy):
 
 
 
-def backtrader(table_list, num, Volatility, rate, ns):
-    stattime = dt.now()
-    # print(type(ns.df), ns.df)
+def backtrader(table_list, result, result_change,result_change_fall, num, Volatility, rate,err_list):
     engine = create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/stocks_data?charset=utf8')
-    result = mp.Manager().list()
-    result_change = mp.Manager().list()
-    result_change_fall = mp.Manager().list()
-    err_list = mp.Manager().list()
     for stock in table_list:
         # print(stock)
         stk_df = pd.read_sql_table(stock, engine)
@@ -147,7 +140,7 @@ def backtrader(table_list, num, Volatility, rate, ns):
         if len(stk_df) > 60:
             cerebro = bt.Cerebro()
 
-            cerebro.addstrategy(TestStrategy, num=num, Volatility=Volatility, rate=rate)
+            cerebro.addstrategy(TestStrategy, num=num, Volatility=Volatility,rate=rate)
 
             cerebro.addsizer(bt.sizers.FixedSize, stake=10000)
             data = MyPandasData(dataname=stk_df,
@@ -193,26 +186,7 @@ def backtrader(table_list, num, Volatility, rate, ns):
                 else:
                     result_change_fall.append((1-cerebro.broker.getvalue() / 10000))
                     # print('aaaaaaaaaaa')
-    print(f'以{num}内最低值波动{Volatility}为支撑、{rate}%为乖离率,结果状态为:')
-    print('正盈利的个股为:', len(result_change), '成功率为:', len(result)/len(table_list))
-    print(f'总盈利:{np.sum(result_change)} 平均盈利:{np.mean(result_change)},最大盈利:{np.max(result_change)}, 最小盈利:{np.min(result_change)}')
-    print(
-        f'总亏损:{np.sum(result_change_fall)},平均亏损:{np.mean(result_change_fall)},最大亏损:{np.min(result_change_fall)} 最小亏损:{np.max(result_change_fall)}')
-    endtime = dt.now()
-    # ns.df.loc[len(ns.df)] = [num, Volatility, rate, len(result), len(result)/len(table_list), np.sum(result_change),
-    #                                 np.mean(result_change), np.max(result_change), np.min(result_change),
-    #                                 np.sum(result_change_fall), np.mean(result_change_fall),
-    #                                 np.min(result_change_fall), np.max(result_change_fall)]
-    a = pd.DataFrame(data=[[num, Volatility, rate, len(result), len(result)/len(table_list), np.sum(result_change),
-                                    np.mean(result_change), np.max(result_change), np.min(result_change),
-                                    np.sum(result_change_fall), np.mean(result_change_fall),
-                                    np.min(result_change_fall), np.max(result_change_fall)]],
-                     columns=['周期', '波动率', '乖离率', '盈利个数', '盈利比例', '总盈利', '平均盈利', '最大盈利', '最小盈利', '总亏损',
-                               '平均亏损', '最大亏损', '最小亏损'])
-    ns.df = pd.concat([ns.df, a], ignore_index=True)
-    # ns.df = ns.df.append(a)
-    print(ns.df)
-    print('每轮耗时:', endtime-stattime)
+
 
             # cerebro.plot()
 
@@ -221,12 +195,7 @@ if __name__ == '__main__':
 
     # stocks = pd.read_sql_query(
     #                     'select value from MA5_1d', engine_hlfx)
-    cpu_count = os.cpu_count()
-    os_name = os.name
-    if os_name == 'posix':
-        path = '/Users/daniel/Documents/'
-    else:
-        path = 'D:\\BackTrader\\'
+
     fre = '1d'
     db = pymysql.connect(host='localhost',
                          user='root',
@@ -237,39 +206,53 @@ if __name__ == '__main__':
     cursor.execute("show tables like '%%%s%%' " % fre)
     table_list = [tuple[0] for tuple in cursor.fetchall()]
     # print(table_list)
-    table_list = table_list[0:100]
+    # table_list = table_list[0:500]
 
-    mgr = Manager()
-    ns = mgr.Namespace()
-    df = pd.DataFrame(columns=['周期', '波动率', '乖离率', '盈利个数', '盈利比例', '总盈利', '平均盈利', '最大盈利', '最小盈利', '总亏损',
+    df = pd.DataFrame(columns=['周期', '波动率', '盈利个数', '盈利比例', '总盈利', '平均盈利', '最大盈利', '最小盈利', '总亏损',
                                '平均亏损', '最大亏损', '最小亏损'])
-    ns.df = df
+
+
     sttime = dt.now()
-    thread_list = []
-    for num in range(30, 120, 10):
-        for Volatility in range(10, 21, 1):
-            for rate in range(5, 15, 1):
-                #获得cpu数量,计算进程数
-                # step = math.ceil(len(table_list)/cpu_count/100)*100
-                print(f'{num}天波动率为{Volatility}% 乖离率为{rate}%')
-                # for i in range(0, len(table_list), step):
+
+    for num in range(60, 140, 20):
+        for Volatility in range(8, 10, 1):
+            for rate in range(7, 10, 1):
+                step = 1000
+                thread_list = []
+                result = mp.Manager().list()
+                result_change = mp.Manager().list()
+                result_change_fall = mp.Manager().list()
+                err_list = mp.Manager().list()
+                print(f'{num}天波动率为{Volatility}%乖离率为{rate}')
+                for i in range(0, len(table_list), step):
+
+
+                    stattime = dt.now()
                     # thd = threading.local()
                     # print(i)
-                p = mp.Process(target=backtrader, args=(table_list,  num, Volatility, rate, ns))
-                # p.start()
-                thread_list.append(p)
+                    p = mp.Process(target=backtrader, args=(table_list[i:i + step], result,
+                                                            result_change, result_change_fall, num, Volatility, rate,err_list))
+                    thread_list.append(p)
                     # p.start()
                     # p.join()
-    print(len(thread_list))
-    print('开始轮循!')
-    step = int(len(thread_list)/cpu_count)
-    thread_list_b = [thread_list[i:i+step] for i in range(0, len(thread_list), step)]
-    for t_list in thread_list_b:
-        for thread in t_list:
-            thread.start()
-        for thread in t_list:
-            thread.join()
-    print('NS.DF:', '\n', ns.df)
+                    # print(thread_list)
+                for thread in thread_list:
+                    thread.start()
+                for thread in thread_list:
+                    thread.join()
+
+                print(f'以{num}内最低值波动{Volatility}为支撑、乖离率为{rate}%,结果状态为:')
+                print('正盈利的个股为:', len(result_change), '成功率为:', len(result)/len(table_list))
+                print(f'总盈利:{np.sum(result_change)} 平均盈利:{np.mean(result_change)},最大盈利:{np.max(result_change)}, 最小盈利:{np.min(result_change)}')
+                print(
+                    f'总亏损:{np.sum(result_change_fall)},平均亏损:{np.mean(result_change_fall)},最大亏损:{np.min(result_change_fall)} 最小亏损:{np.max(result_change_fall)}')
+                endtime = dt.now()
+                df.loc[len(df)] = [num, Volatility, len(result), len(result)/len(table_list), np.sum(result_change),
+                                                np.mean(result_change), np.max(result_change), np.min(result_change),
+                                                np.sum(result_change_fall), np.mean(result_change_fall),
+                                                np.min(result_change_fall), np.max(result_change_fall)]
+                print(df)
+                print('每轮耗时:', endtime-stattime)
     edtime = dt.now()
     print('总耗时:', edtime - sttime)
-    ns.df.to_csv(path+dt.now().strftime('%Y-%m-%d')+'.csv', index=True,encoding='utf_8_sig')
+    df.to_csv(r'C:\Users\Daniel\Documents\策略穷举2.csv', index=True)

+ 57 - 29
his_money_flow.py

@@ -1,53 +1,81 @@
 from jqdatasdk import *
 from datetime import datetime as dt
 import pandas as pd
-import pymysql
 from sqlalchemy import create_engine
+import numpy as np
+from jqdatasdk.technical_analysis import *
 
-auth('18616891214', 'Ea?*7f68nD.dafcW34d!')
+def calculateEMA(period, closeArray, ema, emaArray=[]):
+    """计算指数移动平均"""
+    length = len(closeArray)
+    nanCounter = np.count_nonzero(np.isnan(closeArray))
+    if not emaArray:
+        if ema and (ema !=0):
+            firstema = ema
+            emaArray.append(firstema)
+        else:
+            print('走这里了')
+            emaArray.extend(np.tile([np.nan], (nanCounter + period - 1)))
+            firstema = np.mean(closeArray[nanCounter:nanCounter + period - 1])
+            emaArray.append(firstema)
+        for i in range(nanCounter+period, length):
+            ema_a = (2 * closeArray[i] + (period - 1) * emaArray[-1]) / (period + 1)
+            emaArray.append(ema_a)
+    return np.array(emaArray)
+
+
+def calculateMACD(closeArray, ema, shortPeriod=12, longPeriod=26, signalPeriod=9):
+    ema12 = calculateEMA(shortPeriod, closeArray, ema, [])
+    ema26 = calculateEMA(longPeriod, closeArray, ema, [])
+    diff = ema12 - ema26
+    dea = calculateEMA(signalPeriod, diff, 0, [])
+    macd = 2 * (diff - dea)
+    return macd, diff, dea
+
+# auth('18616891214', 'Ea?*7f68nD.dafcW34d!')
+auth('18521506014', 'Abc123!@#')
 stocks = list(get_all_securities(['stock'], date=dt.today().strftime('%Y-%m-%d')).index)
 engine = create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/stocks?charset=utf8')
 engine_data = create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/stocks_data?charset=utf8')
-# stocks_List = ','.join(set(stocks))
-
-# db_stocks_list = pymysql.connect(host='localhost',
-#                           user='root',
-#                           port=3307,
-#                           password='r6kEwqWU9!v3',
-#                           database='hlfx_pool')
-# cursor_stock_list = db_stocks_list.cursor()
-# sql = "INSERT INTO stocks_list (date,securities) VALUES('%s','%s')" % (dt.today().strftime('%Y-%m-%d'),  stocks_List)
-# cursor_stock_list.execute(sql)
-# db_stocks_list.commit()
-# db_stocks_list.close()
 
 fre = '1d'
 print('ready to write to mysql %s' % fre)
-for stock in stocks[2500:]:
+for stock in stocks[2500:2501]:
     print(stock, fre)
-    starttime ='2010-01-04'
+    starttime ='2022-01-01'
     # endtime = pd.read_sql_table('stk%s_%s' % (stock, fre), con=engine).iloc[-1, 1]
-    df_stock = get_price(stock, start_date=starttime, end_date=dt.today().strftime('%Y-%m-%d %H:%M:%S'),
+    df_stock2 = get_price(stock, start_date=starttime, end_date=dt.today().strftime('%Y-%m-%d %H:%M:%S'),
                          frequency=fre, fields=['open', 'close', 'high', 'low', 'volume', 'money'],
                          skip_paused=False,
                          fq='pre', count=None, panel=False)
-    df_stock.index.name = 'date'
-
-    # print(df_stock)
-    # print(starttime,endtime)
 
+    df_stock = pd.read_sql_query('select date,open,close,high,low,volume,money from `stk%s_%s`' % (stock, fre), engine)
+    # df_stock.index.name = 'date'
     df_money = get_money_flow(stock, start_date=starttime, end_date=dt.today().strftime('%Y-%m-%d %H:%M:%S'),
                               fields=None, count=None)
     df_money = df_money.drop(columns=['sec_code'])
-    # df_money.to_csv('/Users/daniel/Downloads/000002.csv')
-    # print(df_money)
-
     df_stock = pd.merge(df_stock, df_money, how='outer', left_index=False , on='date')
-    df_stock.to_csv('/Users/daniel/Downloads/Result.csv')
+    # df_stock.to_csv('/Users/daniel/Downloads/Result.csv')
     df_stock = df_stock.dropna(axis=0)
-    df_stock.reset_index(inplace=True)
-    df_stock.rename(columns={'index': 'date'}, inplace=True)
-    df_stock.to_sql('stk%s_%s' % (stock, fre), con=engine_data, index=True, if_exists='append')
+    df_stock2=df_stock2.dropna(axis=0)
+    df_stock2.reset_index(inplace=True)
+    df_stock2.rename(columns={'index': 'date'}, inplace=True)
+    print(df_stock2)
+    df_close = df_stock2['close']
+
+    if starttime != df_stock2.loc[0, 'date'].strftime('%Y-%m-%d'):
+        ema = 0
+    else:
+        ema = EMA(stock, check_date=starttime, timeperiod=30)[stock]
+    df_macd = calculateMACD(df_close, ema)
+
+    df_stock = pd.concat([df_stock2, pd.Series(df_macd[0]).rename('macd'), pd.Series(df_macd[1]).rename('diff'), pd.Series(df_macd[2]).rename('dea')], axis=1)
+
+    x_macd_dif, x_macd_dea, x_macd_macd = MACD(stock, check_date=dt.today().strftime('%Y-%m-%d %H:%M:%S'), SHORT=12, LONG=26, MID=9,
+                                               unit=fre)
+    print(x_macd_macd, x_macd_dif, x_macd_dea)
+    print(df_stock)
+    # df_stock.to_sql('stk%s_%s' % (stock, fre), con=engine_data, index=True, if_exists='append')
     # with engine.connect() as con:
     #     con.execute("ALTER TABLE `stk%s_%s` ADD PRIMARY KEY (`date`);" % (stock, fre))
-    print(df_stock)
+    # print(df_stock)

+ 67 - 0
macd_test.py

@@ -0,0 +1,67 @@
+from jqdatasdk import *
+from sqlalchemy import create_engine
+from jqdatasdk.technical_analysis import *
+
+
+auth('18616891214', 'Ea?*7f68nD.dafcW34d!')
+
+import numpy as np
+import pandas as pd
+
+
+def calculateEMA(period, closeArray, ema, emaArray=[]):
+    """计算指数移动平均"""
+    length = len(closeArray)
+    nanCounter = np.count_nonzero(np.isnan(closeArray))
+    print('def ema', ema)
+    if not emaArray:
+        if not ema and ema:
+            firstema = ema
+        else:
+            firstema = np.mean(closeArray[nanCounter:nanCounter + period - 1])
+        # emaArray.extend(np.tile([np.nan], (nanCounter + period - 1)))
+        print('fe', firstema)
+        emaArray.append(firstema)
+
+        for i in range(nanCounter, length):
+            ema_a = (2 * closeArray[i] + (period - 1) * emaArray[-1]) / (period + 1)
+            emaArray.append(ema_a)
+    return np.array(emaArray[1:])
+
+
+def calculateMACD(closeArray,ema, shortPeriod=12, longPeriod=26, signalPeriod=9):
+    ema12 = calculateEMA(shortPeriod, closeArray, ema, [])
+    print(ema12)
+    ema26 = calculateEMA(longPeriod, closeArray, ema, [])
+    print(ema26)
+    diff = ema12 - ema26
+
+    dea = calculateEMA(signalPeriod, diff, 0, [])
+    print(diff,len(diff))
+    print('dea=', dea, type(dea))
+    macd = 2 * (diff - dea)
+    return macd, diff, dea
+
+
+stock = '300114.XSHE'
+fre = '1d'
+check_date = '2010-01-04'
+emaArray = []
+engine_stock = create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/stocks?charset=utf8')
+df = pd.read_sql_query('select date,open,close,high,low,volume,money from `stk%s_%s`' % (stock, fre), engine_stock)
+df_close = df['close']
+ema = EMA(stock, check_date=f'2009-12-31', timeperiod=30)[stock]
+print('ddd', ema)
+df4 = calculateMACD(df_close, ema)
+# df2 = calculateMACD(emaArray, df_close)
+# print('df2=', df2)
+# print(len(df), len(df2[0]))
+# df3 = pd.concat([df, pd.Series(df2[0]).rename('macd'), pd.Series(df2[1]).rename('diff'), pd.Series(df2[2]).rename('dea')], axis=1)
+
+print('df=', df)
+df4 = pd.concat([df, pd.Series(df4[0]).rename('macd'), pd.Series(df4[1]).rename('diff'), pd.Series(df4[2]).rename('dea')], axis=1)
+print('df=', df4)
+print(df4.loc[df.date== '2010-09-10',:])
+
+x_macd_dif, x_macd_dea, x_macd_macd = MACD(stock, check_date='2010-09-13 00:00:00', SHORT=12, LONG=26, MID=9, unit=fre)
+print(x_macd_macd, x_macd_dif, x_macd_dea)

+ 35 - 0
qmt_get_market_data.py

@@ -0,0 +1,35 @@
+# coding=utf-8
+from xtquant import xtdata
+from datetime import datetime as dt
+import pandas as pd
+from sqlalchemy import create_engine
+
+path = 'c:\\qmt\\userdata_mini'
+
+
+if __name__ == '__main__':
+    fre = '1d'
+    stocks = xtdata.get_stock_list_in_sector('沪深A股')
+    print(stocks, '\n')
+    stocks.sort()
+
+
+
+    # df_data = xtdata.get_local_data(field_list=[], stock_code=stocks, start_time='', end_time='',
+    #                                 period='1d',  count=-1)
+    # print(df_data)
+    for s in stocks[0:4]:
+        print(s)
+        cq = xtdata.get_divid_factors(s, start_time='19910101', end_time='20130115')
+        print(cq)
+        df_data = xtdata.get_local_data(field_list=[], stock_code=[s], start_time='', end_time='',
+                                        period='1d', count=-1, dividend_type='back')
+        df = pd.concat([df_data[i].T for i in ['time', 'open', 'high', 'low', 'close', 'volume', 'amount']], axis=1)
+        df.columns = ['time', 'open', 'high', 'low', 'close', 'volume', 'amount']
+        df['time'] = df['time'].apply(lambda x: dt.fromtimestamp(x / 1000.0))
+        # print(df)
+        df['time'] = pd.to_datetime(df['time'], unit='ms')
+        df['time'] = pd.to_datetime(df['time'], format='%Y-%m-%d')
+        df.reset_index(drop=True, inplace=True)
+        # df['time'] = df['time'] + timedelta(hours=8)
+        print(df)

+ 21 - 14
real_time_order_MA_HLFX_1025.py

@@ -13,22 +13,20 @@ from xtquant import xtdata
 
 
 auth('18616891214', 'Ea?*7f68nD.dafcW34d!')
-
+# auth('18521506014', 'Abc123!@#')
 #启动交易系统
 path = 'D:\\安信证券QMT实盘_交易终端\\userdata_mini'
 # session_id为会话编号,策略使用方对于不同的Python策略需要使用不同的会话编号
 session_id = 20221123
-#后续的所有示例将使用该实例对象
-xt_trader = XtQuantTrader(path, session_id)
-xt_trader.start()
-connect_result = xt_trader.connect()
-if connect_result == 0:
-    print('QMTmini 已连接')
-else:
-    print('连接失败')
 
-account = StockAccount('920000207040', 'SECURITY')  # xt_trader为XtQuant API实例对象
-positions = xt_trader.query_stock_positions(account)
+# connect_result = xt_trader.connect()
+# if connect_result == 0:
+#     print('QMTmini 已连接')
+# else:
+#     print('连接失败')
+
+# account = StockAccount('920000207040', 'SECURITY')  # xt_trader为XtQuant API实例对象
+# positions = xt_trader.query_stock_positions(account)
 
 
 
@@ -107,16 +105,24 @@ def Sell_Trader(stock, account, positions, volume):
 
 
 while True:
-
+    # print('进入循环')
     now_date = dt.now()
     date_morning_begin = now_date.replace(hour=9, minute=25, second=0)
     date_morning_end = now_date.replace(hour=11, minute=31, second=0)
     date_afternooe_begin = now_date.replace(hour=13, minute=0, second=0)
     date_afternooe_end = now_date.replace(hour=15, minute=0, second=0)
-    # if True:
-    if date_morning_begin < now_date < date_morning_end or date_afternooe_begin < now_date < date_afternooe_end:
+    if True:
+    # if date_morning_begin < now_date < date_morning_end or date_afternooe_begin < now_date < date_afternooe_end:
         # time.sleep(1800)
+        # 后续的所有示例将使用该实例对象
+        xt_trader = XtQuantTrader(path, session_id)
+        xt_trader.start()
+        connect_result = xt_trader.connect()
         try:
+            if connect_result == 0:
+                print('QMTmini 已连接')
+            else:
+                print('连接失败')
             account = StockAccount('920000207040', 'SECURITY')  # xt_trader为XtQuant API实例对象
             positions = xt_trader.query_stock_positions(account)
             print(positions)
@@ -220,6 +226,7 @@ while True:
                 price = get_bars(keep_stocks, count=1, unit=fre, fields=['close'])
 
                 XtTrader(new_keep_stock)
+        xt_trader.run_forever()
         time.sleep(1800)
     elif now_date > date_afternooe_end:
         pass

+ 8 - 5
real_time_update_qbh_hlfx_1025.py

@@ -8,6 +8,7 @@ from jqdatasdk.technical_analysis import *
 #原始版本
 
 auth('18616891214', 'Ea?*7f68nD.dafcW34d!')
+# auth('18521506014', 'Abc123!@#')
 stocks = list(get_all_securities(['stock'], date=dt.today().strftime('%Y-%m-%d')).index)
 # stocks = stocks[0:200]
 
@@ -266,8 +267,8 @@ while True:
     date_afternooe_begin = now_date.replace(hour=13, minute=0, second=0)
     date_afternooe_end = now_date.replace(hour=15, minute=0, second=0)
     # print(now_date,date_morning_begin,date_morning_end,date_afternooe_begin,date_afternooe_end)
-    if date_morning_begin < now_date < date_afternooe_end:
-    # if True:
+    # if date_morning_begin < now_date < date_afternooe_end:
+    if True:
         for fre in ['1d']:
             start = dt.now()
             print(fre)
@@ -292,7 +293,7 @@ while True:
             stk = locals()
             thd = threading.local()
             # 进程准备
-            step = 600
+            step = 400
             thread_list = []
             engine_stock = []
             engine_hlfx = []
@@ -310,10 +311,12 @@ while True:
             results_short = []
             print('数据库读取', len(results))
 
-            df = get_bars(stocks, count=20, unit=fre,
+            df = get_bars(stocks, count=5, unit=fre,
                           fields=['date', 'open', 'close', 'high', 'low', 'volume', 'money'], include_now=True, df=True)
+            print(df, type(df))
+            print(df.loc['603566.XSHG'])
             print(dt.now(), 'get_bars 成功')
-
+            exit()
             for i in range(0, len(stocks), step):
                 engine_stock.append(create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/stocks?charset=utf8'))
                 engine_hlfx.append(create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/hlfx?charset=utf8'))

+ 250 - 0
updata_qbh_hlfx_1114.py

@@ -0,0 +1,250 @@
+import multiprocessing as mp
+import pandas as pd
+import pymysql
+from sqlalchemy import create_engine
+from datetime import datetime as dt
+
+
+import datetime
+
+# auth('18616891214', 'Ea?*7f68nD.dafcW34d!')
+def hlfx(stocks,fre,table_list):
+    engine = create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/stocks?charset=utf8')
+    engine2 = create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/hlfx?charset=utf8')
+    for stock in stocks:
+        # print(stock)
+        if ('stk%s_%s' % (stock, fre)) in table_list:
+            # 有历史数据
+            index_len = pd.read_sql_table('stk%s_%s' % (stock, fre), con=engine2).iloc[-1, 0]
+
+            # 注意修改time delta
+            startdate = pd.read_sql_table('stk%s_%s' % (stock, fre), con=engine2).iloc[-1, 1]
+            # startdate = pd.read_sql_table('stk%s_%s' % (stock, fre), con=engine2).iloc[-1, 1] + datetime.timedelta(minutes= 5)
+            get_price = pd.read_sql_query(
+                'select date,open,close,high,low,volume,money from `stk%s_%s`' % (stock, fre), engine)
+            get_price = get_price.loc[get_price['date'] > startdate]
+            df_day = pd.read_sql_query(
+                'select date,open,close,high,low,volume,money,HL from `stk%s_%s`' % (stock, fre), engine2)
+            if index_len > 2:
+                # 先处理去包含
+                for i in get_price.index:
+                    # 不包含
+                    if (df_day.iloc[-1, 3] > get_price.loc[i, 'high']
+                        and df_day.iloc[-1, 4] > get_price.loc[i, 'low']) \
+                            or (df_day.iloc[-1, 3] < get_price.loc[i, 'high']
+                                and df_day.iloc[-1, 4] < get_price.loc[i, 'low']):
+                        df_day = pd.concat([df_day, get_price.loc[[i]]], ignore_index=True)
+                        # print(df_day)
+                    # 包含
+                    else:
+                        # (new_df.iloc[-1,3]>=df_day.loc[i,'high'] and new_df.iloc[-1,4]<= df_day.loc[i,'low']):
+                        # 左高,下降
+                        if df_day.iloc[-2, 3] > df_day.iloc[-1, 3]:
+                            df_day.iloc[-1, 3] = min(df_day.iloc[-1, 3], get_price.loc[i, 'high'])
+                            df_day.iloc[-1, 4] = min(df_day.iloc[-1, 4], get_price.loc[i, 'low'])
+                        else:
+                            # 右高,上升
+                            df_day.iloc[-1, 3] = max(df_day.iloc[-1, 3], get_price.loc[i, 'high'])
+                            df_day.iloc[-1, 4] = max(df_day.iloc[-1, 4], get_price.loc[i, 'low'])
+                            # 寻找顶底分型
+                if len(df_day.index) > 2:
+                    # 寻找顶底分型
+                    for x in range(index_len, len(df_day.index)):
+                        m = x - 1
+                        # 底
+                        if ((df_day.loc[x, 'high'] > df_day.loc[x - 1, 'high']) and (
+                                df_day.loc[x - 2, 'high'] > df_day.loc[x - 1, 'high'])):
+                            # if ((stk.df_day.loc[i-2, 'date'] != stk.fxdf.iloc[-1,0]) and (stk.df_day.loc[i-3,'date'] != stk.fxdf.iloc[-1,0]) and (stk.df_day.loc[i-1,'date'] != stk.fxdf.iloc[-1,0])):
+                            # stk.fxdf = pd.concat([stk.fxdf, stk.df_day.iloc[[i]]], ignore_index=True)
+                            df_day.loc[x, 'HL'] = 'L*'
+                            while m:
+                                if df_day.loc[m, 'HL'] == 'H':
+                                    if (x - m) > 3:
+                                        df_day.loc[x, 'HL'] = 'L'
+                                        if x == len(df_day.index) - 1:
+                                            # print(stock, '$$$$$$$', '\n', df_day.loc[x, 'date'], '买买买买买!!')
+                                            pass
+                                    break
+                                elif (df_day.loc[m, 'HL'] == 'L'):
+                                    if df_day.loc[x - 1, 'low'] < df_day.loc[m - 1, 'low']:
+                                        # 前一个为底,且中间存在不包含 or 更低的底
+                                        df_day.loc[x, 'HL'] = 'L'
+                                        if x == len(df_day.index) - 1:
+                                            pass
+                                            # print(stock, '$$$$$$$', '\n', df_day.loc[x, 'date'],
+                                            #       '中继后的底————买吗?!')
+                                        break
+                                    else:
+                                        break
+                                m = m - 1
+                                if m == 0:
+                                    df_day.loc[x, 'HL'] = 'L'
+                        # 顶
+                        elif ((df_day.loc[x, 'high'] < df_day.loc[x - 1, 'high']) and (
+                                df_day.loc[x - 2, 'high'] < df_day.loc[x - 1, 'high'])):
+                            # if ((stk.df_day.loc[i-2, 'date'] != stk.fxdf.iloc[-1,0]) and (stk.df_day.loc[i-3,'date'] != stk.fxdf.iloc[-1,0]) and (stk.df_day.loc[i-1,'date'] != stk.fxdf.iloc[-1,0])):
+                            #     stk.fxdf = pd.concat([stk.fxdf, stk.df_day.iloc[[i]]], ignore_index=True)
+                            df_day.loc[x, 'HL'] = 'H*'
+                            while m:
+                                if df_day.loc[m, 'HL'] == 'L':
+                                    if x - m > 3:
+                                        df_day.loc[x, 'HL'] = 'H'
+                                        if x == len(df_day.index) - 1:
+                                            # print(stock, '!!!!!!!', '\n', '卖卖卖卖卖卖卖!')
+                                            pass
+                                    break
+                                elif (df_day.loc[m, 'HL'] == 'H'):
+                                    if df_day.loc[x - 1, 'high'] > df_day.loc[m - 1, 'high']:
+                                        # 前一个为顶,且中间存在不包含 or 更高的顶
+                                        df_day.loc[x, 'HL'] = 'H'
+                                        if x == len(df_day.index) - 1:
+                                            pass
+                                            # print(stock, '/\/\/\/\/\/\/', '一顶更有一顶高!')
+                                        break
+                                    break
+                                m = m - 1
+                                if m == 0:
+                                    df_day.loc[x, 'HL'] = 'H'
+                        else:
+                            df_day.loc[x, 'HL'] = '-'
+                # 更新数据库
+                df_day[index_len + 1:].to_sql('stk%s_%s' % (stock, fre), con=engine2, index=True,
+                                              if_exists='append')
+            else:
+                df_day = pd.concat([df_day, get_price], ignore_index=True)
+                df_day[index_len + 1:].to_sql('stk%s_%s' % (stock, fre), con=engine2, index=True,
+                                              if_exists='append')
+        else:
+            # 没有历史数据表
+            df_day = pd.DataFrame(columns=('date', 'open', 'close', 'high', 'low', 'volume', 'money', 'HL'))
+            get_price = pd.read_sql_query(
+                'select date,open,close,high,low,volume,money from `stk%s_%s`' % (stock, fre), engine)
+            # 先处理去包含
+            for i in get_price.index:
+                if i == 0 or i == 1:
+                    df_day = pd.concat([df_day, get_price.iloc[[i]]], ignore_index=True)
+                # 不包含
+                elif (df_day.iloc[-1, 3] > get_price.loc[i, 'high']
+                      and df_day.iloc[-1, 4] > get_price.loc[i, 'low']) \
+                        or (df_day.iloc[-1, 3] < get_price.loc[i, 'high']
+                            and df_day.iloc[-1, 4] < get_price.loc[i, 'low']):
+                    df_day = pd.concat([df_day, get_price.loc[[i]]], ignore_index=True)
+                # 包含
+                else:
+                    # 左高,下降
+                    if df_day.iloc[-2, 3] > df_day.iloc[-1, 3]:
+                        df_day.iloc[-1, 3] = min(df_day.iloc[-1, 3], get_price.loc[i, 'high'])
+                        df_day.iloc[-1, 4] = min(df_day.iloc[-1, 4], get_price.loc[i, 'low'])
+                    else:
+                        # 右高,上升
+                        df_day.iloc[-1, 3] = max(df_day.iloc[-1, 3], get_price.loc[i, 'high'])
+                        df_day.iloc[-1, 4] = max(df_day.iloc[-1, 4], get_price.loc[i, 'low'])
+            if len(df_day.index) > 2:
+                # 寻找顶底分型
+                for x in range(2, len(df_day.index)):
+                    m = x - 1
+                    # 底
+                    if ((df_day.loc[x, 'high'] > df_day.loc[x - 1, 'high']) and (
+                            df_day.loc[x - 2, 'high'] > df_day.loc[x - 1, 'high'])):
+                        # if ((stk.df_day.loc[i-2, 'date'] != stk.fxdf.iloc[-1,0]) and (stk.df_day.loc[i-3,'date'] != stk.fxdf.iloc[-1,0]) and (stk.df_day.loc[i-1,'date'] != stk.fxdf.iloc[-1,0])):
+                        # stk.fxdf = pd.concat([stk.fxdf, stk.df_day.iloc[[i]]], ignore_index=True)
+                        df_day.loc[x, 'HL'] = 'L*'
+                        while m:
+                            if df_day.loc[m, 'HL'] == 'H':
+                                if (x - m) > 3:
+                                    df_day.loc[x, 'HL'] = 'L'
+                                    if x == len(df_day.index) - 1:
+                                        pass
+                                        # print(stock, '$$$$$$$', '\n', df_day.loc[x, 'date'], '买买买买买!!')
+                                break
+                            elif (df_day.loc[m, 'HL'] == 'L'):
+                                if df_day.loc[x - 1, 'low'] < df_day.loc[m - 1, 'low']:
+                                    # 前一个为底,且中间存在不包含 or 更低的底
+                                    df_day.loc[x, 'HL'] = 'L'
+                                    if x == len(df_day.index) - 1:
+                                        pass
+                                        # print(stock, '$$$$$$$', '\n', df_day.loc[x, 'date'], '中继后的底————买吗?!')
+                                    break
+                                else:
+                                    break
+                            m = m - 1
+                            if m == 0:
+                                df_day.loc[x, 'HL'] = 'L'
+                    # 顶
+                    elif ((df_day.loc[x, 'high'] < df_day.loc[x - 1, 'high']) and (
+                            df_day.loc[x - 2, 'high'] < df_day.loc[x - 1, 'high'])):
+                        # if ((stk.df_day.loc[i-2, 'date'] != stk.fxdf.iloc[-1,0]) and (stk.df_day.loc[i-3,'date'] != stk.fxdf.iloc[-1,0]) and (stk.df_day.loc[i-1,'date'] != stk.fxdf.iloc[-1,0])):
+                        #     stk.fxdf = pd.concat([stk.fxdf, stk.df_day.iloc[[i]]], ignore_index=True)
+                        df_day.loc[x, 'HL'] = 'H*'
+                        while m:
+                            if df_day.loc[m, 'HL'] == 'L':
+                                if x - m > 3:
+                                    df_day.loc[x, 'HL'] = 'H'
+                                    if x == len(df_day.index) - 1:
+                                        # print(stock, '!!!!!!!', '\n', '卖卖卖卖卖卖卖!')
+                                        pass
+                                break
+                            elif (df_day.loc[m, 'HL'] == 'H'):
+                                if df_day.loc[x - 1, 'high'] > df_day.loc[m - 1, 'high']:
+                                    # 前一个为顶,且中间存在不包含 or 更高的顶
+                                    df_day.loc[x, 'HL'] = 'H'
+                                    if x == len(df_day.index) - 1:
+                                        pass
+                                        # print(stock, '/\/\/\/\/\/\/', '一顶更有一顶高!')
+                                    break
+                                break
+                            m = m - 1
+                            if m == 0:
+                                df_day.loc[x, 'HL'] = 'H'
+                    else:
+                        df_day.loc[x, 'HL'] = '-'
+            # 更新数据库
+            df_day.to_sql('stk%s_%s' % (stock, fre), con=engine2, index=True, if_exists='append')
+
+
+if __name__ == '__main__':
+    engine_stocks_list = create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/hlfx_pool?charset=utf8')
+    # stocks = list(get_all_securities(['stock'], date=dt.today().strftime('%Y-%m-%d')).index)
+
+
+    stocks = pd.read_sql_query(
+        'select securities from stocks_list', engine_stocks_list)
+    stocks = stocks.iloc[-1, 0]
+    stocks = stocks.split(",")
+    print(len(stocks), type(stocks), stocks)
+    # stocks = stocks[0:1000]
+
+    start = dt.now()
+    # 确定级别
+    # 注意修改time delta
+    # fre = '30m'
+
+    for fre in ['30m', '1d']:
+        start = dt.now()
+        print(fre)
+        # 连接数据库
+        db = pymysql.connect(host='localhost',
+                             user='root',
+                             port=3307,
+                             password='r6kEwqWU9!v3',
+                             database='hlfx')
+        cursor = db.cursor()
+        cursor.execute("show tables like '%%%s%%' " % fre)
+        table_list = [tuple[0] for tuple in cursor.fetchall()]
+        print('取得 table_list %s' % fre)
+
+        step = 800
+        mp_list = []
+        print(len(stocks))
+
+        for i in range(0, len(stocks), step):
+            p = mp.Process(target=hlfx, args=(stocks[i:i + step], fre, table_list, ))
+            mp_list.append(p)
+            p.start()
+
+        for processing in mp_list:
+            processing.join()
+        # db.close()
+
+        end = dt.now()
+        print('总时长:', (end - start).seconds)