커뮤니티

예스스팟 Q&A

답변완료

예스스팟 모의투자 - 장중에만 "파일을 열 수 없습니다" 에러 반복

제목[6131] 예스스팟 모의투자 - 장중에만 "파일을 열 수 없습니다" 에러 반복 (5개 전략 중 특정 전략만, 간헐적)내용안녕하세요, [6131] 예스스팟 모의투자 사용 중 반복되는 에러 관련 문의드립니다.■ 증상[6131] 예스스팟에서 5개 전략을 동시 실행 중입니다. 각 전략은 [3202]PowerSearch의 서로 다른 검색식을 참조합니다. 이 중 특정 전략들에서"파일을 열 수 없습니다" 에러가 반복 발생하고, 나머지 1개 전략은항상 정상 작동합니다.■ 발생 시점 (핵심)이 에러는 장중(실시간 시세가 유입되는 동안)에만 발생합니다.장 마감 후 동일한 전략을 다시 실행하면 에러 없이 정상적으로 열립니다.또한 어떤 날은 5개 전략이 모두 정상 작동하고, 어떤 날은 그 중 3~4개가실패하는 등 실패 개수와 대상이 날마다 달라집니다(간헐적/비결정적).파일 자체가 없거나 손상된 게 아니라, 장중 실시간 처리 상황에서만나타나는 간헐적 증상으로 보입니다.■ 시도한 조치 (전부 실패)1. Main_OnTimer에서 KillTimer(1) → ReqPowerSearch → OnPowerSearchFinished에서 SetTimer 재시작하는 패턴 적용 (귀사 Q&A 게시글 165216, 공식 예제12와 동일 구조로 확인 후 적용) → 에러 재발2. [3202] PowerSearch에 저장된 검색식 이름과 예스스팟 코드 내 검색식 참조명을 전수 대조하여 정확히 일치함을 확인 → 에러 재발3. [최소재현 실험] 정상 작동하는 전략의 코드를 100% 그대로 복사하고 참조하는 검색식 이름만 다른 검색식으로 변경한 테스트 슬롯을 생성 → 동일 에러 재현됨■ 코드 비교에서 확인된 사실 (참고용)정상 작동하는 전략과 에러가 나는 전략의 코드를 줄 단위로 비교한 결과,핵심 로직(타이머 등록, PowerSearch 호출, 주문 처리 구조)은 동일하며예산/시간설정 등 파라미터 값만 다릅니다. 다만 두 가지 구조적 차이가있어 참고로 알려드립니다 (인과관계는 저희도 확신하지 못합니다):- 5개 전략이 모두 [3202] PowerSearch 실시간 조건검색 등록 시 동일한 화면번호를 사용하고 있습니다.- 일부 전략은 별도 타이머(청산 체크용)의 주기가 10초, 다른 일부는 600초로 다릅니다.■ 결론코드 자체는 문제가 없는 것으로 판단됩니다. 동일한 코드에서 참조하는검색식만 다르면 에러가 나고, 원래 검색식을 그대로 두면 안 납니다.그리고 이 에러는 장중에만, 그것도 날마다 다른 개수/대상으로 나며장마감후엔 안 납니다. 따라서 원인은 [3202] PowerSearch가 장중실시간으로 여러 전략의 요청을 동시에 처리하는 과정에서 발생하는것으로 추정됩니다.■ 문의사항1. 여러 개의 예스스팟 전략이 장중 실시간으로 [3202] PowerSearch의 서로 다른 검색식을 동시에 참조할 때, 서버 측 동시처리 한도나 리소스 경합으로 특정 검색식 접근이 실패할 수 있나요?2. 실시간 조건검색 등록 시 여러 전략이 동일한 화면번호를 공유하는 것이 문제가 될 수 있나요? 전략마다 화면번호를 분리해야 하나요?3. "파일을 열 수 없습니다" 에러가 구체적으로 어느 내부 파일/리소스를 열지 못하는 것인지 확인 가능한가요?4. 이런 증상의 알려진 원인이나 해결방법이 있다면 알려주시면 감사하겠습니다.첨부1: 에러 발생 화면 (장중)감사합니다.
프로필 이미지
스프릿
2026-07-30
40
글번호 233031

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

프로필 이미지
dbals
2026-07-30
19
글번호 233030

스프릿 님에 의해서 삭제되었습니다.

프로필 이미지
스프릿
2026-07-30
2
글번호 233029

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

프로필 이미지
dbals
2026-07-29
9
글번호 233025

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

프로필 이미지
dbals
2026-07-26
30
글번호 232982
답변완료

조건검색 요청 뒤 응답이 없습니다.

