커뮤니티

조회제한 및 주문호가문의

프로필 이미지
하운드독
2021-12-08 20:17:33
1635
글번호 225592
답변완료
Q1. 아래 수식이 랜덤하게 조회제한에 걸립니다. 조회수제한인지, 주문제한인지는 모르겠습니다. 계좌에 보유종목이 많을때(20종목+), 일때 spot을 실행하자마자 제한이걸려 멈춰버립니다. 제한이 걸리지 않게 코드수정부탁드립니다. Q1-2. 계좌내 최대종목수를 20종목이하로 제한하고 싶습니다. Main.SetTimer(1, 1000*60); //60초 로 제한했음에도 불구하고, 제한에 걸립니다. Q2. ordersSell로 익절조건을 추가했는데, '호가단위가 맞지 않다'고 나옵니다 아래 코드에 2% 익절조건으로 호가단위를 맞출 방법을 문의드립니다. profitB == 1.02 //외부입력변수 if(cond == true){ A.OrderSell(A.Balance.code, A.Balance.count, Math.floor(A.Balance.avgUnitCost * profitB/100)*100, 0); Q3. kosdaq 지수 전일종가가 3일선, 5일선, 10일선 위에 있을때만, orderbuy 조건을 활성화 하고 싶습니다. 확장차트객체를 사용하지 않고서도 가능할까요? ---------------원본 수식코드------- //1. 시세/파워종목검색에서 임의의 사용자검색조건을 설정한다 //2. 사용자검색조건식을 이용하여 일정시간마다 종목을 검색한다 //3. 기존의 미체결 주문을 취소주문한다 //4. 현재 보유하고 있는 잔고종목이 새로 검색된 종목에 없는 경우 현재가로 청산주문낸다 //5. 검색된 종목들을 차례대로 종목객체 생성한다 //6. 생성된 종목객체가 잔고에 없으면 100,000원씩 매도 1호가에 매수주문한다. (단, 100,000원 이상인 종목은 1주 주문)) //7. 생성되었던 객체를 삭제한다 //8. 일정시간 경과 후 다시 종목검색을 하여 위의 과정을 반복한다 /* function getHHMMSSS() { var d = new Date(); HHMMSSS = d.getHours()+":"+ d.getMinutes()+":"+ d.getSeconds(), SSS = d.getMilliseconds(); // 1/1000초 if(SSS < 10) SSS = "00" + SSS; else if (SSS < 100) SSS = "00" + SSS; return HHMMSSS + "." + SSS;} */ var gEntryMoney = 1000000, //종목당 매수금액 gaItemList = [], //검색된 종목들을 담은 배열변수 gItemCnt, //종목객체 생성할 종목수 gRegCnt; //종목객체 생성을 요청한 건수 function Main_OnStart() { Main.MessageList(getHHMMSSS(), "시작"); //2. 사용자검색조건식을 이용하여 일정시간마다 종목을 검색한다 Main.ReqPowerSearch("#전고점돌파(30)"); Main.SetTimer(1, 1000*60); //60초마다 종목검 } function Main_OnRcvItemList(aItemList, nCount) { //3.기존의 미체결 주문을 취소주문한다 var num = A.GetTheNumberOfUnfills(); for(var i = 0; i < num ; i++){ A.SetUnfillIndex(i); A.OrderCancel(A.Unfill.orderNum); //Main.MessageList(getHHMMSSS(), "취소된 미체결주문 종목코드:", A.Unfill.code); } //4. 현재 보유하고 있는 잔고종목이 새로 검색된 종목에 없는 경우 현재가로 청산주문낸다 if(nCount >= 1){ gaItemList = aItemList; Main.MessageList(getHHMMSSS(), "종목검색된 종목수와 종목", nCount, gaItemList); var num = A.GetTheNumberOfBalances(); for(var i = 0; i < num ; i++){ A.SetBalanceIndex(i); //Main.MessageList(getHHMMSSS(), "보유잔고 종목", i + 1, A.Balance.code, A.Balance.count); //검색된 종목과 잔고종목의 종목코드들을 비교하여 같은 종목코드가 있으면 true 아니면 false var cond = false; for(var j = 0; j < gaItemList.length; j++){ // for문으로 잔고코드에 번호 부여 0부터 종목수 if(A.Balance.code == gaItemList[j]){ cond = true; gaItemList.splice(j, 1); //배열변수명.splice(배열에서 삭제할 부분의 처음 인덱스, 삭제할 크기) break; //break문 : for문이나 while문을 빠져나옴 } } //cond이 false이면 매도 if(cond == false){ A.OrderSell(A.Balance.code, A.Balance.count, A.Balance.current, 0); //Main.MessageList(getHHMMSSS(), "청산주문된 종목코드:", A.Balance.code); } if(cond == true){ A.OrderSell(A.Balance.code, A.Balance.count, A.Balance.current , 0);//계좌안에 있으면서, 종목 Main.MessageList (getHHMMSSS (), "[체결잔고 익절 매도주문]", A.Balance. code,"평단가:", A.Balance.avgUnitCost, "매도가격:", Math.floor(A.Balance.avgUnitCost * profitB)); } } //5. 검색된 종목들을 차례대로 종목객체 생성한다 gReqCnt = 0; gItemCnt = gaItemList.length; if(gItemCnt > 0){ Main.ReqMarketData(gaItemList[gReqCnt], 0, 0); } } } function Main_OnRcvMarketData(MD) { // Main.MessageList(getHHMMSSS(), "종목객체 생성", MD.code, MD.name); //6. 생성된 종목객체가 잔고에 없으면 1,000,000원씩 매도 1호가에 매수주문한다.(단, 100,000원 이상인 종목은 1주 주문)) var EntryVol; if(MD.current < gEntryMoney){ EntryVol = Math.floor(gEntryMoney/MD.current); } else{ EntryVol = 1; } A.OrderBuy(MD.code, EntryVol, MD.Ask(1), 0); //Main.MessageList(getHHMMSSS(), "매수주문 종목과 수량:", MD.code, EntryVol); //7. 생성되었던 객체를 삭제한다 // Main.MessageList(getHHMMSSS(), "종목객체 삭제:", MD.code); Main.RemoveMarketData(MD); gReqCnt++; if(gReqCnt < gItemCnt){ var TimeLimit = Main.ReqMarketData(gaItemList[gReqCnt], 0, 0); if(TimeLimit == -1){ Main.SetTimer(2, Main.GetLimitedTime(0) + 100); } } else if(gReqCnt == gItemCnt){ Main.MessageList(getHHMMSSS(), "매수주문 종료"); } } function Main_OnNotifyFill(NF) { Main.MessageList(getHHMMSSS(), "NF:", NF); } function Main_OnTimer(nEventID) { //8. 일정시간 경과 후 다시 종목검색을 하여 위의 과정을 반복한다 if(nEventID == 1){ Main.MessageList(getHHMMSSS(), "종목검색 재시작"); Main.ReqPowerSearch("#전고점돌파(30)"); } //조회시잔이 제한된 경우 if(nEventID == 2){ Main.ReqMarketData(gaItemList[gReqCnt], 0, 0); } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2022-01-19 17:44:45

