量化研究---开源强大小果qmt通达信预警板块交易系统

开源小果通达信预警板块交易系统,我使用更多是文本预警交易系统

量化研究---开源强大小果qmt通达信预警板块交易系统https://mp.weixin.qq.com/s/iIg1GtbNupW9Rt_rRUk52A策略源代码,给我点赞,转发就可以

#encoding:gbk
'''
小果通达信预警板块交易系统
原理读取通达信预警写入板块的数据,没有在持股的标的买入
支持自定义板块卖出
作者:小果
微信:15117320079
'''
import pandas as pd
import numpy as np
import talib
import os
import time 
from datetime import datetime
text={
	"账户":"",
	"账户支持融资融券":"账户支持融资融券,账户类型STOCK/CREDIT",
	"账户类型":"STOCK",
	"交易品种说明":"stock/fund/bond",
	"交易品种":['stock','fund','bond'],
	"是否测试说明":"测试会读取板块的数据分析,不测试直接清空自选股数据,等待最新的数据",
	"是否测试":"否",
	"是否开启临时id记录":"是",
	"通达信路径":"E:/tdx/T0002/blocknew",
	"自选股板块":"XGTDXYJ",
	"剔除预警标开头":['688','300'],
	"通达信卖出板块":"SELL",
	"交易模式说明":"金额/数量",
	"交易模式":"金额",
	"固定交易金额":1000,
	"固定交易数量":100,
	"特殊交易标的设置":"特殊交易标的设置",
	"特殊交易标的":[],
	"特殊交易标的固定交易金额":15000,
	"特殊交易标的固定交易数量":100,
	"持股限制":20,
	"时间设置":"时间设置********",
	"交易时间段":8,
	"交易开始时间":0,
	"交易结束时间":24,
	"是否参加集合竞价":"否",
	"开始交易分钟":0,
	
}
class a:
	pass
a.buy_id_list=[]
def init(c):
	#账户
	c.account=text['账户']
	#账户类型
	c.account_type=text['账户类型']
	if c.account_type=='stock' or c.account_type=='STOCK':
		c.buy_code=23
		c.sell_code=24
	else:
		#融资融券
		c.buy_code=33
		c.sell_code=34
	c.path=text['通达信路径']
	c.name=text['自选股板块']
	c.is_open=text['是否开启临时id记录']
	c.xg_tdx=xg_tdx(path=r'{}'.format(c.path))
	test=text['是否测试']
	if test=='是':
		print('开启测试模型,实盘记得关闭')
	else:
		del_all_tdx_stock(c)
	
	print(get_account(c,c.account,c.account_type))
	print(get_position(c,c.account,c.account_type))
	#循环模式3秒
	c.run_time("run_buy_func","1nSecond","2024-07-25 13:20:00")
	c.run_time("run_sell_func","2nSecond","2024-07-25 13:20:00")
	#定时清空数据
	c.run_time("del_all_tdx_stock","1nDay","2024-07-25 09:10:00")
	c.run_time("del_all_tdx_stock","1nDay","2024-07-25 15:10:00")
	run_sell_func(c)
def handlebar(c):
	pass
def del_all_tdx_stock(c):
	'''
	运行程序前清空通达信预警的数据
	'''
	name=text['自选股板块']
	sell_name=text['通达信卖出板块']
	c.xg_tdx.del_all_tdx_stock(name=name)
	print(name,'数据清空成功')
	c.xg_tdx.del_all_tdx_stock(name=sell_name)
	print(sell_name,'数据清空成功')
def get_price(c,stock):
	'''
	获取最新价格
	'''
	tick=c.get_full_tick(stock_code=[stock])
	tick=tick[stock]
	price=tick['lastPrice']
	return price
def select_data_type(stock='600031'):
	'''
	选择数据类型
	'''
	stock=str(stock)
	if stock[:2] in ['11','12'] or stock[:3] in ['123','110','113','123','127','128','118','132','120']:
		return 'bond'
	elif stock[:2] in ['51','15','50','16','18','52']:
		return 'fund'
	else:
		return 'stock'
