커뮤니티

예스스팟 Q&A

답변완료

확장챠트를 요청해서 챠트가 생성되었을 때 봉이 몇개나 왔는 지 확인하는 방법?

ReqChartItem에서 요청한 봉의 갯수가 5천개여도 만에 하나 5천개가 안되는 봉이 오면 ChartEx객체에서 GetClose로 봉 갯수를 넘어서는 위치를 읽으려할때 에러가 날 것 같아서 봉의 갯수가 몇개나 왔는 지를 확인하는게 실시간 에러를 방지하는데 도움이 될 것 같은데, 그걸 어떻게 확인하는 지 아무리 뒤져봐도 방법을 못찾겠습니다. 그냥 5천개를 요청했으면 5천개가 왔다고 가정하고 index를 4999까지 써도 무방할지 아니면 데이타가 존재하지 않는 곳을 getclose같은 호출할 때 리턴되는 에러코드라던가, 어떻게 하는게 안전하게 코드를 작성하는 방법이 될까요?
프로필 이미지
온고지신
2026-01-09
63
글번호 229667

온고지신 님에 의해서 삭제되었습니다.

프로필 이미지
온고지신
2026-01-09
4
글번호 229665

온고지신 님에 의해서 삭제되었습니다.

프로필 이미지
온고지신
2026-01-06
29
글번호 229618

관리자에 의해 예스랭귀지 QnA로 이동되었습니다.

프로필 이미지
파워
2026-01-04
12
글번호 229555
0
답변완료

야간옵션

