커뮤니티

문의 드립니다

프로필 이미지
미래테크
2026-01-01 13:57:14
47
글번호 229497
답변완료

특정 종목으로 관심종목을 만들고 관심종목만으로 예스스팟으로 실시간 매매 가능한지요


예를 들어 10종목으로 관심종목 만들고 파워검색으로 macd (12,26,9) 골든크로스 매수


데드크로스 매도하는 파워검색식을 만들어 일정간격(10초)으로 해댱되는 관심종목(10종목)만


예스스팟 매매 하고 싶은데 가능한 방법 문의 드립니다.

답변 1
프로필 이미지

예스스탁 예스스탁 답변

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); } } } } } } } 즐거운 하루 되세요