def adjust_stock(stock='600031.SH'):
	'''
	调整代码
	'''
	if stock[-2:]=='SH' or stock[-2:]=='SZ' or stock[-2:]=='sh' or stock[-2:]=='sz':
		stock=stock.upper()
	else:
		if stock[:3] in ['600','601','603','605','688','689',
			] or stock[:2] in ['11','51','58']:
			stock=stock+'.SH'
		else:
			stock=stock+'.SZ'
	return stock
def get_buy_stock(c):
	'''
	获取买入股票池数据
	'''
	if check_is_trader_date_1():
		tarder_type=text['交易品种']
		del_list=text['剔除预警标开头']
		hold_limit=text['持股限制']
		#读取持股
		hold_stock=get_position(c,c.account,c.account_type)
		if hold_stock.shape[0]>0:
			hold_stock=hold_stock[hold_stock['持仓量']>=10]
			if hold_stock.shape[0]>0:
				hold_stock['品种']=hold_stock['证券代码'].apply(lambda x:select_data_type(x))
				hold_stock['选择']=hold_stock['品种'].apply(lambda x:'是' if x in tarder_type else '不是')
				hold_stock=hold_stock[hold_stock['品种']=='是']
				if hold_stock.shape[0]>0:
					hold_stock_list=hold_stock['证券代码'].tolist()
					hold_stock_amount=len(hold_stock_list)
				else:
					hold_stock_list=[]
					hold_stock_amount=0
			else:
				hold_stock_list=[]
				hold_stock_amount=0
		else:
			hold_stock_list=[]
			hold_stock_amount=0
		#读取通达信自选股
		df=c.xg_tdx.read_tdx_stock(name=c.name)
		print(df)
		if df.shape[0]>0:
			df['证券代码']=df['证券代码'].apply(lambda x: str(x)[1:])
			df['证券代码']=df['证券代码'].apply(lambda x:adjust_stock(x))
			df['品种']=df['证券代码'].apply(lambda x:select_data_type(x))
			df['选择']=df['品种'].apply(lambda x:'是' if x in tarder_type else '不是')
			df=df[df['选择']=='是']
			df['剔除']=df['证券代码'].apply(lambda x: '是' if x in del_list  else '不是')
			if df.shape[0]>0:
				df=df[df['剔除']=='不是']
				if df.shape[0]>0:
					tdx_stock_list=df['证券代码'].tolist()
					tdx_stock_amount=len(tdx_stock_list)
				else:
					tdx_stock_list=[]
					tdx_stock_amount=0
			else:
				tdx_stock_list=[]
				tdx_stock_amount=0
		else:
			tdx_stock_list=[]
			tdx_stock_amount=0
		#检查委托买入没有成交的也计算在持股里面
		order=get_order(c,c.account,c.account_type)
		if order.shape[0]>0:
			#操作类型48买入
			order=order[order['操作类型']==48]
			'''
			ENTRUST_STATUS_WAIT_REPORTING	49	待报
			ENTRUST_STATUS_REPORTED	50	已报(已报出到柜台,待成交)
			ENTRUST_STATUS_REPORTED_CANCEL	51	已报待撤(对已报状态的委托撤单吗,等待柜台处理撤单请求)
			ENTRUST_STATUS_PARTSUCC_CANCEL	52	部成待撤(已报到柜台,已有部分成交,已发出对剩余部分的撤单,待柜台处理撤单请求)
			ENTRUST_STATUS_PART_CANCEL	53	部撤(已报到柜台,已有部分成交,剩余部分已撤)
			ENTRUST_STATUS_CANCELED	54	已撤
			ENTRUST_STATUS_PART_SUCC	55	部成(已报到柜台,已有部分成交)
			ENTRUST_STATUS_SUCCEEDED	56	已成
			ENTRUST_STATUS_JUNK	57	废单(不符合报单条件,委托被打回,相关信息再委托的废单原因字段查看)
			'''
			#可以撤销没有成交的类型
			#52,53自己考虑有没有添加
			cacal_list=[49,50,51]
			if order.shape[0]>0:
				order['未成交']=order['委托状态'].apply(lambda x:'是' if x in cacal_list else '不是')
				order=order[order['未成交']=='是']
				if order.shape[0]>0:
					order_stock_list=order['证券代码'].tolist()
				else:
					order_stock_list=[]
			else:
				order_stock_list=[]
		else:
			order_stock_list=[]
		for stock in order_stock_list:
			hold_stock_list.append(stock)
		hold_stock_amount=len(hold_stock_list)
		#买入股票列表
		buy_stock_list=[]
		for stock in tdx_stock_list:
			if stock not in hold_stock_list:
				print('通达信预警{}没有在持股买入'.format(stock))
				buy_stock_list.append(stock)
			else:
				print('通达信预警{}持股不买入'.format(stock))
		buy_df=pd.DataFrame()
		buy_df['证券代码']=buy_stock_list
		buy_amount=hold_limit-hold_stock_amount
		if buy_amount>0:
			buy_amount=buy_amount
		else:
			print('超过持股限制{}不买入'.format(hold_limit))
		buy_df=buy_df[:buy_amount]
		print('买入股票池*******************')
		print(buy_df)
		return buy_df
	else:
		print('{} 目前不是交易时间'.format(datetime.now()))
		buy_df=pd.DataFrame()
		return buy_df
