public void Run(STR_Arb arb) { int useAccount = Convert.ToInt32(Util.RemoveComma(ConfigManager.Ins().Config.GetValue(ConfigKeyConst.USE_ACCOUNT))); int realKB = Convert.ToInt32(Util.RemoveComma(ConfigManager.Ins().Config.GetValue(ConfigKeyConst.KB_REAL))); Boolean bRealAccount = false; if (useAccount == 0) { bRealAccount = false; } else { bRealAccount = true; } Boolean bRealKB = false; if (realKB == 0) { bRealKB = false; } else { bRealKB = true; } if (bRealAccount && bRealKB) { logger.Warn("You can not run DTest_BondArb when real mode(RealAccount + RealKB"); return; } if (_bRun) { logger.Warn("DTest_BondArb is already running"); return; } _bRun = true; DB_DataLoaderCenter.Ins(); Infomax_DataLoaderCenter.Ins(); _arb = arb; { Thread t = new Thread(new ThreadStart(Run_Raw)); t.IsBackground = true; t.Start(); } }
void Run_Raw_Second(STR_Arb arb) { // 두번째 시나리오 /* * 국주 채권 NS * */ // 0. 체결이 무조건 전량체결이 되도록 한다. SimOrderContractPolicyData data = GetSimOrderContractPolicyData_FixedFull(); String jsonText = Util.GetJsonText(typeof(SimOrderContractPolicyData), data); SimOrderContractPolicy.Ins().ChangePolicy(jsonText); long initSweeperCount = arb.GetBondArbNode().GetSweeperCollection().GetTotalSweeperCount(); // 1. 국주채권을 등록한다 logger.Info("D2-1. RegisterHousingBondPair START"); RegisterHousingBondPair(); logger.Info("D2-1. RegisterHousingBondPair END"); // 2. Arb이 아니므로 아무 일도 일어나지 않는 것을 확인한다 logger.Info("D2-2. Check No Arb case START(wait few sec)"); System.Threading.Thread.Sleep(2000); Trace.Assert(arb.GetBondArbNode().GetSweeperCollection().GetTotalSweeperCount() == initSweeperCount); logger.Info("D2-2. Check No Arb case END(ok)"); // 3. 2개짜리 NS기회 logger.Info("D2-3. Check Arb case(NS) START"); RawMarketData rmdNormal = RmdManager.Ins().BondSpot.GetData(_kHousingBondCode_Normal); RawMarketData rmdSmall = RmdManager.Ins().BondSpot.GetData(_kHousingBondCode_Small); SetImmeLongPart(rmdNormal, 1000 * CommonConst._1_000_000, 5000); SetImmeShortPart(rmdSmall, 1000 * CommonConst._1_000_000, 15000); for (int i = 0; i < 50; ++i) { System.Threading.Thread.Sleep(100); Trace.Assert(arb.GetBondArbNode().GetSweeperCollection().GetLiveSweeperCount() <= 4); } logger.Info("D2-3. Check Arb case(NS) END"); System.Threading.Thread.Sleep(5000); }
void Run_Raw_First(STR_Arb arb) { // 첫번째 시나리오 /* * 두산 채권에서 매수 매도 기회가 나와서 매수 매도 모두 채결이 정상적으로 잘 된다. * */ // 0. 체결이 무조건 전량체결이 되도록 한다. SimOrderContractPolicyData data = GetSimOrderContractPolicyData_FixedFull(); String jsonText = Util.GetJsonText(typeof(SimOrderContractPolicyData), data); SimOrderContractPolicy.Ins().ChangePolicy(jsonText); // 1. 두산건설을 등록한다 logger.Info("D1. RegisterCreditBondPair START"); RegisterCreditBondPair(); logger.Info("D1. RegisterCreditBondPair END"); // 2. Arb이 아니므로 아무 일도 일어나지 않는 것을 확인한다 logger.Info("D2. Check No Arb case START(wait few sec)"); System.Threading.Thread.Sleep(2000); Trace.Assert(arb.GetBondArbNode().GetSweeperCollection().GetTotalSweeperCount() == 0); logger.Info("D2. Check No Arb case END(ok)"); // 3. 1개짜리 기회이지만 RN 기회이므로 아무일도 일어나지 않는다 logger.Info("D3. Check One Arb(RN) case START(wait few sec)"); RawMarketData rmdRetail = RmdManager.Ins().BondSpot.GetData(_kDoosanCode_Retail); RawMarketData rmdNormal = RmdManager.Ins().BondSpot.GetData(_kDoosanCode_Normal); SetImmeLongPart(rmdRetail, 100 * CommonConst._1_000_000, 5000); SetImmeShortPart(rmdNormal, 100 * CommonConst._1_000_000, 15000); System.Threading.Thread.Sleep(2000); Trace.Assert(arb.GetBondArbNode().GetSweeperCollection().GetTotalSweeperCount() == 0); logger.Info("D3. Check One Arb(RN) case END(ok)"); SetAsZeroRMD(ref rmdRetail); SetAsZeroRMD(ref rmdNormal); // 4. 1개 기회이고 NR이지만 pnl이 너무 작아서 진입하지 않는다 logger.Info("D4. Check One Arb(NR) with small pnl case START"); SetImmeLongPart(rmdNormal, 100 * CommonConst._1_000, 5000); SetImmeShortPart(rmdRetail, 100 * CommonConst._1_000, 5001); System.Threading.Thread.Sleep(2000); Trace.Assert(arb.GetBondArbNode().GetSweeperCollection().GetTotalSweeperCount() == 0); logger.Info("D4. Check One Arb(NR) with small pnl case END"); SetAsZeroRMD(ref rmdRetail); SetAsZeroRMD(ref rmdNormal); // 5. 1개짜리 기회이고 NR 기회이므로 1개 진입한다. logger.Info("D5. Check One Arb(NR) case START"); SetImmeLongPart(rmdNormal, 100 * CommonConst._1_000, 5000); SetImmeShortPart(rmdRetail, 100 * CommonConst._1_000, 15000); System.Threading.Thread.Sleep(2000); Trace.Assert(arb.GetBondArbNode().GetSweeperCollection().GetTotalSweeperCount() == 1); logger.Info("D5. Check One Arb(NR) case END"); SetAsZeroRMD(ref rmdRetail); SetAsZeroRMD(ref rmdNormal); System.Threading.Thread.Sleep(5000); // 6. 4개 이상 기회 NR, 4개 들어간다. (4개 이상은 안 들어감) logger.Info("D6. Check 4 Arb(NR) case START"); SetImmeLongPart(rmdNormal, 100 * CommonConst._1_000_000 * CommonConst._1_000, 5000); SetImmeShortPart(rmdRetail, 100 * CommonConst._1_000_000 * CommonConst._1_000, 15000); for (int i = 0; i < 50; ++i) { System.Threading.Thread.Sleep(100); Trace.Assert(arb.GetBondArbNode().GetSweeperCollection().GetLiveSweeperCount() <= 4); } logger.Info("D6. Check 4 Arb(NR) case END"); SetAsZeroRMD(ref rmdRetail); SetAsZeroRMD(ref rmdNormal); }