public ElwArbSweepUnit( KospiOptionInfo koi, ElwInfo elwInfo, long optionCount, POrder optionOrder, POrder elwOrder, STR_ElwArb parent) { try { // 이 생성자는 인수인계를 받을 때만 사용하도록 한다. // 주의한다. _state = State._5_Done; if (optionOrder.LongShort == elwOrder.LongShort) { logger.Error("OptionOrder, ElwOrder same trading direction"); Util.KillWithNotice("OptionOrder, ElwOrder same trading direction"); throw new Exception(); } OptionAccount = null; ElwAccount = null; long elwCount = ElwOptionUtil.ConvertOptionCountToElwCount(elwInfo, optionCount); OptionOrderGoal = new POrder( TradingDirection.Short, optionOrder.Code, optionCount, optionOrder.ReqPrice, optionOrder.TargetAccount, optionOrder.RMDClone, MarketType._3_Default, true); OptionOrderGoal.AddComment("ElwOptionSweeper.TakeOver.OptionOrderGoal"); OptionOrderGoal.UpdateForRemain(OptionOrderGoal.ReqCount, OptionOrderGoal.InitReqPrice); ElwOrderGoal = new POrder( TradingDirection.Long, elwOrder.Code, elwCount, elwOrder.ReqPrice, elwOrder.TargetAccount, elwOrder.RMDClone, MarketType._3_Default, true); ElwOrderGoal.AddComment("ElwOptionSweeper.TakeOver.ElwOrderGoal"); ElwOrderGoal.UpdateForRemain(ElwOrderGoal.ReqCount, ElwOrderGoal.InitReqPrice); ElwOrdersReal = new List<POrder>(); OptionOrdersReal = new List<POrder>(); POrder elwOrderReal = new POrder(ElwOrderGoal); elwOrderReal.AddComment("ElwOptionSweeper.TakeOver.elwOrderReal"); elwOrderReal.UpdateForRemain(elwOrderReal.ReqCount, elwOrderReal.InitReqPrice); ElwOrdersReal.Add(elwOrderReal); POrder optionOrderReal = new POrder(OptionOrderGoal); optionOrderReal.AddComment("ElwOptionSweeper.TakeOver.optionOrderReal"); optionOrderReal.UpdateForRemain(optionOrderReal.ReqCount, optionOrderReal.InitReqPrice); OptionOrdersReal.Add(optionOrderReal); _parent = parent; KOI = koi; Key = String.Format("{0};{1}", OptionOrderGoal.Code, ElwOrderGoal.Code); IsBodySweepQuickly = false; } catch (System.Exception ex) { logger.Error(ex.ToString()); Util.KillWithNotice(ex.ToString()); } }
void MakePOrder() { foreach (RawPOrderData rpd in _elwRemains.Values) { RawMarketData rmd = RmdManager.Ins().GetData(rpd.Code); if (rmd == null) { logger.Warn(String.Format("{0} code does not exist. is is ok the day after maturity", rpd.Code)); continue; } POrder o = new POrder(TradingDirection.Long, rpd.Code, rpd.ReqCount, rpd.ReqPrice, _account, rmd); o.AddComment("ADHR_SPOT"); o.OrderNumber = 0; o.UpdateForRemain(rpd.ReqCount, rpd.ReqPrice); _remainPOrders.Add(o); } }
// 이 함수는 신중하게 불러야 한다. // 현재는 KBHTS의 경우 remain을 못 얻어오기 때문에 기존 포지션 정보를 파일에서 읽어오는 데에 사용한다. public void RegisterAsAllContract(POrder o) { Trace.Assert(o.Market != MarketType._3_Default); o.UpdateForRemain(o.ReqCount, o.ReqPrice); this.Hts.RegisterRemainFromAccount(o); }
void _bizServer_ReceiveResult(int nRowSize, int nColSize) { try { if (_bDone) { return; } _remainPOrders.Clear(); // 결과 처리 Array pArr = Array.CreateInstance(typeof(string), nRowSize, nColSize); _bizServer.GetRepeatResult(ref pArr); int rowCount = pArr.GetUpperBound(0); int colCount = pArr.GetUpperBound(1); if (rowCount == 0) { logger.Warn(String.Format("No header info in account ({0})", _accountName)); _bDone = true; return; } Dictionary<String, int> _dic = new Dictionary<string, int>(); for (int iCol = 0; iCol <= colCount; iCol++) { String name = Convert.ToString(pArr.GetValue(0, iCol)).Trim(); _dic.Add(name, iCol); } // 여기서 원하는 Col을 알아낸다. for (int iRow = 1; iRow <= rowCount; iRow++) { String code = Convert.ToString(pArr.GetValue(iRow, _dic["종목코드"])); String codeDescription = Convert.ToString(pArr.GetValue(iRow, _dic["종목명"])); long contractedCount = Convert.ToInt64(pArr.GetValue(iRow, _dic["미결재수량"])); int lsFlag = Convert.ToInt32(pArr.GetValue(iRow, _dic["매매구분"])); // 2가 매수, 1이 매도 double avgPrice = Convert.ToDouble(pArr.GetValue(iRow, _dic["평균매수가"])); String curPriceFormPB = Convert.ToString(pArr.GetValue(iRow, _dic["현재가"])); TradingDirection longShort = (lsFlag == 2) ? TradingDirection.Long : TradingDirection.Short; //주문번호가 없다. 가라 주문번호를 준다. RawMarketData rmd = RmdManager.Ins().GetData(code); if (rmd != null) { POrder o = new POrder(longShort, code, contractedCount, avgPrice, _account, rmd); o.OrderNumber = 0; o.UpdateForRemain(contractedCount, avgPrice); _remainPOrders.Add(o); } else { logger.Warn("{0}({1}) is not in RMD list", code, codeDescription); } } // 모두 잘 받았다. logger.Info("{0}의 기존 잔고 정보를 모두 받았습니다.", _accountName); _bDone = true; } catch (System.Exception ex) { logger.Error(ex.ToString()); Util.KillWithNotice(ex.ToString()); } }