def run_buy_func(c):
	'''
	运行买入函数
	'''
	print('********************************************************')
	print('********************************************************')
	print('********************************************************')
	trader_models=text['交易模式']
	fix_value=text['固定交易金额']
	fix_amount=text['固定交易金额']
	sep_fix_value=text['特殊交易标的固定交易金额']
	sep_fix_amount=text['特殊交易标的固定交易数量']
	sep_stock_list=text['特殊交易标的']
	if check_is_trader_date_1():
		#先卖在买入
		buy_df=get_buy_stock(c)
		#买入
		if buy_df.shape[0]>0:
			for stock in buy_df['证券代码'].tolist():
				if stock  in sep_stock_list:
					print('{}在特殊标的里面*********'.format(stock))
					fix_value=sep_fix_value
					volume=sep_fix_amount
				else:
					fix_value=text['固定交易金额']
					volume=fix_amount
				print(stock,fix_value)
				if trader_models=='金额':
					print('{}金额交易模式*******'.format(stock))
					tader_type,amount,price=order_stock_value(c,c.account,c.account_type,stock,fix_value,'buy')
					print(tader_type,amount,price)
					if tader_type=='buy' and amount>=10 :
						if c.is_open=='是':
							if stock not in a.buy_id_list:
								passorder(c.buy_code, 1101, c.account, str(stock), 5, 0, amount, '买入小果通达信预警板块交易系统',1,'小果通达信预警板块交易系统',c)
								#passorder(23, 1101, c.account, str('513100.SH'), 5, 0, 100, '',1,'',c)
								print('{} 最新价格 买入{} 元'.format(stock,fix_value))
								a.buy_id_list.append(stock)
							else:
								print(stock,'在临时买入id里面不买入')
						else:
							passorder(c.buy_code, 1101, c.account, str(stock), 5, 0, amount, '买入小果通达信预警板块交易系统',1,'小果通达信预警板块交易系统',c)
							#passorder(23, 1101, c.account, str('513100.SH'), 5, 0, 100, '',1,'',c)
							print('{} 最新价格 买入{} 元'.format(stock,fix_value))
							a.buy_id_list.append(stock)
					else:
						print('{}金额交易模式买入不了*******'.format(stock))
				else:
					if c.is_open=='是':
						if stock not in a.buy_id_list:
							print('{}数量交易模式*******'.format(stock))
							passorder(c.buy_code, 1101, c.account, str(stock), 5, 0, volume, '买入小果通达信预警板块交易系统',1,'小果通达信预警板块交易系统',c)
							print('{} 最新价格 买入{} 数量'.format(stock,volume))
						else:
							print(stock,'在临时买入id里面不买入')
					else:
						print('{}数量交易模式*******'.format(stock))
						passorder(c.buy_code, 1101, c.account, str(stock), 5, 0, volume, '买入小果通达信预警板块交易系统',1,'小果通达信预警板块交易系统',c)
						print('{} 最新价格 买入{} 数量'.format(stock,volume))
						
		else:
			print('没有买入数据')
	else:
		print('{} 目前不少交易时间'.format(datetime.now()))