var SearchCode = "재미나이"; var TOTAL_LIMIT = 10000000; // 전체 투자 한도 (1,000만 원)var ORDER_AMOUNT = 1000000; // 1회 매수 금액 (100만 원)var isSearching = false; // 중복 검색 요청 방지 플래그var searchItems = []; // 검색된 종목 코드 리스트 저장var itemDataList = []; // 시세 데이터 수집 배열function Main_OnStart(){ // 5초마다 타이머 동작 (자동 매수 감시) Main.SetTimer(1, 5000); Main.MessageLog("===================================="); Main.MessageLog("★ 예스스팟 자동매매 시작 (변동성A 최근접 종목 시장가 매수 / 20% 익절)"); Main.MessageLog("====================================");}function Main_OnTimer(nEventID){ if (nEventID == 1) { // 계좌 평가 금액/사용 금액 계산 var currentUsed = GetTotalInvestedAmount(); // 100만 원 이상 매수 여력이 남아있고 검색 중이 아닐 때 조건검색 실행 if ((TOTAL_LIMIT - currentUsed >= ORDER_AMOUNT) && !isSearching) { isSearching = true; searchItems = []; itemDataList = []; Main.MessageLog("★ [조건검색 요청] 현재 사용금액: " + currentUsed + "원 / 남은한도: " + (TOTAL_LIMIT - currentUsed) + "원"); Main.ReqPowerSearch(SearchCode); } } // 시세 미수신으로 인한 무한 대기 방지용 타임아웃 (3초) if (nEventID == 2) { Main.KillTimer(2); ProcessBuyOrder(); }}// 파워종목검색 완료 이벤트function Main_OnPowerSearchFinished(nReturnCode){ if (nReturnCode == 1) { var itemCount = Main.GetSearchItemCount(); Main.MessageLog("-> 조건검색 완료: 총 " + itemCount + "개 종목 발견"); if (itemCount > 0) { for (var i = 0; i < itemCount; i++) { var itemCode = Main.GetSearchItemCode(i); // 이미 계좌에 보유 중인 종목은 제외 Account1.SetBalanceItem(itemCode, 0); if (Account1.Balance.count == 0) { searchItems.push(itemCode); Main.ReqMarketData(itemCode); } } // 3초 내에 시세 미수신 시 강제 처리 타임아웃 실행 Main.SetTimer(2, 3000); } else { isSearching = false; } } else { Main.MessageLog("-> [오류] 조건검색 실패 (검색식 명칭 확인 필요)"); isSearching = false; }}// 수신된 시세 데이터 수집 및 매수 조건 처리function Main_OnRcvMarketData(MarketData){ // ---------------------------------------------------- // 1. 조건검색 수신 데이터 처리 및 매수 로직 // ---------------------------------------------------- var isSearchTarget = false; for (var i = 0; i < searchItems.length; i++) { if (searchItems[i] == MarketData.code) { isSearchTarget = true; break; } } if (isSearchTarget) { // 중복 추가 방지 var isExist = false; for (var j = 0; j < itemDataList.length; j++) { if (itemDataList[j].code == MarketData.code) { isExist = true; break; } } if (!isExist) { itemDataList.push(MarketData); } // 검색된 모든 종목의 시세 수신이 완료되었을 때 if (itemDataList.length == searchItems.length && isSearching) { Main.KillTimer(2); // 타임아웃 타이머 해제 ProcessBuyOrder(); } } // ---------------------------------------------------- // 2. 실시간 20% 수익률 감시 및 익절 청산 // ---------------------------------------------------- Account1.SetBalanceItem(MarketData.code, 0); if (Account1.Balance.count > 0) { var avgCost = Account1.Balance.avgUnitCost; // 평균 단가 var currentPrice = MarketData.current; // 현재가 // +20% 이상 수익 시 청산 if (avgCost > 0 && currentPrice >= avgCost * 1.20) { Main.MessageLog("★ [20% 익절 청산] 종목: " + MarketData.code + " / 매수가: " + avgCost + " / 현재가: " + currentPrice); Account1.OrderSell(MarketData.code, Account1.Balance.count, 0, 1); // 시장가 매도 // 청산 완료 시 시세 객체 해제 Main.RemoveMarketData(MarketData); } }}// ★ [수정] 변동성기준선 A와 가장 가까운 종목 선별 후 시장가 즉시 매수function ProcessBuyOrder(){ if (itemDataList.length > 0 && isSearching) { var targetData = null; var minDiffRate = 999999; // 최소 이격률 초기화 var targetVolA = 0; // 검색된 종목들 중 현재가와 '변동성기준선 A' 가격 차이가 가장 적은 종목 탐색 for (var i = 0; i < itemDataList.length; i++) { var mData = itemDataList[i]; if (mData.current > 0 && mData.current > mData.limitDown) { var volPriceA = CalculateVolPriceA(mData); if (volPriceA > 0) { // 현재가와 변동성기준선 A 가격의 격차 비율 계산 (%) var diffRate = Math.abs(mData.current - volPriceA) / mData.current * 100; // 격차가 가장 적은 종목을 매수 타겟으로 선택 if (diffRate < minDiffRate) { minDiffRate = diffRate; targetData = mData; targetVolA = volPriceA; } } } } // 최종 선별된 변동성기준선 최근접 종목을 현재가(시장가)로 즉시 매수 if (targetData != null) { // 현재가 기준으로 매수 수량 연산 var buyQty = Math.floor(ORDER_AMOUNT / targetData.current); if (buyQty > 0) { Main.MessageLog("★ [최근접종목 시장가 매수] 종목: " + targetData.code + " / 현재가: " + targetData.current + " / 변동성A: " + targetVolA + " / 격차: " + minDiffRate.toFixed(2) + "% / 수량: " + buyQty + "주"); // ★ 시장가(구문: 종목코드, 수량, 가격:0, 주문구분:1=시장가) 주문 발주 Account1.OrderBuy(targetData.code, buyQty, 0, 1); } // 매수 타겟 제외 나머지 종목 시세 메모리 해제 for (var k = 0; k < itemDataList.length; k++) { if (itemDataList[k].code != targetData.code) { Main.RemoveMarketData(itemDataList[k]); } } } else { Main.MessageLog("-> [매수 스킵] 조건을 만족하는 매수 대상 종목이 없습니다."); for (var k = 0; k < itemDataList.length; k++) { Main.RemoveMarketData(itemDataList[k]); } } } isSearching = false;}// 변동성기준선 A 연산 함수function CalculateVolPriceA(MarketData){ var prevClose = MarketData.GetHistory(1, 0); // 전일 종가 var prevClose2 = MarketData.GetHistory(2, 0); // 전전일 종가 var prevHigh = MarketData.GetHistory(1, 1); // 전일 고가 var prevLow = MarketData.GetHistory(1, 2); // 전일 저가 var rawA = 0; if (prevClose > prevClose2) rawA = (prevHigh + prevLow + prevClose + prevHigh) / 2 - prevLow; else if (prevClose < prevClose2) rawA = (prevHigh + prevLow + prevClose + prevLow) / 2 - prevLow; else rawA = (prevHigh + prevLow + prevClose + prevClose) / 2 - prevLow; return rawA;}// 총 사용 금액 계산 함수function GetTotalInvestedAmount(){ var total = 0; var num = Account1.GetTheNumberOfBalances(); for (var i = 0; i < num; i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0) { total += (Account1.Balance.avgUnitCost * Account1.Balance.count); } } return total;}
프로필 이미지
용이
2026-07-24
57
글번호 232973
답변완료

