Ejemplo n.º 1
0
 public static void ClearSweeperCollection(MonitorEnter_BondArb_Accessor me)
 {
     SweeperCollectionDefault sc = me._node.GetSweeperCollection() as SweeperCollectionDefault;
     SweeperCollectionDefault_Accessor sca = new SweeperCollectionDefault_Accessor(new PrivateObject(sc));
     sca._done.Clear();
     sca._live.Clear();
 }
Ejemplo n.º 2
0
        Sweeper_BondArb GetHousingSweeperSN(MonitorEnter_BondArb_Accessor me)
        {
            BondPair housingBondPair = null;
            RawMarketData rmdNormal = null;
            RawMarketData rmdSmall = null;

            SetHousingBondPairAndRmds(ref housingBondPair, ref rmdNormal, ref rmdSmall);

            SetAsZeroRMD(ref rmdNormal);
            SetAsZeroRMD(ref rmdSmall);

            int ret = 0;

            // 5000에 소액을 사서 15000에 일반을 팔 수 있는 기회이다
            SetImmeLongPart(rmdSmall, 300 * CommonConst._1_000 * CommonConst._1_000, 5000);
            SetImmeShortPart(rmdSmall, 0, 0);
            SetImmeLongPart(rmdNormal, 0, 0);
            SetImmeShortPart(rmdNormal, 300 * CommonConst._1_000 * CommonConst._1_000, 15000);

            me.BeforeEnterSweeperChance();
            ret = me.CheckArbChance(housingBondPair);
            Assert.AreEqual(0, ret);

            Sweeper_BondArb sweeper = new Sweeper_BondArb(housingBondPair, me._bondAccount);
            me._node.GetSweeperCollection().Add(sweeper);

            return sweeper;
        }
Ejemplo n.º 3
0
        void TestCheckArbChance_NoArbCase2(MonitorEnter_BondArb_Accessor me, ref int innerKillWithNoticeCallingCount)
        {
            BondPair housingBondPair = null;
            RawMarketData rmdNormal = null;
            RawMarketData rmdSmall = null;

            SetHousingBondPairAndRmds(ref housingBondPair, ref rmdNormal, ref rmdSmall);

            int ret = 0;

            // 9999에 사서 10000에 팔 수 있는 기회이다. (100)
            SetImmeLongPart(rmdNormal, 100, 9999);
            SetImmeShortPart(rmdSmall, 100, 10000);

            // 1. rmdNormal에서 10000에 사자 주문이 working중인데 short을 하려고 하는 경우
            RawMarketData rmdNormalForOrder = rmdNormal.Clone() as RawMarketData;
            SetImmeLongPart(rmdNormalForOrder, 100, 10000);

            // 수량이 적어 내부에서 에러난다

            Util.LogOutCriticalError("\t\t# POrder.Invalid ReqCount 1 permitted.");
            innerKillWithNoticeCallingCount++;
            POrder o = new POrder(
                TradingDirection.Long,
                rmdNormalForOrder.Code,
                rmdNormalForOrder.AskCount1,
                rmdNormalForOrder.AskPrice1,
                me._bondAccount,
                rmdNormalForOrder,
                MarketType._0_Bond_일반,
                false);

            POrderUtil.RequestOrder(o, null);

            ret = me.CheckArbChance(housingBondPair);
            Assert.AreEqual(-197, ret);

            // 주문 넣는다
            o.Update(100, 10000, true);
            POrderLegalManager.Ins().Remove(o);
            POrderBidAskCountManager.Ins().Unregister(o);

            // 더 이상 Legal 이슈가 없다.
            ret = me.CheckArbChance(housingBondPair);
            Assert.AreNotEqual(-197, ret);

            // 2. rmdNormal에서 9999에 팔자 주문이 working중인데 long을 하려고 하는 경우
            rmdNormalForOrder = rmdNormal.Clone() as RawMarketData;
            SetImmeLongPart(rmdNormalForOrder, 0, 0);
            SetImmeShortPart(rmdNormalForOrder, 100, 9999);
            //수량이 적어 내부에서 에러난다
            Util.LogOutCriticalError("\t\t# POrder.Invalid ReqCount 1 permitted.");
            innerKillWithNoticeCallingCount++;
            o = new POrder(TradingDirection.Short, rmdNormalForOrder.Code, rmdNormalForOrder.BidCount1, rmdNormalForOrder.BidPrice1, me._bondAccount, rmdNormalForOrder, MarketType._0_Bond_일반, false);
            POrderUtil.RequestOrder(o, null);

            ret = me.CheckArbChance(housingBondPair);
            Assert.AreEqual(-197, ret);

            // 주문 넣는다
            o.Update(100, 9999, true);
            POrderLegalManager.Ins().Remove(o);
            POrderBidAskCountManager.Ins().Unregister(o);

            // 더 이상 Legal 이슈가 없다.
            ret = me.CheckArbChance(housingBondPair);
            Assert.AreNotEqual(-197, ret);

            // 3. rmdSmall에서 10000에 사자 주문이 working중인데 short을 하려고 하는 경우
            RawMarketData rmdSmallForOrder = rmdSmall.Clone() as RawMarketData;
            SetImmeLongPart(rmdSmallForOrder, 100, 10000);
            //수량이 적어 내부에서 에러난다.
            Util.LogOutCriticalError("\t\t# POrder.Invalid ReqCount 1 permitted.");
            innerKillWithNoticeCallingCount++;
            o = new POrder(
                TradingDirection.Long,
                rmdSmallForOrder.Code,
                rmdSmallForOrder.AskCount1,
                rmdSmallForOrder.AskPrice1,
                me._bondAccount,
                rmdSmallForOrder,
                MarketType._1_Bond_소액,
                false);
            POrderUtil.RequestOrder(o, null);

            ret = me.CheckArbChance(housingBondPair);
            Assert.AreEqual(-197, ret);

            // 주문 넣는다
            o.Update(100, 10000, true);
            POrderLegalManager.Ins().Remove(o);
            POrderBidAskCountManager.Ins().Unregister(o);

            // 더 이상 Legal 이슈가 없다.
            ret = me.CheckArbChance(housingBondPair);
            Assert.AreNotEqual(-197, ret);

            // 4. rmdSmall에서 9999에 팔자 주문이 working중인데 long을 하려고 하는 경우
            rmdSmallForOrder = rmdSmall.Clone() as RawMarketData;
            SetImmeLongPart(rmdSmallForOrder, 0, 0);
            SetImmeShortPart(rmdSmallForOrder, 100, 9999);
            //수량이 적어 내부에서 에러난다.
            Util.LogOutCriticalError("\t\t# POrder.Invalid ReqCount 1 permitted.");
            innerKillWithNoticeCallingCount++;
            o = new POrder(
                TradingDirection.Short,
                rmdSmallForOrder.Code,
                rmdSmallForOrder.BidCount1,
                rmdSmallForOrder.BidPrice1,
                me._bondAccount,
                rmdSmallForOrder,
                MarketType._1_Bond_소액,
                false);
            POrderUtil.RequestOrder(o, null);

            ret = me.CheckArbChance(housingBondPair);
            Assert.AreEqual(-197, ret);

            // 주문 넣는다
            o.Update(100, 9999, true);
            POrderLegalManager.Ins().Remove(o);
            POrderBidAskCountManager.Ins().Unregister(o);

            // 5. 수량이 100개이므로 너무 작아 pnl에 의해 arb이 아닌 경우
            ret = me.CheckArbChance(housingBondPair);
            Assert.AreEqual(-202, ret);

            // 6. 민평보다 높은 가격으로 매수하는 경우
            SetImmeLongPart(rmdNormal, 100 * CommonConst._1_000 * CommonConst._1_000, 14999);
            SetImmeShortPart(rmdSmall, 100 * CommonConst._1_000 * CommonConst._1_000, 15000);

            me.BeforeEnterSweeperChance();
            ret = me.CheckArbChance(housingBondPair);
            Assert.AreEqual(-207, ret);

            // 7. 수량이 100,000보다 작아 arb이 아닌 경우 (pnl은 0보다 크다)
            SetImmeLongPart(rmdNormal, 99 * CommonConst._1_000, 5000);
            SetImmeShortPart(rmdSmall, 99 * CommonConst._1_000, 15000);

            me.BeforeEnterSweeperChance();
            ret = me.CheckArbChance(housingBondPair);
            Assert.AreEqual(-202, ret);

            // 8. 수량이 50,000,000를 넘지 못해 arb이 아닌 경우
            SetImmeLongPart(rmdNormal, 100 * CommonConst._1_000 * CommonConst._1_000, 5000);
            SetImmeShortPart(rmdSmall, 99 * CommonConst._1_000 * CommonConst._1_000, 15000);

            me.BeforeEnterSweeperChance();
            ret = me.CheckArbChance(housingBondPair);
            Assert.AreEqual(-208, ret);

            SetImmeLongPart(rmdNormal, 0, 0);
            SetImmeShortPart(rmdNormal, 99 * CommonConst._1_000 * CommonConst._1_000, 15000);

            SetImmeLongPart(rmdSmall, 100 * CommonConst._1_000 * CommonConst._1_000, 5000);
            SetImmeShortPart(rmdSmall, 0, 0);

            me.BeforeEnterSweeperChance();
            ret = me.CheckArbChance(housingBondPair);
            Assert.AreEqual(-208, ret);

            Unittest_BondArbUtil.ClearBondAccount(me._bondAccount);
        }