def get_sell_stock(c):
	'''
	获取卖出股票池数据
	'''
	name=text['通达信卖出板块']
	tarder_type=text['交易品种']
	df=c.xg_tdx.read_tdx_stock(name=name)
	if df.shape[0]>0:
		df['证券代码']=df['证券代码'].apply(lambda x: str(x)[1:])
		df['证券代码']=df['证券代码'].apply(lambda x:adjust_stock(x))
		tdx_stock_list=df['证券代码'].tolist()
		tdx_stock_amount=len(tdx_stock_list)
	else:
		tdx_stock_list=[]
		tdx_stock_amount=0
	hold_stock=get_position(c,c.account,c.account_type)
	if hold_stock.shape[0]>0:
		hold_stock=hold_stock[hold_stock['可用数量']>=10]
		if hold_stock.shape[0]>0:
			hold_stock['品种']=hold_stock['证券代码'].apply(lambda x:select_data_type(x))
			hold_stock['选择']=hold_stock['品种'].apply(lambda x:'是' if x in tarder_type else '不是')
			hold_stock['卖出']=hold_stock['证券代码'].apply(lambda x:'是' if x in tdx_stock_list else '不是')
			
			sell_df=hold_stock[hold_stock['卖出']=='是']
		else:
			sell_df=pd.DataFrame()
	else:
		sell_df=pd.DataFrame()
	return sell_df
			
def run_sell_func(c):
	'''
	运行卖出函数
	'''
	print('********************************************************')
	print('********************************************************')
	print('********************************************************')
	trader_models=text['交易模式']
	fix_value=text['固定交易金额']
	fix_amount=text['固定交易金额']
	sep_fix_value=text['特殊交易标的固定交易金额']
	sep_fix_amount=text['特殊交易标的固定交易数量']
	sep_stock_list=text['特殊交易标的']
	if check_is_trader_date_1():
		sell_df=get_sell_stock(c)
		if sell_df.shape[0]>0:
			for stock,hold_amount,av_amount in zip(sell_df['证券代码'],sell_df['持仓量'],sell_df['可用数量']):
				try:
					if av_amount>=10:
						print('{} 持有数量{} 可以数量{}大于0 卖出数量{}'.format(stock,hold_amount,av_amount,av_amount))
						passorder(c.sell_code, 1101,c.account, stock, 5, 0, av_amount, '卖出小果通达信预警板块交易系统',1,'小果通达信预警板块交易系统',c)
					else:
						print('{} 持有数量{} 可以数量{}等于0 卖出数量{} 不交易'.format(stock,hold_amount,av_amount,av_amount))
				except:
					print('{}卖出有问题'.format(stock))
		else:
			print('没有卖出的数据')
		