예스스팟 프로그램을 어디서 다운로드 받을 수 있나요?

홈페이지 리뉴얼 하면서 다운로드 링크가 없어진 것 같습니다.
프로필 이미지
여의도개미핥기
2026-07-24
40
글번호 232969
답변완료

예스스탁 지원팀 추가 문의

수고하십니다..# 예스스탁 지원팀 추가 문의## A. 틱봉(N틱) 카운팅 기준 (신호값이 실제 차트와 다른 문제 확인용)1. `ReqChartEx`로 `period=CHART_PERIOD_TICK, cycle=N`을 요청해서 받는 과거 이력 틱봉의 "N틱" 카운팅 기준이, 사용자가 차트 화면에서 직접 "N틱봉"으로 설정했을 때와 완전히 동일한 기준입니까?2. 이때 "1틱"으로 세는 기준은 모든 체결 이벤트 1건입니까, 아니면 가격이 실제로 변동된 체결만 1틱으로 셉니까? (같은 가격 연속체결도 각각 별도 틱으로 카운트되는지)3. `chartEx.GetHigh(1, idx)` / `GetLow(1, idx)` / `GetSDate(1, idx)` / `GetSTime(1, idx)`에서 `idx=0`이 가장 최근(마지막) 봉이 맞습니까, 아니면 가장 오래된 봉입니까? (인덱스 방향 확인)4. 같은 종목·같은 N틱 설정이라도, 실시간 체결로 로컬에서 직접 합성한 봉(TickBarBuilder 방식)과 `ReqChartEx`로 받아온 과거이력 봉이 경계 부근(워밍업→실시간 전환 시점)에서 미세하게 어긋날 가능성이 있습니까? 이런 경우 두 소스를 일치시키는 권장 방법이 있습니까?## B. 객체 수 1000개 제한과 크래시 관련5. 이전 답변에서 "스팟은 하나의 전략식에서 총 1000개까지 객체 사용 가능"이라고 하셨는데, 여기서 "객체"의 정확한 기준이 무엇입니까? (예: `ReqChartItem` 인스턴스, `SetTimer` 등록 개수, 스크립트 내 생성한 모든 JS 객체 포함 여부 등)6. `ReqChartEx` 요청을 반복적으로(예: 2초 주기로 계속) 보내고 응답을 받아 처리한 뒤, 해당 `ReqChartItem`/응답 객체를 스크립트에서 더 이상 참조하지 않게 되면 자동으로 해제(GC)되는지, 아니면 명시적으로 해제하는 API가 별도로 있습니까?7. 하나의 스크립트에서 틱데이터를 실시간으로 계속 수신하면서, 동시에 주기적으로 과거 이력(`ReqChartEx`)을 반복 재조회하는 구조를 쓸 경우, 장시간(수십 분~수시간) 실행 시 알려진 메모리 누수나 크래시 사례가 있습니까? 권장하는 안전한 재조회 주기/방식이 있습니까?8. 스크립트가 특별한 에러 로그 없이 HTS 프로세스 자체가 다운되는 경우, 원인을 추적할 수 있는 별도의 크래시 덤프/시스템 로그가 있습니까? (저희 쪽 스크립트 로그에는 마지막 정상 동작만 남고 에러 메시지가 없어서 원인 파악이 어렵습니다)감사합니다...
프로필 이미지
dbals
2026-07-23
50
글번호 232950
답변완료

