Boolean EnterNewDoorOrder(ElwInfo targetElw, KospiOptionInfo targetKOI, KospiOptionInfo doorKOI)
        {
            try
            {
                const double kDownBarrier = 0.1;
                const double kMinBuffer = 0.5;

                RawMarketData targetOptionRMD = RmdManager.Ins().GetDataClone(targetKOI.Code);
                RawMarketData doorOptionRMD = RmdManager.Ins().GetDataClone(doorKOI.Code);

                if (!Util.IsValidPrice(targetOptionRMD.BidPrice1))
                {
                    return false;
                }

                if (!Util.IsValidPrice(doorOptionRMD.BidPrice1))
                {
                    return false;
                }

                if (doorOptionRMD.BidPrice1 <= kDownBarrier)
                {
                    return false;
                }

                if (targetOptionRMD.BidPrice1 <= doorOptionRMD.BidPrice1)
                {
                    logger.Warn("{0} {1} <= {2} {3}",
                        targetOptionRMD.Code,
                        targetOptionRMD.BidPrice1,
                        doorOptionRMD.Code,
                        doorOptionRMD.BidPrice1);
                    return false;
                }

                String elwCode = targetElw.Code;

                double reqPrice = ElwOptionUtil.ConvertOptionPriceToElwPrice(targetElw, doorOptionRMD.BidPrice1);

                // same strike의 bidPrice - kMinBuffer 가격에 해당하는 price
                double reqPrice2 = ElwOptionUtil.ConvertOptionPriceToElwPrice(targetElw, Math.Max(0, targetOptionRMD.BidPrice1 - kMinBuffer));

                // reference bidPrice와 target(같은 strike의 옵션)의 bidPrice - 0.5 중에 작은 값을 take
                reqPrice = Math.Min(reqPrice, reqPrice2);

                // 5원보다 작으면 정말 이상한 것이다.
                if (reqPrice < 4)
                {
                    return false;
                }

                long reqCount = targetElw.MaxPossibleOrderCount;

                if (_parent.EnterMinCount)
                {
                    reqCount = 10; // 테스트 경우 무조건 10개 주문
                }

                Account account = _parent.Parent.ElwAccount;

                RawMarketData rmdElw = RmdManager.Ins().GetDataClone(elwCode);

                POrder o = new POrder(TradingDirection.Long, elwCode, reqCount, reqPrice, account, rmdElw);
                OrderLimitReferenceOOR limitReference = new OrderLimitReferenceOOR(OrderLimitReferenceOOR.OrderType.OOR, targetOptionRMD);
                o.LimitOrderReference = limitReference;

                POrderUtil.RequestOrder(o, this._orders);

                _parent.Parent.AddFishingOrder(o, STR_Door.FishingOrderType.Active);

                return true;
            }
            catch (System.Exception ex)
            {
                logger.Error(ex.ToString());
                Util.KillWithNotice(ex.ToString());
            }
            return false;
        }
Beispiel #2
0
        public void RequestNewSweepOrder(
            TradingDirection ls,
            String code,
            long reqCount,
            double reqPrice,
            RawMarketData rmd)
        {
            OptionTribe ot = ElwOptionUtil.GetOptionTribeFromCode(code);
            String optionCode = ot.KOI.Code;
            RawMarketData rmdReferenceOption = RmdManager.Ins().GetDataClone(optionCode);

            if (!IsProperPrice(rmd, ls, code, reqPrice, rmdReferenceOption))
            {
                logger.Warn("가격이 적당하지 않다. 주문을 넣지 않았습니다.");
                return;
            }

            Account account = null;
            if (ElwUtil.IsElwCode(code))
            {
                account = _parent.Parent.ElwAccount;
            }
            else
            {
                account = _parent.Parent.OptionAccount;
            }

            POrder o = new POrder(ls, code, reqCount, reqPrice, account, rmd);
            OrderLimitReferenceOOR limitReference = new OrderLimitReferenceOOR(OrderLimitReferenceOOR.OrderType.Sweep, rmdReferenceOption);
            o.LimitOrderReference = limitReference;

            POrderUtil.RequestOrder(o, null);
            _sweepOrders.Add(o);
        }