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