Ejemplo n.º 1
0
 public static QotCommon.Security MakeSec(QotCommon.QotMarket market, String code)
 {
     QotCommon.Security sec = QotCommon.Security.CreateBuilder().SetCode(code)
                              .SetMarket((int)market)
                              .Build();
     return(sec);
 }
Ejemplo n.º 2
0
        public QotGetOrderBook.Response GetOrderBookSync(QotCommon.Security sec, int num)
        {
            ReqInfo reqInfo   = null;
            Object  syncEvent = new Object();

            lock (syncEvent)
            {
                lock (qotLock)
                {
                    if (qotConnStatus != ConnStatus.READY)
                    {
                        return(null);
                    }
                    QotGetOrderBook.C2S c2s = QotGetOrderBook.C2S.CreateBuilder()
                                              .SetSecurity(sec)
                                              .SetNum(num)
                                              .Build();
                    QotGetOrderBook.Request req = QotGetOrderBook.Request.CreateBuilder().SetC2S(c2s).Build();
                    uint sn = qot.GetOrderBook(req);
                    if (sn == 0)
                    {
                        return(null);
                    }
                    reqInfo = new ReqInfo(ProtoID.QotGetOrderBook, syncEvent);
                    qotReqInfoMap.Add(sn, reqInfo);
                }
                Monitor.Wait(syncEvent);
                return((QotGetOrderBook.Response)reqInfo.Rsp);
            }
        }
Ejemplo n.º 3
0
 void SendGetMarketState(FTAPI_Qot qot)
 {
     QotCommon.Security sec = QotCommon.Security.CreateBuilder().SetCode("00700")
                              .SetMarket((int)QotCommon.QotMarket.QotMarket_HK_Security)
                              .Build();
     QotGetMarketState.C2S c2s = QotGetMarketState.C2S.CreateBuilder().AddSecurityList(sec)
                                 .Build();
     QotGetMarketState.Request req = QotGetMarketState.Request.CreateBuilder().SetC2S(c2s).Build();
     qot.GetMarketState(req);
 }
Ejemplo n.º 4
0
        public QotRequestHistoryKL.Response RequestHistoryKLSync(QotCommon.Security sec,
                                                                 QotCommon.KLType klType,
                                                                 QotCommon.RehabType rehabType,
                                                                 String beginTime,
                                                                 String endTime,
                                                                 int?count,
                                                                 long?klFields,
                                                                 byte[] nextReqKey,
                                                                 bool extendedTime)
        {
            ReqInfo reqInfo   = null;
            Object  syncEvent = new Object();

            lock (syncEvent)
            {
                lock (qotLock)
                {
                    if (qotConnStatus != ConnStatus.READY)
                    {
                        return(null);
                    }
                    QotRequestHistoryKL.C2S.Builder c2s = QotRequestHistoryKL.C2S.CreateBuilder()
                                                          .SetSecurity(sec)
                                                          .SetKlType((int)klType)
                                                          .SetRehabType((int)rehabType)
                                                          .SetBeginTime(beginTime)
                                                          .SetEndTime(endTime)
                                                          .SetExtendedTime(extendedTime);
                    if (count.HasValue)
                    {
                        c2s.SetMaxAckKLNum(count.Value);
                    }
                    if (klFields.HasValue)
                    {
                        c2s.SetNeedKLFieldsFlag(klFields.Value);
                    }
                    if (nextReqKey.Length > 0)
                    {
                        c2s.SetNextReqKey(ByteString.CopyFrom(nextReqKey));
                    }
                    QotRequestHistoryKL.Request req = QotRequestHistoryKL.Request.CreateBuilder().SetC2S(c2s).Build();
                    uint sn = qot.RequestHistoryKL(req);
                    if (sn == 0)
                    {
                        return(null);
                    }
                    reqInfo = new ReqInfo(ProtoID.QotRequestHistoryKL, syncEvent);
                    qotReqInfoMap.Add(sn, reqInfo);
                }
                Monitor.Wait(syncEvent);
                return((QotRequestHistoryKL.Response)reqInfo.Rsp);
            }
        }
