|
@@ -0,0 +1,232 @@
|
|
|
+from future.types import newint
|
|
|
+from jqdatasdk import *
|
|
|
+from datetime import datetime as dt
|
|
|
+import pandas as pd
|
|
|
+import pymysql
|
|
|
+from sqlalchemy import create_engine
|
|
|
+import time
|
|
|
+from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
|
|
|
+from xtquant.xttype import StockAccount
|
|
|
+from xtquant import xtconstant
|
|
|
+from xtquant import xtdata
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+auth('18616891214', 'Ea?*7f68nD.dafcW34d!')
|
|
|
+
|
|
|
+#启动交易系统
|
|
|
+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)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+fre = '1d'
|
|
|
+
|
|
|
+engine_hlfx_pool = create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/hlfx_pool?charset=utf8')
|
|
|
+# engine_stock = create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/stocks?charset=utf8')
|
|
|
+
|
|
|
+db_pool = pymysql.connect(host='localhost',
|
|
|
+ user='root',
|
|
|
+ port=3307,
|
|
|
+ password='r6kEwqWU9!v3',
|
|
|
+ database='hlfx_pool')
|
|
|
+cursor_pool = db_pool.cursor()
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+fut = locals()
|
|
|
+print(dt.now(), '开始寻找MA5趋势!')
|
|
|
+
|
|
|
+
|
|
|
+def XtTrader(new_keep_stock):
|
|
|
+ # 获取账号信息
|
|
|
+ # account = StockAccount('888824600221', 'CREDIT') #xt_trader为XtQuant API实例对象
|
|
|
+ account = StockAccount('920000207040', 'SECURITY') # xt_trader为XtQuant API实例对象
|
|
|
+ # print('acc:', account.account_type, account.account_id)
|
|
|
+ # print("query asset:")
|
|
|
+ asset = xt_trader.query_stock_asset(account)
|
|
|
+ positions = xt_trader.query_stock_positions(account)
|
|
|
+ if asset:
|
|
|
+ print("asset:")
|
|
|
+ print(asset.account_type, asset.account_id, asset.cash, asset.frozen_cash, asset.market_value,
|
|
|
+ asset.total_asset)
|
|
|
+ # 开始交易
|
|
|
+ for i in new_keep_stock:
|
|
|
+ print(i)
|
|
|
+ price = get_bars(i.replace('SH', 'XSHG').replace('SZ', 'XSHE'), count=1, unit=fre, fields=['close'],
|
|
|
+ include_now=True).iloc[-1].at['close']
|
|
|
+ print('price:', price)
|
|
|
+ print(asset.cash / price)
|
|
|
+ if asset.cash > 2000:
|
|
|
+ volume = int((asset.cash / 2 / price) // 100 * 100)
|
|
|
+ print('volume:', volume)
|
|
|
+ order_id = xt_trader.order_stock(account, i, xtconstant.STOCK_BUY, volume, xtconstant.LATEST_PRICE, price, 'strategy1', 'order_test')
|
|
|
+ print(order_id)
|
|
|
+ # for i in positions:
|
|
|
+ # price = get_bars(i.replace('SH', 'XSHG').replace('SZ', 'XSHE'), count=1, unit=fre, fields=['close'],
|
|
|
+ # include_now=True).iloc[-1].at['close']
|
|
|
+ # if Sell_Trader(i):
|
|
|
+ # print('yao maihu de gupiao !!!!!!!!!!!', i.stock_code)
|
|
|
+ # order_id = xt_trader.order_stock(account, i, xtconstant.STOCK_SELL,
|
|
|
+ # 1000, xtconstant.FIX_PRICE, 10.90, 'strategy1', 'order_test')
|
|
|
+ # print(positions[1].stock_code, positions[1].volume)
|
|
|
+
|
|
|
+ print('今日成交:')
|
|
|
+ for trades in xt_trader.query_stock_trades(account):
|
|
|
+ print(trades.stock_code, trades.traded_volume, trades.traded_price)
|
|
|
+
|
|
|
+ positions = xt_trader.query_stock_positions(account)
|
|
|
+ print("positions:", len(positions))
|
|
|
+ if len(positions) != 0:
|
|
|
+ print("last position:")
|
|
|
+ print("{0} {1} {2}".format(positions[-1].account_id, positions[-1].stock_code, positions[-1].volume))
|
|
|
+
|
|
|
+ print(positions)
|
|
|
+ xt_trader.stop()
|
|
|
+
|
|
|
+def Sell_Trader(stock, account, positions, volume):
|
|
|
+ price = get_bars(stock, count=1, unit=fre, fields=['close'],
|
|
|
+ include_now=True).iloc[-1].at['close']
|
|
|
+ print(type(stock.replace('XSHG', 'SH').replace('XSHE', 'SZ')),stock.replace('XSHG', 'SH').replace('XSHE', 'SZ') )
|
|
|
+ order_id = xt_trader.order_stock(account, stock.replace('XSHG', 'SH').replace('XSHE', 'SZ'), xtconstant.STOCK_SELL,
|
|
|
+ volume, xtconstant.LATEST_PRICE, 0, 'strategy1', 'order_test')
|
|
|
+ print(order_id, i)
|
|
|
+
|
|
|
+
|
|
|
+while True:
|
|
|
+
|
|
|
+ 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:
|
|
|
+ # time.sleep(1800)
|
|
|
+ try:
|
|
|
+ account = StockAccount('920000207040', 'SECURITY') # xt_trader为XtQuant API实例对象
|
|
|
+ positions = xt_trader.query_stock_positions(account)
|
|
|
+ print(positions)
|
|
|
+ except BaseException:
|
|
|
+ continue
|
|
|
+ for i in positions:
|
|
|
+ # print(i.stock_code, i.volume)
|
|
|
+ volume = i.volume
|
|
|
+ stock = i.stock_code.replace('SH', 'XSHG').replace('SZ', 'XSHE')
|
|
|
+ df_stock = get_bars(stock, count=60, unit=fre,
|
|
|
+ fields=['date', 'open', 'close', 'high', 'low', 'volume'],
|
|
|
+ include_now=True, df=True)
|
|
|
+
|
|
|
+ price = df_stock.iloc[-1].at['close']
|
|
|
+ MA5_1 = df_stock['close'][-7:-2].mean()
|
|
|
+ MA5 = df_stock['close'][-6:-1].mean()
|
|
|
+ MA10 = df_stock['close'][-11:-1].mean()
|
|
|
+ MA20 = df_stock['close'][-21:-1].mean()
|
|
|
+ if price < MA5 or MA5 < MA5_1 or price > MA5 * 1.12:
|
|
|
+ print(MA5, MA5_1)
|
|
|
+ Sell_Trader(stock, account, positions, volume)
|
|
|
+
|
|
|
+
|
|
|
+ for fre in ['1d']:
|
|
|
+ print('开始:', fre)
|
|
|
+ results = []
|
|
|
+ try:
|
|
|
+ stock_pool = pd.read_sql_query(
|
|
|
+ 'select value from `%s`' % fre, engine_hlfx_pool)
|
|
|
+ stock_pool = stock_pool.iloc[-1, 0].split(",")
|
|
|
+ print(stock_pool)
|
|
|
+ except BaseException:
|
|
|
+ continue
|
|
|
+ for stock in stock_pool:
|
|
|
+ # print(stock)
|
|
|
+ try:
|
|
|
+ df_stock = get_bars(stock, count=60, unit=fre, fields=['date', 'open', 'close', 'high', 'low','volume'],
|
|
|
+ include_now=True, df=True)
|
|
|
+ price = df_stock.iloc[-1].at['close']
|
|
|
+ price_open = df_stock.iloc[-1].at['open']
|
|
|
+ MA5_1 = df_stock['close'][-7:-2].mean()
|
|
|
+ MA5 = df_stock['close'][-6:-1].mean()
|
|
|
+ MA10 = df_stock['close'][-11:-1].mean()
|
|
|
+ MA20 = df_stock['close'][-21:-1].mean()
|
|
|
+ # print(price,price_open, 'ma5_1:',MA5_1, 'ma5:', MA5,MA10)
|
|
|
+ if (price > price_open) & (price > MA5) & (MA5 > MA5_1) & (price < MA5 * 1.03) & (MA20 < MA10) \
|
|
|
+ & (df_stock.iloc[-1].at['volume'] > df_stock.iloc[-2].at['volume']):
|
|
|
+ print(stock)
|
|
|
+ results.append(stock)
|
|
|
+ elif price < MA5 or MA5<MA5_1 or price > MA5*1.09:
|
|
|
+ stock_pool.remove(stock)
|
|
|
+ print(stock, '已失败!')
|
|
|
+ except BaseException:
|
|
|
+ continue
|
|
|
+ results = list(set(results))
|
|
|
+ print(results)
|
|
|
+ now_time = dt.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
|
+ # results_list =','.join(results)
|
|
|
+ # print(fre, '\n', results_list)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if len(results) == 0:
|
|
|
+ continue
|
|
|
+ else:
|
|
|
+ num_industry = get_industry(results)
|
|
|
+ print(num_industry)
|
|
|
+ industry_list = []
|
|
|
+ for key in num_industry.values():
|
|
|
+ for key2 in key.values():
|
|
|
+ industry_list.append(key2['industry_name'])
|
|
|
+ industry_list = pd.value_counts(industry_list)
|
|
|
+ # 最热集中的n个板块
|
|
|
+ max_industry_list = list(industry_list[0:3].index)
|
|
|
+ results_industry = []
|
|
|
+ for key, value in num_industry.items():
|
|
|
+ for key2 in value.values():
|
|
|
+ if key2['industry_name'] in max_industry_list:
|
|
|
+ results_industry.append(key)
|
|
|
+ print('suoyou:', set(results_industry))
|
|
|
+ results_industry = ','.join(set(results_industry))
|
|
|
+ print(fre, '\n', results_industry)
|
|
|
+
|
|
|
+ sql = "INSERT INTO MA5_%s (date,value) VALUES('%s','%s')" % (fre, dt.now().strftime('%Y-%m-%d %H:%M:%S'),
|
|
|
+ results_industry)
|
|
|
+ cursor_pool.execute(sql)
|
|
|
+ db_pool.commit()
|
|
|
+
|
|
|
+ print(len(results_industry), results_industry)
|
|
|
+ print(dt.now(), '数据库数据已赋值!')
|
|
|
+
|
|
|
+ # 取值交易
|
|
|
+ engine_hlfx_pool = create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/hlfx_pool?charset=utf8')
|
|
|
+
|
|
|
+ # stocks = xtdata.get_stock_list_in_sector('沪深A股')
|
|
|
+ keep_stocks = pd.read_sql_query(
|
|
|
+ 'select value from `MA5_%s`' % fre, engine_hlfx_pool)
|
|
|
+ keep_stocks = keep_stocks.iloc[-1, 0].split(",")
|
|
|
+ new_keep_stock = [stock.replace('XSHG', 'SH').replace('XSHE', 'SZ') for stock in keep_stocks]
|
|
|
+ print(new_keep_stock)
|
|
|
+ price = get_bars(keep_stocks, count=1, unit=fre, fields=['close'])
|
|
|
+
|
|
|
+ XtTrader(new_keep_stock)
|
|
|
+ time.sleep(1800)
|
|
|
+ elif now_date > date_afternooe_end:
|
|
|
+ pass
|
|
|
+ # print("MA5_收盘了", now_date)
|
|
|
+ # break
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|