Example #1
0
 async def searchStock(self):
     dbo = DataBaseOperator()
     objs = dbo.searchAll(StockInformation)
     rst = "股票名 价格 涨跌幅 更新时间\n"
     for obj in objs:
         rst += str(obj) + "\n--------\n"
     return rst
Example #2
0
 async def searchOneStock(self, stock_name):
     dbo = DataBaseOperator()
     stock_id = dbo.searchOne(AllStock,AllStock.stock_name,stock_name).stock_id
     flushOneNow(stock_id)
     obj = dbo.searchOne(StockInformation, StockInformation.stock_name, stock_name)
     if obj:
         return str(obj)
     else:
         return "未找到股票"
Example #3
0
 async def cancelOrder(self, user_id: str, alive_order_index: int) -> str:
     dbo = DataBaseOperator()
     obj = dbo.searchOneWithTwoFields(AliveOrder, AliveOrder.user_id, user_id, AliveOrder.alive_order_index,
                                      alive_order_index)
     if not obj:
         return "您要删除的订单不存在"
     else:
         dbo.deleteWithTwoFields(AliveOrder, AliveOrder.user_id, user_id, AliveOrder.alive_order_index,
                                 alive_order_index)
         return "订单{}删除成功".format(obj.alive_order_index)
Example #4
0
 async def register(self, user_id: str, user_name: str) -> str:
     dbo = DataBaseOperator()
     print(user_id, user_name)
     if dbo.searchOne(UserInformation, UserInformation.user_id, user_id):
         return "您已注册\n" + user_id + "\n" + user_name
     else:
         user = UserInformation(user_id=user_id, user_name=user_name,
                                free_money_amount=begin_money, total_money_amount=begin_money)
         dbo.add(user)
         return "注册成功\n" + user_id + "\n" + user_name
Example #5
0
 async def addSelfStockWithID(self, stock_id: str) -> str:
     dbo = DataBaseOperator()
     obj = dbo.searchOne(StockInformation, StockInformation.stock_id, stock_id)
     if obj:
         return "自选股已经被添加过\n" + + obj.stock_name
     else:
         new_obj = StockInformation(stock_id=stock_id, stock_name="暂未查询", now_price=-1,
                                    flush_time=datetime.now(),
                                    up_down_rate=0)
         dbo.add(new_obj)
         stock_name = flushOneNow(stock_id)
         return "自选股添加成功\n" + str(stock_name)
Example #6
0
 async def searchOneStockWithID(self, stock_id):
     dbo = DataBaseOperator()
     obj = dbo.searchOne(StockInformation, StockInformation.stock_id,
                         stock_id)
     if obj:
         if flushOneNow(stock_id):
             obj = dbo.searchOne(StockInformation,
                                 StockInformation.stock_id, stock_id)
             return str(obj)
         else:
             return "API查询失败,请稍后再次尝试"
     else:
         return "查询失败,请先添加自选股"
Example #7
0
 async def buyStock(self, user_id: str, stock_name: str, stock_amount: int, stock_price: float) -> str:
     if self.outTime():
         return "不在交易时间内"
     dbo = DataBaseOperator()
     if not dbo.searchOne(StockInformation, StockInformation.stock_name, stock_name):
         return "订单失败,请先添加自选股"
     else:
         aoi = dbo.searchAll(AliveOrder)
         if aoi:
             alive_order_index = aoi[-1].alive_order_index + 1
         else:
             alive_order_index = 1
         obj = dbo.searchOne(StockInformation, StockInformation.stock_name, stock_name)
         stock_id = obj.stock_id
         order_money_amount = stock_amount * stock_price
         free_money_amount = dbo.searchOne(UserInformation, UserInformation.user_id, user_id).free_money_amount
         if free_money_amount < order_money_amount:
             return "购买订单创建失败,可支配金额不足"
         else:
             alive_order = AliveOrder(user_id=user_id, alive_order_index=alive_order_index,
                                      alive_order_time=datetime.now(),
                                      buy_or_sell=True, stock_id=stock_id,
                                      stock_name=stock_name, stock_price=stock_price,
                                      stock_amount=stock_amount,
                                      order_money_amount=order_money_amount)
             dbo.add(alive_order)
             flushAliveOrders()
             return "购买订单创建成功\n股票:{}\n股数:{}\n预定价格:{}\n总价格:{}\n".format(stock_name, str(stock_amount),
                                                                       str(stock_price),
                                                                       str(order_money_amount))
