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; }
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); }