아래수식은국내 옵션 주간 거래수식입니다. - 수식 내용 084500에 15분간 변동성 체크하고 090000 거래시작 익절,손절,151500에 endofday 작동 야간거래에 사용할 수 있도록 수정바랍니다. 1. 첫번째 요청수식 오후6시에 15분간 변동성 체크하고 오후6시15분 거래시작 익절,손절, 새벽2시 endofday 작동 2. 두번째 요청수식 오후10시에 15분간 변동성 체크하고 오후10시15분 거래시작 익절,손절, 새벽5시 endofday 작동항상 고맙습니다.*********************************************************************************************************************************var ID1, ID2, num1, num2;var Entry, CallCode, PutCode;var Xv1, Xv2;var HasExited; // 청산 후 재진입을 방지하는 변수var VolatilityCheckPassed; // 변동성 필터 확인 변수var InitialSum, FinalSum; // 양합 체크용 변수var a, b; // 양합var FilterTimePassed; // 필터 시간이 지났는지 여부var HasSoldCall = false; // 콜 옵션 매도 여부var HasSoldPut = false; // 풋 옵션 매도 여부function Main_OnStart() { Main.MessageList("Start"); Main.SetTimer(1, 5000); // 기존 타이머 설정 (5초 간격) Main.SetTimer(2, 1000); // 청산을 위한 타이머 설정 (1초 간격) Main.SetTimer(3, 1000); // 변동성 필터용 타이머 설정 (1초 간격) Entry = 0; // 초기 Entry 값 설정 HasExited = false; // 초기 재진입 가능 상태 VolatilityCheckPassed = false; // 변동성 필터 초기화 InitialSum = null; // 초기 양합값 초기화 FinalSum = null; // 최종 양합값 초기화 a = null; // a양합 초기화 b = null; // b양합 초기화 FilterTimePassed = false; // 필터 시간이 지났는지 여부}function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds(); if (nEventID == 3) { // 변동성 필터 확인 타이머 설정 if (HHMMSS == 084500) { // 084500 양합값 기록 a = Option1.GetCurrent(0, 0) + Option1.GetCurrent(1, 0); } else if (HHMMSS == 085959) { // 085959 양합값 기록 b = Option1.GetCurrent(0, 0) + Option1.GetCurrent(1, 0); if (a !== null && b !== null) { // 양합 차이 계산 var sumDifference = a - b; // 변동성 high 시장으로 판단 if (sumDifference >= 999) { Main.MessageList("Market volatility is low. Skipping trading."); VolatilityCheckPassed = true; // 변동성 필터 통과 } } } // 필터 시간이 지났는지 체크 if (HHMMSS >= 090000) { // 09시 00분부터 거래 가능 FilterTimePassed = true; } } if (nEventID == 1 && !HasExited) { // 재진입 방지 조건 추가 if (HHMMSS >= 084500 && HHMMSS < 150000) { // 0845부터 1500까지 if (FilterTimePassed) { var callPrice = Option1.GetCurrent(0, 0); var putPrice = Option1.GetCurrent(1, 0); var sum = callPrice + putPrice; var diff = Math.abs(callPrice - putPrice); // 진입 조건 if (Entry == 0 && sum <= 999 && diff <= 2.00 && !VolatilityCheckPassed) { Entry = sum; CallCode = Option1.GetATMCallRecent(0); PutCode = Option1.GetATMPutRecent(0); ID1 = Account1.OrderBuy(CallCode, 1, Option1.GetAsk(CallCode, 5), 0); ID2 = Account1.OrderBuy(PutCode, 1, Option1.GetAsk(PutCode, 5), 0); Xv1 = 1; Xv2 = 1; // 진입 성공 시 메시지 Main.MessageList("Trade entry successful. Market volatility is high. Trading ON."); } } if (Entry > 0 && HHMMSS < 151500 && (Option1.GetCurrent(CallCode)+Option1.GetCurrent(PutCode) >= Entry+999) || (Option1.GetCurrent(CallCode)+Option1.GetCurrent(PutCode) <= Entry-1.00)) { // 청산 로직 if (Xv1 > 0 && !HasSoldCall) { Account1.SetUnfill(num1); if (Account1.Unfill.count > 0) { Xv1 = Xv1 - Account1.Unfill.count; Account1.OrderCancel(num1); } Account1.OrderSell(CallCode, Xv1, Option1.GetBid(CallCode, 5), 0); HasSoldCall = true; // 콜 옵션 매도 완료 Main.MessageList("Call option sold."); } if (Xv2 > 0 && !HasSoldPut) { Account1.SetUnfill(num2); if (Account1.Unfill.count > 0) { Xv2 = Xv2 - Account1.Unfill.count; Account1.OrderCancel(num2); } Account1.OrderSell(PutCode, Xv2, Option1.GetBid(PutCode, 5), 0); HasSoldPut = true; // 풋 옵션 매도 완료 Main.MessageList("Put option sold."); } // Entry = 0; // 필요한 경우에만 주석 해제 Main.KillTimer(1); } } } // 1515에 청산 로직 추가 if (Entry > 0 && HHMMSS >= 151500) { Main.MessageList("Clearing orders"); if (Xv1 > 0 && !HasSoldCall) { Account1.SetUnfill(num1); if (Account1.Unfill.count > 0) { Xv1 = Xv1 - Account1.Unfill.count; Account1.OrderCancel(num1); } Account1.OrderSell(CallCode, Xv1, Option1.GetBid(CallCode, 5), 0); HasSoldCall = true; // 콜 옵션 매도 완료 Main.MessageList("Call option sold."); } if (Xv2 > 0 && !HasSoldPut) { Account1.SetUnfill(num2); if (Account1.Unfill.count > 0) { Xv2 = Xv2 - Account1.Unfill.count; Account1.OrderCancel(num2); } Account1.OrderSell(PutCode, Xv2, Option1.GetBid(PutCode, 5), 0); HasSoldPut = true; // 풋 옵션 매도 완료 Main.MessageList("Put option sold."); } Main.KillTimer(1); }}function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == ID1) { num1 = OrderResponse.orderNum; } if (OrderResponse.orderID == ID2) { num2 = OrderResponse.orderNum; }}
프로필 이미지
좌오비우오비
2026-01-03
76
글번호 229548
답변완료

