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
Example #2
0
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)
Example #3
0
    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')
Example #5
0
 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")
Example #6
0
    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)
Example #7
0
 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
Example #8
0
 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 !!!!!")
Example #9
0
 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))
Example #10
0
    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
Example #11
0
 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 !!!!!")    
Example #12
0
    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
Example #13
0
    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 !!!!!")
Example #14
0
 def _logResponse(response):
     if DEBUG:
         logger.info("response:", response.__dict__)
Example #15
0
        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
Example #16
0
 def run(self):
     if not self.trading:return 
     logger.info("[RUN]:start run !!!!!")
     self.trader.autobuy()
     logger.info("[RUN]:run finished !!!!!")
Example #17
0
    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()
Example #18
0
 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))
Example #19
0
 def get(self, name):
     '''
     '''
     rst = self._dbclient(self.db)[name].find()
     for i in rst:
         logger.info(i)
Example #20
0
 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!!!!!!")
Example #21
0
 def disconnect(self):
     logger.info("[DISCONNECT]:statrt disconnect!!!!!")
     if self.istradeday:
         self.api.disconnect()
     logger.info("[DISCONNECT]:disconnect finished!!!!!")
Example #22
0
 def run(self):
     logger.info("[RUN]:start run !!!!!")
     self.trader.autobuy()
     logger.info("[RUN]:run finished !!!!!")
Example #23
0
 def disconnect(self):
     logger.info("[DISCONNECT]:start disconnect !!!!!")
     self.api.disconnect()
     logger.info("[DISCONNECT]:disconnect finished !!!!!")