Ejemplo n.º 4
0
        void TestCheckArbChance_NoArbCase1(MonitorEnter_BondArb_Accessor me, ref int innerKillWithNoticeCallingCount)
        {
            BondPair housingBondPair = null;
            RawMarketData rmdNormal = null;
            RawMarketData rmdSmall = null;

            SetHousingBondPairAndRmds(ref housingBondPair, ref rmdNormal, ref rmdSmall);

            int ret = 0;

            // RMD 값이 없다.
            me.BeforeEnterSweeperChance();
            ret = me.CheckArbChance(housingBondPair);
            Assert.AreEqual(-3, ret);

            // 한쪽만 값이 있다.
            SetImmeLongPart(rmdNormal, 100, 9999);

            me.BeforeEnterSweeperChance();
            ret = me.CheckArbChance(housingBondPair);
            Assert.AreEqual(-3, ret);

            // 둘다 값이 있지만
            SetImmeShortPart(rmdSmall, 100, 9999);

            me.BeforeEnterSweeperChance();
            ret = me.CheckArbChance(housingBondPair);
            Assert.AreEqual(-3, ret);

            SetImmeShortPart(rmdSmall, 100, 10000);

            me.BeforeEnterSweeperChance();
            ret = me.CheckArbChance(housingBondPair);
            Assert.AreNotEqual(-3, ret);

            Unittest_BondArbUtil.ClearBondAccount(me._bondAccount);
        }
Ejemplo n.º 5
0
        int TestCheckArbChance(MonitorEnter_BondArb_Accessor me)
        {
            int killWithNoticeCallingCount = Util.GetKillWithNoticeCallingCount();
             Assert.AreEqual(POrder_UnittestUtil.IsPOrderCommonResourceDirty(), false);

            int innerKillWithNoticeCallingCount = 0;

            // Arb이 아닌 경우(가격이 아닌 경우)를 테스트한다.
            TestCheckArbChance_NoArbCase1(me, ref innerKillWithNoticeCallingCount);

            // Arb이 아닌 경우(여러 상황 때문에)를 테스트한다.
            TestCheckArbChance_NoArbCase2(me, ref innerKillWithNoticeCallingCount);

            // 기존 주문 때문에 Arb이 아닌 경우를 테스트한다.
            TestCheckArbChance_NoArbCase3(me, ref innerKillWithNoticeCallingCount);

            Assert.AreEqual(POrderBidAskCountManager.Ins().IsDirty(), false);
            Assert.AreEqual(POrder_UnittestUtil.IsPOrderCommonResourceDirty(), false);
            Assert.AreEqual(killWithNoticeCallingCount + innerKillWithNoticeCallingCount, Util.GetKillWithNoticeCallingCount());

            return innerKillWithNoticeCallingCount;
        }