class xg_tdx:
	'''
	小果通达信自选股操作模型
	作者微信15117320079
	'''
	def __init__(self,path=r'E:\tdx\T0002\blocknew'):
			'''
			小果通达信自选股操作模型
			'''
			self.path=path

	def read_all_tdx_stock(self):
		'''
		读取全部的通达信板块
		'''
		try:
			all_path=os.listdir(r'{}'.format(self.path))
		except Exception as e:
			print(e,'通达信板块文件不存在')
			all_path=[]
		return all_path
	def creat_tdx_user_def_stock(self,name='CS_1'):
		'''
		建立通达信自定义自选股模块
		'''
		name_1='{}.blk'.format(name)
		path="{}\{}.blk".format(self.path,name)
		all_path=self.read_all_tdx_stock()
		if name_1 in all_path:
			print('{} 通达信自选股模块已经存在不建立'.format(name))
		else:
			with open(path, 'w', encoding='gbk') as file:
				file.writelines('')
				print('{} 通达信自选股板块建立成功'.format(name))
	def del_tdx_user_def_stock(self,name='CS'):
		'''
		删除自定义股票池板块
		'''
		name_1='{}.blk'.format(name)
		path="{}\{}.blk".format(self.path,name)
		all_path=self.read_all_tdx_stock()
		if name_1 in all_path:
			os.remove(path=path)
			print('自定义模块{}删除成功'.format(name))
		else:
			print(name_1,'不存在')
	def adjust_stock(self,stock='600031.SH'):
		'''
		调整代码
		'''
		if stock[:3] in ['600','601','603','605','688','689',
				] or stock[:2] in ['11','51','58']:
			stock="1{}".format(stock)
		else:
			stock="0{}".format(stock)
		return stock
	def read_tdx_stock(self,name='CS'):
		'''
		读取通达信板块成分股
		'''
		path="{}\{}.blk".format(self.path,name)
		try:
			stock_list=[]
			with open(r'{}'.format(path)) as p:
				com=p.readlines()
				for stock in com:
					if len(stock)>=6:
						stock=stock.replace("\n", "")
						stock_list.append(stock)
			df=pd.DataFrame()
			df['证券代码']=stock_list
			
		except Exception as e:
			print(e,'通达信路径有问题可能不存在',path)
			df=pd.DataFrame()
		return df
	def read_tdx_stock_user_path(self,path=''):
		'''
		读取通达信自定义板块数据
		'''
		try:
			stock_list=[]
			with open(r'{}'.format(path)) as p:
				com=p.readlines()
				for stock in com:
					if len(stock)>=6:
						stock=stock.replace("\n", "")
						stock_list.append(stock)
			df=pd.DataFrame()
			df['证券代码']=stock_list
			
		except Exception as e:
			print(e,'通达信路径有问题可能不存在',path)
			df=pd.DataFrame()
		return df
	def add_tdx_stock(self,name='CS',stock='000001'):
		'''
		把股票添加到通达信自选股
		'''
		stock=self.adjust_stock(stock)
		name_1='{}.blk'.format(name)
		path="{}\{}.blk".format(self.path,name)
		all_path=self.read_all_tdx_stock()
		if name_1 in all_path:
			pass
		else:
			self.creat_tdx_user_def_stock(name=name)
			print(name,'自选股不存在建立')
		df=self.read_tdx_stock(name=name)
		if df.shape[0]>0:
			stock_list=df['证券代码'].tolist()
		else:
			print('{}自定义没有数据'.format(name))
			stock_list=[]
		if stock in stock_list:
			print('{} 在自选股{} 不添加'.format(stock,name))
		else:
			stock_list.append(stock)
			with open(path, 'w', encoding='gbk') as file:
				for stock in stock_list:
					file.writelines(str(stock)+'\n')
					print('{} 添加到自选股{}成功'.format(stock,name))
			
				
	def add_tdx_stock_list(self,name='CS',user_stock_list=['000001']):
		'''
		批量添加股票池到自选股
		'''
		name_1='{}.blk'.format(name)
		path="{}\{}.blk".format(self.path,name)
		all_path=self.read_all_tdx_stock()
		if name_1 in all_path:
			pass
		else:
			self.creat_tdx_user_def_stock(name=name)
			print(name,'自选股不存在建立')
		df=self.read_tdx_stock(name=name)
		if df.shape[0]>0:
			stock_list=df['证券代码'].tolist()
		else:
			print('{}自定义没有数据'.format(name))
			stock_list=[]
		for stock in user_stock_list:
			stock=self.adjust_stock(stock)
			if stock in stock_list:
				print('{} 在自选股{} 不添加'.format(stock,name))
			else:
				stock_list.append(stock)
		with open(path, 'w', encoding='gbk') as file:
			for stock in stock_list:
				file.writelines(str(stock)+'\n')
				print('{} 添加到自选股{}成功'.format(stock,name))
	def del_tdx_stock(self,name='CS',stock='000001'):
		'''
		删除通达信自选股成分股
		'''
		stock=self.adjust_stock(stock)
		name_1='{}.blk'.format(name)
		path="{}\{}.blk".format(self.path,name)
		all_path=self.read_all_tdx_stock()
		if name_1 in all_path:
			df=self.read_tdx_stock(name=name)
			if df.shape[0]>0:
				stock_list=df['证券代码'].tolist()
			else:
				print('{}自定义没有数据'.format(name))
				stock_list=[]
			if len(stock_list)>0:
				if stock in stock_list:
					stock_list.remove(stock)
					print('{} 删除自选股{}成功'.format(stock,name))
				else:
					print('{}不在{}自选股不能删除'.format(stock,name))
			else:
				print('{} 自选股没有数据'.format(name))
			with open(path, 'w', encoding='gbk') as file:
				for stock in stock_list:
					file.writelines(str(stock)+'\n')
		else:
			print('{} 自选股不存在'.format(name))
	def del_tdx_stock_list(self,name='CS',user_stock_list=['000001']):
		'''
		批量删除通达信自选股成分股
		'''
		name_1='{}.blk'.format(name)
		path="{}\{}.blk".format(self.path,name)
		all_path=self.read_all_tdx_stock()
		if name_1 in all_path:
			df=self.read_tdx_stock(name=name)
			if df.shape[0]>0:
				stock_list=df['证券代码'].tolist()
			else:
				print('{}自定义没有数据'.format(name))
				stock_list=[]
			if len(stock_list)>0:
				for stock in user_stock_list:
					stock=self.adjust_stock(stock)
					if stock in stock_list:
						stock_list.remove(stock)
						print('{} 删除自选股{}成功'.format(stock,name))
					else:
						print('{}不在{}自选股不能删除'.format(stock,name))
			else:
				print('{} 自选股没有数据'.format(name))
			with open(path, 'w', encoding='gbk') as file:
				for stock in stock_list:
					file.writelines(str(stock)+'\n')
					print('{} 从板块{}删除成功'.format(stock,name))
		else:
			print('{} 自选股不存在'.format(name))
				
	def del_all_tdx_stock(self,name='CS'):
		'''
		清空通达信自选股股票
		'''
		name_1='{}.blk'.format(name)
		path="{}\{}.blk".format(self.path,name)
		all_path=self.read_all_tdx_stock()
		if name_1 in all_path:
			stock_list=[]
			with open(path, 'w', encoding='gbk') as file:
				for stock in stock_list:
					file.writelines(str(stock)+'\n')
			print('{}全部板块内容清空成功'.format(name))
		else:
			print('{} 自选股不存在'.format(name))