Ejemplo n.º 5
0
 void SendSetPriceReminder(FTAPI_Qot qot)
 {
     QotCommon.Security sec = QotCommon.Security.CreateBuilder().SetCode("00700")
                              .SetMarket((int)QotCommon.QotMarket.QotMarket_HK_Security)
                              .Build();
     QotSetPriceReminder.C2S c2s = QotSetPriceReminder.C2S.CreateBuilder().SetSecurity(sec)
                                   .SetOp((int)QotSetPriceReminder.SetPriceReminderOp.SetPriceReminderOp_Add)
                                   .SetType((int)QotCommon.PriceReminderType.PriceReminderType_PriceUp)
                                   .SetFreq((int)QotCommon.PriceReminderFreq.PriceReminderFreq_Always)
                                   .SetValue(380)
                                   .Build();
     QotSetPriceReminder.Request req = QotSetPriceReminder.Request.CreateBuilder().SetC2S(c2s).Build();
     qot.SetPriceReminder(req);
 }
Ejemplo n.º 6
0
        void Buy(QotCommon.Security sec, ulong trdAcc, TrdCommon.TrdMarket trdMarket,
                 TrdCommon.TrdEnv trdEnv)
        {
            TrdCommon.TrdSecMarket secMarket = TrdCommon.TrdSecMarket.TrdSecMarket_Unknown;
            if (sec.Market == (int)QotCommon.QotMarket.QotMarket_HK_Security)
            {
                secMarket = TrdCommon.TrdSecMarket.TrdSecMarket_HK;
            }
            else
            {
                secMarket = TrdCommon.TrdSecMarket.TrdSecMarket_US;
            }

            TrdGetFunds.Response getFundsRsp = GetFundsSync(trdAcc, trdMarket, trdEnv, false, TrdCommon.Currency.Currency_Unknown);
            if (getFundsRsp.RetType != (int)Common.RetType.RetType_Succeed)
            {
                Console.Error.Write("getFundsSync err; retType={0} msg={1}\n", getFundsRsp.RetType, getFundsRsp.RetMsg);
                return;
            }
            QotGetSecuritySnapshot.Response snapshotRsp = GetSecuritySnapshotSync(new List <QotCommon.Security>()
            {
                sec
            });
            if (snapshotRsp.RetType != (int)Common.RetType.RetType_Succeed)
            {
                Console.Error.Write("getSecuritySnapshotSync err; retType={0} msg={1}\n", snapshotRsp.RetType, snapshotRsp.RetMsg);
                return;
            }
            int    lotSize  = snapshotRsp.S2C.SnapshotListList[0].Basic.LotSize;
            double curPrice = snapshotRsp.S2C.SnapshotListList[0].Basic.CurPrice;
            double cash     = getFundsRsp.S2C.Funds.Cash;
            int    qty      = (int)Math.Floor(cash / curPrice);

            qty = qty / lotSize * lotSize;
            TrdCommon.TrdHeader trdHeader = MakeTrdHeader(trdEnv, trdAcc, trdMarket);
            TrdPlaceOrder.C2S   c2s       = TrdPlaceOrder.C2S.CreateBuilder()
                                            .SetPacketID(trd.NextPacketID())
                                            .SetHeader(trdHeader)
                                            .SetTrdSide((int)TrdCommon.TrdSide.TrdSide_Buy)
                                            .SetOrderType((int)TrdCommon.OrderType.OrderType_Normal)
                                            .SetCode(sec.Code)
                                            .SetQty(qty)
                                            .SetPrice(curPrice)
                                            .SetAdjustPrice(true)
                                            .SetSecMarket((int)secMarket)
                                            .Build();
            TrdPlaceOrder.Response placeOrderRsp = PlaceOrderSync(c2s);
            Console.WriteLine(placeOrderRsp);
        }