Ejemplo n.º 6
0
        MonitorEnter_BondArb_Accessor CreateNewMonitorEnter_BondArb()
        {
            // STR_Arb을 생성하여 MonitorEnter_BondArbTest를 생성한다.
            STR_Arb_Accessor arb = Unittest_BondArbUtil.CreateNewStrArbAccessor();
            StrategyNode node = arb._bondArbNode as StrategyNode;
            StrategyNode_Accessor nodeAccessor = new StrategyNode_Accessor(new PrivateObject(node));
            MonitorEnter_BondArb me = nodeAccessor._monitorEnter as MonitorEnter_BondArb;

            MonitorEnter_BondArb_Accessor meAccessor = new MonitorEnter_BondArb_Accessor(new PrivateObject(me));
            return meAccessor;
        }
        void CreateOneSweeperAndSaveToUnittestFolder_NR()
        {
            // STR_Arb을 생성하여 MonitorEnter_BondArbTest를 생성한다.
            STR_Arb_Accessor arb = Unittest_BondArbUtil.CreateNewStrArbAccessor();
            StrategyNode node = arb._bondArbNode as StrategyNode;
            StrategyNode_Accessor nodeAccessor = new StrategyNode_Accessor(new PrivateObject(node));
            MonitorEnter_BondArb me = nodeAccessor._monitorEnter as MonitorEnter_BondArb;
            MonitorEnter_BondArb_Accessor meAccessor = new MonitorEnter_BondArb_Accessor(new PrivateObject(me));

            // 1. Create one sweeper
            BondPair doosanBondPair = null;
            RawMarketData rmdNormal = null;
            RawMarketData rmdRetail = null;

            SetCreditBondPairAndRmds(ref doosanBondPair, ref rmdNormal, ref rmdRetail);

            SetAsZeroRMD(ref rmdNormal);
            SetAsZeroRMD(ref rmdRetail);

            int ret = 0;

            // 5000에 일반을 사서 15000에 소매에 팔 수 있는 기회이다
            SetImmeLongPart(rmdNormal, 300 * CommonConst._1_000 * CommonConst._1_000, 5000);
            SetImmeShortPart(rmdNormal, 0, 0);
            SetImmeLongPart(rmdRetail, 0, 0);
            SetImmeShortPart(rmdRetail, 300 * CommonConst._1_000 * CommonConst._1_000, 15000);

            me.BeforeEnterSweeperChance();
            ret = meAccessor.CheckArbChance(doosanBondPair);

            Sweeper_BondArb sweeper = new Sweeper_BondArb(doosanBondPair, meAccessor._bondAccount);
            meAccessor._node.GetSweeperCollection().Add(sweeper);

            {
                Sweeper_BondArb_Accessor accessor = new Sweeper_BondArb_Accessor(new PrivateObject(sweeper));
                Assert.AreEqual(accessor._bDone, false);

                SweepUnitTemplate longSweepUnitTemplate = accessor._sweepUnitLong;
                SweepUnitTemplate_Accessor longSweepUnitTemplate_Accessor = new SweepUnitTemplate_Accessor(new PrivateObject(longSweepUnitTemplate));
                SweepUnitContext_Bond_Long longContext = longSweepUnitTemplate_Accessor.Context as SweepUnitContext_Bond_Long;
                SweepUnitContext_Bond_Long_Accessor longContext_Accessor = new SweepUnitContext_Bond_Long_Accessor(new PrivateObject(longContext));

                SweepUnitTemplate shortSweepUnitTemplate = accessor._sweepUnitShort;
                SweepUnitTemplate_Accessor shortSweepUnitTemplate_Accessor = new SweepUnitTemplate_Accessor(new PrivateObject(shortSweepUnitTemplate));
                SweepUnitContext_Bond_Short shortContext = shortSweepUnitTemplate_Accessor.Context as SweepUnitContext_Bond_Short;
                SweepUnitContext_Bond_Short_Accessor shortContext_Accessor = new SweepUnitContext_Bond_Short_Accessor(new PrivateObject(shortContext));

                POrder initLongOrder0 = longContext_Accessor._initOrders[0];
                // 주문번호 0
                initLongOrder0.OrderNumber = 0;
                initLongOrder0.Update(25 * CommonConst._1_000_000, 5000, false);
                Assert.AreEqual(initLongOrder0.ShortCutTargetOfContractCallBack.Contract_CallBack(initLongOrder0), true);

                Assert.AreEqual(shortSweepUnitTemplate.GetSignedPossibleContractCount(), (-1) * 25000000);
                Assert.AreEqual(shortContext_Accessor.RealOrdersShort.Count, 1);

                initLongOrder0.Update(50 * CommonConst._1_000_000, 5000, false);
                Assert.AreEqual(initLongOrder0.ShortCutTargetOfContractCallBack.Contract_CallBack(initLongOrder0), true);

                Assert.AreEqual(shortSweepUnitTemplate.GetSignedPossibleContractCount(), (-1) * 50000000);
                Assert.AreEqual(shortContext_Accessor.RealOrdersShort.Count, 2);

                // 2억 체결
                initLongOrder0.Update(200 * CommonConst._1_000_000, 5000, false);
                Assert.AreEqual(initLongOrder0.ShortCutTargetOfContractCallBack.Contract_CallBack(initLongOrder0), true);

                Assert.AreEqual(shortSweepUnitTemplate.GetSignedPossibleContractCount(), (-1) * 200 * CommonConst._1_000_000);
                Assert.AreEqual(shortContext_Accessor.RealOrdersShort.Count, 3);

                POrder balanceOrder0 = shortContext_Accessor.RealOrdersShort[0];
                POrder balanceOrder1 = shortContext_Accessor.RealOrdersShort[1];
                POrder balanceOrder2 = shortContext_Accessor.RealOrdersShort[2];

                balanceOrder0.OrderNumber = 0;
                balanceOrder1.OrderNumber = 0;
                balanceOrder2.OrderNumber = 0;

                // balance order
                Assert.AreEqual(balanceOrder0.Code, _kDoosanCode_Retail);
                Assert.AreEqual(balanceOrder0.LongShort, TradingDirection.Short);
                Assert.AreEqual(balanceOrder0.ReqCount, 25 * CommonConst._1_000_000);
                Assert.AreEqual(balanceOrder0.ReqPrice, 15000);

                // balance order 25,000,000 체결시킨다
                balanceOrder0.Update(25 * CommonConst._1_000_000, 15000, true);

                // Sweep
                longSweepUnitTemplate_Accessor.CurState = SweepUnitTemplate.StateEnum._2_WaitUntilGotAllOrderNumber;
                shortSweepUnitTemplate_Accessor.CurState = SweepUnitTemplate.StateEnum._2_WaitUntilGotAllOrderNumber;

                Assert.AreEqual(sweeper.Run(), false);

                Assert.AreEqual(longSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._3_WaitUntilCancelAllOrders);
                Assert.AreEqual(shortSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._3_WaitUntilCancelAllOrders);

                initLongOrder0.UpdateCancelMessage(initLongOrder0.ReqCount - initLongOrder0.ContractedCount);
                balanceOrder0.UpdateCancelMessage(balanceOrder0.ReqCount - balanceOrder0.ContractedCount);
                balanceOrder1.UpdateCancelMessage(balanceOrder1.ReqCount - balanceOrder1.ContractedCount);
                balanceOrder2.UpdateCancelMessage(balanceOrder2.ReqCount - balanceOrder2.ContractedCount);

                Assert.AreEqual(sweeper.Run(), false);

                Assert.AreEqual(longSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._4_WaitingRunSign);
                Assert.AreEqual(shortSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._4_WaitingRunSign);

                Assert.AreEqual(longContext_Accessor.CurSignedTargetCount, 300 * CommonConst._1_000_000);
                Assert.AreEqual(shortContext_Accessor.CurSignedTargetCount, (-1) * 300 * CommonConst._1_000_000);

                //Resume
                Assert.AreEqual(sweeper.Run(), false);

                Assert.AreEqual(longContext_Accessor.CurSignedTargetCount, 200 * CommonConst._1_000_000);
                Assert.AreEqual(shortContext_Accessor.CurSignedTargetCount, (-1) * 200 * CommonConst._1_000_000);

                Assert.AreEqual(longSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._7_Done);
            }

            // 2. save to unittest folder
            arb.SaveBondArbRemainPosition(Const.UNITTEST_BOND_ARB_REMAIN_POSITION_PATH);

            SetAsZeroAllCodes();
        }
Ejemplo n.º 8
0
        void TestEnterSweeperChance_NoArb(MonitorEnter_BondArb_Accessor me)
        {
            Assert.AreEqual(POrderBidAskCountManager.Ins().IsDirty(), false);
            Assert.AreEqual(POrder_UnittestUtil.IsPOrderCommonResourceDirty(), false);
            // 1. 두 pair 모두 0이므로 no arb
            BondPair housingBondPair = null;
            RawMarketData rmdHousingNormal = null;
            RawMarketData rmdHousingSmall = null;

            SetHousingBondPairAndRmds(ref housingBondPair, ref rmdHousingNormal, ref rmdHousingSmall);

            BondPair doosanBondPair = null;
            RawMarketData rmdDoosanNormal = null;
            RawMarketData rmdDoosanRetail = null;

            SetCreditBondPairAndRmds(ref doosanBondPair, ref rmdDoosanNormal, ref rmdDoosanRetail);

            SetAsZeroRMD(ref rmdHousingNormal);
            SetAsZeroRMD(ref rmdHousingSmall);
            SetAsZeroRMD(ref rmdDoosanNormal);
            SetAsZeroRMD(ref rmdDoosanRetail);

            me.BeforeEnterSweeperChance();
            Assert.AreEqual(false, me.EnterSweeperChance(100));
            Assert.AreEqual(me._node.GetSweeperCollection().GetTotalSweeperCount(), 0);

            // 2. arb이 성립하는지 본 뒤 EnterSweeperChance(0)이므로 no arb
            SetImmeLongPart(rmdDoosanNormal, 100 * CommonConst._1_000, 5000);
            SetImmeShortPart(rmdDoosanRetail, 100 * CommonConst._1_000, 15000);
            me.BeforeEnterSweeperChance();
            Assert.AreEqual(true, me.EnterSweeperChance(100));
            Assert.AreEqual(me._node.GetSweeperCollection().GetTotalSweeperCount(), 1);
            Unittest_BondArbUtil.ClearBondAccount(me._bondAccount);
            Unittest_BondArbUtil.ClearSweeperCollection(me);
            me.BeforeEnterSweeperChance();
            const int kZero = 0;
            Assert.AreEqual(false, me.EnterSweeperChance(kZero));
            Assert.AreEqual(me._node.GetSweeperCollection().GetTotalSweeperCount(), 0);
        }
Ejemplo n.º 9
0
        void TestSweeper_BondArb_SN(MonitorEnter_BondArb_Accessor me)
        {
            Sweeper_BondArb sweeperSN = GetHousingSweeperSN(me);
            TestSweeper_BondArb_SN_Init(me, sweeperSN);
            TestSweeper_BondArb_SN_Running(me, sweeperSN);

            Unittest_BondArbUtil.ClearBondAccount(me._bondAccount);
            Unittest_BondArbUtil.ClearSweeperCollection(me);
        }
Ejemplo n.º 10
0
        void TestSweeper_BondArb_NS(MonitorEnter_BondArb_Accessor me)
        {
            // Sweeper_BondArb 생성자에서 해야할 일을 올바르게 하는지 검사한다.
            Sweeper_BondArb sweeperNS = GetHousingSweeperNS(me);
            TestSweeper_BondArb_NS_Init(me, sweeperNS);
            TestSweeper_BondArb_NS_Running(me, sweeperNS);

            Unittest_BondArbUtil.ClearBondAccount(me._bondAccount);
            Unittest_BondArbUtil.ClearSweeperCollection(me);
        }
