커뮤니티

매수 주문 30초 이후 미체결 주문 취소 관련 문의

프로필 이미지
deeparc
2025-07-26 23:34:59.0
86
글번호 226362
답변완료
안녕하세요 다름 아니라 제가 아래 매수식으로 해서 사용하고 있고 일반적인 매수 주문에는 2호가 아래 주문으로 큰 무리 없이 진행이 되고 있습니다. 다만, 제가 2호가 아래 주문을 하다보니 체결이 안되고 위로 강하게 올라가는 종목이 있는데 그런 종목이 나중에 급락 시 매수되지 않도록 30초 뒤에 매수 주문 넣은 걸 취소하는 기능을 넣고 싶습니다. 수고 많으시겠지만 수식 한번 부탁드려도 될까요? 제가 혼자 timer 30초로 Account.SetUnfill 로 미체결 종목을 확인해서 OrderCancel 를 하는 것으로 생각되어서(맞을까요?) 이리저리 수식을 좀 수정하고 테스트를 해봤는데 도저히 제대로 작동을 안하네요 ㅠㅠㅠ 아마 삽입된 해당 명령어들의 위치 이상하고 허접해서 그런거 아닌가 싶은데.. 혼자 계속 작업을 하다가 도저히 안되어서 문의를 드리게 되었습니다. 수고 많으시겠지만 여유 되실 때 한번 검토를 부탁 드립니다. 미리 감사드립니다. var timer5 = 5; var 매수금 = 100000; var OrderList = []; var MKList = []; var req; var 종목제한수 = 20; function Main_OnStart() { Main.SetTimer(1, timer5 * 1000); // 1번 타이머, 1초 MKList = []; // 오늘 매수한 종목 관리 배열 초기화 } 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 > 090100 && HHMMSS < 143000) //14:30까지로 변경 { Main.ReqPowerSearch("매수조건"); } if (nEventID == 2) { Main.ReqMarketData(OrderList[req]); } } function Main_OnRcvItemList(aItemList, nCount) { Main.KillTimer(1); OrderList = []; if (nCount >= 1) { if (MKList.length == 0) { OrderList = aItemList.slice(0, 종목제한수); // 한정된 수만 가져오기 } else { for (var a = 0; a < nCount; a++) { var Add = true; for (var b = 0; b < MKList.length; b++) { if (aItemList[a] == MKList[b].code) { Add = false; } } if (Add == true && !IsStockInAccount(aItemList[a])) { OrderList.push(aItemList[a]); // 제한 수를 넘는 경우 break if (OrderList.length >= 종목제한수) { break; } } } } if (OrderList.length == 0) { Main.SetTimer(1, timer5 * 1000); } else { req = 0; Main.ReqMarketData(OrderList[req]); } } else // 추가(검색된 종목이 없으면 검색 타이머 재설정) { Main.SetTimer(1, timer5 * 1000); } } function Main_OnRcvMarketData(MarketData) { if (MarketData.code == OrderList[req]) { MKList.push(MarketData); // 계좌에 같은 종목이 있는지 확인 if (!IsStockInAccount(MarketData.code)) { // 계좌에 없는 경우에만 매수 Account1.OrderBuy(MarketData.code, 1, MarketData.current - MarketData.GetTickSize()*2, 0); Main.MessageList(MarketData.code + " 주식을 매수합니다."); } else { Main.MessageList(MarketData.code + " 주식은 이미 계좌에 있으므로 매수하지 않습니다."); } req = req + 1; if (req < OrderList.length) { var aa = Main.ReqMarketData(OrderList[req]); if (aa == -1) { Main.SetTimer(2, 15000); } } else { Main.SetTimer(1, timer5 * 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
프로필 이미지

예스스탁 예스스탁 답변

2025-08-18 16:56:02.0

안녕하세요 예스스탁입니다. 매수시마다 각각 30초 타이머를 설정해서 30초 이후 해당 종목의 매수 미체결이 있으면 취소하게 추가해 드립니다. 매수 순서에 따라 0번 타이머부터 사용하기 위해 종목검색과 종목객체 타이머는 99,98로 변경했습니다. var timer5 = 5; var 매수금 = 100000; var OrderList = []; var MKList = [],ID = [],NUM = []; var req; var 종목제한수 = 20; function Main_OnStart() { Main.SetTimer(99, timer5 * 1000); // 1번 타이머, 1초 MKList = []; // 오늘 매수한 종목 관리 배열 초기화 cnt = 0; Main.SetTimer(99, timer5 * 1000); // 1번 타이머, 1초 } 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(); //14:30까지로 변경 if (nEventID == 99 && HHMMSS > 090100 && HHMMSS < 143000) { Main.ReqPowerSearch("매수조건"); } if (nEventID == 98) { Main.ReqMarketData(OrderList[req]); } if (nEventID < 98) { Main.KillTimer(nEventID); var num = Account1.GetTheNumberOfUnfills(); if ( num > 0) { for (i = 0; i < num) { Account1.SetUnfill(i); if (Account1.Unfill.code == BT[nEventID] && Account1.Unfill.count > 0 && Account1.Unfill.orderKind == 2) { Account1.OrderCancel(Account1.Unfill.orderNum); } } } } } function Main_OnRcvItemList(aItemList, nCount) { Main.KillTimer(1); OrderList = []; if (nCount >= 1) { if (MKList.length == 0) { OrderList = aItemList.slice(0, 종목제한수); // 한정된 수만 가져오기 } else { for (var a = 0; a < nCount; a++) { var Add = true; for (var b = 0; b < MKList.length; b++) { if (aItemList[a] == MKList[b].code) { Add = false; } } if (Add == true && !IsStockInAccount(aItemList[a])) { OrderList.push(aItemList[a]); // 제한 수를 넘는 경우 break if (OrderList.length >= 종목제한수) { break; } } } } if (OrderList.length == 0) { Main.SetTimer(99, timer5 * 1000); } else { req = 0; Main.ReqMarketData(OrderList[req]); } } else // 추가(검색된 종목이 없으면 검색 타이머 재설정) { Main.SetTimer(99, timer5 * 1000); } } function Main_OnRcvMarketData(MarketData) { var d = new Date(); YYYYMMDD = d.getFullYear() * 10000 + (d.getMonth() + 1) * 100 + d.getDate(); HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds(); Second = d.getHours() * 3600 + d.getMinutes() * 60 + d.getSeconds(); if (MarketData.code == OrderList[req]) { MKList.push(MarketData); // 계좌에 같은 종목이 있는지 확인 if (!IsStockInAccount(MarketData.code)) { // 계좌에 없는 경우에만 매수 Account1.OrderBuy(MarketData.code, 1, MarketData.current - MarketData.GetTickSize()*2, 0); BT[cnt] = MarketData.code; Main.SetTimer(cnt, timer5 * 1000); Main.MessageList(MarketData.code + " 주식을 매수합니다."); } else { Main.MessageList(MarketData.code + " 주식은 이미 계좌에 있으므로 매수하지 않습니다."); } cnt = cnt+1; req = req + 1; if (req < OrderList.length) { var aa = Main.ReqMarketData(OrderList[req]); if (aa == -1) { Main.SetTimer(98, 15000); } } else { Main.SetTimer(99, timer5 * 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 반환 } 즐거운 하루되세요 > deeparc 님이 쓴 글입니다. > 제목 : 매수 주문 30초 이후 미체결 주문 취소 관련 문의 > 안녕하세요 다름 아니라 제가 아래 매수식으로 해서 사용하고 있고 일반적인 매수 주문에는 2호가 아래 주문으로 큰 무리 없이 진행이 되고 있습니다. 다만, 제가 2호가 아래 주문을 하다보니 체결이 안되고 위로 강하게 올라가는 종목이 있는데 그런 종목이 나중에 급락 시 매수되지 않도록 30초 뒤에 매수 주문 넣은 걸 취소하는 기능을 넣고 싶습니다. 수고 많으시겠지만 수식 한번 부탁드려도 될까요? 제가 혼자 timer 30초로 Account.SetUnfill 로 미체결 종목을 확인해서 OrderCancel 를 하는 것으로 생각되어서(맞을까요?) 이리저리 수식을 좀 수정하고 테스트를 해봤는데 도저히 제대로 작동을 안하네요 ㅠㅠㅠ 아마 삽입된 해당 명령어들의 위치 이상하고 허접해서 그런거 아닌가 싶은데.. 혼자 계속 작업을 하다가 도저히 안되어서 문의를 드리게 되었습니다. 수고 많으시겠지만 여유 되실 때 한번 검토를 부탁 드립니다. 미리 감사드립니다. var timer5 = 5; var 매수금 = 100000; var OrderList = []; var MKList = []; var req; var 종목제한수 = 20; function Main_OnStart() { Main.SetTimer(1, timer5 * 1000); // 1번 타이머, 1초 MKList = []; // 오늘 매수한 종목 관리 배열 초기화 } 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 > 090100 && HHMMSS < 143000) //14:30까지로 변경 { Main.ReqPowerSearch("매수조건"); } if (nEventID == 2) { Main.ReqMarketData(OrderList[req]); } } function Main_OnRcvItemList(aItemList, nCount) { Main.KillTimer(1); OrderList = []; if (nCount >= 1) { if (MKList.length == 0) { OrderList = aItemList.slice(0, 종목제한수); // 한정된 수만 가져오기 } else { for (var a = 0; a < nCount; a++) { var Add = true; for (var b = 0; b < MKList.length; b++) { if (aItemList[a] == MKList[b].code) { Add = false; } } if (Add == true && !IsStockInAccount(aItemList[a])) { OrderList.push(aItemList[a]); // 제한 수를 넘는 경우 break if (OrderList.length >= 종목제한수) { break; } } } } if (OrderList.length == 0) { Main.SetTimer(1, timer5 * 1000); } else { req = 0; Main.ReqMarketData(OrderList[req]); } } else // 추가(검색된 종목이 없으면 검색 타이머 재설정) { Main.SetTimer(1, timer5 * 1000); } } function Main_OnRcvMarketData(MarketData) { if (MarketData.code == OrderList[req]) { MKList.push(MarketData); // 계좌에 같은 종목이 있는지 확인 if (!IsStockInAccount(MarketData.code)) { // 계좌에 없는 경우에만 매수 Account1.OrderBuy(MarketData.code, 1, MarketData.current - MarketData.GetTickSize()*2, 0); Main.MessageList(MarketData.code + " 주식을 매수합니다."); } else { Main.MessageList(MarketData.code + " 주식은 이미 계좌에 있으므로 매수하지 않습니다."); } req = req + 1; if (req < OrderList.length) { var aa = Main.ReqMarketData(OrderList[req]); if (aa == -1) { Main.SetTimer(2, 15000); } } else { Main.SetTimer(1, timer5 * 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 반환 }