커뮤니티

다중 종목검색

프로필 이미지
순두부남
2019-09-30 01:36:29
3565
글번호 225016
답변완료
안녕하세요. 스팟으로 실전매매 경험이 없고 공부하고 있습니다. 종목검색 하나 실행하면 5~10초(그때그때 다름) 걸리는데 스팟식으로 종목검색식 여러개를 순서대로 검색할 수 있는지요? 만약 가능하다면 다음과 같은 동작을 구현하고 싶습니다. 가이드 수식 부탁드립니다. 감사합니다. ■ 동작순서 1. 타이머지정(9시부터 1시간 간격) 2. 타이머 동작(9시) ☞ 사용자종목검색1~3 검색 ☞ 검색된 종목 모두 차트객체생성(중복제거) ☞ 전체 차트객체 매수신호 대기 ☞ 매수신호 발생시 주문 3. 타이머 동작(10시) ☞ 사용자종목검색1~3 재검색 ☞ 검색된 종목 다음과 같이 판단하여 차트객체생성 - 이미 생성된 차트객체와 동일한 종목은 차트객체 유지 - 기존에 없던 종목은 차트객체 생성 - 9시에 검색된 종목이 10시에 검색된 종목에 없으면 차트객체 삭제 - 새로 검색된 종목에 없어졌더라도 이미 주문이 들어간 종목은 차트객체 유지 (계좌확인으로 해야하는지??) ☞ 전체 차트객체 매수신호 대기 ☞ 매수신호 발생시 주문
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2019-10-18 10:43:28

