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)
Esempio n. 2
0
 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
Esempio n. 3
0
 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)
Esempio n. 4
0
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)
Esempio n. 5
0
    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)
Esempio n. 6
0
    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)
Esempio n. 7
0
    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)
Esempio n. 9
0
    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)
Esempio n. 10
0
    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)
Esempio n. 11
0
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)
Esempio n. 12
0
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
Esempio n. 13
0
        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
        # 委託數量