def check_is_trader_date_1():
	'''
	检测是不是交易时间
	'''
	trader_time=text['交易时间段']
	start_date=text['交易开始时间']
	end_date=text['交易结束时间']
	start_mi=text['开始交易分钟']
	jhjj=text['是否参加集合竞价']
	if jhjj=='是':
		jhjj_time=15
	else:
		jhjj_time=30
	loc=time.localtime()
	tm_hour=loc.tm_hour
	tm_min=loc.tm_min
	wo=loc.tm_wday
	if wo<=trader_time:
		if tm_hour>=start_date and tm_hour<=end_date:
			if tm_hour==9 and tm_min<jhjj_time:
				return False
			
			elif tm_min>=start_mi:
				return True
			else:
				return False
		else:
			return False    
	else:
		print('周末')
		return False
#获取账户总权益m_dBalance
def get_account(c,accountid,datatype):
	'''
	获取账户数据
	'''
	accounts = get_trade_detail_data(accountid, datatype, 'account')
	result={}
	for dt in accounts:
		result['总资产']=dt.m_dBalance
		result['净资产']=dt.m_dAssureAsset
		result['总市值']=dt.m_dInstrumentValue
		result['总负债']=dt.m_dTotalDebit
		result['可用金额']=dt.m_dAvailable
		result['盈亏']=dt.m_dPositionProfit
	return result
