def __SendOrder_Click(self, bAsyncOrder): try: if self.boxBuyOrSell1.get() == "買進": sBuySell = 0 elif self.boxBuyOrSell1.get() == "賣出": sBuySell = 1 # 建立下單用的參數(FUTUREORDER)物件(下單時要填商品代號,買賣別,委託價,數量等等的一個物件) oOrder = sk.FUTUREORDER() # 填入完整帳號 oOrder.bstrFullAccount = self.__dOrder['boxAccount'] # 填入期權代號1 oOrder.bstrStockNo = self.txtStockNo1.get() # 買賣別 oOrder.sBuySell = sBuySell # 委託數量 oOrder.nQty = int(self.txtQty.get()) message, m_nCode = skO.DisassembleOptions(Global.Global_IID, bAsyncOrder, oOrder) self.__oMsg.SendReturnMessage("Order", m_nCode, "DisassembleOptions", self.__dOrder['listInformation']) except Exception as e: messagebox.showerror("error!", e)
def Future(self, account, stockNo, sBuySell, sPrice, sQty, tradetype, reservetype): # 建立下單用的參數(FUTUREORDER)物件(下單時要填商品代號,買賣別,委託價,數量等等的一個物件) oOrder = sk.FUTUREORDER() # 填入完整帳號 oOrder.bstrFullAccount = account # 填入期權代號 oOrder.bstrStockNo = stockNo # 買進 = 0、賣出 = 1 if sBuySell == "Buy": oOrder.sBuySell = 0 elif sBuySell == "Sell": oOrder.sBuySell = 1 # ROD = 0、IOC = 1、FOK = 2 if tradetype == 'ROD': oOrder.sTradeType = 0 elif tradetype == 'IOC': oOrder.sTradeType = 1 elif tradetype == 'FOK': oOrder.sTradeType = 2 # 非當沖 = 0、當沖 = 1 oOrder.sDayTrade = 0 # 委託價、市價 = M oOrder.bstrPrice = sPrice # 委託數量 oOrder.nQty = int(sQty) # 新倉 = 0、平倉 = 1、自動 = 2 oOrder.sNewClose = 2 # 盤中 = 0、T盤預約 = 1 oOrder.sReserved = reservetype return oOrder
def __init__(self): super(SKMainWindow, self).__init__() loadUi(r'UI/MainWindow.ui', self) self.showMaximized() # 帳號處理 self.SKID = '未登入' # 登入帳號 self.IBAccount = '' #期貨帳號 self.statusBar.showMessage('帳號:' + self.SKID) self.Bill = [] self.fOrder = sk.FUTUREORDER() #下單參數 Future structure self.trade_act = -1 self.OrderPrice = '' self.ReplyComplete = False # 介面導入 self.SKLoginUI() #登入介面 self.SKMessageFunc() #系統訊息介面 self.RightUI() #權益數介面 #ManuBar連結 self.actionLogin.triggered.connect(self.Login.show) #登入介面連結 #ToolBar連結 self.SysDetail.triggered.connect(self.SKMessage.show) self.Connectbtn.triggered.connect(self.ConnectFun) self.Disconnectbtn.triggered.connect(self.disconnectFun) # Tab內功能組連結 self.commoditybtn.clicked.connect(self.commodityFnc) self.BidAct_btn.clicked.connect(self.BidFunc) self.AskAct_btn.clicked.connect(self.AskFunc) self.LastPrice_btn.clicked.connect(self.LastPriceFunc) self.PriceSpin.valueChanged.connect(self.GetPriceFunc) self.MarketPrice_btn.clicked.connect(self.MarketPriceFunc) self.LimitMarketPrice_btn.clicked.connect(self.LimitMarketPriceFunc) self.Order_btn.clicked.connect(self.Order_btn_Func) self.OrderCancel_btn.clicked.connect(self.OrderCancelFunc) self.ClosePositionAll_btn.clicked.connect(self.ClosePositionAllFunc)
def send_order(buy_sell, b_async_order=False): print(datetime.datetime.now(), ' is sending order ......') try: ''' Buy: sBuySell = 0 , Sell: sBuySell = 1 ROD: sTradeType = 0, IOC: sTradeType = 1, FOK: sTradeType = 2 非當沖: sDayTrade = 0, 當沖: sDayTrade = 1 新倉: sNewClose = 0, 平倉: sNewClose = 1, 自動: sNewClose = 2 盤中: sReserved = 0, T盤預約: sReserved = 1 ''' order = sk.FUTUREORDER() order.bstrFullAccount = global_account[0] order.bstrStockNo = 'MTX00' order.sBuySell = buy_sell order.sTradeType = 1 order.sDayTrade = 0 order.bstrPrice = 'M' order.nQty = 1 order.sNewClose = 2 order.sReserved = 0 message, stat = skO.SendFutureOrderCLR(global_id, b_async_order, order) if stat == 0: print('【 SendingOrder successful 】') else: print('【 SendingOrder error code:' + str(stat) + '】') except Exception as e: print("error!", e)
def __SendOrder_Click(self, bAsyncOrder): try: if self.__dOrder['boxBuySell'].get() == "買進": sBuySell = 0 elif self.__dOrder['boxBuySell'].get() == "賣出": sBuySell = 1 if self.__dOrder['boxPeriod'].get() == "ROD": sTradeType = 0 elif self.__dOrder['boxPeriod'].get() == "IOC": sTradeType = 1 elif self.__dOrder['boxPeriod'].get() == "FOK": sTradeType = 2 if self.__dOrder['boxFlag'].get() == "非當沖": sDayTrade = 0 elif self.__dOrder['boxFlag'].get() == "當沖": sDayTrade = 1 if self.__dOrder['boxNewClose'].get() == "新倉": sNewClose = 0 elif self.__dOrder['boxNewClose'].get() == "平倉": sNewClose = 1 elif self.__dOrder['boxNewClose'].get() == "自動": sNewClose = 2 if self.__dOrder['boxReserved'].get() == "盤中": sReserved = 0 elif self.__dOrder['boxReserved'].get() == "T盤預約": sReserved = 1 # 建立下單用的參數(FUTUREORDER)物件(下單時要填商品代號,買賣別,委託價,數量等等的一個物件) oOrder = sk.FUTUREORDER() # 填入完整帳號 oOrder.bstrFullAccount = self.__dOrder['boxAccount'] # 填入期權代號 oOrder.bstrStockNo = self.__dOrder['txtStockNo'].get() # 買賣別 oOrder.sBuySell = sBuySell # ROD、IOC、FOK oOrder.sTradeType = sTradeType # 非當沖、當沖 oOrder.sDayTrade = sDayTrade # 委託價 oOrder.bstrPrice = self.__dOrder['txtPrice'].get() # 委託數量 oOrder.nQty = int(self.__dOrder['txtQty'].get()) # 新倉、平倉、自動 oOrder.sNewClose = sNewClose # 盤中、T盤預約 oOrder.sReserved = sReserved message, m_nCode = skO.SendFutureOrderCLR(self.__dOrder['txtID'], bAsyncOrder, oOrder) self.__oMsg.SendReturnMessage("Order", m_nCode, "SendFutureOrderCLR", self.__dOrder['listInformation']) except Exception as e: messagebox.showerror("error!", e)
def __SendOrder_Click(self, bAsyncOrder): try: if self.__dOrder['boxBuySell'].get() == "買進": sBuySell = 0 elif self.__dOrder['boxBuySell'].get() == "賣出": sBuySell = 1 if self.__dOrder['boxPeriod'].get() == "ROD": sTradeType = 0 elif self.__dOrder['boxPeriod'].get() == "IOC": sTradeType = 1 elif self.__dOrder['boxPeriod'].get() == "FOK": sTradeType = 2 if self.__dOrder['boxNewClose'].get() == "新倉": sNewClose = 0 elif self.__dOrder['boxNewClose'].get() == "平倉": sNewClose = 1 elif self.__dOrder['boxNewClose'].get() == "自動": sNewClose = 2 if self.__dOrder['boxReserved'].get() == "盤中": sReserved = 0 elif self.__dOrder['boxReserved'].get() == "T盤預約": sReserved = 1 # 建立下單用的參數(FUTUREORDER)物件(下單時要填商品代號,買賣別,委託價,數量等等的一個物件) oOrder = sk.FUTUREORDER() # 填入完整帳號 oOrder.bstrFullAccount = self.__dOrder['boxAccount'] # 填入期權代號 oOrder.bstrStockNo = self.__dOrder['txtStockNo'].get() # 買賣別 oOrder.sBuySell = sBuySell # ROD、IOC、FOK oOrder.sTradeType = sTradeType # 新倉、平倉、自動 oOrder.sNewClose = sNewClose # 委託價 oOrder.bstrPrice = self.__dOrder['txtPrice'].get() # 委託數量 oOrder.nQty = int(self.__dOrder['txtQty'].get()) # 觸發價 oOrder.bstrTrigger = self.__dOrder['txtTrigger'].get() # 盤中、T盤預約 oOrder.sReserved = sReserved message, m_nCode = skO.SendOptionStopLossOrder( Global.Global_IID, bAsyncOrder, oOrder) self.__oMsg.SendReturnMessage("Order", m_nCode, "SendOptionStopLossOrder", self.__dOrder['listInformation']) if bAsyncOrder == False and m_nCode == 0: strMsg = "選擇權停損委託: " + str(message) self.__oMsg.WriteMessage(strMsg, self.__dOrder['listInformation']) except Exception as e: messagebox.showerror("error!", e)
def __btnSendOrder_Click(self): if self.__dOrder['boxAccount'] == '': messagebox.showerror("error!", '請選擇期貨帳號!') else: try: if self.__dOrder['boxBuySell'].get() == "買進": sBuySell = 0 elif self.__dOrder['boxBuySell'].get() == "賣出": sBuySell = 1 if self.__dOrder['boxPeriod'].get() == "IOC": sTradeType = 1 elif self.__dOrder['boxPeriod'].get() == "FOK": sTradeType = 2 if self.__dOrder['boxNewClose'].get() == "新倉": sNewClose = 0 elif self.__dOrder['boxNewClose'].get() == "平倉": sNewClose = 1 elif self.__dOrder['boxNewClose'].get() == "自動": sNewClose = 2 if self.__dOrder['boxASYNC'].get() == "同步": bAsyncOrder = 0 elif self.__dOrder['boxASYNC'].get() == "非同步": bAsyncOrder = 1 # 建立下單用的參數(FUTUREORDER)物件(下單時要填商品代號,買賣別,委託價,數量等等的一個物件) oOrder = sk.FUTUREORDER() # 填入完整帳號 oOrder.bstrFullAccount = self.__dOrder['boxAccount'] # 填入期權代號 oOrder.bstrStockNo = self.__dOrder['txtStockNo'].get() # 買賣別 oOrder.sBuySell = sBuySell # IOC、FOK oOrder.sTradeType = sTradeType # 新倉、平倉、自動 oOrder.sNewClose = sNewClose # 成交價 oOrder.bstrDealPrice = self.__dOrder['txtDealPrice'].get() # 委託數量 oOrder.nQty = int(self.__dOrder['txtQty'].get()) # 觸發價 oOrder.bstrTrigger = self.__dOrder['txtTrigger'].get() message, m_nCode = skO.SendOptionMITOrder( Global.Global_IID, bAsyncOrder, oOrder) self.__oMsg.SendReturnMessage("Order", m_nCode, "SendOptionMITOrder", self.__dOrder['listInformation']) if bAsyncOrder == False and m_nCode == 0: strMsg = "選擇權MIT委託: " + str(message) self.__oMsg.WriteMessage(strMsg, self.__dOrder['listInformation']) except Exception as e: messagebox.showerror("error!", e)
def __SendOrder_Click(self, bAsyncOrder): try: if self.boxBuyOrSell1.get() == "買進": sBuySell = 0 elif self.boxBuyOrSell1.get() == "賣出": sBuySell = 1 if self.boxBuyOrSell2.get() == "買進": sBuySell2 = 0 elif self.boxBuyOrSell2.get() == "賣出": sBuySell2 = 1 if self.TradeType.get() == "IOC": sTradeType = 1 elif self.TradeType.get() == "FOK": sTradeType = 2 if self.boxNewOrClose.get() == "新倉": sNewClose = 0 elif self.boxNewOrClose.get() == "平倉": sNewClose = 1 # 建立下單用的參數(FUTUREORDER)物件(下單時要填商品代號,買賣別,委託價,數量等等的一個物件) oOrder = sk.FUTUREORDER() # 填入完整帳號 oOrder.bstrFullAccount = self.__dOrder['boxAccount'] # 填入期權代號1 oOrder.bstrStockNo = self.txtMerchandise1.get() # 填入期權代號2 oOrder.bstrStockNo2 = self.txtMerchandise2.get() # 買賣別1 oOrder.sBuySell = sBuySell # 買賣別2 oOrder.sBuySell2 = sBuySell2 # IOC、FOK oOrder.sTradeType = sTradeType # 委託價 oOrder.bstrPrice = self.txtPrice.get() # 委託數量 oOrder.nQty = int(self.txtQty.get()) # 新倉、平倉 oOrder.sNewClose = sNewClose message, m_nCode = skO.SendDuplexOrder(Global.Global_IID, bAsyncOrder, oOrder) self.__oMsg.SendReturnMessage("Order", m_nCode, "SendDuplexOrder", self.__dOrder['listInformation']) if bAsyncOrder == False and m_nCode == 0: strMsg = "複式單委託: " + str(message) self.__oMsg.WriteMessage(strMsg, self.__dOrder['listInformation']) except Exception as e: messagebox.showerror("error!", e)
def __SendOrder_Click(self, bAsyncOrder): try: if self.__dOrder['boxBuySell'].get() == "買進": sBuySell = 0 elif self.__dOrder['boxBuySell'].get() == "賣出": sBuySell = 1 if self.__dOrder['boxPeriod'].get() == "ROD": sTradeType = 0 elif self.__dOrder['boxPeriod'].get() == "IOC": sTradeType = 1 elif self.__dOrder['boxPeriod'].get() == "FOK": sTradeType = 2 if self.__dOrder['boxFlag'].get() == "非當沖": sDayTrade = 0 elif self.__dOrder['boxFlag'].get() == "當沖": sDayTrade = 1 # 建立下單用的參數(FUTUREORDER)物件(下單時要填商品代號,買賣別,委託價,數量等等的一個物件) oOrder = sk.FUTUREORDER() # 填入完整帳號 oOrder.bstrFullAccount = self.__dOrder['boxAccount'] # 填入期權代號 oOrder.bstrStockNo = self.__dOrder['txtStockNo'].get() # 買賣別 oOrder.sBuySell = sBuySell # ROD、IOC、FOK oOrder.sTradeType = sTradeType # 非當沖、當沖 oOrder.sDayTrade = sDayTrade # 委託價 oOrder.bstrPrice = self.__dOrder['txtPrice'].get() # 委託數量 oOrder.nQty = int(self.__dOrder['txtQty'].get()) message, m_nCode = skO.SendFutureOrder(Global.Global_IID, bAsyncOrder, oOrder) self.__oMsg.SendReturnMessage("Order", m_nCode, "SendFutureOrder", self.__dOrder['listInformation']) if bAsyncOrder == False and m_nCode == 0: strMsg = "期貨委託: " + str(message) self.__oMsg.WriteMessage(strMsg, self.__dOrder['listInformation']) except Exception as e: messagebox.showerror("error!", e)
def __SendOrder_Click(self, bAsyncOrder): try: # 建立下單用的參數(FUTUREORDER)物件(下單時要填商品代號,買賣別,委託價,數量等等的一個物件) oOrder = sk.FUTUREORDER() # 填入完整帳號 oOrder.bstrFullAccount = self.__dOrder['boxAccount'] # 填入期權代號 oOrder.bstrStockNo = self.txtMerchandise1.get() # 委託數量 oOrder.nQty = int(self.txtQty.get()) message, m_nCode = skO.CoverAllProduct(Global.Global_IID, bAsyncOrder, oOrder) self.__oMsg.SendReturnMessage("Order", m_nCode, "CoverAllProduct", self.__dOrder['listInformation']) except Exception as e: messagebox.showerror("error!", e)
def daily_stop_loss_order(stop_loss_point=85): print('sending stop loss order ...') try: get_open_position() while True: pythoncom.PumpWaitingMessages() if global_now_open_position: break time.sleep(0.5) order = sk.FUTUREORDER() order.bstrFullAccount = global_account[0] order.bstrStockNo = 'MTX00' order.sTradeType = 1 order.sDayTrade = 0 order.bstrPrice = 'M' order.nQty = 1 order.sNewClose = 2 order.sReserved = 0 if 'NO DATA' in global_now_open_position[0][0]: return elif global_now_open_position[0][3] == 'B': stop_loss_price = str( int(global_now_open_position[0][6]) / 1000 - stop_loss_point) print('Stop loss point: ', stop_loss_price) order.bstrTrigger = stop_loss_price order.sBuySell = 1 elif global_now_open_position[0][3] == 'S': stop_loss_price = str( int(global_now_open_position[0][6]) / 1000 + stop_loss_point) print('Stop loss point: ', stop_loss_price) order.bstrTrigger = stop_loss_price order.sBuySell = 0 message, stat = skO.SendFutureStopLossOrder(global_id, False, order) if stat == 0: print('【 SendFutureStopLossOrder successful 】') else: print('【 SendFutureStopLossOrder error code:' + str(stat) + '】') except Exception as e: print("error!", e)
class Trader(object): def __init__(self, username, password, exchange, merchandise, isReal): self.isReal = isReal if not self.isReal: skC.SKCenterLib_ResetServer('morder1.capital.com.tw') # else: # skC.SKCenterLib_ResetServer('Order2.capital.com.tw') self.username = username self.password = password self.exchange = exchange self.merchandise = merchandise self.SKOrderEvent = SKOrderLibEvent(self) self.SKOrderLibEventHandler = comtypes.client.GetEvents( skO, self.SKOrderEvent) self.SKQuoteEvent = SKQuoteLibEvents(self) self.SKQuoteLibEventHandler = comtypes.client.GetEvents( skQ, self.SKQuoteEvent) self.SKReplyEvent = SKReplyLibEvent(self) self.SKReplyLibEventHandler = comtypes.client.GetEvents( skR, self.SKReplyEvent) self.account_list = None self.updater = select_updater(self.exchange) self.isRun = True self.isTrade = False self.tradeThread = threading.Thread() self.position = N_STR self.signal = N_STR self.tradeSignal = TradeSignal() self.cur_time = None def __pumpwait(self): while self.isTrade: pythoncom.PumpWaitingMessages() def __pumpwaitForT(self, t=1): for i in range(t): time.sleep(1) pythoncom.PumpWaitingMessages() def record(self): if self.__login(): res = skQ.SKQuoteLib_EnterMonitor() strMsg = skC.SKCenterLib_GetReturnCodeMessage(res) Logs('Enter Monitor : {}'.format(strMsg)) self.__pumpwaitForT(8) res = skQ.SKQuoteLib_RequestKLineAM(self.merchandise, sKLineType=0, sOutType=1, sTradeSession=0) strMsg = skC.SKCenterLib_GetReturnCodeMessage(res) Logs('Request K Line : {}'.format(strMsg)) df_klin = self.SKQuoteEvent.GetKLineData() list_kline = df_klin.T.to_dict().values() mongo = DataMongo() mongo.insert('TWS', 'TX00', list_kline) else: Logs('Close Recording Program') def FutureOrder(self, async, sMer, sBuySell, sTradeType, sDayTrade, sPrice, sVol, sNewClose, sReserved): # 建立下單用的參數(FUTUREORDER)物件(下單時要填商品代號,買賣別,委託價,數量等等的一個物件) oOrder = sk.FUTUREORDER() # 填入完整帳號 oOrder.bstrFullAccount = self.account_list['future'] # 填入期權代號 oOrder.bstrStockNo = sMer # 買賣別 oOrder.sBuySell = sBuySell # ROD、IOC、FOK oOrder.sTradeType = sTradeType # 非當沖、當沖 oOrder.sDayTrade = sDayTrade # 委託價 oOrder.bstrPrice = sPrice # 委託數量 oOrder.nQty = sVol # 新倉、平倉、自動 oOrder.sNewClose = sNewClose # 盤中、T盤預約 oOrder.sReserved = sReserved resMsg, res = skO.SendFutureOrder(self.username, async, oOrder) strMsg = skC.SKCenterLib_GetReturnCodeMessage(res) Logs('Order {} @ {}, Vol : {}, msg :{}'.format(sMer, sPrice, sVol, strMsg)) if res == 0: return True, resMsg else: return False, resMsg
strMsg = skC.SKCenterLib_GetReturnCodeMessage(res) Logs( 'OCO Order 1 {} @ {}, Vol : {}, OCO Order 2 {} @ {}, Vol : {}, msg : {}' .format(sMer, sTrigger, sVol, sMer, sTrigger2, sVol, strMsg)) if res == 0: return True, resMsg else: return False, resMsg def FutureStopOrder(self, async, sMer, sBuySell, sTradeType, sDayTrade, sPrice, sTrigger, sVol, sNewClose, sReserved): # 建立下單用的參數(FUTUREORDER)物件(下單時要填商品代號,買賣別,委託價,數量等等的一個物件) oOrder = sk.FUTUREORDER() # 填入完整帳號 oOrder.bstrFullAccount = self.account_list['future'] # 填入期權代號 oOrder.bstrStockNo = sMer # 買賣別 oOrder.sBuySell = sBuySell # ROD、IOC、FOK oOrder.sTradeType = sTradeType # 非當沖、當沖 oOrder.sDayTrade = sDayTrade # 委託價 oOrder.bstrPrice = sPrice # 觸發價 oOrder.bstrTrigger = sTrigger # 委託數量