Example #1
0
 public IEDoorEachMonitorEnterState Run(
     EDoorCenterData centerData,
     EDoorEachMonitorEnterData eachData)
 {
     MonitorState.MonitorDataThisTurn monitorData =
         EDoorUtil.CreateThisTurnInput(eachData);
     return Run(centerData, eachData, monitorData);
 }
Example #2
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;
        }
Example #3
0
        Boolean IsFrontBidPrice(
            EDoorEachMonitorEnterData eachData,
            MonitorState.MonitorDataThisTurn monitorData)
        {
            double reqPrice = eachData.LiveOrder.ReqPrice;
            double marketBidPrice = monitorData.RmdElw.BidPrice1;

            Boolean bSame = Util.IsSameDouble(reqPrice, marketBidPrice, 2);

            if (bSame || reqPrice > marketBidPrice)
            {
                return true;
            }
            return false;
        }
Example #4
0
        public IEDoorEachMonitorEnterState Run(
            EDoorCenterData centerData,
            EDoorEachMonitorEnterData eachData)
        {
            Trace.Assert(eachData.LiveOrder != null);

            if (eachData.LiveOrder.IsCompleteGotOrderNumber())
            {
                centerData.RemoveSweepStateOrder(eachData.LiveOrder);
                logger.Info("Change State Entering to Rebalance {0}",
                    eachData.EI.Name);
                RebalanceState next = new RebalanceState(_parent); 
                return next;
            }
            return this;
        }
Example #5
0
        Boolean IsOrderHigherThanKoi_2(
            EDoorCenterData centerData,
            EDoorEachMonitorEnterData eachData,
            MonitorState.MonitorDataThisTurn monitorData)
        {
            double reqPrice = ElwOptionUtil.ConvertToOptionPrice(
                eachData.EI.Code, eachData.LiveOrder.ReqPrice);

            double bidPriceOfKoi_2 = monitorData.RmdKoi_2.BidPrice1;

            if (reqPrice > bidPriceOfKoi_2)
            {
                return true;
            }
            return false;
        }
Example #6
0
        Boolean IsRebalanceCondition(
            EDoorCenterData centerData,
            EDoorEachMonitorEnterData eachData,
            MonitorState.MonitorDataThisTurn monitorData,
            ref String log)
        {
            if (_parent.Parent.BlockAfterCancel)
            {
                return true;
            }

            // 1. 옵션시세가 정상적인지 확인한다.
            if (EDoorUtil.IsAllValid(monitorData) &&
                EDoorUtil.IsAllRefOK(monitorData))
            {
                // 2. koi 2's bidPrice < optionPriceOfReqPrice라면 리밸런스
                if (IsOrderHigherThanKoi_2(centerData, eachData, monitorData))
                {
                    log += "IsOrderHigherThanKoi_2 is true, ";
                    return true;
                }

                // 3. 최전방 주문이 아니고
                // 최전방 주문 + 1tick가격이 koi 3's bidPrice보다 작으면
                // 리밸런싱
                if (!IsFrontBidPrice(eachData, monitorData) &&
                    IsReqPricePlusOneLowerThanKoi_3(eachData, monitorData))
                {
                    log += "!IsFrontBidPrice and IsReqPricePlusOneLowerThanKoi_3 is true, ";
                    return true;
                }
                return false;
            }
            else
            {
                // 옵션 시세가 정상적이지 않으면 리밸런스 케이스이다.
                log += "Market data is not valid, ";
                return true;
            }
        }
Example #7
0
 long CalculateReqCount(EDoorCenterData centerData,
     EDoorEachMonitorEnterData eachData)
 {
     long reqCount = 0;
     switch (centerData.CurEnterCountType)
     {
         case EDoorCenterData.EnterCountType.Ten:
             reqCount = 10;
             break;
         case EDoorCenterData.EnterCountType.Maximum:
             reqCount = eachData.EI.MaxPossibleOrderCount;
             break;
         default:
             break;
     }
     return reqCount;
 }
Example #8
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;
        }
Example #9
0
        Boolean EnterNewPosition(EDoorCenterData centerData, 
            EDoorEachMonitorEnterData eachData, double reqPrice, long reqCount,
            RawMarketData rmdElw, RawMarketData rmdOption_0)
        {
            try
            {
                // 1. LiveOrder가 없는 상태인 것을 다시한번 확인한다.
                Trace.Assert(eachData.LiveOrder == null);
                Trace.Assert(eachData.CurEDoorOrderState ==
                    EDoorEachMonitorEnterData.EDoorOrderState.Idle);

                String elwCode = eachData.EI.Code;
                Account account = centerData.ElwAccount;

                POrder order = new POrder(TradingDirection.Long, elwCode,
                    reqCount, reqPrice, account, rmdElw);

                // 2. 주문을 넣는다.
                OrderLimitReferenceOOR limitReference =
                    new OrderLimitReferenceOOR(
                        OrderLimitReferenceOOR.OrderType.OOR, rmdOption_0);
                order.LimitOrderReference = limitReference;
                order.ShortCutTargetOfContractCallBack = _parent;
                POrderUtil.RequestOrder(order, null);

                // 3. eachData의 LiveOrder를 설정한다.
                eachData.RequestOrderComplete(order);

                // 4. centerData의 사용 수량을 늘린다.
                centerData.IncreaseUsedChannelCount(order);

                return true;
            }
            catch (System.Exception ex)
            {
                logger.Error(ex.ToString());
                Util.KillWithNotice(ex.ToString());
            }
            return false;
        }
Example #10
0
        IEDoorEachMonitorEnterState Run(
            EDoorCenterData centerData,
            EDoorEachMonitorEnterData eachData,
            MonitorState.MonitorDataThisTurn monitorData)
        {
            // 리밸런스 해야 하는 상황인지 확인한다.

            String log = "";

            if (IsRebalanceCondition(centerData, eachData, monitorData, ref log))
            {
                // sweeper로 남은 주문 처리하고 모리터링 다시 시작
                EDoorEachSweeperController sweeper =
                    new EDoorEachSweeperController(
                        eachData.LiveOrder,
                        _parent.Parent.Parent.GetCenterData());

                // sweeper 등록
                _parent.Parent.Parent.GetSweeperController().Add(sweeper);

                eachData.ClearLiveOrder();
                logger.Info("Change State Rebalance to MonitorState {0} ({1})", eachData.EI.Name, log);
                IEDoorEachMonitorEnterState next = new MonitorState(_parent);
                return next;
            }
            return this;
        }
Example #11
0
        Boolean IsReqPricePlusOneLowerThanKoi_3(
            EDoorEachMonitorEnterData eachData,
            MonitorState.MonitorDataThisTurn monitorData)
        {
            // 1. 주문한 elw 가격 + 1tick 가격을 구한다.
            String elwCode = eachData.LiveOrder.Code;
            double elwReqPrice = eachData.LiveOrder.ReqPrice;

            TickValue tv = ProductUtil.Ins().GetTick(elwCode, elwReqPrice);

            double elwReqPricePlusOne = elwReqPrice + tv.UpTickValue;

            // 2. elw가격 + 1tick 가격을 옵션 가격으로 바꾼다.
            double optionPriceOfReqPricePlusOne =
                ElwOptionUtil.ConvertToOptionPrice(elwCode, elwReqPricePlusOne);

            // 3. koi 3's bidPrice를 구한다.
            double bidPriceOfKoi_3 = monitorData.RmdKoi_3.BidPrice1;

            // 4. 비교한다.
            if (optionPriceOfReqPricePlusOne < bidPriceOfKoi_3)
            {
                return true;
            }
            return false;
        }