Ejemplo n.º 11
0
        void TestSweeper_BondArb_NR_Running(MonitorEnter_BondArb_Accessor me, Sweeper_BondArb sweeper)
        {
            Sweeper_BondArb_Accessor accessor = new Sweeper_BondArb_Accessor(new PrivateObject(sweeper));
            Assert.AreEqual(accessor._bDone, false);

            SweepUnitTemplate longSweepUnitTemplate = accessor._sweepUnitLong;
            SweepUnitTemplate_Accessor longSweepUnitTemplate_Accessor = new SweepUnitTemplate_Accessor(new PrivateObject(longSweepUnitTemplate));
            SweepUnitContext_Bond_Long longContext = longSweepUnitTemplate_Accessor.Context as SweepUnitContext_Bond_Long;
            SweepUnitContext_Bond_Long_Accessor longContext_Accessor = new SweepUnitContext_Bond_Long_Accessor(new PrivateObject(longContext));

            SweepUnitTemplate shortSweepUnitTemplate = accessor._sweepUnitShort;
            SweepUnitTemplate_Accessor shortSweepUnitTemplate_Accessor = new SweepUnitTemplate_Accessor(new PrivateObject(shortSweepUnitTemplate));
            SweepUnitContext_Bond_Short shortContext = shortSweepUnitTemplate_Accessor.Context as SweepUnitContext_Bond_Short;
            SweepUnitContext_Bond_Short_Accessor shortContext_Accessor = new SweepUnitContext_Bond_Short_Accessor(new PrivateObject(shortContext));

            // 1. 소액 25,000,000 체결
            POrder initLongOrder0 = longContext_Accessor._initOrders[0];
            // 주문번호 0
            initLongOrder0.OrderNumber = 0;
            initLongOrder0.Update(25 * CommonConst._1_000_000, 5000, false);
            Assert.AreEqual(initLongOrder0.ShortCutTargetOfContractCallBack.Contract_CallBack(initLongOrder0), true);

            Assert.AreEqual(shortSweepUnitTemplate.GetSignedPossibleContractCount(), (-1) * 25000000);
            Assert.AreEqual(shortContext_Accessor.RealOrdersShort.Count, 1);

            initLongOrder0.Update(50 * CommonConst._1_000_000, 5000, false);
            Assert.AreEqual(initLongOrder0.ShortCutTargetOfContractCallBack.Contract_CallBack(initLongOrder0), true);

            Assert.AreEqual(shortSweepUnitTemplate.GetSignedPossibleContractCount(), (-1) * 50000000);
            Assert.AreEqual(shortContext_Accessor.RealOrdersShort.Count, 2);

            initLongOrder0.Update(200 * CommonConst._1_000_000, 5000, false);
            Assert.AreEqual(initLongOrder0.ShortCutTargetOfContractCallBack.Contract_CallBack(initLongOrder0), true);

            Assert.AreEqual(shortSweepUnitTemplate.GetSignedPossibleContractCount(), (-1) * 200 * CommonConst._1_000_000);
            Assert.AreEqual(shortContext_Accessor.RealOrdersShort.Count, 3);

            POrder balanceOrder0 = shortContext_Accessor.RealOrdersShort[0];
            POrder balanceOrder1 = shortContext_Accessor.RealOrdersShort[1];
            POrder balanceOrder2 = shortContext_Accessor.RealOrdersShort[2];

            balanceOrder0.OrderNumber = 0;
            balanceOrder1.OrderNumber = 0;
            balanceOrder2.OrderNumber = 0;

            // balance order
            Assert.AreEqual(balanceOrder0.Code, _kDoosanCode_Retail);
            Assert.AreEqual(balanceOrder0.LongShort, TradingDirection.Short);
            Assert.AreEqual(balanceOrder0.ReqCount, 25 * CommonConst._1_000_000);
            Assert.AreEqual(balanceOrder0.ReqPrice, 15000);

            // balance order 25,000,000 체결시킨다
            balanceOrder0.Update(25 * CommonConst._1_000_000, 15000, true);

            // 4. Sweep 테스트를 진행한다.

            longSweepUnitTemplate_Accessor.CurState = SweepUnitTemplate.StateEnum._2_WaitUntilGotAllOrderNumber;
            shortSweepUnitTemplate_Accessor.CurState = SweepUnitTemplate.StateEnum._2_WaitUntilGotAllOrderNumber;

            Assert.AreEqual(sweeper.Run(), false);

            Assert.AreEqual(longSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._3_WaitUntilCancelAllOrders);
            Assert.AreEqual(shortSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._3_WaitUntilCancelAllOrders);

            initLongOrder0.UpdateCancelMessage(initLongOrder0.ReqCount - initLongOrder0.ContractedCount);
            balanceOrder0.UpdateCancelMessage(balanceOrder0.ReqCount - balanceOrder0.ContractedCount);
            balanceOrder1.UpdateCancelMessage(balanceOrder1.ReqCount - balanceOrder1.ContractedCount);
            balanceOrder2.UpdateCancelMessage(balanceOrder2.ReqCount - balanceOrder2.ContractedCount);

            Assert.AreEqual(sweeper.Run(), false);

            Assert.AreEqual(longSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._4_WaitingRunSign);
            Assert.AreEqual(shortSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._4_WaitingRunSign);

            Assert.AreEqual(longContext_Accessor.CurSignedTargetCount, 300 * CommonConst._1_000_000);
            Assert.AreEqual(shortContext_Accessor.CurSignedTargetCount, (-1) * 300 * CommonConst._1_000_000);

            //Resume
            Assert.AreEqual(sweeper.Run(), false);

            Assert.AreEqual(longContext_Accessor.CurSignedTargetCount, 200 * CommonConst._1_000_000);
            Assert.AreEqual(shortContext_Accessor.CurSignedTargetCount, (-1) * 200 * CommonConst._1_000_000);

            Assert.AreEqual(longSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._7_Done);

            POrder sweepOrder = shortContext_Accessor.RealOrdersShort[3];

            Assert.AreEqual(sweepOrder.ReqCount, 175 * CommonConst._1_000_000);
            Assert.AreEqual(sweepOrder.Code, _kDoosanCode_Retail);
            Assert.AreEqual(sweepOrder.LongShort, TradingDirection.Short);
            Assert.AreEqual(sweepOrder.ReqPrice, 15000);

            Assert.AreEqual(shortSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._6_MonitorRequestedSweepOrders);

            Timer_Accessor mute_Accessor = new Timer_Accessor(new PrivateObject(shortSweepUnitTemplate_Accessor._mute));

            // 더이상 On이 풀리지 않는다.
            Assert.AreEqual(mute_Accessor.m_end > DateTime.Now.AddHours(1), true);

            // 여기서 많이 불러봐도 소용없다.
            Assert.AreEqual(sweeper.Run(), false);

            sweepOrder.Update(100 * CommonConst._1_000_000, 15000, false);

            Assert.AreEqual(sweeper.Run(), false);

            sweepOrder.Update(175 * CommonConst._1_000_000, 15000, true);

            Assert.AreEqual(sweeper.Run(), true);
        }
