예스스탁
예스스탁 답변
2025-06-17 12:33:17.0
안녕하세요
예스스탁입니다.
Add = true && !IsStockInAccount(aItemList[a])
조건문에 같다라는 표현이 =로 처리된 부분이 있었습니다.
==로 변경하시면 됩니다. 수정한 식입니다.
var timer5 = 9; // 9초 간격
var OrderList = [];
var MKList = [];
var req;
function Main_OnStart()
{
// 1번 타이머로 검색 시작
Main.SetTimer(1, timer5 * 1000);
MKList = [];
// 99번 타이머는 5초마다 09:30:00 여부 확인
Main.SetTimer(99, 5000);
// 55번 타이머는 5초 간격으로 작동
Main.SetTimer(55, 5000);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds();
if (nEventID == 1 && HHMMSS >= 91000 && HHMMSS <= 92000)
{
Main.MessageList("종목검색");
Main.ReqPowerSearch("매수조건");
}
if (nEventID == 2)
{
Main.ReqMarketData(OrderList[req]);
}
if (nEventID == 99 && HHMMSS >= 93000)
{
Main.MessageList("전량매도");
Main.KillTimer(99); // 한 번만 실행
var num = Account1.GetTheNumberOfBalances();
if (num > 0)
{
for (var i = 0; i < num; i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0, 1);
Main.MessageList(Account1.Balance.code + " 주식을 전량 시장가로 매도합니다.");
}
}
}
}
if (nEventID == 55 && HHMMSS >= 92500)
{
Main.KillTimer(55);
Main.MessageLog("취소");
num = Account1.GetTheNumberOfUnfills(); // 미체결주문 갯수
for (var i = 0; i < num; i++)
{
Account1.SetUnfillIndex(i); // i순번의 미체결객체 셋팅
if (Account1.Unfill.count > 0) // 미체결객체의 수량이 0이상이면
{
Account1.OrderCancel(Account1.Unfill.orderNum); // 해당주문번호 취소주문
}
}
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
Main.KillTimer(1);
OrderList = [];
if (nCount >= 1)
{
if (MKList.length == 0)
{
OrderList = aItemList;
}
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]);
}
}
}
}
if (OrderList.length == 0)
{
Main.SetTimer(1, timer5 * 1000);
}
else
{
req = 0;
Main.ReqMarketData(OrderList[req]);
}
}
function Main_OnRcvMarketData(MarketData)
{
if (MarketData.code == OrderList[req])
{
MKList.push(MarketData);
if (!IsStockInAccount(MarketData.code))
{
//Account1.OrderBuy(MarketData.code, 19, 0, 1);
Account1.OrderBuy(MarketData.code, 19, MarketData.current, 0);
Main.MessageList(MarketData.code + " 주식을 19주 시장가로 매수합니다.");
}
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;
}
}
return false;
}
즐거운 하루되세요
> 시온사랑 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 9시10분에서20분까지 검색해서,
종목이 나오면 시장가 매수하고,
25분에 미체결이 있으면 취소하고,
30분에 잔고가 있으면 전량 시장가매도하는 건데...
잘 안됩니다...
어디가 문제일까요???
프로그램이 문제일까...아님 뭐가 문제일까요???
확인 부탁드립니다...
감사합니다...ㅎㅎㅎ
var timer5 = 9; // 9초 간격
var OrderList = [];
var MKList = [];
var req;
function Main_OnStart() {
// 1번 타이머로 검색 시작
Main.SetTimer(1, timer5 * 1000);
MKList = [];
// 99번 타이머는 5초마다 09:30:00 여부 확인
Main.SetTimer(99, 5000);
// 55번 타이머는 5초 간격으로 작동
Main.SetTimer(55, 5000);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds();
if (nEventID == 1 && HHMMSS >= 91000 && HHMMSS <= 92000) {
Main.ReqPowerSearch("매수조건");
}
if (nEventID == 2) {
Main.ReqMarketData(OrderList[req]);
}
if (nEventID == 99 && HHMMSS >= 93000) {
Main.KillTimer(99); // 한 번만 실행
var num = Account1.GetTheNumberOfBalances();
if (num > 0) {
for (var i = 0; i < num; i++) {
Account1.SetBalanceIndex(i);
if (Account1.Balance.count > 0) {
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0, 1);
Main.MessageList(Account1.Balance.code + " 주식을 전량 시장가로 매도합니다.");
}
}
}
}
if (nEventID == 55 && HHMMSS >= 92500) {
Main.KillTimer(55);
Main.MessageLog("취소");
num = Account1.GetTheNumberOfUnfills(); // 미체결주문 갯수
for (var i = 0; i < num; i++) {
Account1.SetUnfillIndex(i); // i순번의 미체결객체 셋팅
if (Account1.Unfill.count > 0) { // 미체결객체의 수량이 0이상이면
Account1.OrderCancel(Account1.Unfill.orderNum); // 해당주문번호 취소주문
}
}
}
}
function Main_OnRcvItemList(aItemList, nCount) {
Main.KillTimer(1);
OrderList = [];
if (nCount >= 1) {
if (MKList.length == 0) {
OrderList = aItemList;
} 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]);
}
}
}
}
if (OrderList.length == 0) {
Main.SetTimer(1, timer5 * 1000);
} else {
req = 0;
Main.ReqMarketData(OrderList[req]);
}
}
function Main_OnRcvMarketData(MarketData) {
if (MarketData.code == OrderList[req]) {
MKList.push(MarketData);
if (!IsStockInAccount(MarketData.code)) {
Account1.OrderBuy(MarketData.code, 19, 0, 1);
Main.MessageList(MarketData.code + " 주식을 19주 시장가로 매수합니다.");
} 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;
}
}
return false;
}