def get_code(): r = ts.RemoteCallFunc('Option_Contract', {}, {}) print(r[1]) return tsbytestostr(r[1])
def getTSdata_day(sdate, edate, stockID, cy): '''通过天软获取日线''' d2 = ts.RemoteCallFunc('MyGetTimeSeries', [sdate, edate, stockID, cy], {}) if d2[0] == 0: return d2[1] else: print(d2[2]) # 搞成天软格式的时间 # 起始日 sdate = ts.EncodeDate(2017, 6, 4) # 终止日 edate = ts.EncodeDate(2018, 6, 4) # 天软时间变正常时间 # ts.DecodeDate(43200) # stock1='IC01' # 天软里面的当月连续 # stock2='IC02' # 天软里面的次月连续 # # 获取期货合约代码 # 周期 cy = '1分钟线'
setsysparam(pn_date(),inttodate({0})); return Query("A股","",True,"","代码",DefaultStockID(), "名称",CurrentStockName(), "最高价",high(), "最低价",low(), "昨收",StockPrevClose3(), "收盘价",close(), "开盘价",open(), "涨幅(%)",StockZf3(), "换手率(%)",StockHsl3(), "量比",volrate(), "对数收益率(%)",StockLnZf3(), "是否下跌",IsDown(), "是否上涨",IsUp(), "是否平盘",IsEqual(), "指定日是否一字涨停({1})",StockIsZt2(42466), "指定日是否一字跌停({2})",StockIsDt2(42437), "是否涨停({3})",StockIsZt(38450), "是否跌停({4})",StockIsDt(38450), "是否曾经涨停({5})",StockIsCJZt(38450), "是否曾经跌停({6})",StockIsCJDt(38450), "最新总市值(万)",StockTotalValue3(), "最新流通市值(万)",StockMarketValue3(), "市盈率(最近12个月)(类型=0)",StockPE3_V(0), "市盈率(专用)(类型=0)",StockPE3_IV(0), "市净率(最新财务数据)",StockPNA3_II()); """.format(date, date, date, date, date, date, date) d2 = TSLPy3.RemoteExecute(t1, {})[1] df5 = change_code(pd.DataFrame(d2))
# -*- coding: utf-8 -*- # @Time : 2018/12/20 16:07 # @Author : Big Huang # @Email : [email protected] # @File : tslfun.py # @Software: PyCharm import pandas as pd import sys import datetime sys.path.append(r"E:\software\Analyse.NET") import TSLPy3 as ts ts.ConnectServer("tsl.tinysoft.com.cn", 443) dl = ts.LoginServer("indexsh","888888") #Tuple(ErrNo,ErrMsg) 登陆用户 assert dl[0] == 0 print("登陆成功") print("服务器设置:", ts.GetService()) ts.SetComputeBitsOption(64) # 设置计算单位 print("计算位数设置:", ts.GetComputeBitsOption()) def tsl_fun(start_date: datetime.datetime, end_date:datetime.datetime): start_date_str = start_date.strftime("%Y-%m-%d") end_date_str = end_date.strftime("%Y-%m-%d") # data = ts.RemoteExecute("return 'return a string';",{}) #执行一条语句 data = ts.RemoteCallFunc("big", [start_date_str, end_date_str, "SH000050"], {}) df = pd.DataFrame(data[1]) df.columns = df.columns.map(lambda x: x.decode("gbk")) for col, dtype in df.dtypes.iteritems(): if dtype.name == "object": df[col] = df[col].str.decode("gbk")
def getTickDetails(self, BegDate, EndDate, contract_code, symbol): # tick_details = pd.DataFrame(self.tsbytestostr(ts.RemoteExecute( '''a:=select ["StockID"],["StockName"],["date"],["price"],["vol"],["amount"],["cjbs"],["yclose"],["syl1"],["syl2"],["buy1"],["sale1"],["bc1"],["sc1"] from tradetable datekey %s+21/24 to %s+16/24 of '%s' end;b:=update a set ['date']=datetimetostr(['date']) end;return a;''' % ( # ts.LocalCallFunc("StrToDate", [BegDate])[1], ts.LocalCallFunc("StrToDate", [EndDate])[1], contract_code),{}))[1]) # tick_details.to_csv('%s%s_%s.csv'%(path,symbol,EndDate),index=False) # return tick_details # tick_details = pd.DataFrame(self.tsbytestostr(ts.RemoteExecute( # '''a:=select ["StockID"],["StockName"],["date"],["price"],["vol"],["amount"],["cjbs"],["yclose"],["syl1"],["syl2"],["buy1"],["sale1"],["bc1"],["sc1"] from tradetable datekey %s+21/24 to %s+16/24 of '%s' end;b:=update a set ['date']=datetimetostr(['date']) end;return a;''' % ( # ts.LocalCallFunc("StrToDate", [BegDate])[1], ts.LocalCallFunc("StrToDate", [EndDate])[1], contract_code), # {}))[1]) if self.mc is None: # self.mc = mongodb_client() self.mc.dbConnect() # dateList=self.getTradeDays( # (datetime.datetime.strptime(BegDate, '%Y-%m-%d') - datetime.timedelta(3)).strftime('%Y-%m-%d'), EndDate) # BegDateAdj=dateList[max(0,dateList.index(BegDate)-1)] tick_dict = self.tsbytestostr( ts.RemoteExecute( '''a:=select ["StockID"],["StockName"],["date"],["price"],["vol"],["amount"],["cjbs"],["yclose"],["syl1"],["syl2"],["buy1"],["sale1"],["bc1"],["sc1"] from tradetable datekey %s to %s+0.9999999 of '%s' end;b:=update a set ['date']=datetimetostr(['date']) end;return a;''' % (ts.LocalCallFunc("StrToDate", [BegDate])[1], ts.LocalCallFunc("StrToDate", [EndDate])[1], contract_code), {}))[1] # datetime.datetime.strptime(tick_dict['date'][0], '%Y-%m-%d %H:%M:%S').replace(microsecond=500000) last_tick_datetime = None count = 0 for d in tick_dict: tick = CtaTickData() tick.vtSymbol = d['StockName'] tick.symbol = d['StockID'] # 合约代码 CF1705 StockID # tick.exchange = EMPTY_STRING # 交易所代码 # 成交数据 tick.lastPrice = d['price'] # 最新成交价 tick.volume = d['vol'] #最新成交量 tick.amount = d['amount'] # 成交金额 tick.cjbs = d['cjbs'] # 周期内成交笔数 tick.yclose = d['yclose'] # 上一收盘价 tick.preSettlement = d['syl2'] # 上一日结算价 # tick的时间 # 转换为datetime格式 try: if len(d['date']) > 10: tick.datetime = datetime.datetime.strptime( d['date'], '%Y-%m-%d %H:%M:%S') # python的datetime时间对象 else: tick.datetime = datetime.datetime.strptime( d['date'], '%Y-%m-%d') tick.date = tick.datetime.strftime('%Y-%m-%d') # 日期 tick.time = tick.datetime.strftime('%H:%M:%S') # 时间 # tick.tradingDay = d['price'] # 交易日期 except Exception as ex: # 抛弃本tick print('日期转换错误:%s,error:%s' % (d['date'], ex)) continue # 1档行情 tick.bidPrice1 = d['buy1'] tick.askPrice1 = d['sale1'] tick.bidVolume1 = d['bc1'] tick.askVolume1 = d['sc1'] # 修正毫秒 if tick.datetime.replace(microsecond=0) == last_tick_datetime: # 与上一个tick的时间(去除毫秒后)相同,修改为500毫秒 tick.datetime = tick.datetime.replace(microsecond=500000) tick.time = tick.datetime.strftime('%H:%M:%S.%f') else: tick.datetime = tick.datetime.replace(microsecond=0) tick.time = tick.datetime.strftime('%H:%M:%S.%f') # 记录最新tick的时间 last_tick_datetime = tick.datetime if symbol == 'TC': symbol = 'ZC' if symbol == 'RO': symbol = 'OI' if symbol == 'ER': symbol = 'RI' if symbol == 'WS': symbol = 'WH' if symbol == 'ME': symbol = 'MA' self.mc.dbInsert('FUTURE_TICK_DB', 'TS_%s_TickDatas' % symbol, d=tick.__dict__) count = count + 1 print('写入合约%s完成,共%d条' % (contract_code, count)) return
def __enter__(self): if ts.Logined() is False: print('天软未登陆或客户端未打开,将执行登陆操作') self.__tsLogin() return self
def __exit__(self, *arg): ts.Disconnect() print('天软连接断开')
def decode_date(dt): dt_decode = tsl.DecodeDate(dt) return pd.Timestamp(*dt_decode)
def run_script(script, sysparams): data = tsl.RemoteExecute(script, sysparams) return data
def __exit__(self, *arg): ts.Disconnect()
def encode_datetime(dt): return tsl.EncodeDateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, 0)
def __enter__(self): if ts.Logined() is False: self.__tsLogin() return self
def TSDate(Y, M, D): d = tp.EncodeDate(Y, M, D) return d
import os import sys sys.path.append("C:\Program Files\Tinysoft\Analyse.NET") import traceback import pickle import datetime # from WindPy import * # 实际上我有这个模块的,但是pycharm找不到,我也没办法 import TSLPy3 as ts ts.DefaultConnectAndLogin("test") #调用函数登陆 def tsbytestostr(data): "把gbk的字符转化为uft的字符" if (isinstance(data, (tuple)) or isinstance(data, (list))): lendata = len(data) ret = [] for i in range(lendata): ret.append(tsbytestostr(data[i])) elif isinstance(data, (dict)): lendata = len(data) ret = {} for i in data: ret[tsbytestostr(i)] = tsbytestostr(data[i])
def autoOrder(): now = datetime.datetime.now() hour = int(now.strftime("%H%M")) #if hour > 1500 or hour < 930: # print('autoOrder not running time :' + str(hour)) # return #dayOfWeek = int(now.strftime("%w")) #if dayOfWeek == 0 or dayOfWeek == 6: # print('autoOrder not running day :' + str(dayOfWeek)) # return date = now.strftime("%Y-%m-%d") orderRuleList = OrderRule.objects.using('stockdb').filter( isvalid="1", expiretime__gt=date + ' 23:59:59') orderLogNewList = [] url = "http://47.100.100.244:3000/stock/publish?message=" message = "" for orderRule in orderRuleList: try: #判断当天该股票是否已经自动下单 orderLog = OrderLog.objects.filter(datetime__contains=date, stockId=orderRule.stockId) print(orderRule.stockId) if orderLog: print('already order') continue #判断因子是否达标 isMatch = matchRule(orderRule, date) print(isMatch) if not isMatch: continue #获取实时价格,获取失败时不发送信息 orderPrice = orderRule.orderPrice if orderPrice == 0.00: returnData = TSLPy3.RemoteCallFunc("stock_realtime_data", [orderRule.stockId], {}) if returnData[0] == 0: orderPrice = returnData[1][b'close'] else: print(returnData[2].decode('gbk')) continue #拼装消息字符串 stockMessage = "b," + orderRule.stockId[2:] + ',' + str( orderPrice) + ',' + str(orderRule.orderQuantity) if message == '': message = stockMessage else: message = message + ";" + stockMessage #初始化下单日志对象 orderLogNew = OrderLog(datetime=datetime.datetime.now().strftime( "%Y-%m-%d %H:%M:%S.%f"), stockId=orderRule.stockId, stockName=orderRule.stockName, orderPrice=orderPrice, orderQuantity=orderRule.orderQuantity, request=stockMessage, response=str(orderRule.id)) orderLogNewList.append(orderLogNew) except KeyError: break print(url + message) #消息不为空时发送消息 if message != '': req = Request(url + message) response = urlopen(req) responseData = response.read().decode('utf-8') if responseData.find("发布消息成功") != -1: #发送成功将规则设置为失效,并更新日志的返回信息字段 for log in orderLogNewList: rule = OrderRule.objects.using('stockdb').get( id=int(log.response)) rule.isvalid = '0' rule.ordertime = log.datetime rule.save() log.response = responseData OrderLog.objects.bulk_create(orderLogNewList) insertTaskLog(now.strftime("%Y-%m-%d %H:%M:%S.%f"), datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f"), 'autoOrderRule', 'success', '', 0)
def m_options_daily_market(date): d = ts.RemoteCallFunc("m_options_daily_market", [date], {}) return (tsbytestostr(d[1]))
def getData(sDate, intervel, sContract): #intervel 表示数据间隔要5秒的,还是一分钟数据,还是日线数据 e.g "5s" #contract 合约名称 e.g "sc" try: os.makedirs('E:\CLionProjects\HedgeArbitrage/data') except: pass while True: ts.ConnectServer('211.100.23.205', 443) ts.LoginServer('fuchunguang', 'Fcg=888888') if ts.Logined() == True: print('already login') daycount = 0 for code in sContract: hdateInfo = {} notNullcounter = 0 for date in sDate: daycount += 1 if intervel == '1m': temp1 = 'cy_1m()' temp2 = 240 elif intervel == '5s': temp1 = 'cy_5s()' temp2 = 2880 sql = 'setsysparam(pn_stock(),\'{}\');' \ 'setsysparam(PN_Cycle(), {});setsysparam(pn_date(),inttodate({}));' \ 'return nday({},"mdate",datetimetostr(sp_time()),"open",Open(),"high",High(),"low",Low(),"close",Close(),"vol",Vol(),"amount",Amount());' \ .format(code, temp1,date, temp2) result = (ts.RemoteExecute(sql, {}))[1] if result: for data in result: temp = data[b'mdate'].decode('gbk').replace( ':', '').replace('-', '').replace(' ', '') if len(temp) < 14: temp += '0' * (14 - len(temp)) if int(sDate[0]) <= int(temp[:8]) <= int( sDate[-1]): notNullcounter += 1 hdateInfo[temp] = [ data[b'open'], data[b'high'], data[b'low'], data[b'close'], data[b'vol'], data[b'amount'] ] print(temp) # print('{},{},{},{},{},{},{},{}\n'.format(code, # temp, # data[b'open'], # data[b'high'], # data[b'low'], # data[b'close'], # data[b'vol'], # data[b'amount'])) if notNullcounter: with open( 'E:\CLionProjects\HedgeArbitrage/data/{}_{}.js'. format(code, intervel), 'w') as f: json.dump(hdateInfo, f) ts.Disconnect() break else: print('not login ') return 0
def get_date_option(code, date): d = ts.RemoteCallFunc("Option_byDateFuture", [code, date], {}) return (tsbytestostr(d[1]))
def __tsLogin(self): ts.ConnectServer("tsl.tinysoft.com.cn", 443) dl = ts.LoginServer("fzzqjyb", "fz123456") print('天软登陆成功')
def getTradeDays(self, start, end): daysList = self.tsbytestostr( ts.RemoteExecute( "begt:=strtodate('%s');endt:=strtodate('%s');return datetostr(spec(specdate(nday3(tradedays(begt,endt),sp_time()),endt),'SH000001'));" % (start, end), {})) return daysList[1]
return d2[1] else: print(d2[2]) if __name__ == '__main__': cy = '日线' dfcode = pd.read_excel('stockcode.xlsx') stockcode = dfcode['代码'].tolist() # 搞成天软格式的时间 # 起始日 sdate = ts.EncodeDate(2017, 1, 1) # 终止日 edate = ts.EncodeDate(2019, 10, 20) # 获取交易日序列 dateS = getTSdate(sdate, edate) # 解析结果的list s2_close = [] s2_low = [] s2_datetime = [] s2_high = [] s2_code = [] df2 = pd.DataFrame() # 整理所有数据
def update_rank(self): tsl = tslFunctions() tsl.tsl_login() # conn_Local=create_engine(str(r"mysql+pymysql://root:xxxx@localhost:3306/test")) conn_Local = create_engine( str(r"mysql+pymysql://root:[email protected]:3306/test")) self.__start=(dt.parser.parse(str(pd.read_sql("select max(截止日) from rank_raw",con=conn_Local\ ).values[0][0]))+datetime.timedelta(days=1)).strftime('%Y-%m-%d') tradedaysList = tsl.getTradeDays(self.__start, self.__end) print(tradedaysList) if len(tradedaysList) == 0: print("已经更新至最新日期%s" % self.__end) return for tday in tradedaysList: update_rank_raw = pd.DataFrame( tsl.tsbytestostr( ts.RemoteExecute( f'''endt:={tday.replace('-','')+'T'}; X:=GetFuturesID('',endt); r:=array(); for i:=0 to length(X)-1 do begin SetSysParam(PN_Stock(),x[i]); Ret:= GetFuturesTradeRankingByDate(endt,t); r&=t; end; return r;''', {})[1])) if len(update_rank_raw) == 0: print("No Datas") else: print(tday) #can_l=update_cangdan_raw.截止日.unique()#记录下返回表的所有日期 update_rank_raw['utime'] = datetime.datetime.now() update_rank_raw['机构简称2'] = update_rank_raw['机构简称'].apply(name) update_rank_raw['code'] = update_rank_raw.代码.apply( lambda x: re.split('\d+', x.upper())[0]) update_rank_raw.to_sql('rank_raw', conn_Local, if_exists='append', index=False, chunksize=5000) #update_rank_raw.dropna(axis=1, inplace=True) duo = update_rank_raw.loc[update_rank_raw.排名类型 == '持买单量排名'] kong = update_rank_raw.loc[update_rank_raw.排名类型 == '持卖单量排名'] rlt_duo = duo.groupby(['code', '截止日', '机构简称'], as_index=False)['数量', '比上交易日增减'].sum() rlt_duo['rename'] = rlt_duo['机构简称'].apply(name) rank_duo = rankk(rlt_duo) rank_duo.columns = [ 'code', 'date', 'name', 'value', 'change', 'rename', 'rank' ] rank_duo.to_sql('rank_long', conn_Local, if_exists='append', index=False, chunksize=5000) rlt_kong = kong.groupby(['code', '截止日', '机构简称'], as_index=False)['数量', '比上交易日增减'].sum() rlt_kong['rename'] = rlt_kong['机构简称'].apply(name) rank_kong = rankk(rlt_kong) rank_kong.columns = [ 'code', 'date', 'name', 'value', 'change', 'rename', 'rank' ] rank_kong.to_sql('rank_short', conn_Local, if_exists='append', index=False, chunksize=5000) ts.Disconnect()