double CalculateElwReqPrice( MonitorDataThisTurn monitorData, EDoorEachMonitorEnterData eachData) { // 옵션 최소가격을 0.1로 설정한다. double kBuffer = 0.5; double kMinOptionPrice = 0.3; double optionPriceOf4th = monitorData.RmdKoi_4.BidPrice1; double optionPriceOfElw = GetOptionPriceOfElwPlusOneTick( monitorData.RmdElw); // 1. elw 매수 1 호가 + 1, 4's 호가 중 큰 값으로 후보가격 결정 double candidateOptionPrice = Math.Max(optionPriceOf4th, optionPriceOfElw); // 2. 후보가격이 3's 매수 1 호가보다 클 수 없다. double optionPriceOf3rd = monitorData.RmdKoi_3.BidPrice1; candidateOptionPrice = Math.Min(candidateOptionPrice, optionPriceOf3rd); // 3. 후보 가격이 0's 매수 1호가 - 버퍼 보다 클 수 없다. double optionPriceOfZero = monitorData.RmdKoi_0.BidPrice1 - kBuffer; optionPriceOfZero = Math.Max(0, optionPriceOfZero); candidateOptionPrice = Math.Min(candidateOptionPrice, optionPriceOfZero); // 너무 낮은 가격이면 주문을 넣지 말자. 의미가 없다. if (candidateOptionPrice < kMinOptionPrice) { return -1.0; } // 4. 후보가격을 Elw 가격으로 변환 double candidateElwPrice = ElwOptionUtil.ConvertOptionPriceToElwPrice( eachData.EI, candidateOptionPrice); // 5. 0's 옵션 매도 1호가 보다는 작은 값이어야 된다. double validateElwPrice = ElwOptionUtil.ConvertOptionPriceToElwPrice( eachData.EI, monitorData.RmdKoi_0.AskPrice1); Trace.Assert(candidateElwPrice <= validateElwPrice); return candidateElwPrice; }
IEDoorEachMonitorEnterState Run( EDoorCenterData centerData, EDoorEachMonitorEnterData eachData, MonitorDataThisTurn monitorData) { if (_parent.Parent.BlockAfterCancel) { // 취소후 더이상 집입 못한다. 따라서 그냥 리턴 return this; } // 1. Reference에 시세가 모두 있는지 확인한다. // 2. Reference사이에 가격 상태가 정상적인지 확인한다. if (EDoorUtil.IsAllValid(monitorData) && EDoorUtil.IsAllRefOK(monitorData)) { // 3. 진입할 가격을 구한다. double reqPrice = CalculateElwReqPrice(monitorData, eachData); // 4. 진입할 수량을 구한다. long reqCount = CalculateReqCount(centerData, eachData); if (reqPrice <= 0.0 || reqCount < 10) { // 가격 수량이 이상하다. return this; } // 5. 진입한다. if (EnterNewPosition(centerData, eachData, reqPrice, reqCount, monitorData.RmdElw, monitorData.RmdKoi_0)) { // 6. Entering state로 변환한다. String askPrice = (monitorData.RmdElw.AskPrice1 == double.MaxValue) ? "NaN" : "" + monitorData.RmdElw.AskPrice1; String bidPrice = (monitorData.RmdElw.BidPrice1 == double.MinValue) ? "NaN" : "" + monitorData.RmdElw.BidPrice1; logger.Info("Change State Monitor to Entering {0} ({1} ; {2:n0} ; {3})", eachData.EI.Name, bidPrice, reqPrice, askPrice); EnteringState state = new EnteringState(this._parent); return state; } } return this; }