> 하운드독 님이 쓴 글입니다. > 제목 : 조회제한 및 주문호가문의 > Q1. 아래 수식이 랜덤하게 조회제한에 걸립니다. 조회수제한인지, 주문제한인지는 모르겠습니다. 계좌에 보유종목이 많을때(20종목+), 일때 spot을 실행하자마자 제한이걸려 멈춰버립니다. 제한이 걸리지 않게 코드수정부탁드립니다. Q1-2. 계좌내 최대종목수를 20종목이하로 제한하고 싶습니다. Main.SetTimer(1, 1000*60); //60초 로 제한했음에도 불구하고, 제한에 걸립니다. Q2. ordersSell로 익절조건을 추가했는데, '호가단위가 맞지 않다'고 나옵니다 아래 코드에 2% 익절조건으로 호가단위를 맞출 방법을 문의드립니다. profitB == 1.02 //외부입력변수 if(cond == true){ A.OrderSell(A.Balance.code, A.Balance.count, Math.floor(A.Balance.avgUnitCost * profitB/100)*100, 0); Q3. kosdaq 지수 전일종가가 3일선, 5일선, 10일선 위에 있을때만, orderbuy 조건을 활성화 하고 싶습니다. 확장차트객체를 사용하지 않고서도 가능할까요? ---------------원본 수식코드------- //1. 시세/파워종목검색에서 임의의 사용자검색조건을 설정한다 //2. 사용자검색조건식을 이용하여 일정시간마다 종목을 검색한다 //3. 기존의 미체결 주문을 취소주문한다 //4. 현재 보유하고 있는 잔고종목이 새로 검색된 종목에 없는 경우 현재가로 청산주문낸다 //5. 검색된 종목들을 차례대로 종목객체 생성한다 //6. 생성된 종목객체가 잔고에 없으면 100,000원씩 매도 1호가에 매수주문한다. (단, 100,000원 이상인 종목은 1주 주문)) //7. 생성되었던 객체를 삭제한다 //8. 일정시간 경과 후 다시 종목검색을 하여 위의 과정을 반복한다 /* function getHHMMSSS() { var d = new Date(); HHMMSSS = d.getHours()+":"+ d.getMinutes()+":"+ d.getSeconds(), SSS = d.getMilliseconds(); // 1/1000초 if(SSS < 10) SSS = "00" + SSS; else if (SSS < 100) SSS = "00" + SSS; return HHMMSSS + "." + SSS;} */ var gEntryMoney = 1000000, //종목당 매수금액 gaItemList = [], //검색된 종목들을 담은 배열변수 gItemCnt, //종목객체 생성할 종목수 gRegCnt; //종목객체 생성을 요청한 건수 function Main_OnStart() { Main.MessageList(getHHMMSSS(), "시작"); //2. 사용자검색조건식을 이용하여 일정시간마다 종목을 검색한다 Main.ReqPowerSearch("#전고점돌파(30)"); Main.SetTimer(1, 1000*60); //60초마다 종목검 } function Main_OnRcvItemList(aItemList, nCount) { //3.기존의 미체결 주문을 취소주문한다 var num = A.GetTheNumberOfUnfills(); for(var i = 0; i < num ; i++){ A.SetUnfillIndex(i); A.OrderCancel(A.Unfill.orderNum); //Main.MessageList(getHHMMSSS(), "취소된 미체결주문 종목코드:", A.Unfill.code); } //4. 현재 보유하고 있는 잔고종목이 새로 검색된 종목에 없는 경우 현재가로 청산주문낸다 if(nCount >= 1){ gaItemList = aItemList; Main.MessageList(getHHMMSSS(), "종목검색된 종목수와 종목", nCount, gaItemList); var num = A.GetTheNumberOfBalances(); for(var i = 0; i < num ; i++){ A.SetBalanceIndex(i); //Main.MessageList(getHHMMSSS(), "보유잔고 종목", i + 1, A.Balance.code, A.Balance.count); //검색된 종목과 잔고종목의 종목코드들을 비교하여 같은 종목코드가 있으면 true 아니면 false var cond = false; for(var j = 0; j < gaItemList.length; j++){ // for문으로 잔고코드에 번호 부여 0부터 종목수 if(A.Balance.code == gaItemList[j]){ cond = true; gaItemList.splice(j, 1); //배열변수명.splice(배열에서 삭제할 부분의 처음 인덱스, 삭제할 크기) break; //break문 : for문이나 while문을 빠져나옴 } } //cond이 false이면 매도 if(cond == false){ A.OrderSell(A.Balance.code, A.Balance.count, A.Balance.current, 0); //Main.MessageList(getHHMMSSS(), "청산주문된 종목코드:", A.Balance.code); } if(cond == true){ A.OrderSell(A.Balance.code, A.Balance.count, A.Balance.current , 0);//계좌안에 있으면서, 종목 Main.MessageList (getHHMMSSS (), "[체결잔고 익절 매도주문]", A.Balance. code,"평단가:", A.Balance.avgUnitCost, "매도가격:", Math.floor(A.Balance.avgUnitCost * profitB)); } } //5. 검색된 종목들을 차례대로 종목객체 생성한다 gReqCnt = 0; gItemCnt = gaItemList.length; if(gItemCnt > 0){ Main.ReqMarketData(gaItemList[gReqCnt], 0, 0); } } } function Main_OnRcvMarketData(MD) { // Main.MessageList(getHHMMSSS(), "종목객체 생성", MD.code, MD.name); //6. 생성된 종목객체가 잔고에 없으면 1,000,000원씩 매도 1호가에 매수주문한다.(단, 100,000원 이상인 종목은 1주 주문)) var EntryVol; if(MD.current < gEntryMoney){ EntryVol = Math.floor(gEntryMoney/MD.current); } else{ EntryVol = 1; } A.OrderBuy(MD.code, EntryVol, MD.Ask(1), 0); //Main.MessageList(getHHMMSSS(), "매수주문 종목과 수량:", MD.code, EntryVol); //7. 생성되었던 객체를 삭제한다 // Main.MessageList(getHHMMSSS(), "종목객체 삭제:", MD.code); Main.RemoveMarketData(MD); gReqCnt++; if(gReqCnt < gItemCnt){ var TimeLimit = Main.ReqMarketData(gaItemList[gReqCnt], 0, 0); if(TimeLimit == -1){ Main.SetTimer(2, Main.GetLimitedTime(0) + 100); } } else if(gReqCnt == gItemCnt){ Main.MessageList(getHHMMSSS(), "매수주문 종료"); } } function Main_OnNotifyFill(NF) { Main.MessageList(getHHMMSSS(), "NF:", NF); } function Main_OnTimer(nEventID) { //8. 일정시간 경과 후 다시 종목검색을 하여 위의 과정을 반복한다 if(nEventID == 1){ Main.MessageList(getHHMMSSS(), "종목검색 재시작"); Main.ReqPowerSearch("#전고점돌파(30)"); } //조회시잔이 제한된 경우 if(nEventID == 2){ Main.ReqMarketData(gaItemList[gReqCnt], 0, 0); } }