Ejemplo n.º 12
0
        void TestSweeper_BondArb(MonitorEnter_BondArb_Accessor me)
        {
            // 1. Normal-Small pair
            TestSweeper_BondArb_NS(me);

            // 2. Small-Normal pair
            TestSweeper_BondArb_SN(me);

            // 3. Normal-Retail pair
            TestSweeper_BondArb_NR(me);
        }
        void LoadRemainPositionAndRun_SN()
        {
            Unittest_BondArbUtil.ForcedClearPOrderBidAskManager();

            STR_Arb_Accessor arb = Unittest_BondArbUtil.CreateNewStrArbAccessor();
            StrategyNode node = arb._bondArbNode as StrategyNode;
            StrategyNode_Accessor nodeAccessor = new StrategyNode_Accessor(new PrivateObject(node));
            MonitorEnter_BondArb me = nodeAccessor._monitorEnter as MonitorEnter_BondArb;
            MonitorEnter_BondArb_Accessor meAccessor = new MonitorEnter_BondArb_Accessor(new PrivateObject(me));

            // TakeOver
            arb.TakeOverBondArbYesterdayPosition(Const.UNITTEST_BOND_ARB_REMAIN_POSITION_PATH);
            List<ISweeper> sweepers = node.GetSweeperCollection().GetLives();
            Sweeper_BondArb sweeper = sweepers[0] as Sweeper_BondArb;
            Sweeper_BondArb_Accessor sweeper_Accessor = new Sweeper_BondArb_Accessor(new PrivateObject(sweeper));

            if (DateTime.Now.Hour >= 9 && DateTime.Now.Hour <= 15)
            {
                Assert.AreEqual(arb.IsMonitorLimitOK(), true);
            }
            else
            {
                Assert.AreEqual(arb.IsMonitorLimitOK(), false);
            }

            Assert.AreEqual(arb.GetTotalSweeperLiveCount(), 1);

            // TakeOver후 상태 점검
            Assert.AreEqual(node.GetSweeperCollection().GetLiveSweeperCount(), 1);

            String codeNoTail = BondUtil.GetCodeNoTail(sweeper.EnterCodeWithMarketType);

            long possibleShortCount = arb.BondAccount.LongBlockManager.GetPossibleShortCountUsingCodeNoTail(codeNoTail);
            Assert.AreEqual(possibleShortCount, 99999 * CommonConst._1_000);

            SetAsZeroAllCodes();

            arb.Run();

            possibleShortCount = arb.BondAccount.LongBlockManager.GetPossibleShortCountUsingCodeNoTail(codeNoTail);
            Assert.AreEqual(possibleShortCount, 0);

            Assert.AreEqual(sweeper_Accessor._sweepUnitShort.Context.GetRealOrders().Count, 2);

            List<POrder> orders = sweeper_Accessor._sweepUnitShort.Context.GetRealOrders();
            POrder order0 = orders[0];
            POrder order1 = orders[1];

            Assert.AreEqual(orders.Count, 2);
            Assert.AreEqual(order0.ReqCount, 50 * CommonConst._1_000_000);
            Assert.AreEqual(order0.ReqPrice, 15000);
            // SN S로 주문
            Assert.AreEqual(order0.Code, sweeper.EnterCodeWithMarketType);
            Assert.AreEqual(order0.LongShort, TradingDirection.Short);

            Assert.AreEqual(order1.ReqCount, 49999 * CommonConst._1_000);
            Assert.AreEqual(order1.ReqPrice, 15000);
            // SN S로 주문
            Assert.AreEqual(order1.Code, sweeper.EnterCodeWithMarketType);
            Assert.AreEqual(order1.LongShort, TradingDirection.Short);

            arb.Run();

            order0.Update(order0.ReqCount, order0.ReqPrice, true);

            arb.Run();

            possibleShortCount = arb.BondAccount.LongBlockManager.GetPossibleShortCountUsingCodeNoTail(codeNoTail);
            Assert.AreEqual(possibleShortCount, 0);
            Assert.AreEqual(sweeper.Run(), false);
            Assert.AreEqual(arb.GetTotalSweeperLiveCount(), 1);

            order1.Update(order1.ReqCount, order1.ReqPrice, true);

            arb.Run();

            possibleShortCount = arb.BondAccount.LongBlockManager.GetPossibleShortCountUsingCodeNoTail(codeNoTail);
            Assert.AreEqual(possibleShortCount, 0);
            Assert.AreEqual(sweeper.Run(), true);
            Assert.AreEqual(arb.GetTotalSweeperLiveCount(), 0);
        }
        void CreateOneSweeperAndSaveToUnittestFolder_SN()
        {
            // STR_Arb을 생성하여 MonitorEnter_BondArbTest를 생성한다.
            STR_Arb_Accessor arb = Unittest_BondArbUtil.CreateNewStrArbAccessor();
            StrategyNode node = arb._bondArbNode as StrategyNode;
            StrategyNode_Accessor nodeAccessor = new StrategyNode_Accessor(new PrivateObject(node));
            MonitorEnter_BondArb me = nodeAccessor._monitorEnter as MonitorEnter_BondArb;
            MonitorEnter_BondArb_Accessor meAccessor = new MonitorEnter_BondArb_Accessor(new PrivateObject(me));

            Sweeper_BondArb sweeper = GetHousingSweeperSN(meAccessor);

            {
                Sweeper_BondArb_Accessor accessor = new Sweeper_BondArb_Accessor(new PrivateObject(sweeper));

                SweepUnitTemplate longSweepUnitTemplate = accessor._sweepUnitLong;
                SweepUnitTemplate_Accessor longSweepUnitTemplate_Accessor = new SweepUnitTemplate_Accessor(new PrivateObject(longSweepUnitTemplate));
                SweepUnitContext_Bond_Long longContext = longSweepUnitTemplate_Accessor.Context as SweepUnitContext_Bond_Long;
                SweepUnitContext_Bond_Long_Accessor longContext_Accessor = new SweepUnitContext_Bond_Long_Accessor(new PrivateObject(longContext));

                SweepUnitTemplate shortSweepUnitTemplate = accessor._sweepUnitShort;
                SweepUnitTemplate_Accessor shortSweepUnitTemplate_Accessor = new SweepUnitTemplate_Accessor(new PrivateObject(shortSweepUnitTemplate));
                SweepUnitContext_Bond_Short shortContext = shortSweepUnitTemplate_Accessor.Context as SweepUnitContext_Bond_Short;
                SweepUnitContext_Bond_Short_Accessor shortContext_Accessor = new SweepUnitContext_Bond_Short_Accessor(new PrivateObject(shortContext));

                // 1. 소액 99,999,000 체결
                longContext_Accessor._initOrders[0].OrderNumber = 0;
                longContext_Accessor._initOrders[1].OrderNumber = 0;
                longContext_Accessor._initOrders[2].OrderNumber = 0;
                longContext_Accessor._initOrders[3].OrderNumber = 0;
                longContext_Accessor._initOrders[4].OrderNumber = 0;
                longContext_Accessor._initOrders[5].OrderNumber = 0;

                longContext_Accessor._initOrders[0].Update(50000 * CommonConst._1_000, longContext_Accessor._initOrders[0].ReqPrice, true);
                longContext_Accessor._initOrders[1].Update(49999 * CommonConst._1_000, longContext_Accessor._initOrders[1].ReqPrice, false);

                // 4. Sweep 테스트를 진행한다.

                longSweepUnitTemplate_Accessor.CurState = SweepUnitTemplate.StateEnum._2_WaitUntilGotAllOrderNumber;
                shortSweepUnitTemplate_Accessor.CurState = SweepUnitTemplate.StateEnum._2_WaitUntilGotAllOrderNumber;

                Assert.AreEqual(sweeper.Run(), false);

                longContext_Accessor._initOrders[1].UpdateCancelMessage(1000);
                longContext_Accessor._initOrders[2].UpdateCancelMessage(longContext_Accessor._initOrders[2].ReqCount);
                longContext_Accessor._initOrders[3].UpdateCancelMessage(longContext_Accessor._initOrders[3].ReqCount);
                longContext_Accessor._initOrders[4].UpdateCancelMessage(longContext_Accessor._initOrders[4].ReqCount);
                longContext_Accessor._initOrders[5].UpdateCancelMessage(longContext_Accessor._initOrders[5].ReqCount);

                Assert.AreEqual(sweeper.Run(), false);

                Assert.AreEqual(longContext_Accessor.CurSignedTargetCount, 300 * CommonConst._1_000_000);
                Assert.AreEqual(shortContext_Accessor.CurSignedTargetCount, (-1) * 300 * CommonConst._1_000_000);

                //Resume
                Assert.AreEqual(sweeper.Run(), false);

                Assert.AreEqual(longContext_Accessor.CurSignedTargetCount, 99999 * CommonConst._1_000);
                Assert.AreEqual(shortContext_Accessor.CurSignedTargetCount, (-1) * 99999 * CommonConst._1_000);

                Assert.AreEqual(longSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._7_Done);

                POrder sweepOrder0 = shortContext_Accessor.RealOrdersShort[0];
                POrder sweepOrder1 = shortContext_Accessor.RealOrdersShort[1];

                Assert.AreEqual(sweepOrder0.ReqCount, 50000 * CommonConst._1_000);
                Assert.AreEqual(sweepOrder0.ReqPrice, 15000);

                Assert.AreEqual(sweepOrder1.ReqCount, 49999 * CommonConst._1_000);
                Assert.AreEqual(sweepOrder1.ReqPrice, 15000);

                Assert.AreEqual(shortSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._6_MonitorRequestedSweepOrders);

                Timer_Accessor mute_Accessor = new Timer_Accessor(new PrivateObject(shortSweepUnitTemplate_Accessor._mute));

                // 더이상 On이 풀리지 않는다.
                Assert.AreEqual(mute_Accessor.m_end > DateTime.Now.AddHours(1), true);

                // 여기서 많이 불러봐도 소용없다.
                Assert.AreEqual(sweeper.Run(), false);
            }

            // 2. save to unittest folder
            arb.SaveBondArbRemainPosition(Const.UNITTEST_BOND_ARB_REMAIN_POSITION_PATH);
            SetAsZeroAllCodes();
        }
