void CallNotEnterCaseTest(Monitor_Door_Entering_Accessor monitorDoor_EnteringAcr) { // 여러가지 콜이 안들어가는 경우를 테스트한다. // 가격이 낮은 경우 // Door 옵션의 가격이 타겟 옵션보다 가격이 높은 경우 }
void DeepCallTest(Monitor_Door_Entering_Accessor monitorDoor_EnteringAcr) { double doorStrikeOffset = monitorDoor_EnteringAcr._parent.Parent.Input.DoorStrikeOffset; CallPutFlag cp = CallPutFlag.Call; DateTime maturity = Util.GetSystemOptionMaturity(); // call strike List<double> strikes = OptionUtil.GetSortedStrikeList(cp); for (int i = strikes.Count - 1; i > strikes.Count - 1 - (int)doorStrikeOffset; --i) { double strike = strikes[i]; double doorStrike = monitorDoor_EnteringAcr.GetDoorStrike(strike, cp); KospiOptionInfo doorKOI = OptionUtil.GetKOI(doorStrike, cp, maturity); Assert.AreEqual(doorKOI, null); } for (int i = 0; i <= strikes.Count - 1 - (int)doorStrikeOffset; ++i) { double strike = strikes[i]; double doorStrike = monitorDoor_EnteringAcr.GetDoorStrike(strike, cp); KospiOptionInfo doorKOI = OptionUtil.GetKOI(doorStrike, cp, maturity); double expected = strike; for (int j = 0; j < (int)doorStrikeOffset; ++j) { expected = OptionUtil.GetNextStrike(strike); } Util.IsSameDouble(expected, doorStrike); } }
void DoorMonitor_UnderlyingPriceTest() { String futureCode = KospiFutureUtil.Ins().KFI.Code; // null이 오면 stay signal Monitor_UnderlyingPrice.Signal signal = _monitorControllerAcr.MonitorPrice.Run(null); Assert.AreEqual(signal, Monitor_UnderlyingPrice.Signal.Stay); RawMarketData rmd = RmdManager.Ins().GetData(futureCode); rmd.CurPrice = 200.0; // 제대로 값이 오면 최초에는 무조건 리밸런스 시그널 signal = _monitorControllerAcr.MonitorPrice.Run(rmd); Assert.AreEqual(signal, Monitor_UnderlyingPrice.Signal.Rebalance); // 최초 모니터도어는 레디 Assert.AreEqual(_monitorControllerAcr._monitorDoor.GetState(), MonitorController_Door.MonitorState.Ready); // 처음에는 Cancel후 Enter가 false Assert.AreEqual(_monitorControllerAcr.EnterAfterCancel, false); IMonitor_Door next = _monitorControllerAcr._monitorDoor.Run(Monitor_UnderlyingPrice.Signal.Rebalance); _monitorControllerAcr._monitorDoor = next; // 계속 ready 유지 Assert.AreEqual(next.GetState(), MonitorController_Door.MonitorState.Ready); // AfterCancel = true _monitorControllerAcr.EnterAfterCancel = true; next = _monitorControllerAcr._monitorDoor.Run(Monitor_UnderlyingPrice.Signal.Rebalance); _monitorControllerAcr._monitorDoor = next; // Entering 도어 Assert.AreEqual(next.GetState(), MonitorController_Door.MonitorState.Entering); signal = _monitorControllerAcr.MonitorPrice.Run(rmd); // 내부에서 reset이 되므로 Stay sign Assert.AreEqual(signal, Monitor_UnderlyingPrice.Signal.Stay); // 이제 Entering을 하도록 하자 Monitor_Door_Entering monitorDoor_Entering = _monitorControllerAcr._monitorDoor as Monitor_Door_Entering; Monitor_Door_Entering_Accessor monitorDoor_EnteringAcr = new Monitor_Door_Entering_Accessor(new PrivateObject(monitorDoor_Entering)); // Call부터 시작하자 // Deep ITM, OTM의 경우 테스트 한다. DeepCallTest(monitorDoor_EnteringAcr); CallNotEnterCaseTest(monitorDoor_EnteringAcr); }