커뮤니티
예스스팟 Q&A
문의드립니다
아래 수식은 선물신호 발생시 2.0 가격에 근접한 옵션을 찾아서 매매하는 수식입니다 라는 오류가 뜹니다잘못 된 부분을 수정 부탁드립니다감사합니다var T;var CC, CallOrderCode;var PP, PutOrderCode;function Main_OnStart(){ T = 0;}function C1_OnRiseSignal(Signal){ if (T <= 0 && Signal.signalKind == 1) { T = 1; Main.MessageList("--------------------------------------------"); Main.MessageList("Buy신호 발생"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; //콜옵션중 2.0에 가장 가까운 종목 //콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 var CallCode = new Array(UNum+LNum+1); var CallPrice = new Array(UNum+LNum+1); for (var i = -LNum; i <= UNum; i++) { CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0); CallCode[i+LNum] = Option.GetATMCallRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var CC = 99999999; CallOrderCode = ""; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] < CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //풋옵션중 2.0에 가장 가까운 종목 //풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 var PutCode = new Array(UNum+LNum+1); var PutPrice = new Array(UNum+LNum+1); for (var i = -UNum; i <= LNum; i++) { PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0); PutCode[i+UNum] = Option.GetATMPutRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var PP = 99999999; PutOrderCode = ""; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] < PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } //종목을 찾았으면 if (CC < 99999999 && PP < 99999999) { Account1.OrderBuy(CallOrderCode, 1, Option.GetAsk(CallOrderCode, 3), 0); //Account1.OrderSell(PutOrderCode, 1, Option.GetBid(PutOrderCode, 5), 0); } } if (T == 1 && Signal.signalKind == 2) { Main.MessageList("--------------------------------------------"); Main.MessageList("ExitLong신호 발생"); T = 0; Account1.OrderSell(CallOrderCode, 1, Option.GetBid(CallOrderCode, 3), 0); //Account1.OrderBuy(PutOrderCode, 1, Option.GetAsk(PutOrderCode, 5), 0); } if (T >= 0 && Signal.signalKind == 3) { T = -1; Main.MessageList("--------------------------------------------"); Main.MessageList("Sell신호 발생"); var UNum = Option.uppersATM; var LNum = Option.lowersATM; //콜옵션중 2.0에 가장 가까운 종목 //콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 var CallCode = new Array(UNum+LNum+1); var CallPrice = new Array(UNum+LNum+1); for (var i = -LNum; i <= UNum; i++) { CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0); CallCode[i+LNum] = Option.GetATMCallRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var CC = 99999999; CallOrderCode = ""; for (var i = -LNum; i <= UNum; i++) { if (CallPrice[i+LNum] < CC) { CC = CallPrice[i+LNum]; CallOrderCode = CallCode[i+LNum] } } //풋옵션중 2.0에 가장 가까운 종목 //풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장 var PutCode = new Array(UNum+LNum+1); var PutPrice = new Array(UNum+LNum+1); for (var i = -UNum; i <= LNum; i++) { PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0); PutCode[i+UNum] = Option.GetATMPutRecent(i); } //저장된 절대값중 가장 작은 종목의 값과 종목코드 계산 var PP = 99999999; PutOrderCode = ""; for (var i = -UNum; i <= LNum; i++) { if (PutPrice[i+UNum] < PP) { PP = PutPrice[i+UNum]; PutOrderCode = PutCode[i+UNum]; } } //종목을 찾았으면 if (CC < 99999999 && PP < 99999999) { //Account1.OrderSell(CallOrderCode, 1, Option.GetBid(CallOrderCode, 5), 0); Account1.OrderBuy(PutOrderCode, 1, Option.GetAsk(PutOrderCode, 3), 0); } } if (T == -1 && Signal.signalKind == 4) { Main.MessageList("--------------------------------------------"); Main.MessageList("ExitShort신호 발생"); T = 0; //Account1.OrderBuy(CallOrderCode, 1, Option.GetAsk(CallOrderCode, 5), 0); Account1.OrderSell(PutOrderCode, 1, Option.GetBid(PutOrderCode, 3), 0); }}
2026-03-12
16
글번호 231060
답변완료
아랫글(230868) 추가질문입니다.
콜이나 풋을 매수한 상태일때, 위 수식이 0.5pt가격에 지정가 매도주문을 발생한다는 의미인가요?동시호가에 옵션매수종목을 무조건 청산하기 위해 시장가 매도주문을 발생시켰으나, 거부되는 경우가 발생되어 ,낮은 가격(0.1pt나 0.5pt 등) 지정가로 주문을 내서 주문이 거부되지 않으면서 거의 무조건 매수포지션을 청산하려는 의도로 질문을 드렸습니다.원하는 바는, 옵션 매수상태일때 지정가 0.5로 청산주문 발생시키고옵션 매도상태일때 지정가 50으로 청산주문 발생시키고 싶습니다.다시한번 답변 부탁드립니다.
2026-03-11
40
글번호 231048
관리자에 의해 예스랭귀지 QnA로 이동되었습니다.
2026-03-11
4
글번호 231036
객체사용
marketdata1과 chart1 객체를 사용하여 미니KP200선물연결 종목호가정보를 가져오려고 하는데 예스스팟 실행을 하면 최근메시지 항목에 "주식종목만 조회 가능합니다."라고 나옵니다.선물도 다 가능하다라고 매뉴얼에 나오는데 왜 그런가요?
2026-03-10
28
글번호 231029
tktmsl 님에 의해서 삭제되었습니다.
2026-03-10
18
글번호 231020
저점 돌파 콜매수, 고점 돌파 풋매수
주간용이며, 데이트레이딩입니다.신호는 선물, 진입은 옵션입니다.요청수식1 . 장초반에 생긴 저점을 깨지 못하다가 오후에 저점에 근접할 때 Call 매수1. 전제조건 : K200선물 시가에서 10포인트 이상 하락2. 구간 저점 저장 : 084500 에서 100000 까지 K200선물 저점은 A 입니다. ( A는 084500 부터 100000 까지 시세를 모두 보고 판단 )3. 트리거 : stime>=130000 and stime<150000 A+2.5포인트 crossdown4. 진입 : 콜옵션 가격 0.20 포인트 이하에 최근접한 행사가에 매수주문 1개를 매도5호가에 냅니다. ( 단, 저점 A가 여전히 저점인 경우만 진입 )5. 청산 : 익절 2.50포인트, EndofDay 1515006. 진입횟수 : 1회요청수식2. 장초반에 생긴 고점을 깨지 못하다가 오후에 고점에 근접할 때 Put 매수1. 전제조건 : K200선물 시가에서 10포인트 이상 상승2. 구간 고점 저장 : 084500 에서 100000 까지 K200선물 고점은 B 입니다. ( B는 084500 부터 100000 까지 시세를 모두 보고 판단 )3. 트리거 : stime>=130000 and stime<150000 B-2.5포인트 crossup4. 진입 : 풋옵션 가격 0.20 포인트 이하에 최근접한 행사가에 매수주문 1개를 매도5호가에 냅니다. ( 단, 고점 B가 여전히 고점인 경우만 진입 )5. 청산 : 익절 2.50포인트, EndofDay 1515006. 진입횟수 : 1회수식 부탁 드립니다.항상 고맙습니다.
2026-03-09
78
글번호 230984
관심종목 중에서 매수, 계좌보유종목수 제한 등에 대해 문의합니다.
전체 종목을 대상으로 써치하여 종목을 매수하는 프로그램입니다.1. 미리 관심종목 그룹에 등록해둔 특정관심종목 폴더에서 중에서 종목을 써치해서 매수하게 하고 싶습니다.2. 1차 매수(지정금액01) 후 당일 내에 매수금액에서 2%하락 시 2차매수(지정금액01)를 하고, 1.2차 평균매수가가 3%하락시 3차매수(지정금액02)를 하는 로직을 만들고 싶습니다.3. 1차 매수(지정금액01) 후 당일이 아닌 다음날에 평균매수가 대비 5%하락 시 2차매수(지정금액01)를 하고, 평균매수가 대비 다시 5%하락시 3차매수(지정금액02)를 하는 로직을 만들고 싶습니다.4. 해당 계좌의 보유 종목수를 제한하여 매수하고자 합니다.(계좌에 20종목만 보유, 1 종목 매도하면 1종목 매수)5. NXT에서도 자동매매가 가능하게 하고 싶습니다.부탁드립니다.=====================var M_Buy = 500000;//종목당 1회 매수금액var OPEN_T = 090000;var CLOSE_T = 150000;var SearchName = "224이평 돌파 및 지지"; //PowerSearch Namevar 당일매수제한종목수 = 10, BuyCount;var timer = 5; //매수 매도 초(시간) 간격var Earning_Rate = 1.3; //계좌평가금액이 스팟시작시 평가금액대비 30% 이상이면 전종목 전량매도var Trailing_Stop = 0.1; // 종목당 -10%이하 손실이면 전량 손절var Earning_Sale = 1.25; // 종목당 25%이상 수익이면 전량 익절var OrderList = [];var MKList = [];var req;function Main_OnStart(){ //1번 타이머, 5초 Main.SetTimer(1, timer*1000); // 오늘 매수한 종목 관리 배열 초기화 MKList = []; //스팟 시작시 잔고평가금액 V1 = Account1.GetBalanceETCinfo(100); BuyCount = 0;}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 >= OPEN_T && HHMMSS < CLOSE_T && BuyCount < 당일매수제한종목수) { //종목검색 수행 Main.ReqPowerSearch(SearchName) Main.MessageList("ReqPowerSearch1"); } if (nEventID == 1) { //계좌보유종수 var num = Account1.GetTheNumberOfBalances(); //9시~15시 15분 사이 if (HHMMSS >= OPEN_T && HHMMSS < CLOSE_T) { //보유종목이 1개 이상 if (num >= 1) { //계좌평가금액이 스팟시작시 평가금액대비 30% 이상이면 전종목 전량매도 if (Account1.GetBalanceETCinfo(100) >= V1*Earning_Rate) { //1번 타이머 종료 Main.KillTimer(1); //계좌리스트의 순서대로 for (var i = 0; i < num; i++) { //잔고를 셋팅 Account1.SetBalance(i); //수량이 있고 Earning_Rate(30%)수익이거나 손실이면 시장가 매도 if (Account1.Balance.count > 0) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } } } else //아니면 개별종목 25% Earning_Sale, -10% Trailing_Stop 체크 { //계좌리스트의 순서대로 for (var i = 0; i < num; i++) { //잔고를 셋팅 Account1.SetBalance(i); //수량이 있고 "Earning_Sale" 25% 수익이거나 "Trailing_Stop" -10% 손실이면 시장가 전량매도 if (Account1.Balance.count > 0 && (Account1.Balance.current >= Account1.Balance.avgUnitCost*Earning_Sale || Account1.Balance.current <= Account1.Balance.avgUnitCost*Trailing_Stop)) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } } } } } } if (nEventID == 2) { Main.ReqMarketData(OrderList[req]); Main.MessageList("ReqMarketData:",OrderList[req]); }}function Main_OnRcvItemList(aItemList, nCount){ Main.KillTimer(1); Main.MessageList("aItemList:",aItemList); OrderList = []; if (nCount >= 1) { if (MKList.length == 0) { OrderList = aItemList; } else { for (var a = 0; a < nCount; a++) { var Add = true; for (var b = 0; b < MKList.length; b++) { if (aItemList[a] == MKList[b].code) { Add = false; } } if (Add == true && !IsStockInAccount(aItemList[a])) { OrderList.push(aItemList[a]); } } } } Main.MessageList("OrderList:",OrderList); if (OrderList.length == 0) { Main.SetTimer(1, timer*1000); } else { req = 0; Main.ReqMarketData(OrderList[req]); Main.MessageList("ReqMarketData:",OrderList[req]); ; }}function Main_OnRcvMarketData(MarketData){ if (MarketData.code == OrderList[req]) { MKList.push(MarketData); // 계좌에 같은 종목이 있는지 확인 if (!IsStockInAccount(MarketData.code)) { if (BuyCount < 당일매수제한종목수) { // 계좌에 잔고가 없는 경우에만 매수 Account1.OrderBuy(MarketData.code,1,MarketData.Ask(1),0); // 종목당 1주 지정가 매수주문 // Account1.OrderBuy(MarketData.code,1,0,1); // 종목당 1주 시장가 매수주문 // Account1.OrderBuy(MarketData.code,Math.floor(M_Buy/MarketData.Ask(1)),0,1); // 종목당 지정금액 시장가 매수주문 //Account1.OrderBuy(MarketData.code,Math.floor(M_Buy/MarketData.Ask(1)),MarketData.Ask(1),0); // 종목당 지정금액 지정가 매수주문 Main.MessageList(MarketData.code + "주식을 매수합니다."); BuyCount = BuyCount+1; } } else { Main.MessageList( MarketData.code + " 주식은 이미 계좌에 있으므로 매수하지 않습니다."); } req = req+1; if (req < OrderList.length && BuyCount < 당일매수제한종목수) { var aa = Main.ReqMarketData(OrderList[req]); Main.MessageList("ReqMarketData:",OrderList[req]); ; if (aa == -1) { Main.SetTimer(2, 15000); } } else { Main.SetTimer(1, timer*1000); Main.MessageList("당일종목수제한 도달 :",BuyCount,"/",당일매수제한종목수); } }}function IsStockInAccount(stockCode) { // 계좌에 해당 종목이 있는지 확인하는 함수 var numberOfBalances = Account1.GetTheNumberOfBalances(); for (var i = 0; i < numberOfBalances; i++) { Account1.SetBalance(i); if (stockCode == Account1.Balance.code) { return true; // 계좌에 같은 종목이 있으면 true 반환 } } return false; // 계좌에 같은 종목이 없으면 false 반환}
2026-03-08
32
글번호 230977
늘그렇게 님에 의해서 삭제되었습니다.
2026-03-08
6
글번호 230976
답변완료
나스닥 거래되는 시작시간과 마감시간을 알아내는 방법이 있는지요?
안녕하세요.Summer time이나 조기종료, 휴일처럼 시간이 바뀌게 되는것을API를 통해서 알아내는 방법이 있는지요?알려주세면 감사하겠습니다.
2026-03-07
37
글번호 230971
답변완료
동시호가 지정가 주문관련 문의드립니다.
function Main_OnStart(){ Main.SetTimer(1, 5000); //무슨 뜻인가요?}function Main_OnTimer(nEventID){ var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1 && HHMMSS >= 153505 && HHMMSS <= 153605 ) { Main.KillTimer(1); var num = Account1.GetTheNumberOfBalances(); if (num > 0) { for (var i = 0; i < num; i++) { Account1.SetBalance(i); if (Option1.GetCurrent(Account1.Balance.code) > 0) { if (Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1); } if (Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1) } } else { if (Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1); } if (Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1); } } } } }}안녕하세요.옵션 매수잔고가 있으면 마감동시호가에 시장가 청산주문 발생하게 하는 로직입니다.(예스스탁에서 도움주셔서 잘 사용하고 있습니다.^^)최근에 변동성이 커지다보니 실시간 가격제한이 적용되는 종목인지 여부에 따라 시장가청산주문이 주문거부되는 경우가 발생합니다.(yt)그래서,동시호가 시장가 exitlong주문을 지정가 0.5pt가격에 주문을 내고 싶습니다.(옵션매도는 진입을 안하니 exitshort부분은 상관없습니다.)수고스러우시겠지만, 수정 부탁드립니다. 감사합니다.
2026-03-03
72
글번호 230868