Ejemplo n.º 15
0
        void TestCheckArbChance_NoArbCase3(MonitorEnter_BondArb_Accessor me, ref int innerKillWithNoticeCallingCount)
        {
            BondPair housingBondPair = null;
            RawMarketData rmdNormal = null;
            RawMarketData rmdSmall = null;

            SetHousingBondPairAndRmds(ref housingBondPair, ref rmdNormal, ref rmdSmall);

            int ret = 0;

            // 5000에 사서 15000에 팔 수 있는 기회이다
            SetImmeLongPart(rmdNormal, 100 * CommonConst._1_000 * CommonConst._1_000, 5000);
            SetImmeShortPart(rmdNormal, 0, 0);
            SetImmeLongPart(rmdSmall, 0, 0);
            SetImmeShortPart(rmdSmall, 100 * CommonConst._1_000 * CommonConst._1_000, 15000);

            me.BeforeEnterSweeperChance();
            ret = me.CheckArbChance(housingBondPair);
            Assert.AreEqual(0, ret);

            POrder o = new POrder(TradingDirection.Long, rmdNormal.Code, 50 * CommonConst._1_000 * CommonConst._1_000, rmdNormal.AskPrice1, me._bondAccount, rmdNormal, MarketType._0_Bond_일반, false);
            POrderUtil.RequestOrder(o, null);

            me.BeforeEnterSweeperChance();
            ret = me.CheckArbChance(housingBondPair);
            Assert.AreEqual(-208, ret);

            o.Update(o.ReqCount, 0, true);
            POrderLegalManager.Ins().Remove(o);
            POrderBidAskCountManager.Ins().Unregister(o);

            me.BeforeEnterSweeperChance();
            ret = me.CheckArbChance(housingBondPair);
            Assert.AreEqual(0, ret);

            Sweeper_BondArb sweeper = new Sweeper_BondArb(housingBondPair, me._bondAccount);
            me._node.GetSweeperCollection().Add(sweeper);

            // long쪽에 많지만 sweeper에서 short쪽을 잡아주었기 때문에 이 경우 arb이 성립되지 않는다.
            SetImmeLongPart(rmdNormal, 100 * CommonConst._1_000 * CommonConst._1_000 * CommonConst._1_000, 5000);
            SetImmeShortPart(rmdNormal, 0, 0);
            SetImmeLongPart(rmdSmall, 0, 0);
            SetImmeShortPart(rmdSmall, 150 * CommonConst._1_000 * CommonConst._1_000, 15000);

            me.BeforeEnterSweeperChance();
            ret = me.CheckArbChance(housingBondPair);
            Assert.AreEqual(-208, ret);

            // 다음 테스트 등을 위해서 깨끗이 지워준다.
            Unittest_BondArbUtil.ClearBondAccount(me._bondAccount);

            // rmd도 깨끗이 정리한다.
            SetImmeLongPart(rmdNormal, 0, 0);
            SetImmeShortPart(rmdNormal, 0, 0);
            SetImmeLongPart(rmdSmall, 0, 0);
            SetImmeShortPart(rmdSmall, 0, 0);

            Unittest_BondArbUtil.ClearSweeperCollection(me);
            Unittest_BondArbUtil.ForcedClearPOrderBidAskManager();
        }
Ejemplo n.º 16
0
        void TestEnterSweeperChance(MonitorEnter_BondArb_Accessor me)
        {
            // 1. 기회가 없는 경우
            TestEnterSweeperChance_NoArb(me);

            // 2. 기회가 있는 경우 (한종목)
            TestEnterSweeperChance_OneArb(me);

            // 3. 기회가 있는 경우 (두종목)
            TestEnterSweeperChance_TwoArb(me);
        }
Ejemplo n.º 17
0
        void TestSweeper_BondArb_SN_Init(MonitorEnter_BondArb_Accessor me, Sweeper_BondArb sweeper)
        {
            Sweeper_BondArb_Accessor accessor = new Sweeper_BondArb_Accessor(new PrivateObject(sweeper));
            Assert.AreEqual(accessor._bDone, false);

            SweepUnitTemplate longSweepUnitTemplate = accessor._sweepUnitLong;
            SweepUnitTemplate_Accessor longSweepUnitTemplate_Accessor = new SweepUnitTemplate_Accessor(new PrivateObject(longSweepUnitTemplate));
            SweepUnitContext_Bond_Long longContext = longSweepUnitTemplate_Accessor.Context as SweepUnitContext_Bond_Long;
            SweepUnitContext_Bond_Long_Accessor longContext_Accessor = new SweepUnitContext_Bond_Long_Accessor(new PrivateObject(longContext));

            SweepUnitTemplate shortSweepUnitTemplate = accessor._sweepUnitShort;
            SweepUnitTemplate_Accessor shortSweepUnitTemplate_Accessor = new SweepUnitTemplate_Accessor(new PrivateObject(shortSweepUnitTemplate));
            SweepUnitContext_Bond_Short shortContext = shortSweepUnitTemplate_Accessor.Context as SweepUnitContext_Bond_Short;
            SweepUnitContext_Bond_Short_Accessor shortContext_Accessor = new SweepUnitContext_Bond_Short_Accessor(new PrivateObject(shortContext));

            // 초기 주문이 잘 들어갔는지 검사한다.

            // 템플릿 상태는 모두 _1_MuteFewSecsAfterInitOrders이고 Long쪽은 주문이 들어가 있어야 한다.

            Assert.AreEqual(longSweepUnitTemplate_Accessor._aging, 0);
            Assert.AreEqual(shortSweepUnitTemplate_Accessor._aging, 0);

            Assert.AreEqual(longSweepUnitTemplate_Accessor._bCompleteQuickly, false);
            Assert.AreEqual(shortSweepUnitTemplate_Accessor._bCompleteQuickly, false);

            Assert.AreEqual(longSweepUnitTemplate_Accessor._bResumed, false);
            Assert.AreEqual(shortSweepUnitTemplate_Accessor._bResumed, false);

            Assert.AreEqual(longSweepUnitTemplate_Accessor._maxWaiting, null);
            Assert.AreEqual(shortSweepUnitTemplate_Accessor._maxWaiting, null);

            Assert.AreEqual(longSweepUnitTemplate_Accessor._mute.On(), true);
            Assert.AreEqual(shortSweepUnitTemplate_Accessor._mute.On(), true);

            Assert.AreEqual(longSweepUnitTemplate_Accessor._muteSec, 5);
            Assert.AreEqual(shortSweepUnitTemplate_Accessor._muteSec, 5);

            Assert.AreEqual(longSweepUnitTemplate_Accessor._sweepMonitorSec, SweepUnitTemplate.SLOW_SWEEP_SEC);
            Assert.AreEqual(shortSweepUnitTemplate_Accessor._sweepMonitorSec, SweepUnitTemplate.SLOW_SWEEP_SEC);

            Assert.AreEqual(longSweepUnitTemplate_Accessor.CurOverviewState, SweepUnitTemplate.OverviewState.Enter);
            Assert.AreEqual(shortSweepUnitTemplate_Accessor.CurOverviewState, SweepUnitTemplate.OverviewState.Enter);

            Assert.AreEqual(longSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._1_MuteFewSecsAfterInitOrders);
            Assert.AreEqual(shortSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._1_MuteFewSecsAfterInitOrders);

            Assert.AreEqual(longSweepUnitTemplate_Accessor.GetSignedPossibleContractCount(), 300 * CommonConst._1_000_000);
            // 주문 낸 것이 없으로 Short part에서는 0
            Assert.AreEqual(shortSweepUnitTemplate_Accessor.GetSignedPossibleContractCount(), 0);

            // 아직 체결된 것이 없으므로 둘다 0
            Assert.AreEqual(longSweepUnitTemplate_Accessor.GetSignedContractedCount(), 0);
            Assert.AreEqual(shortSweepUnitTemplate_Accessor.GetSignedContractedCount(), 0);

            Assert.AreEqual(longSweepUnitTemplate_Accessor.IsException(), false);
            Assert.AreEqual(shortSweepUnitTemplate_Accessor.IsException(), false);

            Assert.AreEqual(longSweepUnitTemplate_Accessor.IsOverAging(), false);
            Assert.AreEqual(shortSweepUnitTemplate_Accessor.IsOverAging(), false);

            // Context를 검사한다.
            Assert.AreEqual(longContext_Accessor._bCalledAfterSetTarget, false);

            Assert.AreEqual(longContext_Accessor._dummyShortOrderForReserveBidAskCount.ReqCount, 300 * CommonConst._1_000_000);
            Assert.AreEqual(longContext_Accessor._dummyShortOrderForReserveBidAskCount.ReqPrice, 15000);
            Assert.AreEqual(longContext_Accessor._enterMarketType, MarketType._1_Bond_소액);
            Assert.AreEqual(longContext_Accessor._initEnterPrice, 5000);
            Assert.AreEqual(longContext_Accessor._initOrders.Count, 6);

            POrder initLongOrder = longContext_Accessor._initOrders[0];

            Assert.AreEqual(initLongOrder.ReqCount, 50 * CommonConst._1_000_000);
            Assert.AreEqual(initLongOrder.ReqPrice, 5000);
            Assert.AreEqual(initLongOrder.Market, MarketType._1_Bond_소액);
            Assert.AreEqual(initLongOrder.LongShort, TradingDirection.Long);
            Assert.AreEqual(initLongOrder.Code, _kHousingBondCode_Small);
            Assert.AreEqual(initLongOrder.CodeNoTail, _kHousingBondCodeNoTail);

            Assert.AreEqual(shortContext_Accessor._enterMarketType, MarketType._1_Bond_소액);
            Assert.AreEqual(shortContext_Accessor._pairMarketType, MarketType._0_Bond_일반);
            Assert.AreEqual(shortContext_Accessor.CurSignedTargetCount, (-1) * 300 * CommonConst._1_000_000);

            Assert.AreEqual(shortContext_Accessor.EnterCode, _kHousingBondCode_Small);
            Assert.AreEqual(shortContext_Accessor.LongShort, TradingDirection.Short);
            Assert.AreEqual(shortContext_Accessor.PairCode, _kHousingBondCode_Normal);
        }
