안녕하세요. 수식작성을 했는데 매수할 때 자꾸 매수가 안되고 주문상태에
주문수량오류 (주문수량:-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 반환
}