Ejemplo n.º 7
0
        void Sell(QotCommon.Security sec, TrdCommon.Position pstn, ulong trdAcc, TrdCommon.TrdMarket trdMarket,
                  TrdCommon.TrdEnv trdEnv)
        {
            QotGetSecuritySnapshot.Response snapshotRsp = GetSecuritySnapshotSync(new List <QotCommon.Security>()
            {
                sec
            });
            if (snapshotRsp.RetType != (int)Common.RetType.RetType_Succeed)
            {
                Console.Error.Write("getSecuritySnapshotSync err; retType={0} msg={1}\n", snapshotRsp.RetType, snapshotRsp.RetMsg);
                return;
            }
            double price = snapshotRsp.S2C.SnapshotListList[0].Basic.CurPrice;

            TrdCommon.TrdSecMarket secMarket = TrdCommon.TrdSecMarket.TrdSecMarket_Unknown;
            if (sec.Market == (int)QotCommon.QotMarket.QotMarket_HK_Security)
            {
                secMarket = TrdCommon.TrdSecMarket.TrdSecMarket_HK;
            }
            else
            {
                secMarket = TrdCommon.TrdSecMarket.TrdSecMarket_US;
            }
            TrdCommon.TrdHeader trdHeader = MakeTrdHeader(trdEnv, trdAcc, trdMarket);
            TrdPlaceOrder.C2S   c2s       = TrdPlaceOrder.C2S.CreateBuilder()
                                            .SetPacketID(trd.NextPacketID())
                                            .SetHeader(trdHeader)
                                            .SetTrdSide((int)TrdCommon.TrdSide.TrdSide_Sell)
                                            .SetOrderType((int)TrdCommon.OrderType.OrderType_Normal)
                                            .SetCode(sec.Code)
                                            .SetQty(pstn.CanSellQty)
                                            .SetPrice(price)
                                            .SetAdjustPrice(true)
                                            .SetSecMarket((int)secMarket)
                                            .Build();
            TrdPlaceOrder.Response placeOrderRsp = PlaceOrderSync(c2s);
            Console.WriteLine(placeOrderRsp);
        }
Ejemplo n.º 8
0
        void Run(ulong trdAcc, String unlockTrdPwdMD5, TrdCommon.TrdMarket trdMarket,
                 TrdCommon.TrdEnv trdEnv,
                 QotCommon.Security sec)
        {
            if (sec.Market != (int)QotCommon.QotMarket.QotMarket_HK_Security &&
                sec.Market != (int)QotCommon.QotMarket.QotMarket_US_Security)
            {
                Console.Error.WriteLine("unsupported stock market");
                return;
            }
            bool ret = InitConnectTrdSync(Config.OpendIP, Config.OpendPort);

            if (!ret)
            {
                Console.Error.WriteLine("fail to connect trd");
                return;
            }
            ret = InitConnectQotSync(Config.OpendIP, Config.OpendPort);
            if (!ret)
            {
                Console.Error.WriteLine("fail to connect qot");
                return;
            }

            TrdUnlockTrade.Response unlockTrdRsp = UnlockTradeSync(unlockTrdPwdMD5, true);
            if (unlockTrdRsp.RetType != (int)Common.RetType.RetType_Succeed)
            {
                Console.Error.Write("fail to unlock trade; retType={0} msg={1}\n", unlockTrdRsp.RetType, unlockTrdRsp.RetMsg);
                return;
            }

            DateTime now       = DateTime.Now;
            DateTime startDate = now.Subtract(new TimeSpan(100, 0, 0, 0));

            QotRequestHistoryKL.Response historyKLRsp = RequestHistoryKLSync(sec, QotCommon.KLType.KLType_Day,
                                                                             QotCommon.RehabType.RehabType_Forward,
                                                                             startDate.ToString("yyyy-MM-dd"),
                                                                             now.ToString("yyyy-MM-dd"),
                                                                             1000,
                                                                             null,
                                                                             new byte[] {},
                                                                             false);
            List <double> klCloseList = new List <double>();
            List <double> difList     = new List <double>();
            List <double> deaList     = new List <double>();
            List <double> macdList    = new List <double>();

            foreach (QotCommon.KLine kl in historyKLRsp.S2C.KlListList)
            {
                klCloseList.Add(kl.ClosePrice);
            }
            MACDUtil.CalcMACD(klCloseList, 12, 26, 9, difList, deaList, macdList);
            int difCount = difList.Count;
            int deaCount = deaList.Count;

            if (difCount > 0 && deaCount > 0)
            {
                if (difList[difCount - 1] < deaList[deaCount - 1] &&
                    difList[difCount - 2] > deaList[deaCount - 2])
                {
                    TrdCommon.TrdFilterConditions filterConditions = TrdCommon.TrdFilterConditions.CreateBuilder()
                                                                     .AddCodeList(sec.Code)
                                                                     .Build();
                    TrdGetPositionList.Response getPositionListRsp = GetPositionListSync(trdAcc, trdMarket,
                                                                                         trdEnv, filterConditions, null, null, false);
                    if (getPositionListRsp.RetType != (int)Common.RetType.RetType_Succeed)
                    {
                        Console.Error.Write("getPositionListSync err; retType={0} msg={1}\n", getPositionListRsp.RetType,
                                            getPositionListRsp.RetMsg);
                        return;
                    }
                    foreach (TrdCommon.Position pstn in getPositionListRsp.S2C.PositionListList)
                    {
                        if (pstn.CanSellQty > 0)
                        {
                            Sell(sec, pstn, trdAcc, trdMarket, trdEnv);
                        }
                    }
                }
                else if (difList[difCount - 1] > deaList[deaCount - 1] &&
                         difList[difCount - 2] < deaList[deaCount - 2])
                {
                    Buy(sec, trdAcc, trdMarket, trdEnv);
                }
            }
        }
