开源小果通达信预警板块交易系统,我使用更多是文本预警交易系统
文章https://blog.csdn.net/qq_50882340/article/details/147212163?spm=1001.2014.3001.5502
略源代码,给我点赞,转发就可以
#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 '','',''