확장차트 생성 후 엑셀 작성 문의합니다.
안녕하세요. 예스스팟으로 매매에 도움을 얻고자 하는 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() };
}
}
2017-05-25
2509
글번호 224172
답변완료
Grid 와 엑셀 객체 사용관련 문의 드립니다.
예스스팟에서 그리드를 활용하여 수시로 변경되는 데이터들을 보관하고, 업데이트하여 사용중입니다.
질문이 좀 여러가지네요. ^__^
1. 전략을 실행하면 Grid 부분에서 마우스로 보이기 를 클릭해 줘야 보이는데,
기본적으로 보이도록 할 방법은 없는지요?
2. Grid 객체를 예스스팟 편집기에서 사용시 row는 최소 1 이상으로 줘야 합니다.
이런 경우 실행시 grid.rows 하면 1이 아닌 0이 리턴 됩니다. 맞는 건가요?
이걸 알아야 새로운 row 추가 후 사용시 0 또는 1로 결정해서 set data를 할 수 있거든요.
3. Grid의 row 나 col은 0부터 시작된다고 하였는데요.
모두 0부터 사용이 되는게 맞는것 같은데, deleterow(0) 이렇게 하면 0 row가 아닌 1번 row가 삭제되는 것으로 테스트가 됩니다.
4. 엑셀객체를 사용하는데, 항상 화면에 엑셀이 나타나는데, 이거 나타나지 않게 할 수 있나요?
5. 엑셀객체 사용시 새로운 프로세스로 가동이라는 게 있던데, 이거는 Y / N 으로 해도 큰 차이를 알수가 없네요.
6. 전략 실행 후 엑셀객체가 뜬 상태에서 전략을 중지하거나 취소하면 PC가 종료되어 버리는 경우가 있습니다. 어떤 경우에 해당되는지 알 수가 없네요. 예스트레이더 파일 전체 새로 받아서 해 보아도 마찬가지 입니다.
7. 엑셀에는 예스스팟에서 사용할 여러 설정값을 저장해 놓고 불러다 사용하는 용도입니다.
그냥 txt 파일에 저장해 놓고 불러다 사용토록 하면 더 좋을 것 같은데요. 좋은 방법이 없을까요? (일반적인 스크립트의 파일스트림은 사용 불가한 듯)
좀 여러가지이지만 성실한 답변 부탁드립니다.
2017-05-15
2430
글번호 224166