안녕하세요 예스스탁입니다. 종목검색은 한번에 하나만 가능합니다. 그러므로 종목검색 후 완료되면 다음을 요청하게 하셔야 하고. 종목검색이 완료된 후에 동일종목을 제외한 리스트를 별도 코딩해서 만드셔야 합니다. 차트객체의 삭제는 시간이 조금 소모되므로 루프문으로 한번에 다수를 삭제하면 오류가 발생할 수 있습니다. 타이머를 이용해 시간간격을 두고 삭제하게 코딩하셔야 합니다. 아래수식에서는 0.5초 간격으로 삭제합니다. 예스스팟의 저희쪽에서 가이드 정도의 수식만 작성해 드립니다. 아래 수식의 내용을 참고하셔서 수정보완해 사용하시기 바랍니다. var LIST; var CT = []; var HHMMSS,HHMMSS,Search,Step,CC; var T1 = 100000; var T2 = 103800; function Main_OnStart() { Main.MessageList("Start"); Main.SetTimer(1, 1000); Step = 0; } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS1 = HHMMSS; HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1) { if (Step == 0 && HHMMSS >= T1 /*&& HHMMSS1 < T1*/) { Step = 1; Search = 0; LIST = []; Main.MessageList("사용자검색조건1"); Main.ReqPowerSearch("사용자검색조건1"); } if (Step == 1 && HHMMSS >= T2 && HHMMSS1 < T2) { Step = 2; if (CT.length > 0) { Main.MessageList("Step :", Step," 차트삭제시작"); Main.SetTimer(2, 500); } else { Main.MessageList("사용자검색조건4"); Main.ReqPowerSearch("사용자검색조건1"); } } } if (nEventID == 2) { Main.KillTimer(2); var index = CT.length - 1; var num = Account1.GetTheNumberOfUnfills(); var BuyUnFill = false; for (var x = 0; x < num; x++) { Account1.SetUnfill(x); if (CT[index].GetCode(1) == Account1.Unfill.code && Account1.Unfill.orderKind == 2) { BuyUnFill = true; } } Account1.SetBalance(CT[index].GetCode(1), 0); Main.MessageList("종목",CT[index].GetCode(1)," 보유수량:",Account1.Balance.count," 매수미체결 : ",BuyUnFill); if (Account1.Balance.count == 0 || BuyUnFill == false) { Main.MessageList("차트삭제",CT[index].GetCode(1)); Main.RemoveObject(CT[index]); CT.splice(index,1); } else { Main.MessageList("차트유지",CT[index].GetCode(1)); } if (index > 0) { Main.SetTimer(2, 500); } else { LIST = []; Search = 0; Main.MessageList("차트객체삭제완료"); Main.MessageList("사용자검색조건4"); Main.ReqPowerSearch("사용자검색조건4"); } } } function Main_OnRcvItemList(aItemList, nCount) { Search = Search+1; Main.MessageList(Search,nCount); if (aItemList.length > 0) { if (Search == 1) { LIST = aItemList; } if (Search >= 2) { for (var i = 0; i < aItemList.length; i++) { Add = true; for (var x = 0; x < LIST.length; x++) { if (aItemList[i] == LIST[x]) { Add = false; } } if (Add == true) { LIST.push(aItemList[i]); } } } } if (Search == 1) { Main.ReqPowerSearch("사용자검색조건2"); } if (Search == 2) { Main.ReqPowerSearch("사용자검색조건3"); } if (Search == 3) { if (CT.length > 0) { for (var i = LIST.length-1; i >= 0; i--) { Add = true; for (var x = 0; x < CT.length; x++) { if (LIST[i] == CT[x].GetCode(1)) { Add = false; LIST.splice(i,1); } } } } Main.MessageList("LIST: ",LIST.length); if (LIST.length > 0) { Main.MessageList("차트객체생성시작"); req = 0; CC = CT.length; Main.MessageList("ReqChartEx: ",LIST[req]); var ChartSet = new ReqChartItem(LIST[req],5,CHART_PERIOD_MINUTE,300,CHART_REQCOUNT_BAR,false,false); var SystemSet = new SystemInfo("시스템이름", YL_TYPE_NORMAL, null, null, null); //차트객체 요청 Main.ReqChartEx(ChartSet,SystemSet); } } } //차트객체 생성완료 function Main_OnRcvChartEx(ChartEx) { //req배열에 차트객체 저장 CT[CC+req] = ChartEx; Main.MessageList(req,CT[req].GetCode(1)); //요청횟수 1 증가 req = req+1; //요청횟수가 검색된 종목수 보다 작으면 //다음종목 요청 if (req < LIST.length) { Main.MessageList("ReqChartEx: ",LIST[req]); //차트설정, 시스템 설정 var ChartSet = new ReqChartItem(LIST[req],5,CHART_PERIOD_MINUTE,300,CHART_REQCOUNT_BAR,false,false); var SystemSet = new SystemInfo("시스템이름", YL_TYPE_NORMAL, null, null, null); //차트객체 요청 Main.ReqChartEx(ChartSet,SystemSet); } else //요청횟수가 검색된 종목수 이상이면 모두 요청했으므로 끝 { Main.MessageList("차트객체 생성끝",LIST.length, CT.length); } } function Main_OnRiseSignal(ChartEx, Signal) { //Buy if (Signal.signalKind == 1) { Account1.OrderBuy(ChartEx.GetCode(1), Signal.count,0,1); } //exitlong if (Signal.signalKind == 2) { //해당종목 매수미체결이 있으면 취소 var num = Account1.GetTheNumberOfUnfills(); for (var i = 0; i < num; i++) { Account1.SetUnfill(i); if (Account1.Unfill.code == ChartEx.GetCode(1) && Account1.Unfill.orderKind == 2) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //해당종목 보유잔고가 있으면 모두 매도 Account1.SetBalance(ChartEx.GetCode(1), 0); if (Account1.Balance.count > 0) { Account1.OrderSell(ChartEx.GetCode(1), Signal.count,0,1); } } } 즐거운 하루되세요 > 순두부남 님이 쓴 글입니다. > 제목 : 다중 종목검색 > 안녕하세요. 스팟으로 실전매매 경험이 없고 공부하고 있습니다. 종목검색 하나 실행하면 5~10초(그때그때 다름) 걸리는데 스팟식으로 종목검색식 여러개를 순서대로 검색할 수 있는지요? 만약 가능하다면 다음과 같은 동작을 구현하고 싶습니다. 가이드 수식 부탁드립니다. 감사합니다. ■ 동작순서 1. 타이머지정(9시부터 1시간 간격) 2. 타이머 동작(9시) ☞ 사용자종목검색1~3 검색 ☞ 검색된 종목 모두 차트객체생성(중복제거) ☞ 전체 차트객체 매수신호 대기 ☞ 매수신호 발생시 주문 3. 타이머 동작(10시) ☞ 사용자종목검색1~3 재검색 ☞ 검색된 종목 다음과 같이 판단하여 차트객체생성 - 이미 생성된 차트객체와 동일한 종목은 차트객체 유지 - 기존에 없던 종목은 차트객체 생성 - 9시에 검색된 종목이 10시에 검색된 종목에 없으면 차트객체 삭제 - 새로 검색된 종목에 없어졌더라도 이미 주문이 들어간 종목은 차트객체 유지 (계좌확인으로 해야하는지??) ☞ 전체 차트객체 매수신호 대기 ☞ 매수신호 발생시 주문