예스스탁
예스스탁 답변
2026-01-08 10:03:39
안녕하세요
예스스탁입니다.
1
우선 아래 종목검색식을 작성해서
사용자검색조건으로 저장하신 후에 스팟식 이용하셔야 합니다.
아래식을 MACD 골든크로스, 데드크로스를 검색하는 식이고
골드이면 결과값으로 1, 데드크르스이면 결과값으로 -1을 리턴합니다.
스팟에서는 종목검색 후에 검색된 종목이 관심그룹이 있고
이 결과값이 1이면 매수, -1이면 매도를 하게 됩니다.
Input : shortPeriod(12), longPeriod(26), Period(9);
var : T(0);
var1 = MACD(shortPeriod, longPeriod);
var2 = ema(var1, Period);
if CrossUp(var1,var2) Then
T = 1;
else if CrossDown(var1,var2) Then
T = -1;
Else
T = 0;
Find(T);
2
스팟 수식은 가이드입니다.
수식내 주석등 참고하시기 바랍니다.
스크립트 객체 설정
계좌객체 추가 --> 속성에서 객체명 Account1, 주문낼 계좌번호 지정
var 관심그룹명 = "관심4";
var 검색명 = "테스트";
var 타이머 = 10;
var 매수금 = 10000000;
var iList = [];
var MK = [],OD = [];
var req;
//스팟 시작
function Main_OnStart()
{
var d = new Date();
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//지정한 관심그룹의 종목들에 대해 iList 배열변수에 차례대로 종목코드 저장
var inum = Main.GetItemCountOfInterest(관심그룹명);
if (inum > 0)
{
for (var i = 0; i < inum; i++)
{
iList.push(Main.GetItemCodeInInterest(관심그룹명, i));
}
Main.MessageList(HHMMSS,"|관심종목:",iList);
//주문시 사용할 호가정보를 알기 위해 종목객체 요청
req = 0;
Main.MessageList(HHMMSS,"|종목객체요청:",iList[req]);
Main.ReqMarketData(iList[req]);
}
else
{
Main.MessageList(HHMMSS,"|관심그룹 종목없음");
}
}
function Main_OnRcvMarketData(MarketData)
{
var d = new Date();
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (MarketData.code == iList[req])
{
//종목객체가 생성되면 종목객체는 MK 배열변수에 차례대로 저장
Main.MessageList(HHMMSS,"|종목객체생성:",MarketData.code);
MK.push(MarketData);
OD.push(0);
req = req+1;
if (req < iList.length)
{
Main.MessageList(HHMMSS,"|종목객체요청",iList[req]);
var aa= Main.ReqMarketData(iList[req]);
//종목객체 생성제한이 걸리면 15초 뒤에 다시 요청
if( aa == -1 )
{
Main.SetTimer(2, 15000);
}
}
else
{
//종목객체 생성이 모두 완료되면 1번 타이머 10초 셋팅
Main.MessageList(HHMMSS,"|관심종목-종목객체생성끝");
Main.SetTimer(1, 타이머*1000);
}
}
}
function Main_OnTimer(nEventID)
{
var d = new Date();
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//1번 타이머가 9시~15시15분 사이에 동작하면
if(nEventID == 1 && HHMMSS > 90000 && HHMMSS < 151500)
{
//종목검색 실행
Main.MessageList(HHMMSS,"|종목검색 실행");
Main.ReqPowerSearch(검색명);
}
if(nEventID ==2)
{
Main.KillTimer(2);
Main.ReqMarketData(iList[req]);
}
}
//종목검색완료
function Main_OnRcvItemList(aItemList, nCount, aValues)
{
var d = new Date();
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
Main.MessageList(HHMMSS,"|검색완료 -검색된종목수:",nCount);
//검색된 종목수가 1개 이상이면
if (nCount >= 1)
{
//검색된 종목과 관심그룹 종목을 비교해서
for (var a = 0; a < nCount; a++)
{
for (var b = 0; b < MK.length; b++)
{
//검색된 종목이 관심종목에 있을 때
if (aItemList[a] == MK[b].code)
{
//결과값이 1이면
if (aValues[a] == 1)
{
Account1.SetBalance(MK[b].code, 0);
//보유수량이 없고 오늘 매수한 경우가 없다면 매수
if (Account1.Balance.count == 0 && OD[b] != 1)
{
OD[b] = 1;
Main.MessageList("매수");
var vol = Math.floor(매수금/MK[b].Ask(3))
Account1.OrderBuy(MK[b].code,vol,MK[b].Ask(3),0);
}
}
//결과값이 -1이면
if (aValues[a] == -1)
{
Account1.SetBalance(MK[b].code, 0);
//보유수량이 있고 오늘 매도한 경우가 없다면 전량 매도
if (Account1.Balance.count > 0 && OD[b] != -1)
{
OD[b] = -1;
Main.MessageList("매도");
Account1.OrderSell(MK[b].code,Account1.Balance.count,MK[b].Bid(3),0);
}
}
}
}
}
}
}
즐거운 하루 되세요