#获取持仓信息{code.market:手数}
def get_position(c,accountid,datatype):
	'''
	获取持股数据
	'''
	positions = get_trade_detail_data(accountid,datatype, 'position')
	data=pd.DataFrame()
	print('持股数量{}'.format(len(positions)))
	if len(positions)>0:
		df=pd.DataFrame()
		try:
			for dt in positions:
				df['股票代码']=[dt.m_strInstrumentID]
				df['市场类型']=[dt.m_strExchangeID]
				df['证券代码']=df['股票代码']+'.'+df['市场类型']
				df['证券名称']=[dt.m_strInstrumentName]
				df['持仓量']=[dt.m_nVolume]
				df['可用数量']=[dt.m_nCanUseVolume]
				df['成本价']=[dt.m_dOpenPrice]
				df['市值']=[dt.m_dInstrumentValue]
				df['持仓成本']=[dt.m_dPositionCost]
				df['盈亏']=[dt.m_dPositionProfit]
				data=pd.concat([data,df],ignore_index=True)
			
		except Exception as e:
			print('获取持股隔离股票池有问题')
			data=pd.DataFrame()
	else:
		data=pd.DataFrame()
	return data 
def get_order(c,accountid,datatype):
	'''
	获取委托
	'''
	data=pd.DataFrame()
	orders = get_trade_detail_data(accountid,datatype, 'order')
	print('委托数量{}'.format(len(orders)))
	if len(orders)>0:
		df=pd.DataFrame()
		for o in orders:
			df['股票代码']=[o.m_strInstrumentID]
			df['市场类型']=[o.m_strExchangeID]
			df['证券代码']=df['股票代码']+'.'+df['市场类型']
			df['买卖方向']=[o.m_nOffsetFlag]
			df['委托数量']=[o.m_nVolumeTotalOriginal]
			df['成交均价']=[o.m_dTradedPrice]
			df['成交数量']=[o.m_nVolumeTraded]
			df['成交金额']=[o.m_dTradeAmount]
			df['投资备注']=[o.m_strRemark]
			df['委托状态']=[o.m_nOrderStatus]
			df['操作类型']=[o.m_nOffsetFlag]
			data=pd.concat([data,df],ignore_index=True)
	else:
		data=pd.DataFrame()
	return data
def get_deal(c,accountid,datatype):
	'''
	获取成交
	'''
	data=pd.DataFrame()
	deals = get_trade_detail_data(account, 'stock', 'deal')
	print('成交数量{}'.format(len(deals)))
	if len(deals):
		df=pd.DataFrame()
		for dt in deals:
			df['股票代码']=[dt.m_strInstrumentID]
			df['市场类型']=[dt.m_strExchangeID]
			df['证券代码']=df['股票代码']+'.'+df['市场类型']
			df['证券名称']=[dt.m_strInstrumentName]
			df['买卖方向']=[dt.m_nOffsetFlag]
			df['成交价格']=[dt.m_dPrice]
			df['成交数量']=[dt.m_nVolume]
			df['成交金额']=[dt.m_dTradeAmount]
			data=pd.concat([data,df],ignore_index=True)
	else:
		data=pd.DataFrame()
