def get_response_by_user_data(request: str, license_key: str, hwid: str, ip: str) -> str: # user_db = db_interface.UserDB() # user_state = user_db.get_user_state(request, license_key, hwid, ip) user_state = db_interface.get_user_state(request, license_key, hwid, ip) if user_state == cfg.g_user_state_ok: logger.info(cfg.g_user_state_ok) return get_response_by_request(request) else: symbol = cfg.separateSymbol user_metadata = symbol.join([license_key, hwid, ip]) logger.warning(user_metadata) if user_state == cfg.g_user_state_wrong_license_key: logger.warning(cfg.g_user_state_wrong_license_key) return cfg.g_user_state_wrong_license_key elif user_state == cfg.g_user_state_other_subscribe_type: logger.warning(cfg.g_user_state_other_subscribe_type) return cfg.g_user_state_other_subscribe_type elif user_state == cfg.g_user_state_outdated_license_key: logger.warning(cfg.g_user_state_outdated_license_key) return cfg.g_user_state_outdated_license_key elif user_state == cfg.g_user_state_other_pc: logger.warning(cfg.g_user_state_other_pc) return cfg.g_user_state_other_pc elif user_state == cfg.g_user_state_hacker: logger.critical(user_metadata) logger.critical(cfg.g_user_state_hacker) remember_hacker() #raise g_user_state_hacker return cfg.g_user_state_hacker else: logger.warning(cfg.g_user_state_undefined) return cfg.g_user_state_undefined return cfg.g_user_state_undefined
def main(): current_dir = os.getcwd() current_folder = current_dir.split('/')[-1] if current_folder == cfg.g_name_of_main_folder: print("Current folder: ", current_folder) print("Change current folder...") os.chdir(current_dir + generator_cfg.g_path_from_script_to_main) print("Current folder: ", os.getcwd) ## FAKE-UNIT TEST ## data = b'mo|1337-7331|deadbeaf' #data = b'mo|12|beefdea' #response = request_handler.processingRequest(data) #logger.debug(response) #exit(0) ## DELETE while True: try: logger.info("Server is started") server = EchoServer(cfg.HOST, cfg.PORT) asyncore.loop() except Exception as err: logger.error(err) time.sleep(cfg.g_error_sleep_sec)
def sync(self, idx, director=True): stocks = self.products[idx]["stocklst"] for stock, number in stocks.items(): if not director: number = 2 * number #空信号,清仓 else: number = 4 * number #判断现有持仓 try: h_number = self.hd_df.ix[stock]["证券数量"] except: h_number = 0 #补仓差 cangcha = int((number - h_number) / 100) * 100 if h_number > 0 and abs( cangcha ) / number < 0.05: #如果有持仓,同时仓差小于5% 不进行更改,为了处理频繁加减仓达到问题 return if cangcha > 0: logger.info("[RUN]:buy code:{}, number:{}".format( stock, number - h_number)) self.buy(stock, cangcha) elif cangcha < 0: logger.info("[RUN]:sell code:{}, number:{}".format( stock, h_number - number)) lastholdnumber = self.hd_df.ix[stock]["可卖数量"] self.sell(stock, min(-cangcha, lastholdnumber))
def processingRequest(data_bytes: str, ip="127.0.0.1") -> bytes: response = cfg.g_empty_response for attempts in range(cfg.g_max_attempts): try: """ Receive the encrypted data """ data = data_bytes.decode('ascii') if data[-1] != cfg.separateSymbol: data = decrypt_data(data) logger.info(data) data = data.lower() data_list = data.split(cfg.separateSymbol) # check for hacker if len(data_list) < 3: logger.warning([data_bytes, ip]) logger.warning(cfg.g_user_state_hacker) remember_hacker() break # Empty license key if not len(data_list[1]): return cfg.g_byte_empty_response request = data_list[0] license_key = data_list[1] hwid = data_list[2] version = data_list[3] if check_version(version): response = get_response_by_user_data(request, license_key, hwid, ip) else: logger.warning([data_bytes, ip]) logger.warning(cfg.g_user_state_outdated_version) response = cfg.g_user_state_outdated_version except Exception as e: args = e.args data = data_bytes.decode('ascii') user_metadata = data + cfg.separateSymbol + ip logger.error(user_metadata) logger.error(args) time.sleep(cfg.g_error_sleep_sec) else: break # debug #response = "Update your application!" # debug """ Send the encrypted data """ logger.debug("RESPONSE: " + response) response = encrypt_data(response) return bytes(response, encoding = 'ascii')
def initial(self): '''每天初始化状态,连接行情数据源,更新除权信息 ''' self.today = datetime.datetime.today().date().strftime('%Y-%m-%d') df = ts.trade_cal() self.trade_day = df[( df["calendarDate"] == self.today)].isOpen.values[0] if self.trade_day: #交易日,连接数据库,连接行情源,处理除权除息 self.connect() self.connect_market() self.set_accounts() self.set_stocks() self.handle_ex_right() logger.info("initial finished")
def handle_ex_right(self): '''处理持仓股票除权价格和数量 ''' func = lambda x: 0 if not x else x today = datetime.datetime.today().date().day year = datetime.datetime.today().date().year month = datetime.datetime.today().date().month for stock in self.stocks: mk = self._select_market_code(stock) cqcx = self.api.get_xdxr_info(mk, stock)[::-1] dct = {"fenhong": 0, 'peigu': 0, 'peigujia': 0, "songzhuangu": 0} iscq = False for i in cqcx: if i["day"] != today or i["month"] != month or i[ "year"] != year: break else: iscq = True dct["fenhong"] += func(i["fenhong"]) dct["peigu"] += func(i["peigu"]) dct["peigujia"] += func(i["peigujia"]) dct["songzhuangu"] += func(i["songzhuangu"]) if iscq: #发生除权除息 rst = self.api.get_security_bars(4, mk, stock, 0, 2) if rst[0]["day"] != today or i["month"] != month or i[ "year"] != year: close = rst[0]["close"] else: close = rst[1]["close"] preclose = (close * 10 - dct["fenhong"] + dct["peigu"] * dct['peigujia']) / ( 10 + dct['peigu'] + dct['songzhuangu']) rate = close / preclose logger.info("除权除息:{},rate:{}".format(stock, rate)) for account in self.accounts: filt = {"code": stock, "cx_date": {"$ne": self.today}} dt = { "$mul": { "cost": 1 / rate, "number": rate }, "$set": { "cx_date": self.today } } self._dbclient(self.db)[self.prefix + account].update_one( filt, dt)
def getdata(self,product,market=1,number=5000,pn=400): data = [] for i in range(int(number/pn)+1): temp = self.api.get_index_bars(self.datatype, market, product, (int(number/pn)-i)*pn,pn) if not temp or len(temp)<pn: self.connect() for _ in range(2): temp = self.api.get_index_bars(self.datatype, market, product, (int(number/pn)-i)*pn,pn) if not temp or len(temp)<pn: logger.info("record not reach the limit!") else: break data += temp df = self.api.to_df(data)[["open","close","high","low","datetime"]] df.set_index("datetime",inplace=True,drop=False) return df
def initial(self): '''每天初始化设置 ''' logger.info("[INITIAL]:start initial !!!!!") logger.info("[INITIAL]:try to create connect... ") self.connect() self.trader = trade(UserID=self.userid,api=self.api,mock=False,server=self.server) logger.info("[INITIAL]:connect successful!") self.trading = self.judgetradeday() logger.info("[INITIAL]:initial finished !!!!!")
def sync(self,idx,director=True): stocks = self.products[idx]["stocklst"] for stock,number in stocks.items(): if not director: number = 0 #空信号,清仓 #判断现有持仓 try: code = stock h_number = self.hd_df.ix[code]["证券数量"] except: h_number = 0 logger.info("[RUN]:{},{},{}".format(stock,h_number,number)) #补仓差 cangcha = int((number-h_number)/100)*100 if h_number>0 and abs(cangcha)/h_number<0.2: #如果有持仓,同时仓差小于10% 不进行更改,为了处理频繁加减仓达到问题 continue if cangcha>0: logger.info("[RUN]:buy code:{}, number:{}".format(stock,number-h_number)) self.buy(stock,cangcha) elif cangcha<0: couldsell = self.hd_df.ix[code]["可卖数量"] logger.info("[RUN]:sell code:{}, number:{},couldsell:{}".format(stock,h_number-number,couldsell)) if couldsell >0: self.sell(stock,min(-cangcha,couldsell))
def order(self, postdata): ''' example: postdata={"action":3,# 0 买入 1 卖出 2 融资买入 3 融券卖出 4 买券还券 5 卖券还款 6 现券还券 "priceType":0, "price":3.132, "amount":200, #必须是整型,不能是float,c_int转换貌似失效 "symbol":"131810"} #131810 204001 ''' if self.mock: logger.info(postdata) self.mongodb.updateholdlist(self.account, postdata) #更新持仓信息 self.mongodb.add_operate_history(self.account, postdata) #添加操作记录 else: if postdata["symbol"] in ["510500"]: postdata["price"] *= 0.1 #etf调整价格 r = requests.post(self.server + '/orders', json=postdata, auth=HTTPBasicAuth(self.token, 'x')) return r.text return
def run(self): logger.info("[RUN]:start run !!!!!") if not self.trading: return self.handleposition() rst = {} for idx in list(self.products.keys()): director = self.handledata(self.getdata(idx,market=1),self.products[idx]["args"]) #用指数出信号 logger.info("[RUN]:trademessage: block:{}, director:{}".format(idx,director)) self.sync(idx,director) rst[idx] = {"up":director,"number":self.products[idx]["stocklst"],"product":idx} logger.info("[RUN]:lastest position status:{}".format(rst)) logger.info("[RUN]:run finished !!!!!")
def calculateltsz(self,df): '''计算流通市值 output:{code:[gb,value} ''' df.loc[:,"market"] = df.index.map(lambda x:0 if x[0] in ["0","3"] else 1) rst = df[df["outstanding"]>0][["market","code",]].values pn = 80 total = rst.shape[0] #更新流通股本为0的股票的价格为0 prices = {code:0 for code in df[df["outstanding"]==0]["code"].values} liutonggb = {code:ltgb for code,ltgb in df[["code","outstanding"]].values} zeros = [] #更新流通股本大于0的股票 for idx in range(math.ceil(total/pn)): start = idx*pn end = start+pn logger.info("[RUN]: get latest price for {}:{}".format(start,end)) pankou = self.api.get_security_quotes(rst[start:end]) for item in pankou: prices[item["code"]] = round(item["price"],2) #注意这里需要处理下数据有效位,否则保存数据库的时候会报错 if item["price"] ==0 :zeros.append(item["code"]) #重新更新流通股份大于0,但是盘口价格为0的股票 for stock in zeros: mk = 0 if stock[0] in ["0","3"] else 1 logger.info("[RUN]: get latest price for {}".format(stock)) prices[stock] = round(self.api.get_security_bars(6,mk,stock,0,1)[0]["close"],2) #计算流通市值 liutongvalues = {code:[gb,gb*prices[code]] for code,gb in liutonggb.items()} return liutongvalues
def initial(self): '''每天初始化设置 ''' logger.info("[INITIAL]:start initial !!!!") if not self.istradeday: self.trading = False return self.trading = True logger.info("[INITIAL]:try to create connect... ") self.connect() self.trader = trade(UserID=self.userid, api=self.api, mock=self.mock, server=self.server) logger.info("[INITIAL]:connect successful!") self.set_number() #设置手数 logger.info("[INITIAL]:initial finished !!!!!")
def _logResponse(response): if DEBUG: logger.info("response:", response.__dict__)
except: pass connect(api) if __name__ == '__main__': userid = os.environ.get('userid', "test1") buylist = eval(os.environ.get('buylist', "[]")) selllist = eval(os.environ.get('selllist', "[]")) query = os.environ.get("query", False) trader = trade(UserID=userid, api=api, mock=True) accountinfo, holdlists = trader.position() if query: logger.info(accountinfo.to_dict('records')) logger.info(holdlists.to_dict('records')) else: if holdlists.shape[0] > 0: holdlists.set_index("证券代码", inplace=True) for stock, number in buylist: logger.info("buy: {} number:{}".format(stock, number)) trader.buy(stock, int(number)) for stock, number in selllist: try: h_number = holdlists.ix[stock]["参考持股"] except: h_number = 0
def run(self): if not self.trading:return logger.info("[RUN]:start run !!!!!") self.trader.autobuy() logger.info("[RUN]:run finished !!!!!")
def getacchistory(self, name): pass def get(self, name): ''' ''' rst = self._dbclient(self.db)[name].find() for i in rst: logger.info(i) if __name__ == '__main__': ip = os.environ.get('IP', "stock_mongo") name = os.environ.get('name', None) money = os.environ.get('money', 10000000) action = os.environ.get('action', "addaccount") if not name: logger.info("please add account name!!!! ") else: tool = Tool(ip=ip) tool.connect() if action == "addaccount": tool.addaccount(name, money) elif action == "getacchistory": tool.getacchistory(name) elif action == "get": tool.get(name) tool.disconnect()
def run(self): '''更新流通股本和行业板块权重到数据库 ''' funcname = sys._getframe().f_code.co_name.upper() #获取当前函数名 if self.online: logger.info("[{}]: update local config file! ".format(funcname)) self.updatelocalfile() logger.info("[{}]: update local config file finished! ".format(funcname)) logger.info("[{}]: create connect to tdx and mongo! ".format(funcname)) self.connect() logger.info("[{}]: create connect to tdx and mongo finished! ".format(funcname)) df = self.get_stock_basics() self.save_basic(df) logger.info("[{}]: get latest price and calculate liutong value start ! ".format(funcname)) liutongvalues = self.calculateltsz(df) logger.info("[{}]: get latest price and calculate liutong value finished ! ".format(funcname)) logger.info("[{}]: update liu tong gu ben to db start ! ".format(funcname)) self.updatevalue2db(liutongvalues) logger.info("[{}]: update liu tong gu ben to db finished ! ".format(funcname)) logger.info("[{}]: calculate hang ye weight! ".format(funcname)) weights = self.calculateweight(liutongvalues) logger.info("[{}]: update hang ye weight to db start ! ".format(funcname)) self.updateweight2db(weights) logger.info("[{}]: update hang ye weight to db finished ! ".format(funcname)) logger.info("[{}]: disconnect from tdx and mongo start ! ".format(funcname)) self.disconnect() logger.info("[{}]: disconnect from tdx and mongo finished ! ".format(funcname))
def get(self, name): ''' ''' rst = self._dbclient(self.db)[name].find() for i in rst: logger.info(i)
def initial(self): '''每天初始化设置 ''' logger.info("[INITIAL]:start initial !!!!!!") if not self.istradeday: self.trading = False return self.trading = True logger.info("[INITIAL]:try to create connect... ") self.connect() self.trader = trade(UserID=self.userid,api=self.api,mock=self.mock,server=self.server) logger.info("[INITIAL]:connect successful!") logger.info("[INITIAL]:initial account info...") self.updatetotal() #更新账户总资金 self.set_permoney() #设置单个品种资金上限 logger.info("[INITIAL]:set per product money limit:{}".format(self.permoney)) self.set_instrument() #设置交易股票和手数 logger.info("[INITIAL]:set stock list succcessful !!!") logger.info("[INITIAL]:initial finished!!!!!!")
def disconnect(self): logger.info("[DISCONNECT]:statrt disconnect!!!!!") if self.istradeday: self.api.disconnect() logger.info("[DISCONNECT]:disconnect finished!!!!!")
def run(self): logger.info("[RUN]:start run !!!!!") self.trader.autobuy() logger.info("[RUN]:run finished !!!!!")
def disconnect(self): logger.info("[DISCONNECT]:start disconnect !!!!!") self.api.disconnect() logger.info("[DISCONNECT]:disconnect finished !!!!!")