//손절 테스트 private Boolean executeTest(DataRow itemRow) { String shcode; //종목코드 String hname; //종목명 String close; //현재가 String searchNm; //검색조건 String searchCode; //검색코드 shcode = itemRow["종목코드"].ToString(); //종목코드 hname = itemRow["종목명"].ToString(); //종목명 close = itemRow["현재가"].ToString(); //현재가 searchNm = itemRow["검색조건"].ToString(); //검색조건 searchCode = itemRow["검색코드"].ToString(); //검색코드 //글로벌 매도가능 설정값 체크 if (!mainForm.cbx_sell_at.Checked) { return(false); } int t0424VoListFindIndex = mainForm.xing_t0424.getT0424VoList().Find("expcode", shcode);//보유종목인지 체크 if (t0424VoListFindIndex >= 0) { T0424Vo t0424Vo = mainForm.xing_t0424.getT0424VoList().ElementAt(t0424VoListFindIndex); //이미 주문이 실행된 상태 if (t0424Vo.orderAt == "Y") { return(false); } //주문 전송 Double 평균단가 = t0424Vo.pamt; //매도주문일경우 매수금액을 알기위해 넣어준다. String 종목코드 = t0424Vo.expcode; String 종목명 = t0424Vo.hname; Double 현재가 = t0424Vo.price; String 매도전략명 = t0424Vo.searchNm; Double 수량 = t0424Vo.mdposqt; Double 수익율 = t0424Vo.sunikrt; //String 상세매매구분 = "매도검색 매도"; //매도주문 t0424Vo.orderAt = "Y"; Xing_CSPAT00600 xing_CSPAT00600 = mainForm.CSPAT00600Mng.get600(); xing_CSPAT00600.call_request(종목명, 종목코드, "매도", 수량, 현재가, 매도전략명, 평균단가, "손절검색"); mainForm.log("<t1857Stop:" + 매도전략명 + "><" + 종목명 + ">" + 수익율 + "% " + 수량 + "주 " + 현재가 + "원"); } return(true); }//buyTest END
//선택 매도 private void btn_checkSell_Click(object sender, EventArgs e) { Double 평균단가; //매도주문일경우 매수금액을 알기위해 넣어준다. String 종목코드; String 종목명; Double 현재가; String 매수전략명; Double 수량; Double 수익율; //String 상세매매구분 = null; //String 매매구분 = null; String 매도주문여부; //매도주문여부 //EBindingList<T0424Vo> t0424VoList = ((EBindingList<T0424Vo>)this.grd_t0424.DataSource); for (int i = 0; i < grd_t0424.RowCount; i++) { if (this.grd_t0424.Rows[i].Cells["grd_t0424_check"].FormattedValue.ToString() == "True") { T0424Vo t0424Vo = (T0424Vo)this.grd_t0424.Rows[i].DataBoundItem; 평균단가 = t0424Vo.pamt; //매도주문일경우 매수금액을 알기위해 넣어준다. 종목코드 = t0424Vo.expcode; 종목명 = t0424Vo.hname; 현재가 = t0424Vo.price; 매수전략명 = t0424Vo.searchNm; 수량 = t0424Vo.mdposqt; 매도주문여부 = t0424Vo.orderAt; 수익율 = t0424Vo.sunikrt; if (매도주문여부 == "N") { Xing_CSPAT00600 xing_CSPAT00600 = this.CSPAT00600Mng.get600(); xing_CSPAT00600.call_request(종목명, 종목코드, "매도", 수량, 현재가, 매수전략명, 평균단가, "선택매도"); t0424Vo.orderAt = "Y"; //일괄 매도시 주문여부를 true로 설정 this.log("<main:선택매도> " + 종목명 + " " + 수익율 + "% " + 수량 + "주 " + 현재가 + "원<" + 매수전략명 + ">"); } else { //이미 매도주문 실행 종목 MessageBox.Show(종목명 + "이미 매도주문이 이루어 졌습니다."); } //선택체크해제 this.grd_t0424.Rows[i].Cells["grd_t0424_check"].Value = false; } } }//btn_checkSell_Click END
}// end function public Xing_CSPAT00600 get600() { Log.WriteLine("Xing_CSPAT00600 카운트::" + this.xing_CSPAT00600List.Count()); for (int i = 0; i < this.xing_CSPAT00600List.Count(); i++) { if (this.xing_CSPAT00600List.ElementAt(i).completeAt) { this.xing_CSPAT00600List.ElementAt(i).completeAt = false; return(this.xing_CSPAT00600List.ElementAt(i)); } } Xing_CSPAT00600 item600 = new Xing_CSPAT00600(mainForm); item600.completeAt = false; this.xing_CSPAT00600List.Add(item600); return(item600); }
}//fn END //목표 수익율 도달 Test 후 도달여부에 따라 매도 호출 public Boolean tradingStopTest(T0424Vo t0424Vo, int index, Double 목표수익율) { //try{ Double 수익율 = t0424Vo.sunikrt; Double 현재가격 = t0424Vo.price; String 감시제외여부 = t0424Vo.exclWatchAt; //감시제외여부 //종목 에러 있으면 매매 하지 않는다. if (t0424Vo.errorcd != "" && t0424Vo.errorcd != null) { return(false); } //이미 주문이 실행된 상태 if (t0424Vo.orderAt == "Y") { return(false); } if (감시제외여부 == "Y") { mainForm.grd_t0424.Rows[index].DefaultCellStyle.BackColor = Color.Gray; return(false); } Double 평균단가 = t0424Vo.pamt; //매도주문일경우 매수금액을 알기위해 넣어준다. String 종목코드 = t0424Vo.expcode; String 종목명 = t0424Vo.hname; Double 현재가 = t0424Vo.price; String 매수전량명 = t0424Vo.searchNm; Double 수량 = t0424Vo.mdposqt; String 상세매매구분 = null; String 매매구분 = null; //매도-------------------------------------------------------------------------------- if (mainForm.cbx_sell_at.Checked) { if (Util.isSellTime()) { //손절 Boolean 손절기능여부 = Properties.Settings.Default.STOP_LOSS_AT; if (손절기능여부) { Double 손절율 = Properties.Settings.Default.STOP_LOSS_RATE; if (수익율 <= 손절율) { 매매구분 = "매도"; 상세매매구분 = "손절"; } } if (종목코드 == "005070") { String tessst = "3"; } //목표수익 달성후 지정 비율 하락이상 반전시 매도 Double 추적청산율 = Double.Parse(t0424Vo.maxRt) + Double.Parse(Properties.Settings.Default.STOP_TARGET_DOWN_RATE); if (Double.Parse(Properties.Settings.Default.STOP_TARGET_DOWN_RATE) < 0) { //설정값이 0이면 사용하지 않는다. if (Double.Parse(t0424Vo.maxRt) >= 목표수익율 && 수익율 <= 추적청산율) //최대도달 수익율 { 매매구분 = "매도"; 상세매매구분 = "추적청산"; } } else { //목표수익 달성시... if (수익율 >= 목표수익율) { //ordptnDetail(상세주문구분-신규매수|반복매수|금일매도|청산) //upOrdno(상위매수주문번호-금일매도일때만 셋팅될것같다) //upExecprc">상위체결금액-없으면 평균단가 넣어주자</param> //IsuNo(종목코드) Quantity(수량) Price(가격) //2틀연속 DataLog 의 매수단가가 잘못 들어가는것들이 있어서 원인을 찾기전에 수익율 < 수익율 2 인경우 주문을 제한하자.메세지창으로 관리하자. //청산일때만 체크 if (t0424Vo.sunikrt < 1) { Log.WriteLine("<ERROR-수익청산><t0424-496:" + t0424Vo.hname + "><" + 수익율.ToString() + ">"); t0424Vo.errorcd = "sunikrt error"; return(false); } 매매구분 = "매도"; 상세매매구분 = "수익청산"; } } } // 일괄매도 - 매도시간 설정값 영향 없이 단독 실행 if (Properties.Settings.Default.ALL_SELL_AT) { TimeSpan nowTimeSpan = TimeSpan.Parse(mainForm.xing_t0167.hour + ":" + mainForm.xing_t0167.minute + ":" + mainForm.xing_t0167.second); DateTime allSellTimeFrom = Properties.Settings.Default.ALL_SELL_TIME_FROM; DateTime allSellTimeTo = Properties.Settings.Default.ALL_SELL_TIME_TO; 목표수익율 = Double.Parse(Properties.Settings.Default.ALL_SELL_RATE); if (nowTimeSpan >= allSellTimeFrom.TimeOfDay && nowTimeSpan <= allSellTimeTo.TimeOfDay) { if (Properties.Settings.Default.ALL_SELL_RATE_SE.Equals("이상")) { if (수익율 >= 목표수익율) { 매매구분 = "매도"; 상세매매구분 = "일괄매도"; } } if (Properties.Settings.Default.ALL_SELL_RATE_SE.Equals("이하")) { if (수익율 < 목표수익율) { 매매구분 = "매도"; 상세매매구분 = "일괄매도"; } } } } String 지정시간초과수익율 = Properties.Settings.Default.SELL_TARGET_TIME_OVR_RATE; if (Properties.Settings.Default.SELL_TARGET_TIME_AT && 수익율 < Double.Parse(지정시간초과수익율)) { Boolean targetTimeFlag = false; String minute = mainForm.xing_t0167.minute; if (Properties.Settings.Default.SELL_TARGET_TIME_10) { if (minute == "11") { targetTimeFlag = true; } } if (Properties.Settings.Default.SELL_TARGET_TIME_20) { if (minute == "21") { targetTimeFlag = true; } } if (Properties.Settings.Default.SELL_TARGET_TIME_30) { if (minute == "31") { targetTimeFlag = true; } } if (Properties.Settings.Default.SELL_TARGET_TIME_40) { if (minute == "41") { targetTimeFlag = true; } } if (Properties.Settings.Default.SELL_TARGET_TIME_50) { if (minute == "51") { targetTimeFlag = true; } } if (Properties.Settings.Default.SELL_TARGET_TIME_00) { if (minute == "01") { targetTimeFlag = true; } } if (!targetTimeFlag) { return(false); } } } //mainForm.cbx_sell_at.Checked end //추가 매수-------------------------------------------------------------------------------- if (mainForm.cbx_buy_at.Checked) { if (Util.isBuyTime()) { //지정 하락 비율 이하이면 추가매수 1번만. if (Properties.Settings.Default.ADD_BUY_AT) { if (int.Parse(t0424Vo.buyCnt) < 2 && 수익율 < Double.Parse(Properties.Settings.Default.ADD_BUY_RATE)) { 매매구분 = "매수"; 상세매매구분 = "추가매수(1회)"; } } } } //주문. if (매매구분 != null) { t0424Vo.orderAt = "Y"; Xing_CSPAT00600 xing_CSPAT00600 = mainForm.CSPAT00600Mng.get600(); xing_CSPAT00600.call_request(종목명, 종목코드, 매매구분, 수량, 현재가, 매수전량명, 평균단가, 상세매매구분); //청산 주문여부를 true로 설정 mainForm.log("<t0424:" + 상세매매구분 + "> " + 종목명 + " " + 수익율 + "% " + 수량 + "주 " + 현재가 + "원<" + 매수전량명 + ">"); } // } //catch (Exception ex){ // Log.WriteLine("t0424 : " + ex.Message); // Log.WriteLine("t0424 : " + ex.StackTrace); //} return(false); }//stopProFitTarget end
//매도 테스트 private Boolean executeTest(DataRow itemRow, int configSearchCode) { String shcode; //종목코드 String hname; //종목명 String close; //현재가 String searchNm; //검색조건 String searchCode; //검색코드 shcode = itemRow["종목코드"].ToString(); //종목코드 hname = itemRow["종목명"].ToString(); //종목명 close = itemRow["현재가"].ToString(); //현재가 searchNm = itemRow["검색조건"].ToString(); //검색조건 searchCode = itemRow["검색코드"].ToString(); //검색코드 //검색코드 설정값 비교 if (int.Parse(searchCode) < configSearchCode) { return(false); } if (!mainForm.cbx_sell_at.Checked) { //itemRow["상태"] = "매도정지 상태"; return(false); } // int t0424VoListFindIndex = mainForm.xing_t0424.getT0424VoList().Find("expcode", shcode);//보유종목인지 체크 if (t0424VoListFindIndex >= 0) { T0424Vo t0424Vo = mainForm.xing_t0424.getT0424VoList().ElementAt(t0424VoListFindIndex); //이미 주문이 실행된 상태 if (t0424Vo.orderAt == "Y") { return(false); } //주문 전송 Double 평균단가 = t0424Vo.pamt; //매도주문일경우 매수금액을 알기위해 넣어준다. String 종목코드 = t0424Vo.expcode; String 종목명 = t0424Vo.hname; Double 현재가 = t0424Vo.price; String 매도전략명 = t0424Vo.searchNm; Double 수량 = t0424Vo.mdposqt; Double 수익율 = t0424Vo.sunikrt; //String 상세매매구분 = "매도검색 매도"; //+수익일때만 매도 if (Properties.Settings.Default.SELL_PLUS_ONLY_AT) { if (수익율 < 1) { return(false); } } //매도주문 t0424Vo.orderAt = "Y"; Xing_CSPAT00600 xing_CSPAT00600 = mainForm.CSPAT00600Mng.get600(); xing_CSPAT00600.call_request(종목명, 종목코드, "매도", 수량, 현재가, 매도전략명, 평균단가, "매도검색 매도"); mainForm.log("<t1857Sell:" + 매도전략명 + "><" + 종목명 + ">" + 수익율 + "% " + 수량 + "주 " + 현재가 + "원"); } return(true); }//buyTest END
//매수 테스트 private Boolean executeTest(DataRow itemRow, int configSearchCode, TimeSpan nowTimeSpan, int rowIndex, Boolean kosBuyAt, Boolean kodBuyAt) { try { String shcode = itemRow["종목코드"].ToString(); //종목코드 String hname = itemRow["종목명"].ToString(); //종목명 String close = itemRow["현재가"].ToString(); //현재가 String searchNm = itemRow["검색조건"].ToString(); //검색조건 String searchCode = itemRow["검색코드"].ToString(); //검색코드 String gubun = itemRow["시장구분"].ToString(); //시장구분(1:코스피 2:코드닥) //시장구분 코스피 if (gubun.Equals("1")) { //코스피 체크 if (!kosBuyAt) { itemRow["상태"] = "코스피x"; return(false); } } else if (gubun.Equals("2")) { //코스닥 체크 if (!kodBuyAt) { itemRow["상태"] = "코스닥x"; return(false); } } else { itemRow["상태"] = "시장구분x"; return(false); } //검색코드 설정값 비교 if (int.Parse(searchCode) < configSearchCode) { itemRow["상태"] = "조건식매수 금지 "; return(false); } //배팅금액 설정 //int battingAtm = int.Parse(Properties.Settings.Default.BUY_BATTING_AMT) * 10000; //매수금지목록 if (Properties.Settings.Default.STOP_STOP_BUYOFF_AT) { DataTable stopSearchListDt = mainForm.xing_t1857Stop.getSearchListDt(); DataRow[] SellListDtRow = null; SellListDtRow = stopSearchListDt.Select("종목코드 Like '" + shcode + "'"); if (SellListDtRow.Count() > 0) { //mainForm.grd_t0424.Rows[t0424VoListFindIndex].Cells["c_expcode"].Style.BackColor = Color.Red; mainForm.grd_t1833_dt.Rows[rowIndex].Cells["종목명"].Style.BackColor = Color.Red; itemRow["상태"] = "매수제외"; return(false); } } String ordptnDetail; //매수 상세 구분을 해준다. 신규매수|반복매수 //금일 매수 체결 내용이 있고 미체결 잔량이 0인 건은 매수 하지 않는다. var toDayBuyT0425VoList = from item in mainForm.xing_t0425.getT0425VoList() where item.expcode == shcode && item.medosu == "매수" select item; if (toDayBuyT0425VoList.Count() > 0) { itemRow["상태"] = "금일매수종목X"; return(false); } var toDaySellT0425VoList = from item in mainForm.xing_t0425.getT0425VoList() where item.expcode == shcode && item.medosu == "매도" select item; if (toDaySellT0425VoList.Count() > 0) { if (!Properties.Settings.Default.SELL_TO_RE_BUY_AT) { itemRow["상태"] = "금일매도종목X"; return(false); } } //5.보유종목 반복매수여부 테스트 -두번째 컨디션일 경우 보유종목일경우에만 중복 매수한다. int t0424VoListFindIndex = mainForm.xing_t0424.getT0424VoList().Find("expcode", shcode);//보유종목인지 체크 if (t0424VoListFindIndex >= 0) { //검색종목 추가매수 여부 옵션 체크 if (!Properties.Settings.Default.ADD_BUY_SIGNAL_AT) { itemRow["상태"] = "신호추가매수X"; return(false); } //기존 종목 수익률 EBindingList <T0424Vo> t0424VoList = mainForm.xing_t0424.getT0424VoList(); Double sunikrt = t0424VoList.ElementAt(t0424VoListFindIndex).sunikrt; //추가매수 하락율 체크 if (sunikrt > double.Parse(Properties.Settings.Default.ADD_BUY_SIGNAL_RATE)) { itemRow["상태"] = "하락율 미달x"; return(false); } ordptnDetail = "신호추가매수"; ////배팅금액 설정 //battingAtm = int.Parse(Properties.Settings.Default.ADD_BUY_AMT) * 10000; //1.반복매수면 투자율 제한 하지 않는다. //2.반복매수면 매수금지 종목이라도 매수한다. } else //-보유종목이 아니고 신규매수해야 한다면. //자본금대비 투자 비율이 높으면 신규매수 하지 않는다. { Double 투자율 = Double.Parse(mainForm.tradingInfoDt.Rows[0]["투자율"].ToString()); if (투자율 >= Double.Parse(Properties.Settings.Default.BASE_MONEY_BUY_RATE)) { itemRow["상태"] = "투자율제한 매수X"; return(false); } ordptnDetail = "신규매수"; } //추가 매수일수 있기때문에 추가매수 체크위에 위치하자 if (ordptnDetail == "신규매수") { String 종목제한수 = Properties.Settings.Default.MAX_BUY_COUNT; int 보유종목수 = mainForm.grd_t0424.RowCount; if (보유종목수 >= int.Parse(종목제한수)) { //mainForm.grd_t0424.Rows[t0424VoListFindIndex].Cells["c_expcode"].Style.BackColor = Color.Red; //mainForm.grd_t1833_dt.Rows[rowIndex].Cells["종목명"].Style.BackColor = Color.Red; itemRow["상태"] = "종목수초과"; return(false); } } //매수 가능 시간 비교 if (!Util.isBuyTime()) { itemRow["상태"] = "시간x<" + ordptnDetail + ">"; return(false); } //4.매수 //임시로 넣어둔다 왜 현제가가 0으로 넘어오는지 모르겠다. if (close == "0") { itemRow["상태"] = "오류:246"; return(false); } //this 함수가 3번 호출 된다. 주문이 3번 나갈 수가 있어서 추가 해준다. if (itemRow["상태"].ToString().IndexOf("주문전송") >= 0) { return(false); } if (!mainForm.cbx_buy_at.Checked) { itemRow["상태"] = "매수정지 상태"; return(false); } /// <summary> /// 현물정상주문 /// </summary> /// <param name="ordptnDetail">상세주문구분 신규매수|반복매수|금일매도|청산</param> /// <param name="IsuNo">종목번호</param> /// <param name="Quantity">수량</param> /// <param name="Price">가격</param> //실시간 가격 모니터링 등록 mainForm.real_S3.call_real(shcode); mainForm.real_K3.call_real(shcode); //매수 실행 Xing_CSPAT00600 xing_CSPAT00600 = mainForm.CSPAT00600Mng.get600(); xing_CSPAT00600.call_request(hname, shcode, "매수", 0, Double.Parse(close), searchNm, 0, ordptnDetail); //로그출력 itemRow["상태"] = "주문전송<" + ordptnDetail + ">"; mainForm.log("<t1857Buy:" + searchNm + "><" + hname + "> <" + close + "원>" + ordptnDetail); } catch (Exception ex) { Log.WriteLine("t1857Buy: " + ex.Message); Log.WriteLine("t1857Buy: " + ex.StackTrace); } return(true); }//buyTest END