커뮤니티
관심종목 중에서 매수, 계좌보유종목수 제한 등에 대해 문의합니다.
전체 종목을 대상으로 써치하여 종목을 매수하는 프로그램입니다.
1. 미리 관심종목 그룹에 등록해둔 특정관심종목 폴더에서 중에서 종목을 써치해서 매수하게 하고 싶습니다.
2. 1차 매수(지정금액01) 후 당일 내에 매수금액에서 2%하락 시 2차매수(지정금액01)를 하고, 1.2차 평균매수가가 3%하락시 3차매수(지정금액02)를 하는 로직을 만들고 싶습니다.
3. 1차 매수(지정금액01) 후 당일이 아닌 다음날에 평균매수가 대비 5%하락 시 2차매수(지정금액01)를 하고, 평균매수가 대비 다시 5%하락시 3차매수(지정금액02)를 하는 로직을 만들고 싶습니다.
4. 해당 계좌의 보유 종목수를 제한하여 매수하고자 합니다.(계좌에 20종목만 보유, 1 종목 매도하면 1종목 매수)
5. NXT에서도 자동매매가 가능하게 하고 싶습니다.
부탁드립니다.
=====================
var M_Buy = 500000;//종목당 1회 매수금액
var OPEN_T = 090000;
var CLOSE_T = 150000;
var SearchName = "224이평 돌파 및 지지"; //PowerSearch Name
var 당일매수제한종목수 = 10, BuyCount;
var timer = 5; //매수 매도 초(시간) 간격
var Earning_Rate = 1.3; //계좌평가금액이 스팟시작시 평가금액대비 30% 이상이면 전종목 전량매도
var Trailing_Stop = 0.1; // 종목당 -10%이하 손실이면 전량 손절
var Earning_Sale = 1.25; // 종목당 25%이상 수익이면 전량 익절
var OrderList = [];
var MKList = [];
var req;
function Main_OnStart()
{
//1번 타이머, 5초
Main.SetTimer(1, timer*1000);
// 오늘 매수한 종목 관리 배열 초기화
MKList = [];
//스팟 시작시 잔고평가금액
V1 = Account1.GetBalanceETCinfo(100);
BuyCount = 0;
}
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 >= OPEN_T && HHMMSS < CLOSE_T && BuyCount < 당일매수제한종목수)
{
//종목검색 수행
Main.ReqPowerSearch(SearchName)
Main.MessageList("ReqPowerSearch1");
}
if (nEventID == 1)
{
//계좌보유종수
var num = Account1.GetTheNumberOfBalances();
//9시~15시 15분 사이
if (HHMMSS >= OPEN_T && HHMMSS < CLOSE_T)
{
//보유종목이 1개 이상
if (num >= 1)
{
//계좌평가금액이 스팟시작시 평가금액대비 30% 이상이면 전종목 전량매도
if (Account1.GetBalanceETCinfo(100) >= V1*Earning_Rate)
{
//1번 타이머 종료
Main.KillTimer(1);
//계좌리스트의 순서대로
for (var i = 0; i < num; i++)
{
//잔고를 셋팅
Account1.SetBalance(i);
//수량이 있고 Earning_Rate(30%)수익이거나 손실이면 시장가 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
else //아니면 개별종목 25% Earning_Sale, -10% Trailing_Stop 체크
{
//계좌리스트의 순서대로
for (var i = 0; i < num; i++)
{
//잔고를 셋팅
Account1.SetBalance(i);
//수량이 있고 "Earning_Sale" 25% 수익이거나 "Trailing_Stop" -10% 손실이면 시장가 전량매도
if (Account1.Balance.count > 0 &&
(Account1.Balance.current >= Account1.Balance.avgUnitCost*Earning_Sale ||
Account1.Balance.current <= Account1.Balance.avgUnitCost*Trailing_Stop))
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
}
}
}
if (nEventID == 2)
{
Main.ReqMarketData(OrderList[req]);
Main.MessageList("ReqMarketData:",OrderList[req]);
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
Main.KillTimer(1);
Main.MessageList("aItemList:",aItemList);
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]);
}
}
}
}
Main.MessageList("OrderList:",OrderList);
if (OrderList.length == 0)
{
Main.SetTimer(1, timer*1000);
}
else
{
req = 0;
Main.ReqMarketData(OrderList[req]);
Main.MessageList("ReqMarketData:",OrderList[req]); ;
}
}
function Main_OnRcvMarketData(MarketData)
{
if (MarketData.code == OrderList[req])
{
MKList.push(MarketData);
// 계좌에 같은 종목이 있는지 확인
if (!IsStockInAccount(MarketData.code))
{
if (BuyCount < 당일매수제한종목수)
{
// 계좌에 잔고가 없는 경우에만 매수
Account1.OrderBuy(MarketData.code,1,MarketData.Ask(1),0); // 종목당 1주 지정가 매수주문
// Account1.OrderBuy(MarketData.code,1,0,1); // 종목당 1주 시장가 매수주문
// Account1.OrderBuy(MarketData.code,Math.floor(M_Buy/MarketData.Ask(1)),0,1); // 종목당 지정금액 시장가 매수주문
//Account1.OrderBuy(MarketData.code,Math.floor(M_Buy/MarketData.Ask(1)),MarketData.Ask(1),0); // 종목당 지정금액 지정가 매수주문
Main.MessageList(MarketData.code + "주식을 매수합니다.");
BuyCount = BuyCount+1;
}
}
else
{
Main.MessageList( MarketData.code + " 주식은 이미 계좌에 있으므로 매수하지 않습니다.");
}
req = req+1;
if (req < OrderList.length && BuyCount < 당일매수제한종목수)
{
var aa = Main.ReqMarketData(OrderList[req]);
Main.MessageList("ReqMarketData:",OrderList[req]); ;
if (aa == -1)
{
Main.SetTimer(2, 15000);
}
}
else
{
Main.SetTimer(1, timer*1000);
Main.MessageList("당일종목수제한 도달 :",BuyCount,"/",당일매수제한종목수);
}
}
}
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
예스스탁 예스스탁 답변
2026-03-23 15:07:22