def isOpen(self): # Wait for market to open. print("Waiting for market to open...") awaitMarketOpen(self) # tAMO = threading.Thread(target=self.awaitMarketOpen) # tAMO.start() # tAMO.join() print("Market opened.") # Figure out when the market will close so we can prepare to sell beforehand. clock = self.alpaca.get_clock() closingTime = clock.next_close.replace( tzinfo=datetime.timezone.utc).timestamp() currTime = clock.timestamp.replace( tzinfo=datetime.timezone.utc).timestamp() self.timeToClose = closingTime - currTime # TODO: leaving this for now, may be removed later if (self.timeToClose < (60 * 16)): # Close all positions when 15 minutes til market close. print("Market closing soon. Closing positions.") positions = self.alpaca.list_positions() for position in positions: if (position.side == 'long'): orderSide = 'sell' else: orderSide = 'buy' qty = abs(int(float(position.qty))) # qty = position.qty # respSO = [] Orders.submitOrder(self, qty, position.symbol, orderSide)
def newPosLogic(self, symbols): self.long = [] self.short = [] positions = self.alpaca.list_positions() blacklist = set() for position in positions: blacklist.add(position.symbol) dt = datetime.today() lastOpenDay = dt.strftime('%Y-%m-%d') for symbol in config.symbols: if (blacklist.isdisjoint({symbol})): df = pd.read_csv('Data/15MinOHLC/{}.txt'.format(symbol), parse_dates=True) #, index_col='Date' a = df.loc[(df['Date'] == lastOpenDay), ('rsi')].values b = df.loc[(df['Date'] == lastOpenDay), ('stoc k')].values c = df.loc[(df['Date'] == lastOpenDay), ('stoc d')].values d = df.loc[(df['Date'] == lastOpenDay), ('macd')].values e = df.loc[(df['Date'] == lastOpenDay), ('signal')].values if ((a < 35) and (b < 25) and (c < 25) and (d > e)): print('buy signal for {}'.format(symbol)) self.long.append(symbol) elif ((a > 65) and (b > 75) and (c > 75) and (d < e)): print('sell signal for {}'.format(symbol)) self.short.append(symbol) else: print('symbol is in an open position, not placing new position') Orders.orderSize(self, self.long, self.short)
def trigger_balance(n1): ctx = dash.callback_context button_id = ctx.triggered[0]['prop_id'].split('.') if button_id[0] == 'balance_btn': new_keys = dbrools.my_keys.find_one() api_key = new_keys['bin']['key'] api_secret = new_keys['bin']['secret'] bclient = Client(api_key=api_key, api_secret=api_secret) Orders.my_balance(client=bclient) repons = dbrools.get_my_balances() return ["{0:.2f} $".format(float(repons['USDT']))] else: raise PreventUpdate
def MyOrders(self, Pair): qString = "pair=" + str(Pair) + "&nonce=" + (str(int(time.time()))) sign = self.ComputeHash(qString) url = self.Url + "Order/MyOrders" response = self.Query(qString, url, sign) _json = json.loads(response.decode("utf-8")) orders = Orders() if 'bids' in _json: for bid in _json['bids']: tOrder = TradeOrder() tOrder.a = bid['a'] tOrder.d = bid['d'] tOrder.id = bid['id'] tOrder.isBid = bid['isBid'] tOrder.p = bid['p'] tOrder.pair = bid['pair'] tOrder.s = bid['s'] orders.bids.append(tOrder) for ask in _json['asks']: tOrder = TradeOrder() tOrder.a = ask['a'] tOrder.d = ask['d'] tOrder.id = ask['id'] tOrder.isBid = ask['isBid'] tOrder.p = ask['p'] tOrder.pair = ask['pair'] tOrder.s = ask['s'] orders.asks.append(tOrder) return orders
def place_new_order(self): bot_message = f"Added {self.symbol}{self.new_side} , \n{round(self.amount, 2)}, \n{round(float(self.my_ask), 5)},\n SL {round(float(self.my_sl), 5)} / TP {round(float(self.my_tp), 5)}" bot_sendtext(bot_message) print("\n", bot_message) self.order = self.main_direction reponse = Orders.my_order( client=self.bclient, symbol=f"{self.symbol.upper()}{self.new_side}USDT", side=1, amount=round(self.amount, 2)) if reponse['error']: self.bot_ping = False logging.info(f"New order Error:\n {reponse}") bot_sendtext(f"New order Error:\n {reponse}") else: self.order_id = reponse['result']['orderId'] logging.info(f"New order:\n {reponse}") dbrools.insert_history_new(data=reponse) self.order_price = self.my_bid data = { "symbol": f"{self.symbol}{self.new_side}", "amount": round(self.amount, 2), "price": self.my_ask, "direct": 'BUY', "result": 0, "date": f"{datetime.now().strftime('%d.%m.%Y')}" } dbrools.insert_history(data=data) self.order_time = time.time() self.place_tp_order()
def close_sl_order(self): bot_message = f"QUIT {self.symbol.upper()}{self.new_side} , \n{round(self.amount, 2)}, \n{round(float(self.my_sl), 5)}, \n STOP LOSS ,\n SL {round(float(self.my_sl), 4)} / TP {round(float(self.my_tp), 4)}" bot_sendtext(bot_message) print("\n", bot_message) result = self.bclient.cancel_order(symbol=self.main_symbol.upper(), orderId=self.order_id) print("\n", result) data = { "symbol": f"{self.symbol}{self.new_side}", "amount": round(self.amount, 2), "price": self.my_sl, "direct": 'SELL', "result": 1, "date": f"{datetime.now().strftime('%d.%m.%Y')}" } dbrools.insert_history(data=data) reponse = Orders.my_order(client=self.bclient, symbol=self.main_symbol.upper(), side=2, amount=round(self.amount, 2)) logging.info(f"QUIT order:\n {reponse}") dbrools.insert_history_new(data=reponse) if reponse['error']: self.bot_ping = False logging.info(f"New order Error:\n {reponse}") bot_sendtext(f"New order Error:\n {reponse}") else: self.my_Stoch = False self.my_RSI = False self.order = False
def generateOrder(self, market): time = market.time # calculate the information of order order = Orders.Order('low' + str(self.traderId), 0, 0, 0) # latency 判断是否参与交易,latency作为影响参与频率的因素,用于确定概率 pro = random.random() if pro > self.latencyFactor: # 此次不参与 # print('\n',self.traderId, "doesn't submit the deal this round! ") return if self.suspendTime != 20: # 市场中已经有订单,此次不会产生新的交易 return # order suspend time order.suspendTime = self.suspendTime order.traderType = self.traderType # order direction if self.traderType == 'c': alphac = 0.04 direction = alphac * (market.RecordList[ time - 1][0] - market.RecordList[time - 2][0]) + self.epsilon else: alphaf = 0.05 Ft = market.RecordList[time - 1][1] * (1 + 0.0001) * (1 + self.epsilon) direction = alphaf * ( Ft - market.RecordList[time - 1][0]) + self.epsilon # 0表示买入,1表示卖出 if direction > 0: order.direction = 0 else: order.direction = 1 # order price order.price = round( market.RecordList[time - 1][0] * (1 + 0.0001) * (1 + self.priceEps), 2) # order quantity order.quantity = abs(direction) order.quantity = max(round(order.quantity, 2), 0.01) # 与财富相关的判断,卖出的股票数不能多于现在持有的股票数,买入花费的现金数不能超过现有的现金 if order.direction == 1 and order.quantity > self.stock: # 卖出 order.quantity = self.stock elif order.direction == 0: # 买入 if order.quantity * order.price > self.cash: order.quantity = round(self.cash / order.price, 2) if order.quantity < 0.01: return # order time order.time = round(market.time + random.uniform(0, 1), 2) # print(order.traderId,order.traderType,order.time,order.direction,order.price,order.quantity,order.suspendTime) self.ownOrders.append(order) self.suspendTime -= 1 if self.suspendTime <= 0: self.suspendTime = 20 return order
def generateOrder(self, market): time = market.time # order judge temp = (market.RecordList[time - 1][0] - market.RecordList[time - 2][0] ) / market.RecordList[time - 2][0] #print(temp,self.threshold) if temp <= self.threshold: #print("This round this HFT doesn't join the market!") return # don't join the market order = Orders.Order('high' + str(self.traderId), 0, 0, 0) order.traderType = 'h' # order direction direction = random.random() # print('The direction of this trader is :',direction) if direction > 0.5: order.direction = 0 #0表示买入,搜索的是对向的截个列表 best = market.AskList.sort_values(['price', 'time'], ascending=False)[0:1]['price'] else: order.direction = 1 best = market.BidList.sort_values(['price', 'time'])[0:1]['price'] # order suspend time,高频的这个值为1,因此只要当前没有匹配成功,就会撤单并在下一轮重新参与,高频参与者每轮都会参与 order.suspendTime = self.suspendTime #order.suspendTime = 1 # order price order.price = round(float(best) * (1 + self.priceDis), 2) # !order quantity meanParamater = 0.625 marketQuantity = market.mes(order.direction) order.quantity = marketQuantity * meanParamater * random.random() #order.quantity = marketQuantity * meanParamater order.quantity = max(round(order.quantity, 2), 0.01) # 持仓限制 if order.quantity + self.stock > marketQuantity / 4: order.quantity = marketQuantity / 4 #print(order.traderId,order.traderType,order.direction,order.price,order.quantity,order.suspendTime) # 与财富相关的判断,卖出的股票数不能多于现在持有的股票数,买入花费的现金数不能超过现有的现金 if order.direction == 1 and order.quantity > self.stock: # 卖出 #print('库存股票不足,无法卖出') order.quantity = self.stock elif order.direction == 0: # 买入 if order.quantity * order.price > self.cash: #print('库存现金不足,无法足量买入') order.quantity = self.cash / order.price if order.quantity < 0.001: #print("No order!\n") return #高频的订单的提交时间 order.time = round(market.time + random.uniform(0, 1), 2) return order
def genMarketDeals(self): deals = [] listdeals = [] if len(self.AskList) == 0: return deals elif len(self.BidList) == 0: return deals for ask in self.AskList.iterrows(): for bid in self.BidList.iterrows(): # print('AskList\n',self.AskList) # print('BidList\n',self.BidList) # print(ask[1][0]) if bid[1][0] >= ask[1][0]: # 成交,加入到历史记录中 price = (ask[1][0] + bid[1][0]) / 2 quantity = min(ask[1][4], bid[1][4]) deal = Orders.Deal(ask[1][3], bid[1][3], quantity, price, self.time) #"AskId", "BidId", "Quantity", "Price","Time" deals.append(deal) self.deals.loc[self.dealnum] = [ ask[1][3], bid[1][3], quantity, price, self.time ] self.dealnum += 1 #deals.append([deal.sellerName,deal.buyerNameme,deal.quantity,deal.price,deal.time]) # print('The price of this deal is :',price) # 订单变化,交易者财富更新 self.updateWealth(ask, bid, quantity) if ask[1][4] > bid[1][4]: self.cancelOrder(bid) # 撤单,订单消失的交易者的suspend返回为原来的常数 self.BidList = self.BidList.drop(bid[0]) rest = ask[1][4] - quantity self.AskList.loc[ask[0], 'quantity'] = rest # print('AskList\n',self.AskList) # print('BidList\n',self.BidList) continue elif ask[1][4] < bid[1][4]: self.cancelOrder(ask) self.AskList = self.AskList.drop(ask[0]) rest = bid[1][4] - quantity self.BidList.loc[bid[0], 'quantity'] = rest break else: self.cancelOrder(ask) self.cancelOrder(bid) self.BidList = self.BidList.drop(bid[0]) self.AskList = self.AskList.drop(ask[0]) break else: print('No more deals! \n') return deals continue return deals
def place_tp_order(self): reponse = Orders.my_order(client=self.bclient, symbol=self.main_symbol.upper(), side=2, amount=round(self.amount, 2), price=self.my_tp) if reponse['error']: self.bot_ping = False logging.info(f"TP order Error:\n {reponse}") bot_sendtext(f"TP order Error:\n {reponse}") else: self.order_id = reponse['result']['orderId']
def place_sl_order(self): reponse = Orders.sl_future( client=self.bclient, symbol=f"{self.symbol.upper()}USDT", side=self.main_direction, price=str(round(self.my_sl, n_rools[self.symbol.upper()]['price'])), amount=round(self.amount, n_rools[self.symbol.upper()]["decimals"])) if reponse['error']: self.bot_ping = False logging.info(f"TP order Error:\n {reponse}") bot_sendtext(f"TP order Error:\n {reponse}") else: self.order_id_sl = reponse['result']['clientOrderId']
def place_tp_order(self): reponse = Orders.my_order( client=self.bclient, symbol=f"{self.symbol.upper()}{self.new_side}USDT", side=2, amount=round(self.amount, 2), price=str( round(self.my_tp, n_rools[self.symbol.upper()][self.new_side]))) if reponse['error']: self.bot_ping = False logging.info(f"TP order Error:\n {reponse}") bot_sendtext(f"TP order Error:\n {reponse}") else: self.order_id = reponse['result']['orderId']
def addLine(self): orderID = self.entryOrderID.get() item = self.entryItem.get() receiver = self.entryReceiver.get() telegramID = self.entryTelegramID.get() for widget in self.frame.winfo_children(): widget.destroy() row = ["{}".format(orderID), "SDB-000-AAA-AAAA", "{}".format(receiver),"{}".format(item),"{}".format(telegramID)] tkinter.messagebox.showinfo("","Caricamento avvenuto con successo") tkinter._exit() Orders.Orders().addRow(row)
def add_orders(self, order_code, order_amount=None, order_class=None): ''' 添加医嘱进该阶段 :return: ''' if order_code in self.stage_item_codes_set: print("ERROR: Order has already existed in stage") else: self.stage_item_codes_set.add(order_code) # 将该医嘱放入对应阶段, 若存在对应医嘱,则修改 order_name = Orders.Orders_Dict.get_orders(order_code).order_name order_info = dict({ "CLINIC_ITEM_CODE": order_code, "AMOUNT": order_amount, "ORDER_CLASS": order_class, "ORDER_NAME": order_name }) self.stage_orders_detail[order_code] = Orders.Basic_Order_Info( order_info) return
def orders(): import Orders C5 = Orders.vp_start_gui()
def close_sl_order(self): my_order = self.bclient.get_order( symbol=f"{self.symbol.upper()}{self.new_side}USDT", orderId=self.order_id) if my_order['status'] == "FILLED": self.close_tp_order() elif my_order['status'] == "PARTIALLY_FILLED": bot_message = f"QUIT (PART){self.symbol.upper()}{self.new_side} , \n{round(self.amount, 2)}, \n{round(float(self.my_sl), 5)}, \n STOP LOSS ,\n SL {round(float(self.my_sl), 4)} / TP {round(float(self.my_tp), 4)}" bot_sendtext(bot_message) print("\n", bot_message) result = self.bclient.cancel_order( symbol=f"{self.symbol.upper()}{self.new_side}USDT", orderId=self.order_id) data = { "symbol": f"{self.symbol}{self.new_side}", "amount": round(self.amount, 2), "price": self.my_sl, "direct": 'SELL', "result": 1, "date": f"{datetime.now().strftime('%d.%m.%Y')}" } dbrools.insert_history(data=data) reponse = Orders.my_order( client=self.bclient, symbol=f"{self.symbol.upper()}{self.new_side}USDT", side=2, amount=round( float(my_order['executedQty']) - float(my_order['origQty']), 2)) logging.info(f"QUIT order:\n {reponse}") dbrools.insert_history_new(data=reponse) if reponse['error']: self.bot_ping = False logging.info(f"New order Error:\n {reponse}") bot_sendtext(f"New order Error:\n {reponse}") else: self.my_Stoch = False self.my_RSI = False self.order = False self.order_id = False else: bot_message = f"QUIT {self.symbol.upper()}{self.new_side} , \n{round(self.amount, 2)}, \n{round(float(self.my_sl), 5)}, \n STOP LOSS ,\n SL {round(float(self.my_sl), 4)} / TP {round(float(self.my_tp), 4)}" bot_sendtext(bot_message) print("\n", bot_message) result = self.bclient.cancel_order( symbol=f"{self.symbol.upper()}{self.new_side}USDT", orderId=self.order_id) print("\n", result) data = { "symbol": f"{self.symbol}{self.new_side}", "amount": round(self.amount, 2), "price": self.my_sl, "direct": 'SELL', "result": 1, "date": f"{datetime.now().strftime('%d.%m.%Y')}" } dbrools.insert_history(data=data) reponse = Orders.my_order( client=self.bclient, symbol=f"{self.symbol.upper()}{self.new_side}USDT", side=2, amount=round(self.amount, 2)) logging.info(f"QUIT order:\n {reponse}") dbrools.insert_history_new(data=reponse) if reponse['error']: self.bot_ping = False logging.info(f"New order Error:\n {reponse}") bot_sendtext(f"New order Error:\n {reponse}") else: self.my_Stoch = False self.my_RSI = False self.order = False self.order_id = False
def place_new_order(self): if self.main_direction == 1: self.new_side = "LONG" else: self.new_side = "SHORT" self.order = self.main_direction reponse = Orders.my_order_future( client=self.bclient, symbol=f"{self.symbol.upper()}USDT", side=self.main_direction, amount=round(self.amount, n_rools[self.symbol.upper()]["decimals"])) if reponse['error']: self.bot_ping = False logging.info(f"New order Error:\n {reponse}") bot_sendtext(f"New order Error:\n {reponse}") else: self.order_id = reponse['result']['orderId'] logging.info(f"New order:\n {reponse}") dbrools.insert_history_new(data=reponse) time.sleep(1) my_orders = self.bclient.futures_get_order( symbol=f"{self.symbol.upper()}USDT", orderId=self.order_id) self.my_price = float(my_orders['avgPrice']) if self.order == 1: self.my_sl = self.my_price / 1.009 self.my_tp = self.my_price * 1.022 else: self.my_sl = self.my_price * 1.009 self.my_tp = self.my_price / 1.022 data = { "symbol": f"{self.symbol} ({self.new_side})", "side": f"{self.new_side}", "amount": round(self.amount, n_rools[self.symbol.upper()]["decimals"]), "price": float( round(self.my_price, n_rools[self.symbol.upper()]['price'])), "direct": 'BUY', "result": 0, "date": f"{datetime.now().strftime('%d.%m.%Y')}" } dbrools.insert_history(data=data) bot_message = f"Added {self.symbol} ({self.new_side}), \n{round(self.amount, n_rools[self.symbol.upper()]['decimals'])}, \n{round(self.my_price, n_rools[self.symbol.upper()]['price'])},\n SL {round(self.my_sl, n_rools[self.symbol.upper()]['price'])} / TP {round(self.my_tp, n_rools[self.symbol.upper()]['price'])}" bot_sendtext(bot_message) print("\n", bot_message) self.place_tp_order()
def curPosLogic(self): dt = datetime.today() tDelta = timedelta(days=1) dtLessOne = dt - tDelta day = dt.strftime('%Y-%m-%d') dayLessOne = dtLessOne.strftime('%Y-%m-%d') positions = self.alpaca.list_positions() for position in positions: df = pd.read_csv('data/15MinOHLC/{}.txt'.format(position.symbol), parse_dates=True) a = df.loc[(df['Date'] == day), ('rsi')].values b = df.loc[(df['Date'] == day), ('stoc k')].values c = df.loc[(df['Date'] == day), ('stoc d')].values d = df.loc[(df['Date'] == day), ('macd')].values e = df.loc[(df['Date'] == day), ('signal')].values # d = df.loc[(df['Date'] == day), ('histogram')].values # e = df.loc[(df['Date'] == dayLessOne), ('histogram')].values purchasePrice = float(position.avg_entry_price) currentPrice = float(position.current_price) if (position.side == 'long'): if ((a > 65) and (b > 75) and (c > 75)): print('sell/exit signal for long position in {}'.format( position.symbol)) qty = int(position.qty) Orders.submitOrder(self, qty, position.symbol, 'sell') # may later replace with a trailing stop loss, but the macd might be an earlier warning than a stop loss # elif(d < e): # print('macd is crossing exit position for {}'.format(position.symbol)) # qty = int(position.qty) # Orders.submitOrder(self, qty, position.symbol, 'sell') elif ((currentPrice / purchasePrice) > 1.015): print('closing {} position to realize gains'.format( position.symbol)) qty = int(position.qty) Orders.submitOrder(self, qty, position.symbol, 'sell') elif ((currentPrice / purchasePrice) < 1): print('closing {} position to stop losses'.format( position.symbol)) qty = int(position.qty) Orders.submitOrder(self, qty, position.symbol, 'sell') else: print('holding position {} {} {}'.format( position.symbol, position.qty, position.side)) elif (position.side == 'short'): if ((a < 35) and (b < 25) and (c < 25)): print('buy/exit signal for short position in {}'.format( position.symbol)) qty = abs(int(position.qty)) Orders.submitOrder(self, qty, position.symbol, 'buy') # may later replace with a trailing stop loss, but the macd might be an earlier warning than a stop loss # elif(e < d): # print('macd is crossing exit position for {}'.format(position.symbol)) # qty = abs(int(position.qty)) # Orders.submitOrder(self, qty, position.symbol, 'buy') elif ((purchasePrice / currentPrice) > 1.015): print('closing {} position to realize gains'.format( position.symbol)) qty = abs(int(position.qty)) Orders.submitOrder(self, qty, position.symbol, 'buy') elif ((purchasePrice / currentPrice) < 1): print('closing {} position to stop losses'.format( position.symbol)) qty = abs(int(position.qty)) Orders.submitOrder(self, qty, position.symbol, 'buy') else: print('holding position {} {} {}'.format( position.symbol, position.qty, position.side))
def __init__(self, user): self.wn = tk.ThemedTk() self.wn.configure(bg="#6262ED") self.wn.title("Rent a car") self.wn.geometry("650x450+200+50") self.item_index = "" self.my_index = 1 self.user = user self.wn.get_themes() self.wn.set_theme('plastik') self.item = Admn.Admin() self.order = Orders.Order() #==========================Frame1==============================# self.frame1 = Frame(self.wn) self.frame1.place(x=10, y=10) self.frame1.configure(bg="#6262ED") self.lbl_add = Label(self.frame1, font=("Calibri", 14, "bold"), text="Address:", bg="#6262ED") self.lbl_add.grid(row=0, column=0) self.combo_tbl1 = ttk.Combobox(self.frame1, state='readonly', width=20) self.combo_tbl1.grid(row=0, column=1, padx=5) self.combo_tbl1['values'] = self.order.all_address() self.btn1 = Button(self.frame1, text='Search', font=('Calibri', 11, "bold"), fg="white", background='#6262ED', width=12, bd=1, command=self.search) self.btn1.grid(row=0, column=2, padx=10) #==========================Frame2==============================# self.frame2 = Frame(self.wn, bg="#6262ED") self.frame2.place(x=10, y=50) self.cars_tree = ttk.Treeview(self.frame2, columns=('Brand', 'Model', 'Price', 'Address')) self.cars_tree.grid(row=0, column=0) self.cars_tree['show'] = 'headings' self.cars_tree.column('Brand', width=150, anchor='center') self.cars_tree.column('Model', width=150, anchor='center') self.cars_tree.column('Price', width=150, anchor='center') self.cars_tree.column('Address', width=155, anchor='center') self.cars_tree.heading('Brand', text="Brand") self.cars_tree.heading('Model', text="Model") self.cars_tree.heading('Price', text="Price") self.cars_tree.heading('Address', text="Address") self.cars_tree.bind("<Double-1>", self.select_item) self.vsb = ttk.Scrollbar(self.frame2, orient="vertical", command=self.cars_tree.yview) self.vsb.place(x=591, y=2, height=225) self.cars_tree.configure(yscrollcommand=self.vsb.set) #==========================Frame3==============================# self.frame3 = Frame(self.wn, bg="#6262ED") self.frame3.place(x=10, y=300) self.lbl_brand = Label(self.frame3, font=("Calibri", 14, "bold"), text="Brand:", bg="#6262ED") self.lbl_brand.grid(row=0, column=0) self.lbl_model = Label(self.frame3, font=("Calibri", 14, "bold"), text="Model:", bg="#6262ED") self.lbl_model.grid(row=1, column=0) self.ent_cbrand = ttk.Entry(self.frame3, font=("Verdana", 12), state="readonly") self.ent_cbrand.grid(row=0, column=1, padx=10) self.ent_cmodel = ttk.Entry(self.frame3, font=("Verdana", 12), state="readonly") self.ent_cmodel.grid(row=1, column=1, padx=10) self.lbl_price = Label(self.frame3, font=("Calibri", 14, "bold"), text="Price:", bg="#6262ED") self.lbl_price.grid(row=2, column=0) self.ent_cprice = ttk.Entry(self.frame3, font=("Verdana", 12), state="readonly") self.ent_cprice.grid(row=2, column=1, padx=10) self.lbl_date = Label(self.frame3, font=("Calibri", 14, "bold"), text="Pick up Date:", bg="#6262ED") self.lbl_date.grid(row=0, column=3) self.cal = DateEntry(self.frame3, width=12, background='darkblue', foreground='white', borderwidth=2, state="readonly") self.cal.grid(row=0, column=4) self.lbl_days = Label(self.frame3, font=("Calibri", 14, "bold"), text="Days:", bg="#6262ED") self.lbl_days.grid(row=1, column=3) self.combo_tbl2 = ttk.Combobox(self.frame3, state='readonly', width=11) self.combo_tbl2.grid(row=1, column=4, padx=5) self.combo_tbl2['values'] = [ '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15' ] self.btn1 = Button(self.wn, text="Order", font=('Calibri', 11, "bold"), fg="white", background='#6262ED', borderwidth=0.5, width=15, command=self.submitOrder) self.btn1.place(x=260, y=400) self.show_menu() self.wn.mainloop()
def main(*args): # file = open('config.txt') parser.parse(sys.argv[1]) orders = Orders.Orders() orders.execute_orders(sys.argv[2], sys.argv[3])
decriptandoli usando come chiave di cifratura il seriale della SDB, Fintanto che il seriale dell'ordine non matcha la lista degli ordini in arrivo presenti sulla SDB (orders.txt) (Si presume che il sudetto file venga aggiornato da Amazon e si refreshi all'avvio della SDB) Infine vengono restituiti i dati dell'ordine in fase di consegna ''' b = ScanQR.scanqr() #Avvio Processo di ScanQR ''' b==1 -> QR Speciale b not none -> QR Letto correttamente dal postino b is none -> QR NON Letto, NO apertura ''' #Caso lettura QR in maniera corretta da Postino if b is not None and b!=1: #Eliminazione ordine da "Orders.txt" Orders.Orders().deleteOrder(b.SerialNumber) ServoMotor.ServoOpen() time.sleep(40) # Tempo inserimento pacco nel SDB ServoMotor.ServoClose() # Invio Messaggio da TelegramBot message_T = "Ciao " + b.CustomerName + " il tuo ordine che include: " + b.OrderDescription + " è in consegna presso la seguente SmartDeliveryBox: " + b.DeliveryBoxSerial TelegramMessage.send(message_T, b.CustomerTelegram.strip()) time.sleep(2) TelegramMessage.sendqr(b.CustomerTelegram.strip()) #Caso lettura QR "Speciale" in maniera corretta if b is not None and b==1: ServoMotor.ServoOpen() time.sleep(40) #Tempo inserimento pacco nel SDB
def scanqr(): Orders.Orders().loadOrder( ) #Sincronizza Ordini da FoglioGoogle->orders.txt timeout = 60 #Timeout time for QRCode scanning timeout_start = time.time() #Avvio Timer while time.time() < timeout_start + timeout: RGB.RGBClass() RGB.RGBClass.blue_on() RGB.RGBClass.red_off() RGB.RGBClass.green_off() # crea uno stream dati in memoria stream = io.BytesIO() # visualizzazione dello streaming della camera with picamera.PiCamera() as camera: camera.exposure_mode = 'auto' camera.preview_fullscreen = False # ridimensiono il preview per poter interrompere in caso di problemi camera.preview_window = (300, 200, 640, 480) camera.start_preview() sleep(1) # aumentare se si vuole inquadrare meglio camera.capture(stream, format='jpeg') # recupera tutto il flusso per creare l'immagine stream.seek(0) pil = Image.open(stream) # inizializza lo scan dell'immagine scanner = zbar.ImageScanner() # configura il lettore scanner.parse_config('enable') pil = pil.convert('L') width, height = pil.size # raw = pil.tostring() raw = pil.tobytes() # wrap dati della immagine image = zbar.Image(width, height, 'Y800', raw) # cerca un QRcode scanner.scan(image) # se la password corrisponde ed e' esatta for symbol in image: # if hashlib.sha256(password).hexdigest() == symbol.data: for order in OrderClassList.loadorders( ): #Carico e inizializzo classe da Orders.txt ''' TO SHOW + CMD CLICK ''' if (len(symbol.data) == 44): if Crypter.decode( symbol.data ) == order.SerialNumber or Crypter.decode( symbol.data) == '000-0000000-0000001': #Gestione SpecialKeyQRCode if (Crypter.decode( symbol.data) == '000-0000000-0000001'): order = 1 RGB.RGBClass.blue_off() RGB.RGBClass.green_on() ''' print Crypter.decode(symbol.data) print order.SerialNumber print len(symbol.data) ''' return order # strip Eliminato qui else: RGB.RGBClass.blue_off() RGB.RGBClass.red_pulse() else: RGB.RGBClass.blue_off() RGB.RGBClass.red_pulse() # pulisci e cancella del (image) return None
def __init__(self, cp_id, version_sqno, cp_detail_order, cp_detail_info, stage_info): ''' 临床路径的阶段类 :param cp_id: 临床路径的id :param version_sqno: 临床路径的版本 :param cp_detail_order: :param cp_detail_info: :param stage_info: 临床路径阶段的详细信息, dict格式 :param conn: 数据库连接 Stage包含的参数有: stage_sqno start_day end_day stage_desc stage_name stage_item_codes_set: set,该阶段所有医嘱编号的集合 stage_orders_detail: 字典,该阶段包含的医嘱code ---> 医嘱的详细信息 stage_required_codes_set: set, 该阶段所有必选医嘱编号的集合 stage_required_detail: 字典,该阶段包含的必选医嘱code ---> 医嘱的详细信息 ''' self.cp_id = cp_id self.version_sqno = version_sqno self.stage_sqno = stage_info["STAGE_SQNO"] self.start_day = stage_info["START_DAY"] self.end_day = stage_info["END_DAY"] self.stage_desc = stage_info["STAGE_DESC"] self.stage_name = stage_info["STAGE_NAME"] self.stage_item_codes_set = set() self.stage_orders_detail = dict() self.stage_required_codes_set = set() self.stage_required_detail = dict() # 该阶段的医嘱详细信息表 # cp_orders = pd.read_sql_query( # "select * from CP_DETAIL_ORDER where CP_ID = '" + str(self.cp_id) + "' and VERSION_SQNO = '" + str( # self.version_sqno) + "' and STAGE_SQNO = '" + str(self.stage_sqno) + "'", conn) cp_orders = cp_detail_order[cp_detail_order.STAGE_SQNO == self.stage_sqno].reset_index(drop=True) # 该阶段的路径内容记录,主要用于判断医嘱是否必选 # cp_detail_info = pd.read_sql_query("select * from CP_DETAIL_INFO where CP_ID = '" + str(self.cp_id) + "' and VERSION_SQNO = '" + str( # self.version_sqno) + "' and STAGE_SQNO = '" + str(self.stage_sqno) + "'", conn).rename(columns={"ITEM_SQNO": "ORDER_SQNO"}) cp_detail_info = cp_detail_info[cp_detail_info.STAGE_SQNO == self.stage_sqno].rename( columns={ "ITEM_SQNO": "ORDER_SQNO" }).reset_index(drop=True) # 获取必选医嘱的codes集合 cp_info = cp_orders.merge( cp_detail_info, how="left", on=["CP_ID", "VERSION_SQNO", "STAGE_SQNO", "ORDER_SQNO"]) cp_require_order = cp_info[cp_info.REQUIRED.astype(str) == "1"] self.stage_required_codes_set = set(cp_require_order.CLINIC_ITEM_CODE) cp_orders_columns_list = cp_orders.columns.values.tolist() # 获取字段名称 for each_order in cp_info.iterrows(): self.stage_item_codes_set.add(each_order[1]["CLINIC_ITEM_CODE"]) # 创建医嘱详情 each_order_dict = dict([(k, each_order[1][k]) for k in cp_orders_columns_list]) order_detail = Orders.Basic_Order_Info(each_order_dict) self.stage_orders_detail[each_order[1] ["CLINIC_ITEM_CODE"]] = order_detail # 若医嘱在必选医嘱集中,则将其加入必选医嘱的详情dict if each_order[1][ "CLINIC_ITEM_CODE"] in self.stage_required_codes_set: self.stage_required_detail[each_order[1] ["CLINIC_ITEM_CODE"]] = order_detail # 将医嘱放入医嘱字典 Orders.Orders_Dict.add_orders(each_order_dict) return