문의 합니다...

26년 병오년 새해 복 많이 받으세요....^^*한가지 문의 사항이 있어서 질의 합니다..예스스팟에서 종목이 검색되어서 자동매매가 이루어지는데, 종목이 검출되면 전략실행차트와 종목이 연동이 되는 방법이 었는지요?
프로필 이미지
서민순
2026-01-02
72
글번호 229542

온고지신 님에 의해서 삭제되었습니다.

프로필 이미지
온고지신
2026-01-02
40
글번호 229514
답변완료

수식 부탁드립니다.

스팟문의는 예스스팟 Q&A에 올려 주시기 바랍니다.스팟은 기본적으로 저희가 완성식을 작성해 드리지는 않습니다.질문 올리신면 가이드식으로 답변드리며 답변받으시는데 시간이 좀 걸리실 수 있습니다.안녕하세요. 이 수식어에 분할 매수 수식어가 필요합니다. 부탁드립니다.보유종목 중 마이너스에 매수하기1차매수후- 신규종목2차매수- -3%3차매수- -5%4차매수- -8%+3% 전량익절보유종목중 2.3.4차에 도달하지 않았더라도 +3% 익절시 전량 매도var timer5 = 2; // 2초var 매수금 = 500000;var OrderList = [];var MKList = [];var req;function Main_OnStart(){Main.SetTimer(1, timer5*1000);MKList =[];}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 > 090300 && HHMMSS < 151500){ Main.ReqPowerSearch("test");}if (nEventID == 2){ Main.ReqMarketData(OrderList[req]);}}function Main_OnRcvItemList(altemList, nCount){Main.KillTimer(1);OrderList = [];if (nCount >= 1){ if (MKList.length == 0) { OrderList = altemList; } else { for (var a = 0; a < nCount; a++) { var Add = true; for (var b = 0; b < MKList.length; b++) { if (altemList[a] == MKList[b].code) { Add = false; } } if (Add == true && !IsStockInAccount(altemList[a])) { OrderList.push(altemList[a]); } } }}if (OrderList.length == 0){Main.SetTimer(1, timer5*1000);}else{req = 0;Main.ReqMarketData(OrderList[req]);}}function Main_OnRcvMarketData(MarketData){if (MarketData.code == OrderList[req]){MKList.push(MarketData); if (!IsStockInAccount(MarketData.code)) { //Account1.OrderBuy(MarketData.code,1,0,2); // Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(1)),0,1); Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(5)),MarketData.Ask(5),0); Main.MessageList(MarketData.code + " 주식을 매수합니다.");} else {Main.MessageList( MarketData.code + " 주식은 이미 계좌에 있으므로 매수하지 않습니다.");}req = req+1;if (req < OrderList.length){var aa = Main.ReqMarketData(OrderList[req]);if (aa == -1){Main.SetTimer(2, 15000);}}else{Main.SetTimer(1, timer5*1000);}}}function IsStockInAccount(stockCode) {var numberOfBalances = Account1.GetTheNumberOfBalances();for (var i = 0; i < numberOfBalances; i++) {Account1.SetBalance(i);if (stockCode == Account1.Balance.code) {return true; }}return false; }
프로필 이미지
치치야
2025-12-31
124
글번호 229512
답변완료

문의 드립니다

특정 종목으로 관심종목을 만들고 관심종목만으로 예스스팟으로 실시간 매매 가능한지요예를 들어 10종목으로 관심종목 만들고 파워검색으로 macd (12,26,9) 골든크로스 매수데드크로스 매도하는 파워검색식을 만들어 일정간격(10초)으로 해댱되는 관심종목(10종목)만예스스팟 매매 하고 싶은데 가능한 방법 문의 드립니다.
프로필 이미지
미래테크
2026-01-01
60
글번호 229497

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

프로필 이미지
다올
2025-12-26
1
글번호 229372