signal 객체 관련 문의

안녕하세요.확장차트 및 signal 객체 관련해서 문의드립니다.signal 객체에서 확장차트에서 이미 나온 신호를 yesspot에서 확인하거나 일자를 소급해서 확인할 수 있나요?예를 들어서 설명을 드리자면, 저는검색식을 9시부터 1시간에 1번씩 돌려서 나온 종목들을 관심종목에 등록하고 yeslanguage 일봉 거래식에서 나온 신호를 yesspot으로 받아서 확장차트를 띄웁니다.매수 가격 등은 전일 데이터 등으로 만들어 지는 케이스도 있어서 장중에 매수가 되기도 합니다.이 때 A 종목이 9시에는 검색이 안돼서 관심종목에 등록이 안됐고, 9시 30분에 a 종목에 b1 신호가 나왔습니다.(이 때는 yestrader나 yesspot에서 감시를 하지 않았기 때문에 신호가 나온 걸 알 수 없습니다.)10시에 검색을 다시 했을 때 A 종목이 걸려서 관심종목을 등록하고 확장차트를 띄운 후에 b1신호가 나왔었다는 걸 알게 됩니다.그럼 signal 객체에서 b1이 나왔다는 사실이나 가격을 알 수 있나요? 또는 전일에 신호가 나왔었다면 봉을 소급해서 신호가 나왔다는 사실이나 신호 가격 등을 알 수 있나요?signal.price 등으로 이미 차트가 띄워진 상태에서 신호가 나오는 순간에 가격이 잡히는 것 같습니다.아니면 yeslanguage에서 과거 신호 관련된 걸 yesspot 쪽으로 던져줄 수 있는 방법이 있는지 문의드립니다.감사합니다.좋은 하루 보내세요.
프로필 이미지
깜피
2026-07-15
50
글번호 232844
답변완료

풋옵션 매수 수식 2개

데이트레이딩입니다.아래 내용 수식 2개 부탁드립니다.요청수식1. 풋옵션 매수(거래량이 가장 많은 행사가 선택) 내용 1) 조건 - 시작시간 : 140000 - 행사가 선택 : 140000 기준으로 당일 거래량이 가장 많은 행사가를 선택합니다. 2) 진입 - 해당 행사가에서 0.02 체결이 발생하면 매도1호가에 매수주문합니다. 수량은 4개입니다. 3) 익절 해당 행사가 옵션 가격이 4.90 되면 1개 청산 해당 행사가 옵션 가격이 5.90 되면 1개 청산 해당 행사가 옵션 가격이 6.90 되면 1개 청산 해당 행사가 옵션 가격이 7.90 되면 1개 청산 4) end of day : 151800 (익절이 없을 경우 미결제 모두 청산)요청수식2. 풋옵션 매수(옵션시세표의 가장 싼 행사가 선택) 내용 1) 조건 - 시작시간 : 140000 - 행사가 선택 : 140000 기준으로 옵션시세표의 가장 싼 행사가를 선택합니다. 2) 진입 - 해당 행사가에서 0.02 체결이 발생하면 매도1호가에 매수주문합니다. 수량은 4개입니다. 3) 익절 해당 행사가 옵션 가격이 0.90 되면 1개 청산 해당 행사가 옵션 가격이 1.90 되면 1개 청산 해당 행사가 옵션 가격이 2.90 되면 1개 청산 해당 행사가 옵션 가격이 3.90 되면 1개 청산 4) end of day : 151800 (익절이 없을 경우 미결제 모두 청산)항상 고맙습니다.
프로필 이미지
좌오비우오비
2026-07-14
75
글번호 232841