커뮤니티

시세조회 건수제한.........

프로필 이미지
곰발바닥
2015-04-03 18:09:48
1876
글번호 223401
답변완료
안녕하세요~~ 현물로 예스스팟 공부중인데 갑작스런 장벽을 만났습니다. 시세조회 건수제한 오류(15초당 60건만 가능합니다. 13초 남았습니다.) 위의 문구가 나오면서 스팟이 더이상 진행이 되지않습니다. 혹시나 13초후 다음으로 연결해서 진행될걸로 기대했으나 실망으로 끝을 맺었습니다. 현재 코스피, 코스닥, 그외종목합이 2000정도 되는데 건수제한수가 너무 불합리하다고 봅니다. 예전에도 어떤분이 질문한게 있었는데 그당시 검토해 보겠다는 답변이 있었습니다. 그로부터 훨씬 지난 지금도 그대로입니다. 해결책은 없는건가요? 위문구처럼 13초후 이어서 조회를 계속한다든지 딜레이함수로 15초에 정확히 60건을 처리하게 한다든지,,,,,,, 고민을 해결해 주십시요~~~~ 항상 수고해주셔서 감사합니다.
답변 4
프로필 이미지

예스스탁 예스스탁 답변

2015-04-07 17:02:33

안녕하세요 예스스탁입니다. 시세조회 건수제한은 서버 과부화를 방지하기 위한 부분으로 제한을 풀수는 없습니다. 한번에 60개 이상의 종목을 생성하실때는 for문등으로 한번에 모든 종목에 대해 한번에 요청을 하시게 되면 제한건수를 피할방법이 없습니다. 종목코드를 배열변수등에 저장하신 후에 순차적으로 1개씩 요청하고 요청한 종목에 대해 수신받으면 또 다음종목 요청을 하게 식을 작성하셔야 합니다. 종목객체 요청 --> Main_OnRcvMarketData 이벤트발생 --> 다음종목객체 요청 함수중에 아래 2개의 함수를 이용하시면 해당부분 제어를 하실수 있습니다 Main.RemoveMarketData(MarketData) Main.GetLimitedTime(nKind) RemoveMarketData함수는 종목생성요청이 정상적으로 수행되지 않으면 -1을 리턴합니다. -1이 리턴되면 GetLimitedTime함수로 시간제한 남은 시간(초)를 확인하시고 타이머로 해당 초 이후에 다시 요청하게 처리하시면 됩니다. GetLimitedTime로 리턴되는 시간이 1000이 1초입니다. 1/1000까지 초가 제공되므로 해당함수에서 리턴되는 값에 1초(1000)정도 더 더해서 타이머의 시간(초) 지정하시면 됩니다. 아래 내용 한번 수행해 보시기 바랍니다. 스크립트 객체설정에 따라 추가하실 객체는 없습니다. KP200 포함종목에 대한 종목객체를 요청합니다. var num; var Code = []; var Symbol = []; var Receive = 0; var req; function Main_OnStart() { //KP200 포함종목수 num = Main.GetItemCountOfCategory("201") //해당종목들의 종목코드를 받아와 배열변수에 저장 for(var i = 0; i < num; i++) { Code[i] = Main.GetItemCodeInCategory("201", i); Main.MessageList(i,Code[i]) } Receive = 0; //배열변수 0번방의 종목 요청 Main.ReqMarketData(Code[Receive]); Main.MessageList(Receive,"요청",Code[Receive]) } //요청종목에 대한 종목객체를 받으면 function Main_OnRcvMarketData(MarketData) { Main.MessageList(Receive,"수신",MarketData.code) //Symbol배열변수의 동일방에 저장 Symbol[Receive] = MarketData; //Receive는 1 증가 Receive = Receive+1; //다음 배열방의 종목 요청 if (Receive < num) req = Main.ReqMarketData(Code[Receive]); if (req == -1) { Main.MessageList(Receive,"건수제한",Code[Receive],"남은시간(초)",Main.GetLimitedTime(0)) Main.SetTimer(1, Main.GetLimitedTime(0)+1000); } else { Main.MessageList(Receive,"재요청",Code[Receive]) } } //타이머 동작하면 재요청 function Main_OnTimer(nEventID) { Main.KillTimer(1); req = Main.ReqMarketData(Code[Receive]); Main.MessageList(Receive,"요청",Code[Receive]) } 즐거운 하루되세요 > 곰발바닥 님이 쓴 글입니다. > 제목 : 시세조회 건수제한......... > 안녕하세요~~ 현물로 예스스팟 공부중인데 갑작스런 장벽을 만났습니다. 시세조회 건수제한 오류(15초당 60건만 가능합니다. 13초 남았습니다.) 위의 문구가 나오면서 스팟이 더이상 진행이 되지않습니다. 혹시나 13초후 다음으로 연결해서 진행될걸로 기대했으나 실망으로 끝을 맺었습니다. 현재 코스피, 코스닥, 그외종목합이 2000정도 되는데 건수제한수가 너무 불합리하다고 봅니다. 예전에도 어떤분이 질문한게 있었는데 그당시 검토해 보겠다는 답변이 있었습니다. 그로부터 훨씬 지난 지금도 그대로입니다. 해결책은 없는건가요? 위문구처럼 13초후 이어서 조회를 계속한다든지 딜레이함수로 15초에 정확히 60건을 처리하게 한다든지,,,,,,, 고민을 해결해 주십시요~~~~ 항상 수고해주셔서 감사합니다.
프로필 이미지

곰발바닥

2015-04-07 23:03:43

곰발바닥 님에 의해 삭제된 답변입니다.
프로필 이미지

곰발바닥

2015-04-07 23:11:25

답변 감사합니다. 매일매일 종목검색후 잔고로 계속 편입하다보니 60종목이 넘어버려 질문드린것 같은 상황이 되었습니다. 아래식은 현재 테스트중인 스팟식입니다. 동시호가에 잔고를 검색해서 조건에 맞는 종목을 출력시켜주는 식입니다. 그렇게 시간에 구애받는 식은 아닌거죠. 정상 작동될수있도록 수정 부탁드립니다. 답변주신 방식말고 딜레이즉 1번째종목,딜레이,2번째종목,딜레이,3번째종목,,,,,, 15초에60종목이니 한종목당 0.25초 딜레이주는 방법은 없나요? var Nth = 0; var Bnum; var ItemCode = new Array(); var ItemObject = new Array(); function Main_OnStart() { Main.SetTimer(1, 30000); } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMSS >= 145200 ) { Main.KillTimer(1); Nth = 0; Bnum = Account1.GetTheNumberOfBalances(); if (Bnum > 0) { Account1.SetBalanceIndex(Nth); if (Account1.Balance.count > 0) { Main.ReqMarketData(Account1.Balance.code, 0,0); ItemCode[Nth] = Account1.Balance.code; Main.MessageList("종목객체요청",Account1.Balance.code); } } } } function Main_OnRcvMarketData(MarketData) { Main.MessageList("종목객체수신",MarketData.name); if (MarketData.code == ItemCode[Nth]) { ItemObject[Nth] = MarketData; Main.MessageList(Nth,"번째","종목객체생성완료 : "); Nth = Nth+1; if (Bnum > 0) { Account1.SetBalanceIndex(Nth); if (Account1.Balance.count > 0) { Main.ReqMarketData(Account1.Balance.code, 0,0); ItemCode[Nth] = Account1.Balance.code; Main.MessageList("종목객체요청",Account1.Balance.code); } } } if (ItemCode[Nth] == ItemObject[Nth]) { for (var j = 0; j < Nth; j++) { Account1.SetBalanceItem(ItemObject[j].code,0); if (Account1.Balance.position == 2) { if (ItemObject[j].current < Account1.Balance.avgUnitCost*0.85) { Main.MessageList(ItemObject[j].name); } } } } }
프로필 이미지

