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);
        }
        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);
        }
        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 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);
        }
        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();
        }