커뮤니티

확장차트 생성 후 엑셀 작성 문의합니다.

프로필 이미지
매매광
2017-05-25 23:24:18
2510
글번호 224172
안녕하세요. 예스스팟으로 매매에 도움을 얻고자 하는 1인입니다. 최근 여러 종목에서 필요한 값을 엑셀에 정리할 때 예스스팟을 활용할려고 합니다. 그래서 구상한 형태는 다음과 같은데요. 1 엑셀에 종목코드, 코스닥/코스피 표시 해두기 2 엑셀에 종목코드 읽어들여서 확장차트 생성하기 3 확장차트에서 최근 260일 종가 읽어들여서 수식 값 계산하기 4 수식 결과값 엑셀에 출력 그런데 현재 2번 확장차트 생성하기까지는 실행이 되는데, 이후 확장차트가 생성이 되어도 function Main_OnRcvChartEx(ChartEx) 로 진행이 되질 않습니다. 무엇이 잘못되었는지 참 고민하다가 여기에 글을 올립니다. 조언 부탁드립니다. ------------ 엑셀 파일 A B C D 1 종목코드 종목명 K (수식결과값입력란:빈칸) 2 종목코드 종목명 Q (수식결과값입력란:빈칸) (K면 코스피, Q면 코스닥) -------------- 코드 var ExcelCode = [], InMarket = [], Code = []; var KPprofit = [], KQprofit = [], Profit = [], Covar = [], Beta = []; var rcv, rcv1, ExcelRow, C1, ChartEx1, Period; var Avgpf, AvgKPpf, AvgKQpf, VarKP, VarKQ, AvgCovItem; function Main_OnStart() //특정이벤트에서 { Main.MessageLog("시작") ExcelRow = Excel1.GetRowCount(1); //엑셀에서 종목코드를 가져와 ExcelCode에 저장 for (var i = 2; i <= ExcelRow; i++) { ExcelCode[i-2] = Excel1.GetData(1, "A"+i); InMarket[i-2] = Excel1.GetData(1, "C"+i); } //객체수신 횟수를 카운트할 변수 rcv = 0; //객체수신하면 저장할 배열변수 Code = []; //자료수집 기간 설정 Period = 260; //코스피, 코스닥 지수 수익률 분산 계산 for (var j = 0 ; j < Period ; j++) { KPprofit[j] = ( ChartExKP.GetClose(1,j) / ChartExKP.GetClose(1,j+1) ) - 1; AvgKPpf = AvgKPpf + KPprofit[j] / Period; KQprofit[j] = ( ChartExKQ.GetClose(1,j) / ChartExKQ.GetClose(1,j+1) ) - 1; AvgKQpf = AvgKQpf + KQprofit[j] / Period; } for (var k = 0 ; k < Period ; k++) { VarKP = VarKP + Math.pow( AvgKPpf - KPprofit[k], 2); VarKQ = VarKQ + Math.pow( AvgKQpf - KQprofit[k], 2); } Main.MessageLog("KP, KQ 분산 측정, 타이머 시작"); Main.SetTimer(1,1000) } function Main_OnTimer(nEventID) //특정이벤트에서 { //ExcelCode에 저장된 값이 1개이상이면 if (nEventID == 1 && ExcelCode.length >= 1 && ExcelCode.length <= ExcelRow + 1 ) { //ExcelCode[rcv]방의 종목요청 Main.ReqMarketData(ExcelCode[rcv]); Main.MessageList("종목 <",ExcelCode[rcv],"> 생성 요청"); } Main.KillTimer(1); } function Main_OnRcvMarketData(MarketData) { //확장차트 객체 초기화 // var ChartEx1 = null; //직전 요청산 종목이 수신되면 if (MarketData.code == ExcelCode[rcv]) { //Object의 rcv방에 해당종목객체 저장 Code[rcv] = MarketData; var C1 = new ReqChartItem(MarketData.code, 1, CHART_PERIOD_DAILY, 261, CHART_REQCOUNT_BAR,false, false); Main.ReqChartEx(C1, null, null, null); Main.MessageList("종목 <",ExcelCode[rcv],">의 확장차트 생성"); } function Main_OnRcvChartEx(ChartEx) { ChartExA = ChartEx; for (var l = 0 ; l < Period; l++) { Profit[l] = ( ChartExA.GetClose(1,l) / ChartExA.GetClose(1,l+1) ) - 1; Avgpf = Avgpf + Profit[l] / Period; Main.MessageLog("Avgpf 측정"); } //코스피, 코스닥 종목 구분 if ( InMarket[rcv] == "K" ) { for (var m = 0 ; m < Period ; m++) { Covar[m] = ( Profit[m] - AvgKPpf )*( KPprofit[m] - Avgpf ); AvgCovItem = AvgCovItem + Covar[m] / Period; } Beta[rcv] = AvgCovItem / VarKP; Main.MessageLog("Beta 측정"); } if ( InMarket[rcv] == "Q" ) { for (var n = 0 ; n < Period ; n++) { Covar[n] = ( Profit[n] - AvgKQpf )*( KQprofit[n] - Avgpf ); AvgCovItem = AvgCovItem + Covar[n] / Period; } Beta[rcv] = AvgCovItem / VarKQ; Main.MessageLog("Beta 측정"); } if ( InMarket[rcv] == "" ) { Beta[rcv] = 0; Main.MessageLog("Beta 측정"); } rcv1 = rcv + 2; //엑셀에 베타(1년) 입력 Excel1.SetColData(1, "D"+rcv1, Beta[rcv]); Main.MessageList("종목 <",ExcelCode[rcv],">의 Beta 출력"); //필요한 변수 초기화 Avgpf = 0; AvgCovItem = 0; //rcv는 1증가 rcv = rcv+1; //타이머 재설정 Main.SetTimer(1,5000); //배열변수가 0부터 존재하므로 //rcv가 종목코드갯수 이하일때만 요청 if (rcv < ExcelCode.length) { Main.ReqMarketData(ExcelCode[rcv]); } if ( rcv >= ExcelRow - 1 ) { Excel1.Save() }; } }
답변 1
프로필 이미지

매매광

2017-05-29 17:41:09

전화 주셔서 덕분에 많은 진전을 보았습니다. 감사합니다. 꾸벅~ 진전: - 각 종목별로 종목 객체를 호출하여 일간데이터 261개를 수신함. - 종목 객체로부터 원하는 값을 계산할 수 있게 되었음. - 엑셀에 차근차근 종목별로 원하는 값을 출력할 수 있게 되었음. 그런데 프로그램이 엑셀에 차근차근 기록을 잘 해주다가도 상장한 지 1년이 채 안되는 종목이 적힌 엑셀 행에서 멈추는 현상을 발견했습니다. Main.ReqMarketData(Excelcode[rcv],261); 로 종목객체를 호출하는데 최근 상장한 종목에서는 위 코드로 종목객체를 불러들이려고 해도 function Main_OnRcvMarket(MarketData) { ... } 위와 같이 종목객체 데이터 수신이 안 되는 것 같았습니다. Main.ReqMarketData 가 상황에 따라서 정상일 때 0이상, 오류일 때 0, 시간제한 걸렸을 때 -1 로 값을 반환한다고 했는데, 그 반환값을 활용하는 방법도 모르겠고... 종목객체 요청했을 때 수신한 일간데이터 개수를 확인하는 함수를 사용해볼려고 했으나.. 이마저도 잘 되지 않더군요. 이 부분만 어떻게 도움을 구할 수 없을까 해서 글을 올립니다. 감사합니다. 010-6557-2584