Ejemplo n.º 18
0
        void TestEnterSweeperChance_TwoArb(MonitorEnter_BondArb_Accessor me)
        {
            // 두 pair 모두 0으로 값을 설정한 후 테스트한다.
            BondPair housingBondPair = null;
            RawMarketData rmdHousingNormal = null;
            RawMarketData rmdHousingSmall = null;

            SetHousingBondPairAndRmds(ref housingBondPair, ref rmdHousingNormal, ref rmdHousingSmall);

            BondPair doosanBondPair = null;
            RawMarketData rmdDoosanNormal = null;
            RawMarketData rmdDoosanRetail = null;

            SetCreditBondPairAndRmds(ref doosanBondPair, ref rmdDoosanNormal, ref rmdDoosanRetail);

            SetAsZeroRMD(ref rmdHousingNormal);
            SetAsZeroRMD(ref rmdHousingSmall);
            SetAsZeroRMD(ref rmdDoosanNormal);
            SetAsZeroRMD(ref rmdDoosanRetail);

            me.BeforeEnterSweeperChance();
            Assert.AreEqual(false, me.EnterSweeperChance(100));
            Assert.AreEqual(me._node.GetSweeperCollection().GetTotalSweeperCount(), 0);

            // 두개 모두 arb가능
            SetImmeLongPart(rmdDoosanNormal, 100 * CommonConst._1_000_000, 5000);
            SetImmeShortPart(rmdDoosanRetail, 100 * CommonConst._1_000_000, 15000);
            SetImmeLongPart(rmdHousingNormal, 100 * CommonConst._1_000_000, 5000);
            SetImmeShortPart(rmdHousingSmall, 100 * CommonConst._1_000_000, 15000);

            me.BeforeEnterSweeperChance();
            Assert.AreEqual(true, me.EnterSweeperChance(100));
            Assert.AreEqual(me._node.GetSweeperCollection().GetTotalSweeperCount(), 2);
            Unittest_BondArbUtil.ClearBondAccount(me._bondAccount);
            Unittest_BondArbUtil.ClearSweeperCollection(me);
        }
