|
@@ -29,22 +29,6 @@ pd.set_option('display.max_columns', None) # 设置显示最大行
|
|
fre = '1d'
|
|
fre = '1d'
|
|
|
|
|
|
|
|
|
|
-def run(seq):
|
|
|
|
- print('seq=', seq)
|
|
|
|
- '''阻塞线程接收行情回调'''
|
|
|
|
- import time
|
|
|
|
- client = xtdata.get_client()
|
|
|
|
- while True:
|
|
|
|
- time.sleep(3)
|
|
|
|
- now_date = dt.now()
|
|
|
|
- if not client.is_connected() or dt.now() > now_date.replace(hour=15, minute=0, second=0):
|
|
|
|
- xtdata.unsubscribe_quote(seq)
|
|
|
|
- print(f'现在时间:{dt.now()},已收盘')
|
|
|
|
- raise Exception('行情服务连接断开')
|
|
|
|
- break
|
|
|
|
- return
|
|
|
|
-
|
|
|
|
-
|
|
|
|
class MyXtQuantTraderCallback(XtQuantTraderCallback):
|
|
class MyXtQuantTraderCallback(XtQuantTraderCallback):
|
|
def on_disconnected(self):
|
|
def on_disconnected(self):
|
|
"""
|
|
"""
|
|
@@ -115,8 +99,24 @@ def err_call_back(err):
|
|
traceback.print_exc()
|
|
traceback.print_exc()
|
|
|
|
|
|
|
|
|
|
-def hlfx(data):
|
|
|
|
- stock_list = list(data.keys())
|
|
|
|
|
|
+def run(seq):
|
|
|
|
+ """阻塞线程接收行情回调"""
|
|
|
|
+ import time
|
|
|
|
+ client = xtdata.get_client()
|
|
|
|
+ while True:
|
|
|
|
+ time.sleep(3)
|
|
|
|
+ now_date = dt.now()
|
|
|
|
+ if not client.is_connected():
|
|
|
|
+ xtdata.unsubscribe_quote(seq)
|
|
|
|
+ raise Exception('行情服务连接断开')
|
|
|
|
+ if dt.now() > now_date.replace(hour=15, minute=0, second=0):
|
|
|
|
+ print(f'现在时间:{dt.now()},已收盘')
|
|
|
|
+ return 0
|
|
|
|
+ return
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def hlfx(stock_list, data):
|
|
|
|
+ # stock_list = list(data.keys())
|
|
print(f'def-->hlfx, MyPid is {os.getpid()}, 本次我需要计算{len(stock_list)},now is {dt.now()}')
|
|
print(f'def-->hlfx, MyPid is {os.getpid()}, 本次我需要计算{len(stock_list)},now is {dt.now()}')
|
|
|
|
|
|
# 获得hlfx_pool池子
|
|
# 获得hlfx_pool池子
|
|
@@ -132,8 +132,8 @@ def hlfx(data):
|
|
# 读取qmt_stocks_whole表-前复权-信息
|
|
# 读取qmt_stocks_whole表-前复权-信息
|
|
try:
|
|
try:
|
|
df_day = pd.read_sql_query(
|
|
df_day = pd.read_sql_query(
|
|
- 'select time, open_front, close_front, high_front, low_front, volume_front, amount_front, dif, dea, macd,HL from `%s_%s`'
|
|
|
|
- % (qmt_stock, fre), engine_stock)
|
|
|
|
|
|
+ 'select time, open_front, close_front, high_front, low_front, volume_front, amount_front, '
|
|
|
|
+ 'dif, dea, macd, HL from `%s_%s`' % (qmt_stock, fre), engine_stock)
|
|
df_day.columns = ['time', 'open', 'close', 'high', 'low', 'volume', 'amount', 'dif', 'dea', 'macd', 'HL']
|
|
df_day.columns = ['time', 'open', 'close', 'high', 'low', 'volume', 'amount', 'dif', 'dea', 'macd', 'HL']
|
|
except BaseException as e:
|
|
except BaseException as e:
|
|
print(qmt_stock, '未能读取!', e)
|
|
print(qmt_stock, '未能读取!', e)
|
|
@@ -189,8 +189,9 @@ def hlfx(data):
|
|
if (x - m) > 3:
|
|
if (x - m) > 3:
|
|
# 成笔——>L
|
|
# 成笔——>L
|
|
df_day.loc[x, 'HL'] = 'L'
|
|
df_day.loc[x, 'HL'] = 'L'
|
|
|
|
+ break
|
|
|
|
|
|
- elif df_day.loc[m, 'HL'] == 'L':
|
|
|
|
|
|
+ elif df_day.loc[m, 'HL'] in ['L', 'LL', 'L*']:
|
|
if df_day.loc[m - 1, 'low'] > df_day.loc[x - 1, 'low']:
|
|
if df_day.loc[m - 1, 'low'] > df_day.loc[x - 1, 'low']:
|
|
# pool_list.append(qmt_stock)
|
|
# pool_list.append(qmt_stock)
|
|
|
|
|
|
@@ -205,16 +206,16 @@ def hlfx(data):
|
|
df_day.loc[x, 'HL'] = 'LL'
|
|
df_day.loc[x, 'HL'] = 'LL'
|
|
# 产生信号,进入hlfx_pool
|
|
# 产生信号,进入hlfx_pool
|
|
results.append(qmt_stock)
|
|
results.append(qmt_stock)
|
|
|
|
+ break
|
|
# 前一个为底更高,且中间不存在更低的底
|
|
# 前一个为底更高,且中间不存在更低的底
|
|
else:
|
|
else:
|
|
df_day.loc[x, 'HL'] = 'L'
|
|
df_day.loc[x, 'HL'] = 'L'
|
|
# 产生信号,进入hlfx_pool
|
|
# 产生信号,进入hlfx_pool
|
|
- results.append(qmt_stock)
|
|
|
|
- break
|
|
|
|
break
|
|
break
|
|
m = m - 1
|
|
m = m - 1
|
|
if m == 0:
|
|
if m == 0:
|
|
df_day.loc[x, 'HL'] = 'L'
|
|
df_day.loc[x, 'HL'] = 'L'
|
|
|
|
+ results.append(qmt_stock)
|
|
|
|
|
|
# 顶
|
|
# 顶
|
|
|
|
|
|
@@ -230,7 +231,7 @@ def hlfx(data):
|
|
results.remove(qmt_stock)
|
|
results.remove(qmt_stock)
|
|
break
|
|
break
|
|
|
|
|
|
- elif (df_day.loc[m, 'HL'] == 'H'):
|
|
|
|
|
|
+ elif df_day.loc[m, 'HL'] in ['H','HH', 'H*']:
|
|
if df_day.loc[x - 1, 'high'] > df_day.loc[m - 1, 'high']:
|
|
if df_day.loc[x - 1, 'high'] > df_day.loc[m - 1, 'high']:
|
|
# 获得MACD,判断MACD判断背驰
|
|
# 获得MACD,判断MACD判断背驰
|
|
x_macd_dif, x_macd_dea, x_macd_macd = df_day.loc[x, 'dif'], df_day.loc[x, 'dea'], \
|
|
x_macd_dif, x_macd_dea, x_macd_macd = df_day.loc[x, 'dif'], df_day.loc[x, 'dea'], \
|
|
@@ -243,18 +244,18 @@ def hlfx(data):
|
|
df_day.loc[x, 'HL'] = 'HH'
|
|
df_day.loc[x, 'HL'] = 'HH'
|
|
# 产生卖出信号,进入hlfx_pool
|
|
# 产生卖出信号,进入hlfx_pool
|
|
results.remove(qmt_stock)
|
|
results.remove(qmt_stock)
|
|
|
|
+ break
|
|
|
|
|
|
# 前一个为顶,且中间存在不包含 or 更高的顶
|
|
# 前一个为顶,且中间存在不包含 or 更高的顶
|
|
else:
|
|
else:
|
|
df_day.loc[x, 'HL'] = 'H'
|
|
df_day.loc[x, 'HL'] = 'H'
|
|
# 产生卖出信号,进入hlfx_pool
|
|
# 产生卖出信号,进入hlfx_pool
|
|
results.remove(qmt_stock)
|
|
results.remove(qmt_stock)
|
|
-
|
|
|
|
- break
|
|
|
|
break
|
|
break
|
|
m = m - 1
|
|
m = m - 1
|
|
if m == 0:
|
|
if m == 0:
|
|
df_day.loc[x, 'HL'] = 'H'
|
|
df_day.loc[x, 'HL'] = 'H'
|
|
|
|
+ results.remove(qmt_stock)
|
|
engine_stock.dispose()
|
|
engine_stock.dispose()
|
|
|
|
|
|
db_pool = pymysql.connect(host='localhost',
|
|
db_pool = pymysql.connect(host='localhost',
|
|
@@ -269,33 +270,31 @@ def hlfx(data):
|
|
cursor_pool.execute(sql)
|
|
cursor_pool.execute(sql)
|
|
db_pool.commit()
|
|
db_pool.commit()
|
|
print(f'{dt.now()}写入新的results{len(results_list)}个,hlfx_pool更新')
|
|
print(f'{dt.now()}写入新的results{len(results_list)}个,hlfx_pool更新')
|
|
- del df_day
|
|
|
|
- gc.collect()
|
|
|
|
engine_hlfx_pool.dispose()
|
|
engine_hlfx_pool.dispose()
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-def bridge(list):
|
|
|
|
- print(f'MyPid is {os.getpid()}, now is {dt.now()},我需要负责{len(list)}个个股数据')
|
|
|
|
- seq = xtdata.subscribe_whole_quote(list, callback=hlfx)
|
|
|
|
- run(seq)
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-def prepare():
|
|
|
|
|
|
+def bridge():
|
|
|
|
+ print(f'MyPid is {os.getpid()}, now is {dt.now()},开盘了')
|
|
stocks = xtdata.get_stock_list_in_sector('沪深A股')
|
|
stocks = xtdata.get_stock_list_in_sector('沪深A股')
|
|
|
|
+ seq = xtdata.subscribe_whole_quote(stocks, callback=prepare)
|
|
|
|
+ if run(seq) == 0:
|
|
|
|
+ xtdata.unsubscribe_quote(seq)
|
|
|
|
+ print(f'{dt.now()},收盘了,收工!')
|
|
|
|
|
|
|
|
+
|
|
|
|
+def prepare(data):
|
|
|
|
+ stock_list = list(data.keys())
|
|
cpu_count = 4
|
|
cpu_count = 4
|
|
pool = mp.Pool(processes=cpu_count, maxtasksperchild=4)
|
|
pool = mp.Pool(processes=cpu_count, maxtasksperchild=4)
|
|
- step = math.ceil(len(stocks) / cpu_count)
|
|
|
|
|
|
+ step = math.ceil(len(stock_list) / cpu_count)
|
|
to_hlfx_list = []
|
|
to_hlfx_list = []
|
|
|
|
|
|
- for i in range(0, len(stocks), step):
|
|
|
|
- to_hlfx_list.append([x for x in stocks[i:i + step]])
|
|
|
|
|
|
+ for i in range(0, len(stock_list), step):
|
|
|
|
+ to_hlfx_list.append([x for x in stock_list[i:i + step]])
|
|
|
|
|
|
for m in range(cpu_count):
|
|
for m in range(cpu_count):
|
|
- pool.apply_async(func=bridge,
|
|
|
|
- args=(to_hlfx_list[m],), error_callback=err_call_back)
|
|
|
|
|
|
+ pool.apply_async(func=hlfx,
|
|
|
|
+ args=(to_hlfx_list[m], data), error_callback=err_call_back)
|
|
pool.close()
|
|
pool.close()
|
|
pool.join()
|
|
pool.join()
|
|
|
|
|
|
@@ -324,7 +323,7 @@ if __name__ == '__main__':
|
|
print('对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功', subscribe_result)
|
|
print('对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功', subscribe_result)
|
|
|
|
|
|
scheduler = BlockingScheduler()
|
|
scheduler = BlockingScheduler()
|
|
- scheduler.add_job(func=prepare, trigger='cron', day_of_week='0-4', hour='14', minute='51',
|
|
|
|
|
|
+ scheduler.add_job(func=bridge, trigger='cron', day_of_week='0-4', hour='09', minute='25',
|
|
timezone="Asia/Shanghai")
|
|
timezone="Asia/Shanghai")
|
|
try:
|
|
try:
|
|
scheduler.start()
|
|
scheduler.start()
|