커뮤니티

주문 수량 오류 -1 문의드립니다.

프로필 이미지
iinnn
2024-08-12 15:36:19.0
586
글번호 226077
답변완료
안녕하세요. 수식작성을 했는데 매수할 때 자꾸 매수가 안되고 주문상태에 주문수량오류 (주문수량:-1) 이라고 뜹니다. 뭐가 잘못 작성 된 것 일까요? 저는 NH증권을 쓰고 매수금액을 주문가능금액의 85프로로 설정하였습니다. 차트에서 신호받아서 매수하진 않고, 검색기에 뜨는 종목을 매수합니다. 한번 봐주시길 바라겠습니다. 감사합니다. var 타이머간격 = 3; var 손절 = 0.95; var 익절 = 1.05; var OrderList = []; var MKList = []; var req; var 매수금; function Main_OnStart() { //1번 타이머, 3초 Main.SetTimer(1, 타이머간격*1000); // 오늘 매수한 종목 관리 배열 초기화 MKList = []; //주문가능현금의 85% 매수금 = Account1.GetBalanceETCinfo(16)*0.85; //스팟 시작시 잔고평가금액 V1 = Account1.GetBalanceETCinfo(100); } function Main_OnTimer(nEventID) { var d = new Date(); YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMSS >= 90000 && HHMMSS < 151500) { // 종목검색 실행 //조건검색명입력 Main.ReqPowerSearch("전략2"); } if (nEventID == 1) { //계좌전체종목수 var num = Account1.GetTheNumberOfBalances(); //9시~15시 15분 사이 if (HHMMSS >= 90000 && HHMMSS < 151500) { //보유종목이 1개 이상 if (num >= 1) { //1번 타이머 종료 Main.KillTimer(1); //계좌리스트의 순서대로 인덱스를1씩증가 for (var i = 0; i < num; i++) { //잔고를 셋팅 Account1.SetBalance(i); //수량이 있고 5%수익이거나 5% 손실이면 시장가 매도 if (Account1.Balance.count > 0 && (Account1.Balance.current >= Account1.Balance.avgUnitCost*익절 || Account1.Balance.current <= Account1.Balance.avgUnitCost*손절)) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } } } } //15시 15분이후이면 if (HHMMSS >= 151500) { //1번 타이머 종료 Main.KillTimer(1); //미체결 전체 취소 var Unum = Account1.GetTheNumberOfUnfills() for(var i = 0; i < Unum; i++) { Account1.SetUnfillIndex(i); if (Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //계좌리스트의 순서대로 for (var i = 0; i < num; i++) { //잔고를 셋팅 Account1.SetBalance(i); if (Account1.Balance.count > 0) //잔고에 수량이 0이상이면 { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); //시장가로매도 } } } } if (nEventID == 2) { Main.ReqMarketData(OrderList[req]); } } function Main_OnRcvItemList(aItemList, nCount) //종목검색완료 { OrderList = []; if (nCount >= 1) //1종목 이상 검색되면 { Main.KillTimer(1); if (MKList.length == 0) //첫검색이면 { OrderList = aItemList; //해당 종목코드 모두 종목객체요청 리스트에 추가 } else //첫검색이 아니면 { for (var a = 0; a < nCount; a++) //기존종목객체요청리스트에 없는 종목만 선별 { var Add = true; for (var b = 0; b < BuyList.length; b++) { if (aItemList[a] == BuyList[b].code) { Add = false; } } if (Add == true && !IsStockInAccount(aItemList[a])) { OrderList.push(aItemList[a]); } } } } if (OrderList.length == 0) //종목객체 요청할 종목수가 없으면 종목검색을 위해 타이머 다시 동작 { Main.SetTimer(1, 타이머간격*1000); //1번타이머재동작 } else //종목객체 요청할 종목수가 1이상이면 { req = 0; //요청횟수는 초기값 0 Main.ReqMarketData(OrderList[req]); //요청시작 } } function Main_OnRcvMarketData(MarketData) //요청한 종목객체가 만들어지먼 { if (MarketData.code == OrderList[req]) { MKList.push(MarketData); //MK배열변수에 순서대로 종목객체저장 // 계좌에 같은 종목이 있는지 확인 if (!IsStockInAccount(MarketData.code)) { // 계좌에 없는 경우에만 매수 Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(1)),0,1); // 시장가 주문 Main.MessageList(MarketData.code + " 주식을 매수합니다."); } else { Main.MessageList( MarketData.code + " 주식은 이미 계좌에 있으므로 매수하지 않습니다."); } req = req+1; //요청횟수 1증가 if (req < OrderList.length) //요청횟수가 요청할종목수 미만이면 { var aa = Main.ReqMarketData(OrderList[req]); //다음종목 요청 if (aa == -1) //종목객체 제한시간에 걸리면(15초에 60개) 15초 쉬고 다시 요청 { Main.SetTimer(2, 15000); } } else //모두 요청했으면 { Main.SetTimer(1, 타이머간격*1000); //종목검색을 위해 타이머 다시 동작 } } } function IsStockInAccount(stockCode) { // 계좌에 해당 종목이 있는지 확인하는 함수 var numberOfBalances = Account1.GetTheNumberOfBalances(); for (var i = 0; i < numberOfBalances; i++) { Account1.SetBalance(i); if (stockCode == Account1.Balance.code) { return true; // 계좌에 같은 종목이 있으면 true 반환 } } return false; // 계좌에 같은 종목이 없으면 false 반환 }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2024-08-26 09:21:55.0

안녕하세요 예스스탁입니다. 원인파악 후 전화드리겠습니다. 즐거운 하루되세요 > iinnn 님이 쓴 글입니다. > 제목 : 주문 수량 오류 -1 문의드립니다. > 안녕하세요. 수식작성을 했는데 매수할 때 자꾸 매수가 안되고 주문상태에 주문수량오류 (주문수량:-1) 이라고 뜹니다. 뭐가 잘못 작성 된 것 일까요? 저는 NH증권을 쓰고 매수금액을 주문가능금액의 85프로로 설정하였습니다. 차트에서 신호받아서 매수하진 않고, 검색기에 뜨는 종목을 매수합니다. 한번 봐주시길 바라겠습니다. 감사합니다. var 타이머간격 = 3; var 손절 = 0.95; var 익절 = 1.05; var OrderList = []; var MKList = []; var req; var 매수금; function Main_OnStart() { //1번 타이머, 3초 Main.SetTimer(1, 타이머간격*1000); // 오늘 매수한 종목 관리 배열 초기화 MKList = []; //주문가능현금의 85% 매수금 = Account1.GetBalanceETCinfo(16)*0.85; //스팟 시작시 잔고평가금액 V1 = Account1.GetBalanceETCinfo(100); } function Main_OnTimer(nEventID) { var d = new Date(); YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMSS >= 90000 && HHMMSS < 151500) { // 종목검색 실행 //조건검색명입력 Main.ReqPowerSearch("전략2"); } if (nEventID == 1) { //계좌전체종목수 var num = Account1.GetTheNumberOfBalances(); //9시~15시 15분 사이 if (HHMMSS >= 90000 && HHMMSS < 151500) { //보유종목이 1개 이상 if (num >= 1) { //1번 타이머 종료 Main.KillTimer(1); //계좌리스트의 순서대로 인덱스를1씩증가 for (var i = 0; i < num; i++) { //잔고를 셋팅 Account1.SetBalance(i); //수량이 있고 5%수익이거나 5% 손실이면 시장가 매도 if (Account1.Balance.count > 0 && (Account1.Balance.current >= Account1.Balance.avgUnitCost*익절 || Account1.Balance.current <= Account1.Balance.avgUnitCost*손절)) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } } } } //15시 15분이후이면 if (HHMMSS >= 151500) { //1번 타이머 종료 Main.KillTimer(1); //미체결 전체 취소 var Unum = Account1.GetTheNumberOfUnfills() for(var i = 0; i < Unum; i++) { Account1.SetUnfillIndex(i); if (Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //계좌리스트의 순서대로 for (var i = 0; i < num; i++) { //잔고를 셋팅 Account1.SetBalance(i); if (Account1.Balance.count > 0) //잔고에 수량이 0이상이면 { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); //시장가로매도 } } } } if (nEventID == 2) { Main.ReqMarketData(OrderList[req]); } } function Main_OnRcvItemList(aItemList, nCount) //종목검색완료 { OrderList = []; if (nCount >= 1) //1종목 이상 검색되면 { Main.KillTimer(1); if (MKList.length == 0) //첫검색이면 { OrderList = aItemList; //해당 종목코드 모두 종목객체요청 리스트에 추가 } else //첫검색이 아니면 { for (var a = 0; a < nCount; a++) //기존종목객체요청리스트에 없는 종목만 선별 { var Add = true; for (var b = 0; b < BuyList.length; b++) { if (aItemList[a] == BuyList[b].code) { Add = false; } } if (Add == true && !IsStockInAccount(aItemList[a])) { OrderList.push(aItemList[a]); } } } } if (OrderList.length == 0) //종목객체 요청할 종목수가 없으면 종목검색을 위해 타이머 다시 동작 { Main.SetTimer(1, 타이머간격*1000); //1번타이머재동작 } else //종목객체 요청할 종목수가 1이상이면 { req = 0; //요청횟수는 초기값 0 Main.ReqMarketData(OrderList[req]); //요청시작 } } function Main_OnRcvMarketData(MarketData) //요청한 종목객체가 만들어지먼 { if (MarketData.code == OrderList[req]) { MKList.push(MarketData); //MK배열변수에 순서대로 종목객체저장 // 계좌에 같은 종목이 있는지 확인 if (!IsStockInAccount(MarketData.code)) { // 계좌에 없는 경우에만 매수 Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(1)),0,1); // 시장가 주문 Main.MessageList(MarketData.code + " 주식을 매수합니다."); } else { Main.MessageList( MarketData.code + " 주식은 이미 계좌에 있으므로 매수하지 않습니다."); } req = req+1; //요청횟수 1증가 if (req < OrderList.length) //요청횟수가 요청할종목수 미만이면 { var aa = Main.ReqMarketData(OrderList[req]); //다음종목 요청 if (aa == -1) //종목객체 제한시간에 걸리면(15초에 60개) 15초 쉬고 다시 요청 { Main.SetTimer(2, 15000); } } else //모두 요청했으면 { Main.SetTimer(1, 타이머간격*1000); //종목검색을 위해 타이머 다시 동작 } } } function IsStockInAccount(stockCode) { // 계좌에 해당 종목이 있는지 확인하는 함수 var numberOfBalances = Account1.GetTheNumberOfBalances(); for (var i = 0; i < numberOfBalances; i++) { Account1.SetBalance(i); if (stockCode == Account1.Balance.code) { return true; // 계좌에 같은 종목이 있으면 true 반환 } } return false; // 계좌에 같은 종목이 없으면 false 반환 }