Ejemplo n.º 19
0
        void TestSweeper_BondArb_SN_Running(MonitorEnter_BondArb_Accessor me, Sweeper_BondArb sweeper)
        {
            Sweeper_BondArb_Accessor accessor = new Sweeper_BondArb_Accessor(new PrivateObject(sweeper));
            Assert.AreEqual(accessor._bDone, false);

            SweepUnitTemplate longSweepUnitTemplate = accessor._sweepUnitLong;
            SweepUnitTemplate_Accessor longSweepUnitTemplate_Accessor = new SweepUnitTemplate_Accessor(new PrivateObject(longSweepUnitTemplate));
            SweepUnitContext_Bond_Long longContext = longSweepUnitTemplate_Accessor.Context as SweepUnitContext_Bond_Long;
            SweepUnitContext_Bond_Long_Accessor longContext_Accessor = new SweepUnitContext_Bond_Long_Accessor(new PrivateObject(longContext));

            SweepUnitTemplate shortSweepUnitTemplate = accessor._sweepUnitShort;
            SweepUnitTemplate_Accessor shortSweepUnitTemplate_Accessor = new SweepUnitTemplate_Accessor(new PrivateObject(shortSweepUnitTemplate));
            SweepUnitContext_Bond_Short shortContext = shortSweepUnitTemplate_Accessor.Context as SweepUnitContext_Bond_Short;
            SweepUnitContext_Bond_Short_Accessor shortContext_Accessor = new SweepUnitContext_Bond_Short_Accessor(new PrivateObject(shortContext));

            // 1. 소액 25,000,000 체결
            POrder initLongOrder0 = longContext_Accessor._initOrders[0];
            // 주문번호 0
            initLongOrder0.OrderNumber = 0;
            initLongOrder0.Update(25 * CommonConst._1_000_000, 5000, false);
            Assert.AreEqual(initLongOrder0.ShortCutTargetOfContractCallBack.Contract_CallBack(initLongOrder0), true);

            Assert.AreEqual(shortSweepUnitTemplate.GetSignedPossibleContractCount(), 0);
            Assert.AreEqual(shortContext_Accessor.RealOrdersShort.Count, 0);

            initLongOrder0.Update(50 * CommonConst._1_000_000, 5000, true);
            Assert.AreEqual(initLongOrder0.ShortCutTargetOfContractCallBack.Contract_CallBack(initLongOrder0), true);

            Assert.AreEqual(shortSweepUnitTemplate.GetSignedPossibleContractCount(), 0);
            Assert.AreEqual(shortContext_Accessor.RealOrdersShort.Count, 0);

            POrder initLongOrder1 = longContext_Accessor._initOrders[1];
            initLongOrder1.OrderNumber = 0;
            initLongOrder1.Update(25 * CommonConst._1_000_000, 5000, false);
            Assert.AreEqual(initLongOrder1.ShortCutTargetOfContractCallBack.Contract_CallBack(initLongOrder1), true);

            Assert.AreEqual(shortSweepUnitTemplate.GetSignedPossibleContractCount(), 0);
            Assert.AreEqual(shortContext_Accessor.RealOrdersShort.Count, 0);

            initLongOrder1.Update(49999000, 5000, false);
            Assert.AreEqual(initLongOrder1.ShortCutTargetOfContractCallBack.Contract_CallBack(initLongOrder1), true);

            Assert.AreEqual(shortSweepUnitTemplate.GetSignedPossibleContractCount(), 0);
            Assert.AreEqual(shortContext_Accessor.RealOrdersShort.Count, 0);

            // 1억째 되었다
            initLongOrder1.Update(50 * CommonConst._1_000_000, 5000, true);
            Assert.AreEqual(initLongOrder1.ShortCutTargetOfContractCallBack.Contract_CallBack(initLongOrder1), true);

            Assert.AreEqual(shortSweepUnitTemplate.GetSignedPossibleContractCount(), (-1) * 100 * CommonConst._1_000_000);
            Assert.AreEqual(shortContext_Accessor.RealOrdersShort.Count, 1);

            POrder initLongOrder2 = longContext_Accessor._initOrders[2];
            initLongOrder2.OrderNumber = 0;
            initLongOrder2.Update(50 * CommonConst._1_000_000, 5000, true);
            Assert.AreEqual(initLongOrder2.ShortCutTargetOfContractCallBack.Contract_CallBack(initLongOrder2), true);

            Assert.AreEqual(shortSweepUnitTemplate.GetSignedPossibleContractCount(), (-1) * 100 * CommonConst._1_000_000);
            Assert.AreEqual(shortContext_Accessor.RealOrdersShort.Count, 1);

            POrder initLongOrder3 = longContext_Accessor._initOrders[3];
            initLongOrder3.OrderNumber = 0;
            initLongOrder3.Update(49999000, 5000, false);
            Assert.AreEqual(initLongOrder3.ShortCutTargetOfContractCallBack.Contract_CallBack(initLongOrder3), true);
            Assert.AreEqual(shortSweepUnitTemplate.GetSignedPossibleContractCount(), (-1) * 100 * CommonConst._1_000_000);
            Assert.AreEqual(shortContext_Accessor.RealOrdersShort.Count, 1);

            initLongOrder3.Update(50000000, 5000, true);
            Assert.AreEqual(initLongOrder3.ShortCutTargetOfContractCallBack.Contract_CallBack(initLongOrder3), true);
            Assert.AreEqual(shortSweepUnitTemplate.GetSignedPossibleContractCount(), (-1) * 200 * CommonConst._1_000_000);
            Assert.AreEqual(shortContext_Accessor.RealOrdersShort.Count, 2);

            // balance order
            POrder balanceOrder1 = shortContext_Accessor.RealOrdersShort[0];
            Assert.AreEqual(balanceOrder1.Code, _kHousingBondCode_Normal);
            Assert.AreEqual(balanceOrder1.LongShort, TradingDirection.Short);
            Assert.AreEqual(balanceOrder1.ReqCount, 100 * CommonConst._1_000_000);
            Assert.AreEqual(balanceOrder1.ReqPrice, 15000);

            POrder balanceOrder2 = shortContext_Accessor.RealOrdersShort[1];
            Assert.AreEqual(balanceOrder2.Code, _kHousingBondCode_Normal);
            Assert.AreEqual(balanceOrder2.LongShort, TradingDirection.Short);
            Assert.AreEqual(balanceOrder2.ReqCount, 100 * CommonConst._1_000_000);
            Assert.AreEqual(balanceOrder2.ReqPrice, 15000);

            // 2. 일반을 79,900,000만큼 체결시킨다.
            balanceOrder1.Update(79900 * CommonConst._1_000, 5000, false);
            Assert.AreEqual(balanceOrder1.ShortCutTargetOfContractCallBack.Contract_CallBack(balanceOrder1), true);

            // 4. Sweep 테스트를 진행한다.

            longSweepUnitTemplate_Accessor.CurState = SweepUnitTemplate.StateEnum._2_WaitUntilGotAllOrderNumber;
            shortSweepUnitTemplate_Accessor.CurState = SweepUnitTemplate.StateEnum._2_WaitUntilGotAllOrderNumber;

            balanceOrder1.OrderNumber = 0;
            balanceOrder2.OrderNumber = 0;

            POrder initLongOrder4 = longContext_Accessor._initOrders[4];
            POrder initLongOrder5 = longContext_Accessor._initOrders[5];

            initLongOrder4.OrderNumber = 0;
            initLongOrder5.OrderNumber = 0;

            Assert.AreEqual(sweeper.Run(), false);

            Assert.AreEqual(longSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._3_WaitUntilCancelAllOrders);
            Assert.AreEqual(shortSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._3_WaitUntilCancelAllOrders);

            initLongOrder4.Update(CommonConst._1_000, 5000, false);
            initLongOrder4.UpdateCancelMessage(initLongOrder4.ReqCount - CommonConst._1_000);
            initLongOrder5.UpdateCancelMessage(initLongOrder5.ReqCount);

            balanceOrder1.UpdateCancelMessage(balanceOrder1.ReqCount - balanceOrder1.ContractedCount);
            balanceOrder2.UpdateCancelMessage(balanceOrder2.ReqCount - balanceOrder2.ContractedCount);

            Assert.AreEqual(sweeper.Run(), false);

            Assert.AreEqual(longSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._4_WaitingRunSign);
            Assert.AreEqual(shortSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._4_WaitingRunSign);

            Assert.AreEqual(longContext_Accessor.CurSignedTargetCount, 300 * CommonConst._1_000_000);
            Assert.AreEqual(shortContext_Accessor.CurSignedTargetCount, (-1) * 300 * CommonConst._1_000_000);

            //Resume
            Assert.AreEqual(sweeper.Run(), false);

            Assert.AreEqual(longContext_Accessor.CurSignedTargetCount, 200 * CommonConst._1_000_000 + CommonConst._1_000);
            Assert.AreEqual(shortContext_Accessor.CurSignedTargetCount, (-1) * (200 * CommonConst._1_000_000 + CommonConst._1_000));

            Assert.AreEqual(longSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._7_Done);

            POrder sweepOrder1 = shortContext_Accessor.RealOrdersShort[2];
            POrder sweepOrder2 = shortContext_Accessor.RealOrdersShort[3];
            POrder sweepOrder3 = shortContext_Accessor.RealOrdersShort[4];

            //121,001,000
            Assert.AreEqual(sweepOrder1.ReqCount, 50 * CommonConst._1_000_000);
            Assert.AreEqual(sweepOrder2.ReqCount, 50 * CommonConst._1_000_000);
            Assert.AreEqual(sweepOrder3.ReqCount, 20101000);

            Assert.AreEqual(sweepOrder1.Code, _kHousingBondCode_Small);
            Assert.AreEqual(sweepOrder2.Code, _kHousingBondCode_Small);
            Assert.AreEqual(sweepOrder3.Code, _kHousingBondCode_Small);

            Assert.AreEqual(sweepOrder1.LongShort, TradingDirection.Short);
            Assert.AreEqual(sweepOrder2.LongShort, TradingDirection.Short);
            Assert.AreEqual(sweepOrder3.LongShort, TradingDirection.Short);

            Assert.AreEqual(sweepOrder1.ReqPrice, 15000);
            Assert.AreEqual(sweepOrder2.ReqPrice, 15000);
            Assert.AreEqual(sweepOrder3.ReqPrice, 15000);

            Assert.AreEqual(shortSweepUnitTemplate_Accessor.CurState, SweepUnitTemplate.StateEnum._6_MonitorRequestedSweepOrders);

            Timer_Accessor mute_Accessor = new Timer_Accessor(new PrivateObject(shortSweepUnitTemplate_Accessor._mute));

            // 더이상 On이 풀리지 않는다.
            Assert.AreEqual(mute_Accessor.m_end > DateTime.Now.AddHours(1), true);

            // 여기서 많이 불러봐도 소용없다.
            Assert.AreEqual(sweeper.Run(), false);

            sweepOrder1.Update(50000000, 15000, true);
            sweepOrder2.Update(50000000, 15000, true);

            Assert.AreEqual(sweeper.Run(), false);

            sweepOrder3.Update(20101000, 15000, true);

            Assert.AreEqual(sweeper.Run(), true);
        }