커뮤니티

[예스스팟] 파워종목검색 결과값(aValues)에 검색식 계산값을 싣는 방법 문의

프로필 이미지
megapro
2026-09-02 13:00:18
124
글번호 233464
답변완료

안녕하세요. 예스스팟 스크립트로 자동매매 엔진을 운용 중입니다.

파워종목검색 결과를 스팟에서 받을 때, 검색식이 계산한 값을 함께 받는 방법을

찾지 못해 문의드립니다.


■ 목적

하나의 검색식 안에서 If ~ Else If 체인으로 Find(1) ~ Find(13)을 나눠 호출하고 있습니다. 스팟 엔진에서 "이 종목이 몇 번 조건으로 걸렸는지"를 알아야 종목별로 다른 매매 전략(진입 비중, 손절폭, 트레일링)을 적용할 수 있습니다.


■ 현재 구성

[3202] 파워종목검색 사용자검색조건 등록 내용

A. [순위 검색] 설정조건에서 [거래량] [상위] 순으로 [300] 종목검색

B. [순위 검색] 설정조건에서 [거래대금] [상위] 순으로 [300] 종목검색

C. [가격대별 주가] 가격대 [2,000] ~ [500,000]

E. [차트 Fire+ASGMA(...)] 검색어 ← 예스랭귀지로 작성한 지표 검색식

조합식 : (A or B) and C and E


■ 확인된 동작

스팟에서 Main_OnRcvItemList(aItemList, nCount, aValues)로 정상 수신됩니다.

(인자 3개 수신 확인, aValues.length == nCount 일치)


aValues[i] 가 "1,1,1,0" 형태의 쉼표 결합 문자열로 옵니다.

하루치 608건을 전수 확인한 결과 세 가지 패턴만 나왔습니다.

"1,1,1,0" 426건

"0,1,1,0" 125건

"1,0,1,0" 57건


앞 세 자리는 A, B, C 조건과 정확히 대응합니다.

· 세 번째 자리(C 가격대)는 항상 1

· 첫째·둘째(A, B) 중 최소 하나는 항상 1 — 조합식 (A or B)와 일치

· 둘 다 1인 경우가 다수, 한쪽만 1인 경우가 소수


그런데 네 번째 자리(E 지표 검색식)는 항상 0입니다.

조합식이 "and E" 이므로 E가 거짓이면 그 종목은 검색되지 않아야 하는데, 검색은 정상적으로 되면서 값만 0으로 옵니다.


■ 시도한 것

1) 검색식에 Var : FindTag(0); 를 선언하고 각 분기에서 값을 대입한 뒤

마지막 줄에 FindTag; 를 두었습니다. → aValues 해당 자리 계속 0

2) 변수 문제인지 확인하기 위해 마지막 줄을 상수 7; 로 바꿨습니다.

→ 조건 삭제 후 재등록, 엔진 재기동까지 하고 353건을 확인했으나 해당 자리는 여전히 0이었습니다.


즉 변수 값이나 대입 시점의 문제가 아니라, 지표 검색식이 계산한 값이 aValues로 전달되는 경로 자체가 없는 것으로 보입니다.


■ 질문

1) 지표 검색식(예스랭귀지)에서 계산한 숫자를 aValues로 내보내려면 어떤 문법을 써야 합니까?

(전용 함수가 있는지, 특정 변수명 규칙이 있는지,

또는 [3202] 탭 설정에서 결과값 컬럼을 지정해야 하는지)


2) aValues의 각 원소가 쉼표 결합 문자열인 것이 정상 규격입니까?

슬롯 순서는 조건 등록 순서(A, B, C, E)와 항상 일치합니까?


3) 위 방법이 없다면, 검색식에서 호출한 Find(n)의 n 값을 스팟에서 받을 수 있는 다른 방법이 있습니까?

(없다면 검색식을 조건별로 나눠 등록하는 방식 외에 권장하시는 구조가 있는지도 알려주시면 감사하겠습니다.)


[SEARCH_SHAPE] 검색콜백 원형 | argc:3 n:6 list[0] type:string val:036710

| values:있음 len:6 values[0] type:string val:1,1,1,0


감사합니다.

답변 3
프로필 이미지

예스스탁 예스스탁 답변

2026-09-02 16:00:48

