Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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;
        }