Example #8
0
    async def searchUserHoldings(self, user_id: str) -> str:
        dbo = DataBaseOperator()
        dbo.delete(UserHoldings, UserHoldings.stock_amount, 0)
        userHoldings = dbo.searchAllWithField(UserHoldings, UserHoldings.user_id, user_id)
        if not userHoldings:
            return "您当前没有持仓"
        else:
            rst = "您好,{},您当前的持仓情况是:\n".format(user_id)
            if type(userHoldings) == list:
                for item in userHoldings:
                    rst += str(item) + "\n"
                    rst += "-------------\n"
            else:
                rst += str(userHoldings)

            return rst
 async def searchOneStock(self, stock_name):
     dbo = DataBaseOperator()
     try:
         stock_id = dbo.searchOne(AllStock, AllStock.stock_name,
                                  stock_name).stock_id
     except:
         return "查询失败,API缺少该股信息"
     obj = dbo.searchOne(StockInformation, StockInformation.stock_name,
                         stock_name)
     if obj:
         if flushOneNow(stock_id):
             return str(obj)
         else:
             return "API查询失败,请稍后再次尝试"
     else:
         return "查询失败,请先添加自选股"
def flushOneNow(stock_id):
    dbo = DataBaseOperator()
    stock = dbo.searchOne(StockInformation, StockInformation.stock_id, stock_id)
    try:
        df = ts.get_realtime_quotes(stock.stock_id)
        stock.stock_name = df['name'][0].replace(' ', '')
        stock.now_price = float(df['price'])
        stock.flush_time = datetime.strptime(df['date'][0] + " " + df['time'][0], '%Y-%m-%d %H:%M:%S')
        try:
            stock.up_down_rate = 100 * (float(df['price'][0]) - float(df['pre_close'][0])) / float(
                df['pre_close'][0])
        except:
            stock.up_down_rate = 0
        dbo.update()
    except:
        return False
    return True
Example #11
0
    async def searchAliveOrders(self, user_id: str) -> str:
        dbo = DataBaseOperator()
        dbo.delete(AliveOrder, AliveOrder.is_alive, False)
        flushAliveOrders()
        aliveorders = dbo.searchAllWithField(AliveOrder, AliveOrder.user_id, user_id)
        if not aliveorders:
            return "您当前没有有效订单"
        else:
            rst = "您好,{},您当前的订单情况是:\n".format(user_id)
            if type(aliveorders) == list:
                for item in aliveorders:
                    rst += str(item) + "\n"
                    rst += "-------------\n"
            else:
                rst += str(aliveorders)

            return rst
Example #12
0
    async def sellStock(self, user_id: str, stock_name: str, stock_amount: int, stock_price: float) -> str:
        if self.outTime():
            return "不在交易时间内"
        dbo = DataBaseOperator()
        stock_amount_obj = dbo.searchOneWithTwoFields(UserHoldings, UserHoldings.stock_name, stock_name,
                                                      UserHoldings.user_id, user_id)
        if not stock_amount_obj:
            return "卖出订单创建失败,您没有购买该支股票"
        else:
            now = datetime.now().strftime('%Y-%m-%d')
            bought_time = stock_amount_obj.bought_time.strftime('%Y-%m-%d')
            if now == bought_time:
                return "卖出订单创建失败,您必须在购买成功后的T+1日才能卖出"
            if stock_amount > stock_amount_obj.stock_amount:
                return "卖出订单创建失败,您没有足够的持仓,当前持仓为:" + str(stock_amount_obj.stock_amount)
            else:
                aoi = dbo.searchAll(AliveOrder)
                if aoi:
                    alive_order_index = aoi[-1].alive_order_index + 1
                else:
                    alive_order_index = 1
                stock_id = dbo.searchOne(StockInformation, StockInformation.stock_name, stock_name).stock_id
                alive_order = AliveOrder(user_id=user_id, alive_order_index=alive_order_index,
                                         alive_order_time=datetime.now(),
                                         buy_or_sell=False, stock_id=stock_id,
                                         stock_name=stock_name, stock_price=stock_price,
                                         stock_amount=stock_amount,
                                         order_money_amount=stock_amount * stock_price)

                dbo.add(alive_order)
                flushAliveOrders()
                return "卖出订单创建成功\n股票:{}\n股数:{}\n预定价格:{}\n总价格:{}\n".format(stock_name, str(stock_amount),
                                                                          str(stock_price),
                                                                          str(stock_amount * stock_price))
