Ejemplo n.º 1
0
        Sweeper_BondArb GetHousingSweeperNS(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(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);

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

            return sweeper;
        }
Ejemplo n.º 2
0
        Sweeper_BondArb GetDoosanSweeperNR(MonitorEnter_BondArb_Accessor me)
        {
            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 = me.CheckArbChance(doosanBondPair);
            Assert.AreEqual(0, ret);

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

            return sweeper;
        }
Ejemplo n.º 3
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.º 4
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.º 5
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);
        }
        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();
        }