안녕하세요 예스스탁입니다. 1 OnRcvItemList이벤트에서 aValues는 종목검색시 조건이 1개인 경우에만 find(결과값);안의 결과값을 리턴합니다.

올리신 내용과 같이 여러 조건의 조합된 형태는 각 조건별 만족여부만 1,0으로 하는 텍스트로 리턴이 됩니다.

2 예 맞습니다. 조건만족여부(1,0)을 쉼표로 구분해서 리턴되는 문자열입니다. 이런경우 각 조건별로 만족여부를 체크하실 경우에는 JSON.parse 함수로 값을 변환해서 이용하시면 됩니다. function Main_OnRcvItemList(aItemList, nCount, aValues) { if (nCount > 0) { for (var i = 0; i < nCount; i++) { AB = JSON.parse("["+aValues[i]+"]"); Main.MessageList(i,"번 종목:",AB[0],AB[1],AB[2],AB[3]); } } } 2-1 파워종목검색의 조건이 (A or B) and C and D인데 올리신 글에 D조건이 0입니다. 파워종목검색 화면에서 사용자검색조건을 다시 클릭하셔서 (A or B)의 괄호치기가 정상적인지 확인을 해보시길 바랍니다. 저희쪽에서 검색을 해봤지만 (A or B) and C and D 조건식에서 D가 0이 나오는 경우가 없습니다. 혹은 02-3453-1060으로 전화주시기 바랍니다. 3 find함수안에 지정한 결과값을 받기 위해서는 해당 종목검색식이 단일로 실행하는 방법뿐이 없습니다. 도움을 드리지 못해 죄송합니다. 즐거운 하루되세요
프로필 이미지

megapro

2026-09-02 20:05:35

앞서 빠른 답변 감사합니다. 2-1 관련하여 확인한 내용과 추가 질문 드립니다. ■ 먼저 정정 — 조건 구성을 제가 부정확하게 전달했습니다 실제 등록 조건은 5개입니다. A. [순위 검색] 거래량 상위 300 B. [순위 검색] 거래대금 상위 300 C. [가격대별 주가] 2,000 ~ 500,000 D. [전일 동시간대비 거래량 비율] 200% 이상 E. [차트 Fire+ASGMA(...)] 검색어 ← 예스랭귀지 지표 검색식 조건식 : ( A or B ) and C and E D는 목록에만 있고 조건식에는 넣지 않았습니다(전략 성격상 의도적 제외). 따라서 0으로 오는 것은 D가 아니라 ★E(지표 검색식)★ 입니다. ■ 괄호치기 확인 안내대로 사용자검색조건을 다시 열어 확인했습니다. "( A or B ) and C and E" 로 정상 표시됩니다(첨부). 조건 삭제 후 재등록도 여러 차례 했으나 동일합니다. ■ 증상 — 마지막 슬롯(E)이 항상 0 하루치 608건 전수 확인 결과 세 패턴만 나왔고, 마지막 자리가 0이 아닌 경우가 ★한 건도 없습니다.★ "1,1,1,0" 426건 "0,1,1,0" 125건 "1,0,1,0" 57건 앞 자리들은 정확합니다. · 3번째(C 가격대)는 항상 1 · 1·2번째(A, B) 중 최소 하나는 항상 1 — 조건식 (A or B)와 일치 즉 aValues 자체는 정상적으로 채워지고 E 자리만 비어 있습니다. 조건식이 "and E"이므로 E가 거짓이면 검색되지 않아야 하는데, 검색은 정상이고 값만 0입니다. ■ 시도한 것 1) 검색식에 Var : FindTag(0); 선언 후 각 분기에서 101~113을 대입하고 마지막 줄에 FindTag; 를 두었습니다. → E 자리 계속 0 2) 변수 문제인지 가리기 위해 마지막 줄을 상수 7; 로 바꿨습니다. 재등록·재기동 후 353건 확인했으나 여전히 0이었습니다. 이때 ★검출 종목 수는 늘지 않았습니다★(6건 수준 유지). 마지막 표현식이 조건 판정을 결정한다면 상수 7(항상 참)로 인해 (A or B) and C 통과 종목이 전부 나왔어야 하는데 그렇지 않았습니다. 즉 E의 필터링 자체는 정상 동작하고 있습니다. ■ 질문 1) aValues 슬롯은 "등록된 조건 수"가 아니라 "조건식에 실제로 사용된 조건 수"만큼 오는 것이 맞습니까? (D를 조건식에서 빼니 4자리가 옵니다) 2) 조합 조건에서 지표 검색식이 만족되었을 때 그 자리는 1이 와야 합니까? 3) 1이 정상이라면 어떤 경우에 0이 나올 수 있습니까? 검색식 구조가 영향을 줍니까? (저희 검색식은 If ~ Else If 체인으로 Find(1)~Find(13)을 나눠 호출하고, For 루프·Ema·std 등 시리즈 함수를 사용합니다.) 4) Find(n)의 n을 받으려면 단일 조건으로 등록해야 한다는 안내는 확인했습니다. 다만 [순위 검색] 거래량·거래대금 상위 300은 예스랭귀지 검색식 안에서 구현할 방법이 없는 것으로 압니다. 조합 조건을 유지하면서 "몇 번 분기로 걸렸는지"를 스팟으로 전달할 방법이 있습니까? 없다면 권장 대안 구조를 알려주시면 그에 맞춰 재설계하겠습니다. ■ 첨부 · 사용자검색조건 화면(조건 목록 + 조건식) · 검색식 최종부(FindTag 대입 → Find 호출 → 마지막 줄 FindTag;) · 수신 로그 argc:3 n:6 list[0]:036710 | values:있음 len:6 values[0]:"1,1,1,0" (종목별 예: 005880 → "1,1,1,0" / 001450 → "1,1,1,0" / 002380 → "0,1,1,0") 감사합니다.
프로필 이미지