def flushStockInformation():
    dbo = DataBaseOperator()
    dbo.delete(StockInformation, StockInformation.stock_name, "API缺少该股信息")
    stock_list = dbo.searchAll(StockInformation)
    for stock in stock_list:
        try:
            df = ts.get_realtime_quotes(stock.stock_id)
            stock.stock_name = df['name'][0]
            stock.now_price = float(df['price'])
            stock.flush_time = datetime.strptime(
                df['date'][0] + " " + df['time'][0], '%Y-%m-%d %H:%M:%S')
            try:
                stock.up_down_rate = 100 * (float(df['price'][0]) - float(
                    df['pre_close'][0])) / float(df['pre_close'][0])
            except:
                stock.up_down_rate = 0
        except:
            stock.stock_name = "API缺少该股信息"
            stock.now_price = 9999
            stock.flush_time = datetime.now()
            stock.up_down_rate = 0
        dbo.update()
    flushAliveOrders()
    global timer
    timer = threading.Timer(global_flush_time * 60, flushStockInformation)
Example #14
0
 async def searchUserInformation(self, user_id: str) -> str:
     dbo = DataBaseOperator()
     user = dbo.searchOne(UserInformation, UserInformation.user_id, user_id)
     if not user:
         return "查询失败,您尚未注册"
     holdings = dbo.searchAllWithField(UserHoldings, UserHoldings.user_id,
                                       user_id)
     user.total_money_amount = 0
     for holding in holdings:
         try:
             price_now = dbo.searchOne(StockInformation,
                                       StockInformation.stock_name,
                                       holding.stock_name).now_price
             user.total_money_amount += holding.stock_amount * price_now
         except:
             return "查询个人信息失败,自选股被非法删除,请联系管理员"
     user.total_money_amount += user.free_money_amount
     dbo.update()
     rst = "您好,{},您当前的账户信息如下:\n".format(user_id)
     if type(user) == list:
         for item in user:
             rst += str(item) + "\n"
             rst += "-------------\n"
     else:
         rst += str(user)
     return rst
Example #15
0
 async def addSelfStockWithID(self, stock_id: str) -> str:
     dbo = DataBaseOperator()
     obj = dbo.searchOne(StockInformation, StockInformation.stock_id,
                         stock_id)
     if obj:
         return "自选股已经被添加过\n" + obj.stock_name
     else:
         try:
             df = ts.get_realtime_quotes(stock_id)
             stock_name = df['name'][0].replace(' ', '')
             now_price = float(df['price'])
             flush_time = datetime.strptime(
                 df['date'][0] + " " + df['time'][0], '%Y-%m-%d %H:%M:%S')
         except:
             return "API缺少该股信息"
         try:
             up_down_rate = 100 * (float(df['price'][0]) - float(
                 df['pre_close'][0])) / float(df['pre_close'][0])
         except:
             up_down_rate = 0
         new_obj = StockInformation(stock_id=stock_id,
                                    stock_name=stock_name,
                                    now_price=now_price,
                                    flush_time=flush_time,
                                    up_down_rate=up_down_rate)
         try:
             dbo.add(new_obj)
         except:
             pass
         # 下面,添加到all_stock中
         new_stock = AllStock(stock_id=stock_id, stock_name=stock_name)
         dbo.add(new_stock)
         flushOneNow(stock_id)
         return "自选股添加成功\n" + str(stock_name)
Example #16
0
 async def deleteSelfStock(self, stock_name: str) -> str:
     dbo = DataBaseOperator()
     orders = dbo.searchAllWithField(AliveOrder, AliveOrder.stock_name, stock_name)
     holdings = dbo.searchAllWithField(UserHoldings, UserHoldings.stock_name, stock_name)
     if orders or holdings:
         return "已有订单或持仓,不能删除"
     else:
         name = stock_name
         dbo.delete(StockInformation, StockInformation.stock_name, stock_name)
         return stock_name + "删除成功"
