예스스탁
예스스탁 답변
2026-01-13 10:59:41
안녕하세요
예스스탁입니다.
Main.ReqChartEx(ReqChartItem, SystemInfo, IndicatorInfo, ReqRefItem)
스팟의 함수 중에 차트를 생성하는 함수가 있습니다.
종목이 검색되면 검색된 종목의 차트를 생성해 사용하시면 됩니다.
아래 수식 참고하시기 바랍니다.
종목검색 후 검색된 종목에 대해
종목객체를 생성하고 차트객체에 시스템을 적용후 생성해서
차트에서 신호가 발생하면 주문이 집행되는 수식입니다.
var MKList = []; //종목검색 후 종목객체 요청할 종목의 종목코드를 리스트할 배열변수
var MK = []; //종목객체를 저장할 배열변수
var CT = []; //차트객체를 저장할 배열변수
var req; //종목객체 요청 횟수를 저장할 변수
var 최대매수종목수 = 20; //매수할 최대 종목수
var 매수금 = 1000000; //종목당 매수금
//스팟 시작
function Main_OnStart()
{
//1번 타이머, 60초
Main.SetTimer(1, 5000);
}
//타이머 동작
function Main_OnTimer(nEventID)
{
//자바스크립트 날짜시간 객체에서 값을 가져와 HHMMSS형식으로 시간 계산
var d = new Date();
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//1번 타이머 동작하고 9시~15시 사이이면
if (nEventID == 1 && HHMMSS >= 90000 && HHMMSS <= 150000)
{
//타이머 종료
Main.KillTimer(1);
//지정한 이름의 사용자조건검색을 실행
Main.ReqPowerSearch("test");
}
if (nEventID == 2)
{
Main.KillTimer(2);
//재요청
Main.ReqMarketData(MKList[req]);
}
}
//종목검색완료
function Main_OnRcvItemList(aItemList, nCount, aValues)
{
Main.MessageList("검색된종목수",nCount);
//검색된 종목이 한종목 이상
if (nCount >= 1)
{
//종목객체 요청리스트를 초기화
MKList = [];
//처음 종목이 검색이 될 떄는
if (MK.length == 0)
{
//검색된 종목 중 잔고에 없는 종목으로 최대20개만 MKList에 저장
for (var a = 0; a < nCount; a++)
{
Account1.SetBalance(aItemList[a],0);
if (Account1.Balance.count == 0 && MKList.length < 최대매수종목수)
{
MKList.push(aItemList[a]);
}
}
}
else
{
//1종목이상 검색이 된 이후에는
if (MK.length < 최대매수종목수)
{
for (var a = 0; a < nCount; a++)
{
//종목객체가 만들어진 종목은 제외
var Add = true;
for (var b = 0; b < MK.length; b++)
{
if (aItemList[a] == MK[b].code)
{
Add = false;
}
}
//계좌 잔고에 보유중인 종목 제외
Account1.SetBalance(aItemList[a],0);
if (Account1.Balance.count > 0)
Add = false;
//종목객체로 만들어 지지 않았고 잔고에 없는 종목으로 선정하여
//요청리스트에 저장
if (Add == true && MKList.length < 최대매수종목수-MK.length)
{
MKList.push(aItemList[a]);
}
}
}
}
Main.MessageList("주문할 종목수:",MKList.length);
//요청할 종목이 없고
if (MKList.length == 0)
{
//종목객체가 최대매수종목수 미만이면 1번 타이머 재셋팅
if (MK.length < 최대매수종목수)
{
//1번 타이머, 60초
Main.SetTimer(1, 6000);
}
else
{
//종목객체가 최대매수종목수와 같으면 메세지 출력하고 종료
Main.MessageList("최대종목수 도달 검색종료");
}
}
else //요청할 종목이 있으면
{
//요청리스트의 첫종목 부터 종목객체 요청(배열이므로 종목코드가 0번방 부터 존재)
req = 0;
Main.MessageList(req,"종목객체요청",MKList[req]);
Main.ReqMarketData(MKList[req]);
}
}
}
//요청한 종목객체가 만들어 지먼
function Main_OnRcvMarketData(MarketData)
{
//직전 요청한 종목이 맞는지 확인후에
if (MarketData.code == MKList[req])
{
Main.MessageList(req,"종목객체생성",MarketData.code);
//종목객체는 MK에 추가하고
MK.push(MarketData);
//기본종목셋팅(종목코드지정, 5분 5000개, 갭보정안함, 수정주가처리 안함)
var ChartSet = new ReqChartItem(MKList[req],1,CHART_PERIOD_MINUTE, 5000, CHART_REQCOUNT_BAR, false, false);
//시스템 셋팅(시스템명 지정)
var SysSet = new SystemInfo("#test");
//지정한 차트셋팅과 시스템 셋티응로 차트 요청
Main.ReqChartEx(ChartSet, SysSet);
}
}
function Main_OnRcvChartEx(ChartEx)
{
if (ChartEx.GetCode(1) == MKList[req])
{
CT.push(ChartEx);
//요청횟수 1증가
req = req+1;
//요청횟수가 요청할 종목갯수보다 작으면 다음 종목객체 요청
if (req < MKList.length)
{
Main.MessageList(req,"종목객체요청",MKList[req]);
var XX = Main.ReqMarketData(MKList[req]);
//종목객체 생성제한
if (XX == -1)
{
//2번 타이머 15초
Main.SetTimer(2,15000);
}
}
else //요청횟수가 요청할 종목갯수에 도달했으면 종목객체 생성 종료
{
Main.MessageList(req,"종목객체생성끝");
//최대매수종목수에 도달하지 않았으면 종목검색을 위해 타이머 재셋팅
if (MK.length < 최대매수종목수)
{
Main.SetTimer(1,6000);
}
else
{
//최대매수종목수를 채웠으면 검색 종료
Main.MessageList("최대종목수 도달 검색종료");
}
}
}
}
function Main_OnRiseSignal(ChartEx, Signal)
{
for (var i = 0; i < CT.length; i++)
{
if (ChartEx.GetCode(1) == CT[i].GetCode(1))
{
if (Signal.signalKind == 1)
{
//매수주문가격
var OP = MK[i].Ask(1);
//수량
var OV = Math.floor(매수금/OP);
Account1.OrderBuy(MK[i].code,OV,OP,0);
Main.MessageList(req,"매수주문",MK[i].code,OV,OP);
}
if (Signal.signalKind == 2)
{
Account1.SetBalance(MK[i].code,0);
if (Account1.Balance.count > 0)
{
//매수주문가격
var XP = MK[i].Bid(1);
//수량
var XV = Account1.Balance.count;
Account1.OrderSell(MK[i].code,XV,XP,0);
Main.MessageList("매도주문",MK[i].code,XV,XP);
}
}
}
}
}
즐거운 하루 되세요