예스스탁 예스스탁 답변

2026-09-03 14:17:47

안녕하세요
예스스탁입니다.

1
확인결과 NH에서 종목검색은 정상인데 결과값 리턴을 잘못하고 있었습니다.
해당 부분은 관련팀에 전달해서 수정하도록 하겠습니다.
2 현재 구조에서는 종목검색을 두번하셔야 합니다. (A or B) and C로 사용자검색조건을 하나 만드시고 (가칭 검색1) D로 사용자검색조건을 하나 만드신 후에 (가칭 검색2) 검색1을 먼저 수행하신 후에 종목코드를 모두 저장하시고 검색2를 다음 수행해서 검색1에서 검색된 종목코드와 검색2에서 검색한 종목코드를
비교해서 같은 것만 취하게 하시면 됩니다.
아래 코드 참고하시기 바랍니다. var 종목검색타이머 = 5;//5초 var List1 = []; var FinalList = [],FinalaValues = []; function Main_OnStart() { Main.SetTimer(1, 종목검색타이머*1000); } function Main_OnTimer(nEventID) { if (nEventID == 1) { //1번타이머 중지 Main.KillTimer(1); //검색1 요청 Main.ReqPowerSearch("검색1"); //검색스텝은 1 SearchStep = 1; //값저장할 배열변수는 비움 List1 = []; FinalList = []; FinalaValues = []; } } function Main_OnRcvItemList(aItemList, nCount, aValues) { //검색1 완료 if (SearchStep == 1) { Main.MessageList("검색1완료:",nCount); //검색된 종목이 있으면 if (nCount > 0) { //List1에 종목코드들 저장 List1 = aItemList; //검색2 요청 Main.ReqPowerSearch("검색2"); //검색스텝은 2 SearchStep = 2; } else { Main.SetTimer(1, 5000); } } else if (SearchStep == 2) //검색2 완료 { Main.MessageList("검색2완료:",nCount); //검색된 종목이 있으면 if (nCount > 0) { //검색된 종목 중 List1에 있는 종목만 순차적으로 //FinalList에 종목코드 저장하고 FinalaValues에 결과값도 저장 for (var x = 0; x < List1.length; x++) { for (var y = 0; y < aItemList.length; y++) { if (List1[x] == aItemList[y]) { FinalList.push(aItemList[y]); FinalaValues.push(aValues[y]); } } } } //최종체크 Main.MessageList("최종리스트",FinalList.length, FinalaValues.length); if (FinalList.length > 0) { for (var i = 0; i < FinalList.length; i++) { Main.MessageList(FinalList[i],FinalaValues[i]); } } Main.SetTimer(1, 5000); } }

즐거운 하루되세요