커뮤니티

예스스팟 Q&A

답변완료

안녕하세요. 요청드립니다.

안녕하세요. 예스스팟 입문하려고 자바스크립트 기초서적 보고 있는데, 제가 처음부터 만들기에는 쉽지않아 보여 요청드려 봅니다. 요청내용이 많아 보이는데, 혹시 전부 제공해주시기 어려우시다면 전체적인 뼈대만 이라도 부탁드립니다. 감사합니다. 매수 시간: 9:00:00 ~ 9:30:00 대상: 파워검색으로 검색된 종목순으로 최대 10종목을 실시간 (시장가)매수 투입금액: 종목당 매수금액은 계좌잔고금액의 10% 매수제한: 당일 계좌내 매매이력있는 종목 매수제한(손절/익절 종목 재매수 금지) 매도 시간: 9:00:00 ~ 11:00:00 익절손절: 익절 3% 해당종목(시장가)매도, 손절 3% 해당종목(시장가)매도 계좌청산: 당일 계좌잔고의 1% 이상 이익시 매수된 종목 전체(시장가)청산 시간청산: 11:00:00에 매수된 종목 전체(시장가)청산
프로필 이미지
강지
2021-04-21
2684
글번호 225472
답변완료

조회대상종목이 아닙니다

항상 수고 많으십니다. 기존에 매매한 종목을 엑셀이나 데이터베이스에 저장해서 장 시작전에 종목객체를 생성하고 있습니다 종목합병의 이슈에 의해서 기존의 종목코드가 없어지게 되는 경우가 있는데요 이러한 경우 종목객체의 생성이 되지 않습니다. 이를테면 동성화학 같은경우는 종목합병에 의해서 종목코드가 없어진 경우인데요. 다음과 같은 에러메세지가 생성되고 다른종목도 덩달아 종목객체 생성이 되지 않으며 수식이 먹통이 됩니다. TypeError : "005190"는 조회대상종목이 아닙니다. 이를 일일이 확인 할 수 없는 상황인데요 이를 피해갈 수 있는 수식을 부탁 드립니다.
프로필 이미지
재령
2021-04-16
2684
글번호 225465
답변완료

수식부탁합니다.

