커뮤니티

예스스팟에서 배열 사용법 문의

프로필 이미지
김태희
2015-04-28 14:08:45
2136
글번호 223442
제가 예스스팟을 지금 공부 중인데, 배열 선언과 사용에 있어서 좀 특이한 점들이 있어서 문의드립니다. 제가 예스스팟에서의 배열 사용법을 알아보려고 아래와같이 시험 테스트를 해보았습니다. function Main_OnStart() { var aaa; aaa = new Array(3); aaa[0] = 0; aaa[1] = 1; aaa[2] = 2; aaa[-1] = -1; aaa[-2] = -2; aaa[-3] = 33.33 aaa['a'] = 'abcd'; aaa['b'] = "efgh"; Main.MessageList(aaa[0], aaa[1], aaa[2], aaa[-1], aaa[-2], aaa[-3], aaa['a'], aaa['b']); } 디버깅 창에 표시된 내용 ===> 0 1 2 –1 –2 33.33 abcd efgh 문의1) 먼저, 배열 선언해 줄 때, aaa = new Array(3); 와 같이 배열 요소 개수를 3개만 지정해주었는데도, 실제로 사용시엔 3개 이상 지정해도 아무 문제없이 사용이 가능하더군요. 예스스팟에서 new를 이용해 배열선언시에 요소갯수 지정은 아무런 의미가 없어 보이는데요. 위 경우처럼 new Array(3); 으로 지정해주지 않고, 그냥 괄호 () 속을 공란으로 두고 new Array();처럼 코딩해도 프로그램은 오류없이 잘 돌아가더군요. 수식 코딩할 때 배열요소 개수 지정은 안해줘도 상관없는 건가요? 예스스팟에서 배열이 동작하는 정확한 개념과 원리..메카니즘을 알고 싶습니다. 문의2) aaa[-1], aaa['a']처럼 배열 요소를 인덱싱할 때 음수나 문자를 넣어도 문제없이 잘 돌아가던데, 이렇게 써도 문제 없는 건가요? 문의3) 배열요소에 값을 할당할 때 정수,실수,문자열 등을 막 집어넣어도 데이터 타입 오류를 발생시키지 않고 잘 돌아가던데, 예스스팟에선 원래 이런 방식을 허용하나요? 문의4) 예스스팟은 자바스크립트 기반으로 작동한다고 매뉴얼엔 씌여 있던데, 원래 자바 스크립트에선 위에서 언급한 것과 같은 방식의 배열 사용은 허용하지 않는 걸로 알고 있는데, (물론, 파이썬 같은 랭귀지에선 허용이 되긴 합니다만) 좀 희안하네요. 근데, 모의투자로 접속해선 저렇게 프로그래밍해도 잘돌아가긴 하지만...실전에 들어가서 실계좌에 돈을 입금한 상황에서 저런 방식으로 배열을 사용했을 때 오류가 발생해서 주문이 잘못나가거나 할까봐 걱정이 돼서 문의드립니다. 배열 사용에서 문제가 생겨 수식이 오작동해서 주문이 잘못나가기라도 하면 큰 손실을 볼수 있으니 말입니다. 홈페이지에 올라와 있는 예스스팟 매뉴얼에선 저렇게 사용하면 안되는 걸로 나와 있던데, 실제론 저렇게 프로그래밍 해도 되니 정말 저렇게 써도 될까? 의구심도 생기고 불안하기도 하고 그렇네요. 예스스팟에서 배열이 작동하는 기본 원리와 개념에 대해서 알고 싶습니다. 문의5) 예스스팟 스튜디오에서 스크립트 객체화면에서 종목객체추가 버튼을 누르면 종목이 추가되는데요. 거기 보면 current 라는 프로퍼티가 있던데, 설명에는‘현재가‘라고 되어 있더군요. 이 current 프로퍼티가 옵션같은 경우에는 현재 체결가인가요? 아니면 현재 그 종목의 이론가인가요? 옵션의 극외가격이나 극내가격 같은 경우에는 하루에 1건도 체결이 안되는..정말 거래량이 아예 없는 종목들도 있는데요. 그런 경우에는 현재 체결된 내역이 있으면 그 체결가를 current 가 저장하고, 체결된 내역이 없으며 이론가를 저장하고..그런 방식으로 작동하나요? 종목의 이론가만 따로 저장하고 있는 프로퍼티나 이론가를 구할수 있는 메소드를 찾아봐도 없는 거 같던데요. 예스스팟에서 옵션 이론가는 어떻게 참조하나요? 요약하면, current 프로퍼티가 체결가를 보관하는지 이론가를 저장하는지 여부와 이론가를 알고 싶을 때 어떤 방법이 있는지 궁금합니다. 문의6) 예스스팟 매뉴얼을 읽다보니 시간제한 관련한 내용이 있던데 잘 이해가 안되서 문의드리는데요. GetLimitedTime(nKind) 설 명 : 조회나 주문 등에 시간제한이 발생했을 때 남은 시간을 1/1000초 단위로 반환합니다. 반 환 값 : 정수 매개변수 : 제한시간종류 (0:조회제한시간, 1:주문제한시간, 2:계좌정보조회 제한시간) ※ 종목객체 요청: 15초당 최대 60회 ※ 주문: 15초당 최대 90회 ※ 계좌 조회: 15초당 최대 60회 언뜻 봐서 15초당 60회 이상 조회하면 시간 제한이 있어서 더 이상 조회를 못한다는 내용같은데요. 예를들어, 100개 종목들을 스크립트 객체화면에서 종목객체추가 버튼을 눌러 추가시킨 경우에 main 객체내에 있는 OnUpdat eMarket 이벤트를 이용해서 이벤트 함수를 구현하면 무조건 15초 간격으로 60개 종목을 계속 조회하게 된다는 뜻인가요? 장종료되거나 예스스팟 종료전까지는 쉬지 않고 무조건 계속 15초 간격으로 조회하나요? 이런 경우 나머지 40개 종목은 어떻게 되는지요? 만일 100개의 종목에 대해 조회 요청을 했다고 가정했을 때 15초 동안 60개 종목만 조회를 허락하고 나머지 40개 종목은 15초가 지난 뒤에 조회가 된다는 뜻인가요? 사실 컴퓨터가 60개 종목 조회하는데는 1초도 안걸릴텐데요. 일단 1초동안 60개 종목 조회를 했다고 가정하면 15초제한으로 인해 14초 동안은 조회를 못하고 있다가 14초가 지난 다음에야 나머지 40개 종목을 조회하게 된다는 의미인가요? 매뉴얼에는 시간제한 발생했을 때 어떻게 처리하는지에 대한 프로그램 코딩 예제는 없어서 잘 감이 안잡히는데, 실제로 프로그램으로 코딩해서 어떤 방식으로 처리하는지 좀 가르쳐 주세요. 매뉴얼엔 너무 간단히 언급되어있어 잘 이해가 안되네요. 문의7) 그리고, 제가 테스트 차원에서 스크립트 객체화면에서 계좌객체, 옵션 객체를 추가시키고 간단히 다음과 같이 코딩해 봤습니다. 그랬더니 OnUp dateMarket 이벤트가 전혀 발생하지를 않더군요. function Main_OnUpd ateMarket(sItemCode, lUp dateID) { Main.MessageList('OnUp dateMarket내부'); } 그래서, 스크립트 객체화면에서 종목객체 추가 버튼을 눌러 다시 5월물 콜270 종목 1개를 추가시키고, 다시 테스트 해봤더니 그제서야 OnUpd ateMarket 이벤트가 발생하네요. 스크립트 객체화면에서 Option 데이터라고 되어 있는 버튼을 눌러서 추가시킨 경우에는 OnUp d ateMarket 이벤트가 작동을 안하고, 스크립트 객체화면에서 종목객체 추가 버튼을 눌러서 추가시킨 종목에 대해서만 OnUpd ateMarket 이벤트가 작동하는 건가요? 그리고, 예스스팟은 최근월물(5월물),차근월물(6월물)까지만 지원해 주는 걸로 알고 있는데, 7월물이나 8월물같은 원월물에 대해서도 스크립트 객체화면에서 종목객체 추가 버튼을 눌러서 추가시키는 방식으로 하면 이에 대해서도 OnUpda teMarket 이벤트가 정상적으로 발생하나요? 또한, OnUp dateMarket 이벤트는 시세변동뿐만 아니라 호가변동시에도 발생하는 걸로 알고 있는데, 매수1호가(혹은 매도1호가)부터 매수10호가(매도10호가)까지의 호가변동만 감지해서 이벤트를 발생시키나요? 아니면 1호가부터 5호가까지만 보나요? 그것도 아니면 10호가 밖에 있는 호가 변동까지 다 감시를 하는 건가요?
답변 1
프로필 이미지