Ejemplo n.º 9
0
        void smartSell(String code, QotCommon.QotMarket qotMarket, TrdCommon.TrdSecMarket secMarket,
                       int volume, TrdCommon.OrderType orderType,
                       TrdCommon.TrdEnv trdEnv,
                       ulong accID,
                       TrdCommon.TrdMarket trdMarket,
                       String trdPwdMD5)
        {
            int lotSize = 0;

            QotCommon.Security sec = MakeSec(qotMarket, code);
            while (true)
            {
                Thread.Sleep(1000);
                if (lotSize == 0)
                {
                    List <QotCommon.Security> secList = new List <QotCommon.Security>();
                    secList.Add(sec);
                    QotGetSecuritySnapshot.Response rsp = GetSecuritySnapshotSync(secList);
                    if (rsp.RetType != (int)Common.RetType.RetType_Succeed)
                    {
                        Console.Error.Write("getSecuritySnapshotSync err; retType={} msg={1}\n", rsp.RetType,
                                            rsp.RetMsg);
                        return;
                    }
                    lotSize = rsp.S2C.SnapshotListList[0].Basic.LotSize;
                    if (lotSize <= 0)
                    {
                        Console.Error.Write("invalid lot size; code={0} lotSize={1}\n", code, lotSize);
                        return;
                    }
                }
                int qty = (volume / lotSize) * lotSize; // 将数量调整为整手的股数

                QotSub.Response subRsp = SubSync(new List <QotCommon.Security>()
                {
                    sec
                },
                                                 new List <QotCommon.SubType>()
                {
                    QotCommon.SubType.SubType_OrderBook
                },
                                                 true,
                                                 false);
                if (subRsp.RetType != (int)Common.RetType.RetType_Succeed)
                {
                    Console.Error.Write("subSync er; retType={0}; msg={1}\n", subRsp.RetType, subRsp.RetMsg);
                    return;
                }

                QotGetOrderBook.Response getOrderBookRsp = GetOrderBookSync(MakeSec(qotMarket, code), 1);
                if (getOrderBookRsp.RetType != (int)Common.RetType.RetType_Succeed)
                {
                    Console.Error.Write("getOrderBookSync er; retType={0}; msg={1}\n", subRsp.RetType, subRsp.RetMsg);
                    return;
                }
                double bid1Price = getOrderBookRsp.S2C.OrderBookBidListList[0].Price;
                TrdCommon.TrdHeader trdHeader = MakeTrdHeader(trdEnv, accID, trdMarket);
                TrdPlaceOrder.C2S   c2s       = TrdPlaceOrder.C2S.CreateBuilder()
                                                .SetHeader(trdHeader)
                                                .SetPacketID(trd.NextPacketID())
                                                .SetTrdSide((int)TrdCommon.TrdSide.TrdSide_Sell)
                                                .SetOrderType((int)orderType)
                                                .SetCode(code)
                                                .SetQty(qty)
                                                .SetPrice(bid1Price)
                                                .SetAdjustPrice(true)
                                                .SetSecMarket((int)secMarket)
                                                .Build();
                TrdPlaceOrder.Response placeOrderRsp = PlaceOrderSync(c2s);
                if (placeOrderRsp.RetType != (int)Common.RetType.RetType_Succeed)
                {
                    Console.Error.Write("placeOrderSync err; retType={0} msg={1}\n", placeOrderRsp.RetType, placeOrderRsp.RetMsg);
                    return;
                }
                else
                {
                    Console.Write("下单成功: {0}\n", placeOrderRsp.S2C);
                }
            }
        }
