def HistoryWeiTuo(self): key = 'HistoryChengJiao' key = self._genKey(key) if self.is_dirty(): df = TcAccount.HistoryWeiTuo(self) myredis.set_obj(key, df) else: return myredis.get_obj(key) return df
def SendOrder(bSell, code, price, num): #用wm_copydata hwnd = FindMainWindow() cds = COPYDATASTRUCT() cds.dwData = 0 s = "Order|" + str(bSell) + "|" + str(code) + "|" + str(price) + "|" + str( num) + "|" cds.cbData = ctypes.sizeof(ctypes.create_string_buffer(s)) cds.lpData = ctypes.c_char_p(s) print s SendMessage(hwnd, win32con.WM_COPYDATA, 0, ctypes.byref(cds)) myredis.set_obj('TCAccountCache_dirty', True)
def PostTask(fn, t, reset=False): """每隔t秒执行一次fn 主要是防止交易接口被短期内多次调用, 造成系统异常 """ key = 'posttask_'+fn.func_name cur_t = agl.curTime() if reset: myredis.delkey(key) pre_t = myredis.get_obj(key) if pre_t == None: pre_t = cur_t - datetime.timedelta(seconds=t+1) if cur_t - pre_t > datetime.timedelta(seconds=t): fn() myredis.set_obj(key, cur_t)
def Run(self): self.pd_task.index = range(len(self.pd_task)) print self.pd_task #保存任务表 myredis.set_obj('multi', self.pd_task) cmd = sys.executable cmd += ' ' + getMainDir() + '\\MultiSubProcess_exec.py' process = [] for i in range(len(self.pd_task)): cur_cmd = cmd + ' ' + str(i) #print cur_cmd p = subprocess.Popen(cur_cmd) process.append(p) for p in process: p.wait()
def Report(self): import time, dateutil, datetime self._ReadData() for code, group in self.df_chengjiao.groupby('stock_code'): if code in myenum.allow_traded_codes: print code, stock.GetCodeName(code) df = self.df_chengjiao[self.df_chengjiao['stock_code'] == code] df = df.loc[:, ['price', 'num', 'is_sell', 'stock_code', 't']] df.columns = ['price', 'num', 'flag', 'code', 'd'] #匹配web接口里使用的字段 print df df['d'] = df.index.astype(str) df['d'] = df['d'].map(lambda x: str(dateutil.parser.parse(x) + \ datetime.timedelta(minutes=5))) myredis.set_obj('backtest_trade', df) os.system('start http://localhost/training') time.sleep(5)
def Report(self, end_day, is_detail=False): if sys.version > '3': print('python 3 can not execute') return import stock, myredis, mysql, agl #成交记录 df = self.df_ChengJiao.loc[:, ['成交价格', '成交数量', '买卖标志', '证券代码']] #print df #输出交易记录到json,供iChat访问 df.columns = ['price', 'num', 'flag', 'code'] df['d'] = df.index.astype(str) df['d'] = df['d'].map(lambda x: str(dateutil.parser.parse(x) + \ datetime.timedelta(minutes=5))) myredis.set_obj('backtest_trade', df) #原有的php需要使用json, 现在使用django, 可以废弃 #f = open('E:/Apache/Apache/htdocs/stock/trade_training/trade.json','w') #json.dump(np.array(df).tolist(),f) #f.close() if is_detail: agl.print_df(df) #计算股票市值, 暂时只能处理一只股票的情况 shizhi = 0 close = 0 if len(self.df_stock) > 0: code = self.df_stock.iloc[0]['证券代码'] close = stock.getHisdatDataFrameFromRedis(code, '', end_day).iloc[-1]['c'] num = self.df_stock.iloc[0]['库存数量'] shizhi += float(close) * int(num) print(self.df_zhijing.tail(n=1)) print('市值:%f,总资产:%f' % (shizhi, self.money + shizhi)) #如果持股不动,现在的资金 #取第一次交易后的可用资金 if len(self.df_zhijing) > 1: money = self.df_zhijing.iloc[1]['可用'] else: money = self.df_zhijing.iloc[0]['可用'] #第一次股票数量到现在的市值 num = 0 if len(self.df_ChengJiao) > 0: num = self.df_ChengJiao.iloc[0]['成交数量'] shizhi = num * close print('如果持股不动 市值:%f,总资产:%f' % (shizhi, money + shizhi))
def main(args): os.chdir(getMainDir()) i = int(args[0]) #print 'arg=',i pd_task = myredis.get_obj('multi') if 0: pd_task = pd.DataFrame #print pd_task.iloc[i] v = tuple(pd_task.iloc[i].tolist()[1:]) #去掉task_id #print v v += (i, ) #加上task_id s = 'import %s\n' % (v[0]) #module.fn s += 'r = %s.%s(%s, %d)' % v #print s exec s #print 'result=',r #保存结果 myredis.set_obj(MultiSubProcess.getResultName(i), r)
def WeiTuoList(self): """历史成交加当日委托 主要用状态说明这个字段来判断, 通过枚举值来判断委托状态 操作日期|委托时间|股东代码|深0沪1|证券代码|证券名称|买0卖1|买卖标志|委托价格|委托数量|委托编号|成交数量|成交金额|撤单数量|状态说明|撤单标志|委托日期|备注| return : df""" key = 'WeiTuoList' key = self._genKey(key) if self.is_dirty(): df = self.HistoryWeiTuo() df2 = TcAccount.WeiTuoList(self) df = pd.concat([df2, df]) #对报单时间排序 df.index = pd.DatetimeIndex(df['操作日期'] + ' ' + df['委托时间']) df = df.sort() myredis.set_obj(key, df) self.setDirty(False) return df else: return myredis.get_obj(key)
def _getUserStrategy(self, downloadStrategyInterval=60): """按固定的时间间隔下载用户代码 downloadStrategyInterval: int default=60 秒 return: df""" k = "SignForWebUser_preLoadTime" preLoadTime = myredis.get_obj(k) if preLoadTime is None: preLoadTime = datetime.datetime(2015, 10, 19, 15, 33, 47, 53000) #上一次下载的时间 #判断时间 if (agl.curTime() - preLoadTime).total_seconds() > downloadStrategyInterval: url = "http://stocksign.sinaapp.com/query?cmd=query_strategy" result = Http().get(url) df_source = pd.read_json(result) df_source.columns = ['id', 'user_id', 'title', 'code'] preLoadTime = agl.curTime() myredis.set_obj(k, preLoadTime) myredis.set_obj('mysource', df_source) else: df_source = myredis.get_obj('mysource') if df_source is None: df_source = pd.DataFrame([]) return df_source
def setDirty(self, is_dirty): key = self._genKey('dirty') myredis.set_obj(key, is_dirty)