Example #17
0
 async def addSelfStock(self, stock_name: str) -> str:
     dbo = DataBaseOperator()
     obj = dbo.searchOne(StockInformation, StockInformation.stock_name,
                         stock_name)
     if obj:
         return "自选股已经被添加过\n" + obj.stock_name
     else:
         stock = dbo.searchOne(AllStock, AllStock.stock_name, stock_name)
         if stock:
             new_obj = StockInformation(stock_id=stock.stock_id,
                                        stock_name=stock_name,
                                        now_price=-1,
                                        flush_time=datetime.now(),
                                        up_down_rate=0)
             dbo.add(new_obj)
             flushOneNow(stock.stock_id)
             return "自选股添加成功\n" + str(stock_name)
         else:
             return "自选股添加失败,API缺少该股信息"
def flushOneNow(stock_id):
    dbo = DataBaseOperator()
    dbo.delete(StockInformation, StockInformation.stock_name, "API缺少该股信息")
    stock = dbo.searchOne(StockInformation, StockInformation.stock_id,
                          stock_id)
    try:
        df = ts.get_realtime_quotes(stock.stock_id)
        stock.stock_name = df['name'][0]
        stock.now_price = float(df['price'])
        stock.flush_time = datetime.strptime(
            df['date'][0] + " " + df['time'][0], '%Y-%m-%d %H:%M:%S')
        try:
            stock.up_down_rate = 100 * (float(df['price'][0]) - float(
                df['pre_close'][0])) / float(df['pre_close'][0])
        except:
            stock.up_down_rate = 0
    except:
        stock.stock_name = "API缺少该股信息"
        stock.now_price = 9999
        stock.flush_time = datetime.now()
        stock.up_down_rate = 0
    dbo.update()
    return stock.stock_name
Example #19
0
def flushAliveOrders():
    dbo = DataBaseOperator()
    dbo.delete(AliveOrder, AliveOrder.is_alive, False)
    dbo.delete(UserHoldings, UserHoldings.stock_amount, 0)
    order_list = dbo.searchAll(AliveOrder)
    for order in order_list:
        # True是买入
        if order.buy_or_sell:
            stock = dbo.searchOne(StockInformation, StockInformation.stock_id,
                                  order.stock_id)
            print(stock.now_price, order.stock_price, stock.stock_name)
            if stock.now_price <= order.stock_price:
                # 买入
                user = dbo.searchOne(UserInformation, UserInformation.user_id,
                                     order.user_id)
                service_charge = order.order_money_amount * 0.0003
                if service_charge < 5:
                    service_charge = 5
                order.order_money_amount = order.stock_amount * stock.now_price
                if order.order_money_amount <= user.free_money_amount + service_charge:
                    user.free_money_amount -= (order.order_money_amount +
                                               service_charge)
                    order.is_alive = False
                    holdings = dbo.searchOneWithTwoFields(
                        UserHoldings, UserHoldings.user_id, order.user_id,
                        UserHoldings.stock_name, order.stock_name)
                    if holdings:
                        holdings.stock_amount += order.stock_amount
                        holdings.bought_price = order.stock_price
                        holdings.bought_total_price += order.order_money_amount
                    else:
                        holdings = UserHoldings(order.user_id,
                                                order.stock_name,
                                                order.stock_amount,
                                                stock.stock_price,
                                                order.order_money_amount,
                                                datetime.now())
                        dbo.add(holdings)
                dbo.update()
            else:
                continue
                # 卖出订单:
                #   查询表UserInformation的now_price,如果价格低于order的价格,continue
                #   否则,查询user_holdings的stock_amount字段,比较order的amount和holdings的amount,如果order的大,continue。
                #   否则,user的free_money_amount字段+=order的money_amount字段-手续费。holdings-=amount,order的is_alive设为false
        else:
            stock = dbo.searchOne(StockInformation, StockInformation.stock_id,
                                  order.stock_id)
            if stock.now_price > order.stock_price:
                holdings = dbo.searchOne(UserHoldings, UserHoldings.user_id,
                                         order.user_id)
                if holdings.stock_amount >= order.stock_amount:
                    service_charge = order.stock_amount * stock.now_price * 0.0013
                    if service_charge < 5:
                        service_charge = 5
                    user = dbo.searchOne(UserInformation,
                                         UserInformation.user_id,
                                         order.user_id)
                    user.free_money_amount += stock.now_price * order.stock_amount - service_charge
                    holdings.stock_amount -= order.stock_amount
                    order.is_alive = False
                else:
                    continue
            else:
                continue
            dbo.update()