Ejemplo n.º 1
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_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();
        }
        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_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();
        }