}//receiveDataEventHandler END public void getSummaryVo(T0424Vo t0424Vo) { String 종목코드 = t0424Vo.expcode; Double 매도가능수량 = t0424Vo.mdposqt; String 에러코드 = t0424Vo.errorcd; SummaryVo summaryVo = mainForm.tradingHistory.getSummaryVo(종목코드); if (summaryVo == null) { t0424Vo.errorcd = "summaryVo is null"; } else { String 최대수익율 = Util.nvl(summaryVo.maxRt, "0"); String 최소수익율 = Util.nvl(summaryVo.minRt, "0"); t0424Vo.sellCnt = summaryVo.sellCnt; //매도 횟수. t0424Vo.buyCnt = summaryVo.buyCnt; //매수 횟수 t0424Vo.firstBuyDt = summaryVo.firstBuyDt; //최초진입일시 t0424Vo.sumMdposqt = summaryVo.sumMdposqt; //매도가능이력 t0424Vo.ordermtd = summaryVo.ordermtd; //주문매체 t0424Vo.exclWatchAt = summaryVo.exclWatchAt; //감시제외여부 t0424Vo.searchNm = summaryVo.searchNm; //검색조건 이름 t0424Vo.maxRt = 최대수익율; //최대도달 수익율 t0424Vo.minRt = 최소수익율; //최소도달 수익율 //매도가능수량이 같지 않으면 에러표시 해주자. //String c_mdposqt = this.grd_t0424.Rows[rowIndex].Cells["c_mdposqt"].Value.ToString(); if (매도가능수량.ToString() != summaryVo.sumMdposqt) { t0424Vo.errorcd = "mdposqt not equals"; //this.grd_t0424.Rows[rowIndex].DefaultCellStyle.BackColor = Color.Red; } else if (매도가능수량.ToString() == summaryVo.sumMdposqt) { if (t0424Vo.errorcd.Equals("mdposqt not equals"))//기존 다른 에러코드가 존재하면 초기화 하지 않는다. { t0424Vo.errorcd = ""; //this.grd_t0424.Rows[rowIndex].DefaultCellStyle.BackColor = Color.White; } } //확장정보 에러일경우 에러상태를 풀어준다. if (t0424Vo.errorcd != null && t0424Vo.errorcd.Equals("summaryVo is null"))//summaryVo is null { t0424Vo.errorcd = ""; //this.grd_t0424.Rows[rowIndex].DefaultCellStyle.BackColor = Color.White; } } }
}//stopProFitTarget end //매매이력 DB와 동기화 public void t0424histoySync() { for (int i = 0; i < this.t0424VoList.Count(); i++) { //1.보유종목 이력 존재 여부확인 SummaryVo summaryVo = mainForm.tradingHistory.getSummaryVo(this.t0424VoList.ElementAt(i).expcode.Replace("A", "")); if (summaryVo != null) { //2.매도가능수량 같은지 확인 if (this.t0424VoList.ElementAt(i).mdposqt.ToString() != summaryVo.sumMdposqt) { //3.같지않으면 삭세후 새로 등록. mainForm.tradingHistory.isunoDelete(this.t0424VoList.ElementAt(i).expcode); //종목일괄삭제. this.t0424VoToHistoryInsert(this.t0424VoList.ElementAt(i), i.ToString()); //이력등록 } } else { //이력정보가 없으면 이력정보를 등록해준다. this.t0424VoToHistoryInsert(this.t0424VoList.ElementAt(i), i.ToString());//이력등록 }//grd_t0424 for END } }//histoySync END
public SummaryVo getSummaryVo(String Isuno) { SummaryVo summaryVo = new SummaryVo(); //로그출력 String 최초진입 = ""; //double 매입금액 = 0; //double 총매수금액 = 0; //double 총매도금액 = 0; double 총매도체결수량 = 0; double 총매수체결수량 = 0; double 매도가능수량 = 0; //double 중간매도손익 = 0; int 매도횟수 = 0; int 매수횟수 = 0; var items = from item in this.tradingHistoryDt.AsEnumerable() where item["accno"].ToString() == mainForm.account && item["Isuno"].ToString() == Isuno.Replace("A", "") && item["useYN"].ToString() == "Y" select item; if (items.Count() <= 0) { return(null); } foreach (DataRow item in items) { if (item["ordptncode"].ToString() == "02" && item["useYN"].ToString() == "Y" && int.Parse(item["execqty"].ToString()) > 0) //매수그룹 { //총매수금액 + 체결수량+체결가격 // 총매수금액 = 총매수금액 + (Double.Parse(item["execqty"].ToString()) * Double.Parse(item["execprc"].ToString())); // //매도가능수량 = 매도가능수량 + Double.Parse(item.execqty); 총매수체결수량 = 총매수체결수량 + Double.Parse(item["execqty"].ToString()); 매수횟수 = 매수횟수 + 1; if (매수횟수 == 1) { 최초진입 = item["dt"].ToString(); } } else if (item["ordptncode"].ToString() == "01" && item["useYN"].ToString() == "Y" && int.Parse(item["execqty"].ToString()) > 0) {//매도그룹 // //총매도금액 =총매도금액+ 체결수량 * 상위체결금액(현재오른값으로 계산하면 1줄일때 반만 매도됬을경우 계산 안맞는다.) // 총매도금액 = 총매도금액 + (Double.Parse(item["execqty"].ToString()) * Double.Parse(item["upExecprc"].ToString())); // //매도가능수량 = 매도가능수량 - Double.Parse(item.execqty); 총매도체결수량 = 총매도체결수량 + Double.Parse(item["execqty"].ToString()); 매도횟수 = 매도횟수 + 1; // 중간매도손익 = 중간매도손익 + ((Double.Parse(item["execqty"].ToString()) * Double.Parse(item["execprc"].ToString())) - (Double.Parse(item["execqty"].ToString()) * Double.Parse(item["upExecprc"].ToString()))); } } //매입금액 = 총매수금액 - 총매도금액; 매도가능수량 = 총매수체결수량 - 총매도체결수량; //double 평균단가 = (매입금액 / 매도가능수량); //summaryVo.pamt2 = 평균단가.ToString(); //평균단가 summaryVo.buyCnt = 매수횟수.ToString(); //매수횟수 summaryVo.sellCnt = 매도횟수.ToString(); //매도횟수 //summaryVo.sellSunik = 중간매도손익.ToString(); //중간매도손익 summaryVo.firstBuyDt = 최초진입; summaryVo.sumMdposqt = 매도가능수량.ToString(); if (items.First()["ordermtd"].ToString().Equals("")) { summaryVo.ordermtd = "XING API"; } else { summaryVo.ordermtd = items.First()["ordermtd"].ToString(); //주문매체 - 감시제외 일때 사용 } //summaryVo.ordermtd = items.First()["ordermtd" ].ToString(); //주문매체 - 감시제외 일때 사용 //summaryVo.targClearPrc = items.First()["targClearPrc"].ToString(); //목표청산가격 - 감시제외 일때 사용 //summaryVo.secEntPrc = items.First()["secEntPrc"].ToString(); //2차진입가격 - 감시제외 일때 사용 - 이값이 설정되어있지않으면 2차진입이 실행 되었거나 설정을 안한 케이스. //summaryVo.secEntAmt = items.First()["secEntAmt"].ToString(); //2차진입비중가격 - 감시제외 일때 사용 //summaryVo.stopPrc = items.First()["stopPrc"].ToString(); //손절가격 - 감시제외 일때 사용 summaryVo.exclWatchAt = items.First()["exclWatchAt"].ToString(); //감시제외여부 summaryVo.searchNm = items.First()["searchNm"].ToString(); //검색조건 이름 summaryVo.maxRt = items.First()["maxHisRt"].ToString(); //최대도달 수익율 summaryVo.minRt = items.First()["minHisRt"].ToString(); //최소도달 수익율 return(summaryVo); }
/// <summary> /// 데이터 응답 처리 /// </summary> /// <param name="szTrCode">조회코드</param> void receiveDataEventHandler(string szTrCode) { //4.주문처리유형코드,ordtrxptncode, // 0 정상 //6 정정확인 //7 정정거부(채권) //8 취소확인 //9 취소거부(채권) realSc1Vo.ordno = base.GetFieldData("OutBlock", "ordno"); //주문번호 realSc1Vo.ordptncode = base.GetFieldData("OutBlock", "ordptncode"); //주문구분 01:매도|02:매수 realSc1Vo.ordtrxptncode = base.GetFieldData("OutBlock", "ordptncode"); // 0:정상|6:정정확인 |7:정정거부(채권) |8:취소확인 |9:취소거부(채권) realSc1Vo.Isuno = base.GetFieldData("OutBlock", "shtnIsuno"); //종목코드 realSc1Vo.Isunm = base.GetFieldData("OutBlock", "Isunm"); //종목명 realSc1Vo.ordqty = base.GetFieldData("OutBlock", "ordqty"); //ordqty//주문수량 realSc1Vo.ordprc = base.GetFieldData("OutBlock", "ordprc"); //ordprc//주문가격 realSc1Vo.execqty = base.GetFieldData("OutBlock", "execqty"); //execqty//체결수량 realSc1Vo.execprc = base.GetFieldData("OutBlock", "execprc"); //execprc//체결가격 realSc1Vo.avrpchsprc = base.GetFieldData("OutBlock", "avrpchsprc"); //평균매입가 -실서버에서 제공하지 않는필드 realSc1Vo.pchsant = base.GetFieldData("OutBlock", "pchsant"); //매입금액 -실서버에서 제공하지 않는필드 realSc1Vo.accno = base.GetFieldData("OutBlock", "accno"); //계좌번호 //1.주문체결유형코드,ordxctptncode // 01 주문 //02 정정 //03 취소 //11 체결 //12 정정확인 //13 취소확인 //14 거부 mainForm.log("Real:" + realSc1Vo.Isunm + ">" + realSc1Vo.execqty + "주 체결<ordtrxptncode:" + realSc1Vo.ordtrxptncode + ">"); //int tmpindex = mainForm.tradingHistory.getTradingHistoryVoList().Find("ordno", realSc1Vo.ordno); var items = from item in mainForm.tradingHistory.getTradingHistoryDt().AsEnumerable() where item["ordno"].ToString() == realSc1Vo.ordno && item["Isuno"].ToString() == realSc1Vo.Isuno.Replace("A", "") && item["accno"].ToString() == mainForm.account //&& item["useYN"].ToString() == "Y" select item; //매매이력이없으면 등록해줘야한다. if (items.Count() > 0) { //기존체결수량+체결수량 items.First()["execqty"] = (int.Parse(items.First()["execqty"].ToString()) + int.Parse(realSc1Vo.execqty)).ToString(); items.First()["execprc"] = realSc1Vo.execprc.Replace(",", "");//체결가격 //items.First()["Isunm"] = realSc1Vo.Isunm; //dataLogVo.sellOrdAt = "Y"; //item.Isunm = realSc1Vo.Isunm;//하루확인후 필요하면 주석풀자. mainForm.tradingHistory.execqtyUpdate(items.First());//매도주문 여부 상태 업데이트 } else { //데이타로그에 저장 //public class dataLogVo TradingHistoryVo dataLogVo = new TradingHistoryVo(); dataLogVo.ordno = realSc1Vo.ordno; //주문번호 dataLogVo.accno = mainForm.account; //계좌번호 dataLogVo.ordptncode = realSc1Vo.ordptncode; //주문구분 01:매도|02:매수 dataLogVo.Isuno = realSc1Vo.Isuno.Replace("A", ""); //종목코드 dataLogVo.ordqty = realSc1Vo.ordqty; //주문수량 dataLogVo.execqty = realSc1Vo.execqty; //체결수량 dataLogVo.ordprc = realSc1Vo.ordprc; //주문가격 dataLogVo.execprc = realSc1Vo.execprc; //체결가격 dataLogVo.Isunm = realSc1Vo.Isunm; //종목명 dataLogVo.ordptnDetail = "수동매수"; //상세 주문구분 신규매수|반복매수|금일매도|청산 dataLogVo.upExecprc = "0"; //상위체결가격 dataLogVo.sellOrdAt = "N"; //매도주문 여부 YN default:N -02:매 일때만 값이 있어야한다. dataLogVo.useYN = "Y"; //사용여부 dataLogVo.ordermtd = "HTS"; //주문 매체 dataLogVo.upOrdno = realSc1Vo.ordno; //상위 주문번호 dataLogVo.exclWatchAt = "Y"; //감시제외여부 : 자동매수가 아닌것은 기본으로 감시제외시킨다. //주문정보를 주문이력 DB에 저장 - dataInsert호출 mainForm.tradingHistory.insert(dataLogVo); ////mainForm.tradingHistory.getTradingHistoryVoList().Add(dataLogVo); } //실시간 매도가능수량 업데이트(3초마다업데이트되어서 안해줘도되는데...) ->매도가 이루어지면 실시간으로 매도가능수량을 적용해주자. EBindingList <T0424Vo> t0424VoList = mainForm.xing_t0424.getT0424VoList(); int findIndex = t0424VoList.Find("expcode", realSc1Vo.Isuno.Replace("A", "")); Double 매도가능수 = 0; if (findIndex >= 0) { //mainForm.grd_t0424.Rows[findIndex].Cells["c_mdposqt"].Style.BackColor = Color.Gray; //매도 - 매도가능수량-체결수량 if (realSc1Vo.ordptncode == "01") { 매도가능수 = t0424VoList.ElementAt(findIndex).mdposqt - int.Parse(realSc1Vo.execqty); } else if (realSc1Vo.ordptncode == "02") //매수 - 매도가능수량+체결수량 { 매도가능수 = t0424VoList.ElementAt(findIndex).mdposqt + int.Parse(realSc1Vo.execqty); } mainForm.grd_t0424.Rows[findIndex].Cells["c_mdposqt"].Value = 매도가능수.ToString(); //매도가능수량이 0보다 작으면 잔고그리드와 dataLog에서 제거해주자. if (매도가능수 <= 0) { //2.청산된 종목 사용여부를 db 'N'으로 업데이트한다. if (items.Count() > 0) { items.First()["useYN"] = "N"; mainForm.tradingHistory.useYnUpdate(items.First());//종목 일괄적용. } //3.그리드에서 해당 로우 삭제 //this.grd_t0424.Rows.Remove(this.grd_t0424.Rows[findIndex]);//그리드에서 삭제하면 바인딩객체도 같이 삭제 되는지 잘모르겠어서 그냥 바인딩객체를 삭제로 바꿔준다. mainForm.xing_t0424.getT0424VoList().RemoveAt(findIndex); Log.WriteLine("real_SC1 deleteCallBack :: 청산된 종목 그리드와 DataLog Line 제거.[종목코드:" + realSc1Vo.Isuno + "]"); } else { //수정된 평균단가를 실시간 적용해준다. SummaryVo summaryVo = mainForm.tradingHistory.getSummaryVo(realSc1Vo.Isuno.Replace("A", "")); //Log.WriteLine("TEST Real Sc1 historyvo :[종목코드: " + realSc1Vo.Isuno + "]"); if (summaryVo != null) { //mainForm.grd_t0424.Rows[findIndex].Cells["pamt2"].Value = summaryVo.pamt2;//평균단가 mainForm.grd_t0424.Rows[findIndex].Cells["sellCnt"].Value = summaryVo.sellCnt; //매도횟수 mainForm.grd_t0424.Rows[findIndex].Cells["buyCnt"].Value = summaryVo.buyCnt; //매수회수 //mainForm.grd_t0424.Rows[findIndex].Cells["sellSunik"].Value = summaryVo.sellSunik;//중간매도손익 //여기서는 평균단가만 적용해주자...실시간 현재가 이벤트 발생시에만 수익률을 계산하여 매매를 하자. //평균단가 구한후 평균단가를 기준으로 수익율을 구한다. } } } else //실시간 체결정보인데 종목그리드에 존재하지 않는 종목일경우 t0424 를 호출해준다.--신규매수일수잇다. //mainForm.xing_t0424.call_request(mainForm.accountForm.account, mainForm.accountForm.accountPw); { } }