안녕하세요 많은 도움 받고있습니다. 당일 콜,풋 양매도한 전량을 종목에 상관없이 당일 15시 5분에 콜풋 모두 청산하는 식 원합니다. 아래 식은 전일 양매도한 걸 당일 15시 5분에 청산하는식이나 정상작동되지 않습니다. var CallOrderCode,PutOrderCode; var Entry, Exit; function Main_OnStart() { Entry = false; Exit = false; Main.SetTimer(1, 5000); } function Main_OnTimer(nEventID) { if (nEventID <= 1) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //15시 10분 if (Entry == false && HHMMSS >= 151000 ) { Entry = true; //차트가 매수유지봉 if (Chart1.GetOpenContracts() > 0) { Main.MessageList("--------------------------------------------"); Main.MessageList("매수신호유지"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; ================================ 중략 ======================================== { Account1.OrderSell(CallOrderCode, 1, 0, 1); Account1.OrderSell(PutOrderCode, 1, 0, 1); Main.SetUserValue("CallOrderCode", CallOrderCode); Main.SetUserValue("PutOrderCode", PutOrderCode); } } } //15시 5분 if (Exit == false && HHMMSS >= 150500 ) { Exit = true; //내부파일의 값을 가져와 변수에 저장 var PreDayCall = Main.GetUserValue("CallOrderCode"); var PreDayPut = Main.GetUserValue("PutOrderCode"); //PreDayCall에 값이 있으면 if (PreDayCall != "") { //잔고셋팅후 매도포지션이면 청산하고 //내부파일의 값을 빈공간으로 만듬 Account1.SetBalanceItem(PreDayCall,0) if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, 0, 1); Main.SetUserValue("CallOrderCode", ""); } } //PreDayPutl에 값이 있으면 if (PreDayPut != "") { //잔고셋팅후 매도포지션이면 청산하고 //내부파일의 값을 빈공간으로 만듬 Account1.SetBalanceItem(PreDayPut,0) if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, 0, 1); Main.SetUserValue("PutOrderCode", ""); } } //모두 수행후 값을 빈공간으로 만듬 Main.SetUserValue("CallOrderCode", ""); Main.SetUserValue("PutOrderCode", ""); }
프로필 이미지
팡팡
2021-04-14
2899
글번호 225464

팡팡 님에 의해서 삭제되었습니다.

프로필 이미지
팡팡
2021-04-14
2
글번호 225463
답변완료

금액 기준 수량

외부입력변수 EntryVol에 기입한 금액에 따른 주식 수량(Vol)을 매수하는 식을 작성하였는데, 수량을 입력시키라는 에러 메시지와 함께 매수 주문이 안나가네요. 아래의 스팟 검토 부탁드립니다. var BL = [],req; var CT = [],MK = []; function Main_OnStart() { //처음 시작시 step은 0 step = 0; //시작시점의 보유종목수 var num = Account1.GetTheNumberOfBalances(); //보유종목이 1개 이상이면 보유종목의 종목코드를 BL변수에 순차적으로 저장 if (num > 0) { BL = []; for(var i = 0 ; i < num ; i++) { Account1.SetBalance(i); BL.push(Account1.Balance.code); } Main.MessageList("BL : ",BL); if (BL.length >= 1) { req = 0; var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 100000, // 최대진입수량 10); // 최대진입횟수 var ChartSet = new ReqChartItem(BL[req],5,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,false); var SymSet = new SystemInfo("[현물]WayPointStock01_H_Signal",YL_TYPE_NORMAL,null,TradeSet); Main.ReqChartEx(ChartSet, SymSet); Main.MessageList("차트객체요청 :",BL[req]); } } else //보유종목이 없으면 바로 1분 타이머 시작 { Main.MessageList("보유종목없음"); Main.SetTimer(1, 10000);//1번 타이머, 60초 } } function Main_OnRcvChartEx(ChartEx) { if (ChartEx.GetCode(1) == BL[req]) { Main.MessageList("차트객체생성 :",ChartEx.GetCode(1)); CT.push(ChartEx); Main.ReqMarketData(BL[req]); Main.MessageList("종목객체요청 :",BL[req]); } } function Main_OnRcvMarketData(MarketData) { if (MarketData.code == BL[req]) { Main.MessageList("종목객체생성 :",MarketData.code); MK.push(MarketData); req = req+1; if (req < BL.length) { var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 100000, // 최대진입수량 10); var ChartSet = new ReqChartItem(BL[req],5,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,false); var SymSet = new SystemInfo("[현물]WayPointStock01_H_Signal",YL_TYPE_NORMAL,null,TradeSet); Main.ReqChartEx(ChartSet, SymSet); Main.MessageList("차트객체요청 :",BL[req]); } else { Main.SetTimer(1, 10000);//1번 타이머, 60초 Main.MessageList("보유종목차트생성완료",CT.length,MK.length); } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { //타이머 종료 Main.KillTimer(1); Main.ReqPowerSearch("PSearch"); } } function Main_OnRcvItemList(aItemList, nCount) { //검색된 종목이 없으면 if (nCount == 0) { //타이머 다시 셋팅 Main.SetTimer(1, 100000);//1번 타이머, 60초 } //검색된 종목이 있으면 if (nCount >= 1) { //검색된 종목과 기존 만든 차트들의 종목코드를 비교해 //차트가 만들어 지지 않은 종목이면 BL변수에 종목코드 추가 BL = []; for(var i = 0 ; i < aItemList.length ; i++) { var add = true; for(var z = 0 ; z < CT.length ; z++) { if (aItemList[i] == CT[z].GetCode(1)) { add = false; break; } } if (add == true) { BL.push(aItemList[i]); } } Main.MessageList("BL : ",BL); //차트 생성해야할 종목이 있으면 차트요청 if (BL.length >= 1) { req = 0; //차트 요청 var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 100000, // 최대진입수량 10); var ChartSet = new ReqChartItem(BL[req],5,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,false); var SymSet = new SystemInfo("[현물]WayPointStock01_H_Signal",YL_TYPE_NORMAL,null,TradeSet); Main.ReqChartEx(ChartSet, SymSet); } else //없으면 타이머 다시 셋팅 { Main.SetTimer(1, 100000);//1번 타이머, 60초 } } } //생성된 차트들에서 신호가 발생하면 function Main_OnRiseSignal(ChartEx, Signal) { //매수신호 발생 if (Signal.signalKind == 1) { //EntryVol 금액 시장가 매수 var Vol = Math.floor(EntryVol/Signal.price); Account1.OrderBuy(Signal.code, Vol,Signal.price,1); } //매수청산신호 발생 if (Signal.signalKind == 2) { //잔고셋팅 Account1.SetBalance(Signal.code,0); //보유수량이 있으면 if (Account1.Balance.count > 0) { //전량 시장가 매도 Account1.OrderSell(Signal.code, Account1.Balance.count,Signal.price,1); } } }
프로필 이미지
몬스터
2021-04-06
3030
글번호 225460
답변완료

단기과열 종목 알 수 있는 방법 문의

하이투자증권 YES TRADER를 사용중입니다. 4/5일 한화투자증권은 단기과열종목으로 지정되어 30분마다 단일가 거래를 하였는데요. 단기과열 종목으로 지정되어 즉각적으로 매매를 못하고, 30분 단일가 거래를 하는 종목을 Yes Spot 에서 어떻게 하면 판단할 수 있을까요? 이런 종목들은 거래를 하지 않고, 다른 종목들로 거래를 하려고 합니다. - YES TRADER의 [3202]파워종목검색의 설정 항목에는 단기과열종목 체크박스가 없습니다. - 차트 객체를 불러와서 봉의 시간 간격을 구하는 방법 말고 좀 더 간편하게 알 수 있는 방법은 없을까요?
프로필 이미지
브라이언7
2021-04-06
3035
글번호 225459

영원한자유 님에 의해서 삭제되었습니다.

프로필 이미지
영원한자유
2021-04-04
15
글번호 225458
답변완료

스팟에서 시스템의 손절,익절 신호 문의

안녕하세요. 스팟에서 확장차트객체에 이미 만들어진 시스템을 로딩해서 시스템 안에서 손절, 익절을 처리하려고 합니다. 시스템의 손절, 익절 신호도 스팟에서 OnRiseSignal 이벤트가 발생하나요?
프로필 이미지
브라이언7
2021-03-31
2800
글번호 225456
답변완료

미청산 부분 엑셀추출

지표로 진입과 청산 수식을 짜서 적용하고 있습니다. 차트에서 진입과 청산이 이루어지면 엑셀로 데이터가 추출되는데 차트상 진입은 있고 청산이 이루어지지 않는 부분은 아예 그어떤것도 데이터가 추출되지 않아서요. 청산되지 않은 진입에 관하여 진입시기와 기준가 정도만 기록하여 "미청산"이라는 표기로 엑셀로 데이터 추출을 하고 싶은데 혹시 안되는 이유가 무엇인지 알 수 있을까요? 아래 수식 올려드립니다. var Log = new Logger(true); var gData = []; var gName; function Main_OnStart() { Log.log("===================== Main_OnStart ====================="); var i; try { for(i = 0 ; i < 10000000 ; i++) { var date = Chart1.GetSDate(1, i); var time = Chart1.GetSTime(1, i); var barDateTime = makeDateTimeStr(date, time, true); // Log.log('일시 : ', dateTime, ', ', i, '봉전 종가 = ', Chart1.GetClose(1, i)); if(Chart1.GetIndicatorData(지표명, 1, i) < 0) continue; var data = new Data(); data.read(i, barDateTime); gData.push(data); } } catch(e) { Log.log('stopped, i = ', i, ', e => ', e); } var code = Main.GetOrderCode(Chart1.GetCode(1)); Main.ReqMarketData(code, 0, 0); Log.log('Main_OnStart, code = ', code); } function Main_OnRcvMarketData(MarketData) { Log.log('Main_OnRcvMarketData, code = ', MarketData.code, ', name = ', MarketData.name); Excel1.Clear(1, 'A1', 'Z5000'); Excel1.SetArrayToRow(1, 'A1', ['기록봉', '종목', '분봉', '일시', '방향', '기준가', '고가/저가', '되돌림%', '벌어진값', '봉갯수', '청산가']); var name = MarketData.name; gName = name; var j = 2; for(i = gData.length - 1; i >= 0 ; i--) { var d = gData[i]; var isUpS = d.isUp ? '상승' : '하락'; // if(d.isEnter) Excel1.SetArrayToRow(1, 'A' + j, [d.barDateTime, name, d.barInterval + '분', d.dateTime, isUpS, '진입', '', '', '', '']); // else Excel1.SetArrayToRow(1, 'A' + j, [d.barDateTime, name, d.barInterval + '분', d.dateTime, isUpS, d.standard, d.base, d.retrace + '%', d.tick, d.barCnt, d.exit]); if(d.isEnter) continue; Excel1.SetArrayToRow(1, 'A' + j, [d.barDateTime, name, d.barInterval + '분', d.dateTime, isUpS, d.standard, d.base, d.retrace + '%', d.tick, d.barCnt, d.exit]); j++; } writeUnexitedEnters(j); } function Data() { this.isEnter = false; this.date; this.time; this.isUp = true; this.standard; this.base; this.retrace; this.tick; this.barCnt; this.exit; this.dateTime; this.barDateTime; this.barInterval; Data.prototype.read = function(i, barDateTime) { this.isEnter = Chart1.GetIndicatorData(지표명, 1, i) == 1; this.date = Chart1.GetIndicatorData(지표명, 2, i); this.time = Chart1.GetIndicatorData(지표명, 3, i); this.isUp = Chart1.GetIndicatorData(지표명, 4, i) == 1; this.standard = Chart1.GetIndicatorData(지표명, 5, i).toFixed(소수자릿수); this.base = Chart1.GetIndicatorData(지표명, 6, i).toFixed(소수자릿수); this.retrace = Chart1.GetIndicatorData(지표명, 7, i).toFixed(0); this.tick = Chart1.GetIndicatorData(지표명, 8, i).toFixed(소수자릿수); this.barCnt = Chart1.GetIndicatorData(지표명, 9, i); this.exit = Chart1.GetIndicatorData(지표명, 10, i).toFixed(소수자릿수); this.barInterval = Chart1.GetIndicatorData(지표명, 11, i); this.dateTime = makeDateTimeStr(this.date, this.time, false); this.barDateTime = barDateTime; this.barCnt = this.barCnt == -2 ? '미청산' : this.barCnt; Log.log(i, ', ', this.isEnter, ', ', this.dateTime, ', ', this.isUp, ', ', this.standard, ', ', this.base, ', ', this.retrace, ', ', this.tick, ', ', this.barCnt, ', ', this.exit); } } function makeDateTimeStr(date, time, isChartDate) { var year = Math.floor(date / 10000); var date1 = date - year * 10000; var month = Math.floor(date1 / 100); var day1 = date1 - month * 100; var time = isChartDate ? Math.floor(time / 1000000) : time; var hour = Math.floor(time / 100); var minute = time - hour * 100; var dateTime = year + "-" + month + "-" + day1 + " " + hour + ":" + minute; return dateTime; } function writeUnexitedEnters(row) { Log.log('writeUnexitedEnters, 미청산 추가'); var enters = []; for(var i in gData) { var d = gData[i]; if(d.isEnter) { var isExited = false; for(var j in gData) { var t = gData[j]; if(i == j) continue; if(d.dateTime == t.dateTime) isExited = true; } if(!isExited) enters.push(d); } } for(var i in enters) { var d = enters[i]; var isUpS = d.isUp ? '상승' : '하락'; var rowN = Number(row) + Number(i); var rowS = 'A' + rowN; Log.log('row = ', row, ', i = ', i, ', rowN = ', rowN, ', rowS = ', rowS); Excel1.SetArrayToRow(1, rowS, ['', gName, d.barInterval + '분', d.dateTime, isUpS, '미청산', '', '', '', '']); // Excel1.SetArrayToRow(1, 'A' + j, [d.barDateTime, gName, d.barInterval + '분', d.dateTime, isUpS, d.standard, d.base, d.retrace + '%', d.tick, '미청산', d.exit]); } } //------------------------------------ Util -------------------------------------------------- function DateUtil() { this.startTime = 900; this.endTime = 1521; this.searchEndTime = 1515; this.now = new Date(); DateUtil.prototype.format = function(value) { return ('00' + value).slice(-2); } DateUtil.prototype.getTimeString = function() { return this.format(this.now.getHours()) + ':' + this.format(this.now.getMinutes()) + ':' + this.format(this.now.getSeconds()); } DateUtil.prototype.isAfter = function(time) { var HHMM = this.now.getHours() * 100 + this.now.getMinutes(); return HHMM >= time; } DateUtil.prototype.isBefore = function(time) { var HHMM = this.now.getHours() * 100 + this.now.getMinutes(); return HHMM <= time; } DateUtil.prototype.isAfterSearchTime = function() { return this.isAfter(this.searchEndTime); } DateUtil.prototype.isInSearchTime = function() { return this.isAfter(this.startTime) && !this.isAfterSearchTime() && this.isBefore(this.endTime); } DateUtil.prototype.isAfterEndTime = function() { return this.isAfter(this.endTime); } DateUtil.prototype.isMarketStarted = function() { return this.isAfter(900); } DateUtil.prototype.getDate = function() { return '' + (this.now.getYear() + 1900) + this.format(this.now.getMonth() + 1) + this.format(this.now.getDate()); } } function Logger(isOn) { this.DEBUG = isOn; this.log = function() { if(this.DEBUG) Main.MessageLog(this.makeString(arguments)); } this.msg = function() { Main.MessageLog(this.makeString(arguments)); } this.makeString = function(args) { var str = new DateUtil().getTimeString() + ', '; for(var i = 0; i < args.length; i++) { var arg = args[i]; if( isFinite(arg) ) { arg = ('' + arg).replace(/₩B(?=(₩d{3})+(?!₩d))/g, ","); } str += arg; } return str; } }
프로필 이미지
열라빠른거북이
2021-03-17
2748
글번호 225452
답변완료

전일 계좌조회를 하고 싶을때..

안녕하세요 1. 현재 NH선물을 이용하고 있습니다. 3월 15일이 오늘이고 3월 12일 전영업일 이었다면, 오늘의 총계정 자산가치는 A1.GetBalanceETCinfo(9)로 받아오면 되는데, 전날 3월 12일의 총계정 자산가치의 금액을 불러 들이고 싶을때 어떻게 적용해야할까요? 2. 예스글로벌에서 챠트 신호를 실시간으로 엑셀로 불러 들인다음, 예스트레이터 예스스팟으로 실시간으로 찍히는 엑셀신호를 읽어들여 국내주식을 주문해보려고 합니다. 예스글로벌 신호를 엑셀로 저장하는거 까지는 진행이 되었는데, 예스트레이더에서 엑셀을 부르는 과정에서 엑셀파일이 '읽기전용'으로 불러져서 실시간 신호를 읽을 수 없습니다. 엑셀에 실시간으로 찍히는 신호를 보고 예스트레이더로 주문을 어떻게 넣어야 하는지 궁금합니다. 미리 감사드립니다.
프로필 이미지
왕왕
2021-03-20
2896
글번호 225450