불꽃기사

2015-04-29 08:33:19

예스스팟은 그냥 자바스크립트를 이용한 자동매매 프로그램입니다. 예스스탁에서는 자동화하는 데 필요한 데이터들을 객체로 제공해 주는 것 뿐이지요. ECMA Script 명세를 그대로 따릅니다. 따라서, 1~4까지는 한마디로 설명이 끝납니다. "자바스크립에서 배열은 객체의 한 종류다." 그러므로, 언급하신 모든 형태의 배열 사용이 가능합니다. a[-1] 이런 것도 충분히 가능하지요. 왜 허용하지 않는다고 생각하시나요? 대부분의 스크립트 언어들이 그렇듯이 자바스크립트도 변수사용시 데이터형이 정해져 있지 않지요. 힌트를 드리자면 a[-1]과 a["-1"] 은 같은 배열요소를 참조합니다. 우선 자바스크립트부터 개념부터 익히셔야 할 듯 합니다. 자세한 내용은 인터넷 뒤져서 자바스크립트 배열 찾아보면 널려 있습니다. 덧붙혀 JSON 도 찾아서 같이 보시면 이해가 잘 되실겁니다. 5. 종목객체의 current는 말그대로 그냥 현재가입니다. 정확히는 직전체결가겠지요. 종목객체는 옵션이건 선물이건 주식이건 따로 구분이 없으니까요. 6. 15초당 60종목이 아니라 정확히는 15초당 60건의 조회입니다. 예전에 종목객체를 테스트 해 보니 종목만 지정하고 일간데이터와 수급데이터는 사용하지 않으면 15초당 60종목이 되지만, 일간데이터와 수급데이터를 모두 사용한다고 하면 15초당 20종목이 되더군요. 추측해보면 종목시세와 일간데이터, 수급데이터가 각각 별도의 조회를 발생시킨다고 보여집니다. 따라서, ReqMarketData로 종목객체를 생성할 경우 리턴값 에러가 시간제한 에러일경우 GetLimitedTime method로 남은 시간을 타이머를 돌려 OnTimer이벤트에서 나머지 조회하면 되겠지요. 자바스크립트를 공부하시면 알겠지만 이벤트라는 건 시스템에 의해 호출당하는(Call Back)함수입니다. OnUpdat eMarekt 은 시스템에 의해 호출되는 거지 호출해야하는 함수가 아니라는 거지요. 굳이 하겠다면 말리진 않겠지만, 호출한다고 해서 조회가 발생되지는 당연히 않겠지요. 7. 시세자동업데이트 이벤트는 종목객체가 있을 때만 발생되더군요. 옵션객체도 이벤트에 추가해달라고 요청하려다 생각해보니 그 많은 종목의 자동업데이트를 이벤트로 받다간 전략이 제대로 돌지도 못하겠더군요. 전체적으로 자세히 설명드리고 싶으나 그랬다간 자바스크립트 책써야할판이네요. 찾아서 해보시면 그렇게 어렵지 않습니다. 저도 책보고 인터넷보고 독학으로 했답니다. > 김태희 님이 쓴 글입니다. > 제목 : 예스스팟에서 배열 사용법 문의 > 제가 예스스팟을 지금 공부 중인데, 배열 선언과 사용에 있어서 좀 특이한 점들이 있어서 문의드립니다. 제가 예스스팟에서의 배열 사용법을 알아보려고 아래와같이 시험 테스트를 해보았습니다. function Main_OnStart() { var aaa; aaa = new Array(3); aaa[0] = 0; aaa[1] = 1; aaa[2] = 2; aaa[-1] = -1; aaa[-2] = -2; aaa[-3] = 33.33 aaa['a'] = 'abcd'; aaa['b'] = "efgh"; Main.MessageList(aaa[0], aaa[1], aaa[2], aaa[-1], aaa[-2], aaa[-3], aaa['a'], aaa['b']); } 디버깅 창에 표시된 내용 ===> 0 1 2 –1 –2 33.33 abcd efgh 문의1) 먼저, 배열 선언해 줄 때, aaa = new Array(3); 와 같이 배열 요소 개수를 3개만 지정해주었는데도, 실제로 사용시엔 3개 이상 지정해도 아무 문제없이 사용이 가능하더군요. 예스스팟에서 new를 이용해 배열선언시에 요소갯수 지정은 아무런 의미가 없어 보이는데요. 위 경우처럼 new Array(3); 으로 지정해주지 않고, 그냥 괄호 () 속을 공란으로 두고 new Array();처럼 코딩해도 프로그램은 오류없이 잘 돌아가더군요. 수식 코딩할 때 배열요소 개수 지정은 안해줘도 상관없는 건가요? 예스스팟에서 배열이 동작하는 정확한 개념과 원리..메카니즘을 알고 싶습니다. 문의2) aaa[-1], aaa['a']처럼 배열 요소를 인덱싱할 때 음수나 문자를 넣어도 문제없이 잘 돌아가던데, 이렇게 써도 문제 없는 건가요? 문의3) 배열요소에 값을 할당할 때 정수,실수,문자열 등을 막 집어넣어도 데이터 타입 오류를 발생시키지 않고 잘 돌아가던데, 예스스팟에선 원래 이런 방식을 허용하나요? 문의4) 예스스팟은 자바스크립트 기반으로 작동한다고 매뉴얼엔 씌여 있던데, 원래 자바 스크립트에선 위에서 언급한 것과 같은 방식의 배열 사용은 허용하지 않는 걸로 알고 있는데, (물론, 파이썬 같은 랭귀지에선 허용이 되긴 합니다만) 좀 희안하네요. 근데, 모의투자로 접속해선 저렇게 프로그래밍해도 잘돌아가긴 하지만...실전에 들어가서 실계좌에 돈을 입금한 상황에서 저런 방식으로 배열을 사용했을 때 오류가 발생해서 주문이 잘못나가거나 할까봐 걱정이 돼서 문의드립니다. 배열 사용에서 문제가 생겨 수식이 오작동해서 주문이 잘못나가기라도 하면 큰 손실을 볼수 있으니 말입니다. 홈페이지에 올라와 있는 예스스팟 매뉴얼에선 저렇게 사용하면 안되는 걸로 나와 있던데, 실제론 저렇게 프로그래밍 해도 되니 정말 저렇게 써도 될까? 의구심도 생기고 불안하기도 하고 그렇네요. 예스스팟에서 배열이 작동하는 기본 원리와 개념에 대해서 알고 싶습니다. 문의5) 예스스팟 스튜디오에서 스크립트 객체화면에서 종목객체추가 버튼을 누르면 종목이 추가되는데요. 거기 보면 current 라는 프로퍼티가 있던데, 설명에는‘현재가‘라고 되어 있더군요. 이 current 프로퍼티가 옵션같은 경우에는 현재 체결가인가요? 아니면 현재 그 종목의 이론가인가요? 옵션의 극외가격이나 극내가격 같은 경우에는 하루에 1건도 체결이 안되는..정말 거래량이 아예 없는 종목들도 있는데요. 그런 경우에는 현재 체결된 내역이 있으면 그 체결가를 current 가 저장하고, 체결된 내역이 없으며 이론가를 저장하고..그런 방식으로 작동하나요? 종목의 이론가만 따로 저장하고 있는 프로퍼티나 이론가를 구할수 있는 메소드를 찾아봐도 없는 거 같던데요. 예스스팟에서 옵션 이론가는 어떻게 참조하나요? 요약하면, current 프로퍼티가 체결가를 보관하는지 이론가를 저장하는지 여부와 이론가를 알고 싶을 때 어떤 방법이 있는지 궁금합니다. 문의6) 예스스팟 매뉴얼을 읽다보니 시간제한 관련한 내용이 있던데 잘 이해가 안되서 문의드리는데요. GetLimitedTime(nKind) 설 명 : 조회나 주문 등에 시간제한이 발생했을 때 남은 시간을 1/1000초 단위로 반환합니다. 반 환 값 : 정수 매개변수 : 제한시간종류 (0:조회제한시간, 1:주문제한시간, 2:계좌정보조회 제한시간) ※ 종목객체 요청: 15초당 최대 60회 ※ 주문: 15초당 최대 90회 ※ 계좌 조회: 15초당 최대 60회 언뜻 봐서 15초당 60회 이상 조회하면 시간 제한이 있어서 더 이상 조회를 못한다는 내용같은데요. 예를들어, 100개 종목들을 스크립트 객체화면에서 종목객체추가 버튼을 눌러 추가시킨 경우에 main 객체내에 있는 OnUpdat eMarket 이벤트를 이용해서 이벤트 함수를 구현하면 무조건 15초 간격으로 60개 종목을 계속 조회하게 된다는 뜻인가요? 장종료되거나 예스스팟 종료전까지는 쉬지 않고 무조건 계속 15초 간격으로 조회하나요? 이런 경우 나머지 40개 종목은 어떻게 되는지요? 만일 100개의 종목에 대해 조회 요청을 했다고 가정했을 때 15초 동안 60개 종목만 조회를 허락하고 나머지 40개 종목은 15초가 지난 뒤에 조회가 된다는 뜻인가요? 사실 컴퓨터가 60개 종목 조회하는데는 1초도 안걸릴텐데요. 일단 1초동안 60개 종목 조회를 했다고 가정하면 15초제한으로 인해 14초 동안은 조회를 못하고 있다가 14초가 지난 다음에야 나머지 40개 종목을 조회하게 된다는 의미인가요? 매뉴얼에는 시간제한 발생했을 때 어떻게 처리하는지에 대한 프로그램 코딩 예제는 없어서 잘 감이 안잡히는데, 실제로 프로그램으로 코딩해서 어떤 방식으로 처리하는지 좀 가르쳐 주세요. 매뉴얼엔 너무 간단히 언급되어있어 잘 이해가 안되네요. 문의7) 그리고, 제가 테스트 차원에서 스크립트 객체화면에서 계좌객체, 옵션 객체를 추가시키고 간단히 다음과 같이 코딩해 봤습니다. 그랬더니 OnUp dateMarket 이벤트가 전혀 발생하지를 않더군요. function Main_OnUpd ateMarket(sItemCode, lUp dateID) { Main.MessageList('OnUp dateMarket내부'); } 그래서, 스크립트 객체화면에서 종목객체 추가 버튼을 눌러 다시 5월물 콜270 종목 1개를 추가시키고, 다시 테스트 해봤더니 그제서야 OnUpd ateMarket 이벤트가 발생하네요. 스크립트 객체화면에서 Option 데이터라고 되어 있는 버튼을 눌러서 추가시킨 경우에는 OnUp d ateMarket 이벤트가 작동을 안하고, 스크립트 객체화면에서 종목객체 추가 버튼을 눌러서 추가시킨 종목에 대해서만 OnUpd ateMarket 이벤트가 작동하는 건가요? 그리고, 예스스팟은 최근월물(5월물),차근월물(6월물)까지만 지원해 주는 걸로 알고 있는데, 7월물이나 8월물같은 원월물에 대해서도 스크립트 객체화면에서 종목객체 추가 버튼을 눌러서 추가시키는 방식으로 하면 이에 대해서도 OnUpda teMarket 이벤트가 정상적으로 발생하나요? 또한, OnUp dateMarket 이벤트는 시세변동뿐만 아니라 호가변동시에도 발생하는 걸로 알고 있는데, 매수1호가(혹은 매도1호가)부터 매수10호가(매도10호가)까지의 호가변동만 감지해서 이벤트를 발생시키나요? 아니면 1호가부터 5호가까지만 보나요? 그것도 아니면 10호가 밖에 있는 호가 변동까지 다 감시를 하는 건가요?