Ejemplo n.º 10
0
        void simpleSell(String code, QotCommon.QotMarket qotMarket, TrdCommon.TrdSecMarket secMarket,
                        double price, int volume, TrdCommon.OrderType orderType,
                        TrdCommon.TrdEnv trdEnv,
                        ulong accID,
                        TrdCommon.TrdMarket trdMarket,
                        String trdPwdMD5)
        {
            bool ret = InitConnectQotSync(Config.OpendIP, Config.OpendPort);

            if (!ret)
            {
                Console.Error.WriteLine("Fail to connect opend");
                return;
            }
            ret = InitConnectTrdSync(Config.OpendIP, Config.OpendPort);
            if (!ret)
            {
                Console.Error.WriteLine("Fail to connect opend");
                return;
            }
            int lotSize = 0;

            QotCommon.Security sec = MakeSec(qotMarket, code);
            while (true)
            {
                Thread.Sleep(1000);
                if (lotSize == 0)
                {
                    List <QotCommon.Security> secList = new List <QotCommon.Security>();
                    secList.Add(sec);
                    QotGetSecuritySnapshot.Response rsp = GetSecuritySnapshotSync(secList);
                    if (rsp.RetType != (int)Common.RetType.RetType_Succeed)
                    {
                        Console.Error.Write("getSecuritySnapshotSync err; retType={0} msg={1}\n", rsp.RetType,
                                            rsp.RetMsg);
                        return;
                    }
                    lotSize = rsp.S2C.SnapshotListList[0].Basic.LotSize;
                    if (lotSize <= 0)
                    {
                        Console.Error.Write("invalid lot size; code={0} lotSize={1}\n", code, lotSize);
                        return;
                    }
                }

                int qty = (volume / lotSize) * lotSize; // 将数量调整为整手的股数
                TrdCommon.TrdHeader trdHeader = MakeTrdHeader(trdEnv, accID, trdMarket);
                TrdPlaceOrder.C2S   c2s       = TrdPlaceOrder.C2S.CreateBuilder()
                                                .SetHeader(trdHeader)
                                                .SetPacketID(trd.NextPacketID())
                                                .SetTrdSide((int)TrdCommon.TrdSide.TrdSide_Sell)
                                                .SetOrderType((int)orderType)
                                                .SetCode(code)
                                                .SetQty(qty)
                                                .SetPrice(price)
                                                .SetAdjustPrice(true)
                                                .SetSecMarket((int)secMarket)
                                                .Build();
                TrdPlaceOrder.Response placeOrderRsp = PlaceOrderSync(c2s);
                if (placeOrderRsp.RetType != (int)Common.RetType.RetType_Succeed)
                {
                    Console.Error.Write("placeOrderSync err; retType={0} msg={1}\n", placeOrderRsp.RetType, placeOrderRsp.RetMsg);
                    return;
                }
                else
                {
                    Console.Write("下单成功: {0}\n", placeOrderRsp.S2C);
                }
            }
        }