def order_stock_value(c,accountid,datatype,stock,value,trader_type):
	'''
	价值下单函数
	'''
	price=get_price(c,stock)
	hold_stock=get_position(c,accountid,datatype)
	if hold_stock.shape[0]>0:
		hold_stock=hold_stock[hold_stock['持仓量']>=10]
		if hold_stock.shape[0]>0:
			hold_df=hold_stock[hold_stock['证券代码']==stock]
			if hold_df.shape[0]>0:
				hold_amount=hold_df['持仓量'].tolist()[-1]
				av_amount=hold_df['可用数量'].tolist()[-1]
			else:
				hold_amount=0
				av_amount=0
		else:
			hold_amount=0
			av_amount=0
	else:
		hold_amount=0
		av_amount=0
	account=get_account(c,accountid,datatype)
	av_cash=account['可用金额']
	amount=value/price
	if str(stock)[:2] in ['11','12']:
		amount=int(amount/10)*10
	else:
		amount=int(amount/100)*100
	if trader_type=='buy':
		if av_cash>=value and amount>=10:
			print('金额下单可以资金{}大于买入金额{} 买入{} 价格{} 数量{}'.format(av_cash,value,stock,price,amount))
			return 'buy',amount,price
		else:
			print('金额下单可以资金{}小于买入金额{} 不买入{} 价格{} 数量{}'.format(av_cash,value,stock,price,amount))
			return '','',price 
	elif trader_type=='sell':
		if av_amount>=amount and amount>=10:
			print('金额下单 持有数量{} 可用数量{} 大于卖出数量{} 卖出{} 价格{} 数量{}'.format(hold_amount,av_amount,amount,stock,price,amount))
			return 'sell',amount,price
		elif av_amount<amount and av_amount>=10:
			print('金额下单 持有数量{} 可用数量{} 小于卖出数量{},可以数量大于10 卖出{} 价格{} 数量{}'.format(hold_amount,av_amount,amount,stock,price,amount))
			return 'sell',amount,price
		else:
			print('金额下单 持有数量{} 可用数量{} 小于卖出数量{},不卖出{} 价格{} 数量{}'.format(hold_amount,av_amount,amount,stock,price,amount))
			return 'sell',amount,price
	else:
		print('金额下单未知的交易类型{}'.format(stock))
		return '',amount,price
def order_target_amount(c,accountid,datatype,stock,price,target_amount,com_ratio=0.0001):
	'''
	目标交易数量
	'''
	account=get_account(c,accountid,datatype)
	#可以使用的现金
	av_cash=account['可用金额']
	position=get_position(c,accountid,datatype)
	if position.shape[0]>0:
		position[position['持仓量']>=10]
		if position.shape[0]>0:
			hold_amount=position['持仓量'].tolist()[-1]
			av_amount=position['可用数量'].tolist()[-1]
		else:
			hold_amount=0
			av_amount=0
	else:
		hold_amount=0
		av_amount=0
	#可以交易的数量
	av_trader_amount=target_amount-hold_amount
	#存在买入空间
	if av_trader_amount>=10:
		#买入的价值
		value=av_trader_amount*price
		#手续费
		com=value*com_ratio
		if av_cash>=value+com:
			print('{} 目标数量{} 持有数量{} 可用数量{} 买入数量{} 可用资金{} 大于买入资金{} 买入'.format(stock,target_amount,hold_amount,av_amount,av_trader_amount,av_cash,value))
			return 'buy',price,av_trader_amount
		else:
			print('{} 目标数量{} 持有数量{} 可用数量{} 买入数量{} 可用资金{} 小于买入资金{} 不买入'.format(stock,target_amount,hold_amount,av_amount,av_trader_amount,av_cash,value))
			return '',price,av_trader_amount
	elif av_trader_amount<=-10:
		av_trader_amount=abs(av_trader_amount)
		if av_amount>=av_trader_amount:
			print('{} 目标数量{} 持有数量{} 可用数量{}大于 卖出数量{} 卖出'.format(stock,target_amount,hold_amount,av_amount,av_trader_amount))
			return 'sell',price,-av_trader_amount
		else:
			print('{} 目标数量{} 持有数量{} 可用数量{}小于 卖出数量{} 卖出全部'.format(stock,target_amount,hold_amount,av_amount,av_trader_amount))
			return 'sell',price,-av_amount
	else:
		print('{} 目标数量{} 持有数量{}一样不交易'.format(stock,target_amount,hold_amount))
		return '','',''

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xg_quants1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值