예스스탁 예스스탁 답변

2015-04-08 19:44:43

안녕하세요 예스스탁입니다. 기존에 답변드린 내용이 가장 시간을 절약해 종목을 생성할수 있는 방법입니다. 타이머로 0.25초씩 주는 부분도 서버의 딜레이보다 0.0001초라도 부족할경우 마찬가지로 제한시간에 걸리게 될수 있습니다. var num; var ItemCode = []; var ItemObject = []; var Receive = 0; var req; function Main_OnStart() { Main.SetTimer(1, 1000); } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMSS >= 145200 ) { Main.KillTimer(1); num = Account1.GetTheNumberOfBalances(); Receive = 0; if (num > 0) { for(var i = 0; i < num; i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0) { ItemCode[i] = Account1.Balance.code; Main.MessageList(i,ItemCode[i]); } } //배열변수 0번방의 종목 요청 Main.ReqMarketData(ItemCode[Receive]); Main.MessageList(Receive,"요청",ItemCode[Receive]); } } if (nEventID == 2) { Main.KillTimer(2); req = Main.ReqMarketData(ItemCode[Receive]); Main.MessageList(Receive,"재요청",ItemCode[Receive]); } } function Main_OnRcvMarketData(MarketData) { Main.MessageList(Receive,"수신",MarketData.code) ItemObject[Receive] = MarketData; Receive = Receive+1; if (Receive < num) { req = Main.ReqMarketData(ItemCode[Receive]); if (req == -1) { Main.MessageList(Receive,"건수제한",ItemCode[Receive],"남은시간(초)",Main.GetLimitedTime(0)) Main.SetTimer(2, Main.GetLimitedTime(0)+1000); } else { Main.MessageList(Receive,"요청",ItemCode[Receive]) } } } 즐거운 하루되세요 > 곰발바닥 님이 쓴 글입니다. > 제목 : Re : Re : 시세조회 건수제한.........추가질문입니다. > 답변 감사합니다. 매일매일 종목검색후 잔고로 계속 편입하다보니 60종목이 넘어버려 질문드린것 같은 상황이 되었습니다. 아래식은 현재 테스트중인 스팟식입니다. 동시호가에 잔고를 검색해서 조건에 맞는 종목을 출력시켜주는 식입니다. 그렇게 시간에 구애받는 식은 아닌거죠. 정상 작동될수있도록 수정 부탁드립니다. 답변주신 방식말고 딜레이즉 1번째종목,딜레이,2번째종목,딜레이,3번째종목,,,,,, 15초에60종목이니 한종목당 0.25초 딜레이주는 방법은 없나요? var Nth = 0; var Bnum; var ItemCode = new Array(); var ItemObject = new Array(); function Main_OnStart() { Main.SetTimer(1, 30000); } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMSS >= 145200 ) { Main.KillTimer(1); Nth = 0; Bnum = Account1.GetTheNumberOfBalances(); if (Bnum > 0) { Account1.SetBalanceIndex(Nth); if (Account1.Balance.count > 0) { Main.ReqMarketData(Account1.Balance.code, 0,0); ItemCode[Nth] = Account1.Balance.code; Main.MessageList("종목객체요청",Account1.Balance.code); } } } } function Main_OnRcvMarketData(MarketData) { Main.MessageList("종목객체수신",MarketData.name); if (MarketData.code == ItemCode[Nth]) { ItemObject[Nth] = MarketData; Main.MessageList(Nth,"번째","종목객체생성완료 : "); Nth = Nth+1; if (Bnum > 0) { Account1.SetBalanceIndex(Nth); if (Account1.Balance.count > 0) { Main.ReqMarketData(Account1.Balance.code, 0,0); ItemCode[Nth] = Account1.Balance.code; Main.MessageList("종목객체요청",Account1.Balance.code); } } } if (ItemCode[Nth] == ItemObject[Nth]) { for (var j = 0; j < Nth; j++) { Account1.SetBalanceItem(ItemObject[j].code,0); if (Account1.Balance.position == 2) { if (ItemObject[j].current < Account1.Balance.avgUnitCost*0.85) { Main.MessageList(ItemObject[j].name); } } } } }