123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- 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!')
- # auth('18521506014', 'Abc123!@#')
- #启动交易系统
- path = 'c:\\qmt\\userdata_mini'
- # session_id为会话编号,策略使用方对于不同的Python策略需要使用不同的会话编号
- session_id = 20221123
- # 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 real_price(datas):
- return datas
- 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)
- xtdata.subscribe_whole_quote(new_keep_stock, callback=real_price)
- 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']
- datas = real_price()
- price = datas[i]['lastPrice']
- print('price:', price)
- exit()
- 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:
- # print('进入循环')
- stocks = xtdata.get_stock_list_in_sector('沪深A股')
- 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)
- # 后续的所有示例将使用该实例对象
- xt_trader = XtQuantTrader(path, session_id)
- xt_trader.start()
- connect_result = xt_trader.connect()
- xtdata.subscribe_whole_quote(stocks, callback=real_price)
- 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)
- 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']
- datas = real_price()
- price = datas[i.stock_code]['lastPrice']
- 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)
- # print('time=', df_stock.iloc[-1].at['date'])
- # price = df_stock.iloc[-1].at['close']
- datas = real_price()
- price = datas[i]['lastPrice']
- 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)
- xt_trader.run_forever()
- time.sleep(1800)
- elif now_date > date_afternooe_end:
- pass
- # print("MA5_收盘了", now_date)
- # break
|