커뮤니티

예스스팟 Q&A

답변완료

예스스팟 자동주문 Error

자동주문을 하기위해 예스스팟에 파일을 올려 실행을 하면 파일을 열수없다는 에러 메세지가 뜹니다.예스스팟 편집기에서도 수식작성 검증이며 계좌정보까지 이상없이 저장 하였습니다만에러가 나는 경우가 어떤 원인이 있을까요?
프로필 이미지
고릴라
2026-01-13
149
글번호 229741
답변완료

양합이 제일 낮은 행사가와 값 구하기

주신 답변 늘 응용해서 잘 사용하고 있습니다. 감사합니다.아래와 같은 양합을 구하는 수식을 스팟으로 만들고 싶습니다.등가를 이용해도 되겠지만 수동으로 계산하는 수식이 필요합니다.=========================================================1. 장시작후 9시가되면 10초마다 행사가가 같은 콜옵션과 풋옵션의 합 중 가장 낮은 합의 콜과 풋의 종목을 구함2. 당일 행사가 변경과 관계없이 양합이 가장 낮은 양합값, 가장 높은 양합값 구함3. Main.MessageList 명령어를 사용해서 최근메시지 창에 표시 //메시지 예시 Main.MessageList("현재콜종목", 000, "현재풋종목", 000, "현재양합:", 000, "개장후최소양합:", 000, "개장후최대양합:", 000); 답변 미리 감사드립니다.(참고) 1월물 만기일 가장 낮은 양합 변화 그래프입니다.
프로필 이미지
탄젠트80
2026-01-12
122
글번호 229707
답변완료

DB(D1) 객체를 활용한 외부 python 시스템과의 연동 및 SQL 문법 관련 문의.

문의 내용: 현재 해외 선물(MYM)을 예스스팟의 Database(D1) 객체를 사용하여 외부 Python 시스템(SQLite DB 매개)과 매매 신호를 주고받는 브릿지 시스템을 구축 중입니다. 작업 중 다음과 같은 기술적 문제에 대해 확인 부탁드립니다. 1. 연동 구조의 적정성: 예스스팟이 32비트 SQLite ODBC 드라이버를 통해 특정 DB 파일(database.db)에 연결하고, Python 시스템이 동일한 DB 파일에 데이터를 INSERT하면, 예스스팟의 D1.Select() 메서드로 이를 실시간 감지하여 주문을 내는 방식이 권장되는 연동 구조인지 궁금합니다. 2. `D1.Select()` 메서드의 SQL 자동 생성 여부: D1.Select("SELECT * FROM table", "name") 호출 시, `near "SELECT": syntax error (1)` 오류가 발생합니다. * 예스스팟 엔진이 내부적으로 SELECT * FROM [설정된_테이블] WHERE를 자동으로 생성하여 사용자 쿼리 앞에 붙이는 방식인가요? * 만약 그렇다면, 사용자는 D1.Select() 인자로 오직 'WHERE 조건절'만 입력해야 하는 것인지 확인 부탁드립니다. 3. 예약어 충돌 문제: orders, action, status 등 SQL 예약어가 포함된 테이블명이나 컬럼명을 D1.Select에서 조회할 때, 예스트레이더 엔진에서 이를 회피하기 위한 별도의 식별자(예: [orders] 또는 "orders") 사용 규칙이 있는지 궁금합니다.현재 NH선물 YesGlobal 을 이용 중입니다. 4. DB 를 사용 하여 외부시스템간 통신이 되었던 사례가 있으면 올려 주시면 감사 하겠습니다.
프로필 이미지
너무조아
2026-01-09
145
글번호 229691
답변완료

수식 수정 부탁합니다

아래 식은 매수하여 잔고의 합이 -5만원을 넘었는데 청산되지 않습니다.function Main_OnStart(){ Main.MessageList("시작"); Main.SetTimer(99,0010);}//타이머 동작function Main_OnTimer(nEventID){ if (nEventID == 99) { // 옵션매수포지션 전체 손익계산 var num = A1.GetTheNumberOfBalances(); var PLsum = 0; for(var i = 0; i < num; i++) { //잔고셋팅 A1.SetBalanceIndex(i); //매수포지션이고 옵션종목이고 if (A1.Balance.position == 2 && (A1.Balance.code.substring(0,1) == "2" || A1.Balance.code.substring(0,1) == "3")) { //각 옵션매수종목의 (평균단가-현재가)*수량*5만원을 누적 PLsum = PLsum + ((A1.Balance.current - A1.Balance.avgUnitCost)*A1.Balance.count)*250000; } } //손익이 +5만원이상이거나 -5만원 이하이면 if (PLsum >= 50000 || PLsum <= -50000) { for(var i = 0; i < num; i++) { //잔고셋팅 A1.SetBalanceIndex(i); //매수포지션이고 옵션종목이고 if (A1.Balance.position == 2 && (A1.Balance.code.substring(0,1) == "2" || A1.Balance.code.substring(0,1) == "3")) { A1.OrderSell(A1.Balance.code, A1.Balance.count, 0,1); } } } }}
프로필 이미지
팡팡
2026-01-09
119
글번호 229688
답변완료

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

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

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

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

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

프로필 이미지
온고지신
2026-01-06
31
글번호 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
140
글번호 229548
답변완료

문의 합니다...

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