커뮤니티

예스스팟 Q&A

답변완료

타이머질문

안녕하세요. 종목검색에 타이머를 5초로 설정해뒀는데, 종목검색이 5초가 넘게걸리면 어떻게되나요? 종목검색이 끝난후 5초후 다시실행하나요?
프로필 이미지
깅창
2019-07-16
3281
글번호 224919
답변완료

재접속

해외선물에 새벽 6시 5분이면 재접속이 뜨는데 예스스팟으로 자동으로 로그인 시킬 수 있나요 ? 그리고 중간에 인터넷 접속이 끊어져도 재로그인 시킬수 있나요 ?
프로필 이미지
구다이전설
2019-07-13
3427
글번호 224918

퀀트드래곤 님에 의해서 삭제되었습니다.

프로필 이미지
퀀트드래곤
2019-07-08
0
글번호 224917
답변완료

옵션 과거 가격 조회

스팟에서 옵션 과거의 가격을 조회하는 방법이, 차트나 확장차트 외에는 없나요? 옵션 객체에서 바로 알 수 있는 방법 등이 있는지요? 몇 년치의 과거 가격이 궁금한 것이 아니라, 전일이나 전전일 등 과거 5일 이내 정도의 일봉 정도라도 참고가 되었으면 좋겠습니다.
프로필 이미지
idnotbe
2019-07-03
3428
글번호 224911
답변완료

옵션의 역사적변동성과 내제변동성의 차이를 통한 매매를 하고싶습니다

옵션의 역사적변동성과 내제변동성의 차이를 통한 매매를 하고싶은데 내제변동성은 알려주는 함수가있는데 역사적변동성은 알려주는 함수가 없는거같아요. option객체중 volatility를 사용하면 되는건가요? 콜 옵션 중에서 atm부터 가장 deep otm까지 돌면서 내제변동성이 역사적변동성보다 큰 종목중 가장 atm에 가까운 종목을 찾고싶은데 어떻게 코딩하면 되나요 for(var i =0; i<Option1.lowersATM, i++) { if(Option1.GetImpliedVolatility(0, i) > Option1.Volatility) } 이와 비슷하게 나올거같긴한데 i가 0부터 시작하니까 atm 부터 끝의 호가까지 돌면서 서로 차례대로 비교하는게 맞나요? "> Option1.Volatility" 이 부분이 아마 틀릴거같고 Option1.GetImpliedVolatility(0, i) 이 부분에서 i를 써주면 atm부터 찾는건지 모르겠네요 답변부탁드릴게요. 감사합니다
프로필 이미지
퀀트드래곤
2019-06-28
3425
글번호 224910
답변완료

해선 옵션 관련

아래 국선용 합성시스템을 해선의 옵션에도 적용하고 싶습니다. NH선물의 YesGrobal을 사용하는데, 1. 설정에 "옵션민감도" 등의 선택란이 없어 옵션에 대한 정보를 못가져오는지 우선 GetRemainDays에 문제가 발생하고 2. GetAskByCode 등의 함수에도 문제가 발생하고 있습니다. 아래의 시스템을 해선에서도 사용할 수 있도록 수정 부탁드립니다. ====================================================================== /*스크립트시작-----------------------------------------------------*/ var Start; var BuyC1_code; var BuyC2_code; var BuyP1_code; var BuyP2_code; var SellC1_code; var SellC2_code; var SellP1_code; var SellP2_code; function Main_OnStart() { Main.MessageLog("시작"); Start = 0; //옵션 Day청산이면 타이머셋팅 5초간격 if (Option.GetRemainDays(0,0) == 1) { Main.SetTimer(1, 5000); } } function Chart1_OnRiseSignal(Signal) { Main.MessageLog("신호완성/"+Signal.signalKind); //Buy 신호발생 if (Signal.signalKind == 1 ) { Start = 1; BuyC2_code = Option.GetATMCallRecent(2,0); //콜 ATM+2 종목코드 var BuyC2_price = Option.GetAskByCode(BuyC2_code,2); var Vol = Signal.count; //신호수량 Account1.OrderBuy(BuyC2_code, Vol*2, BuyC2_price, 0); Main.MessageLog("상방합성선물매수"); } //매수청산신호 if (Start == 1 && Signal.signalKind == 2 ) { //전체 종목수 var num = Account1.GetTheNumberOfBalances(); //전체 종목 중 옵션만 청산 for(var i = 0 ; i < num ; i++) { //잔고셋팅 Account1.SetBalance(i); //옵션함수로 해당 종목이 옵션인지 확인 if (Option.GetCurrent(Account1.Balance.code) > 0 && Account1.Balance.count > 0) { //종목코드 var cc = Account1.Balance.code; //잔고수량 var vv = Account1.Balance.count; //매도포지션이면 if (Account1.Balance.position == 1) { //청산 Account1.OrderBuy(cc, vv,Option.GetAsk(cc, 5),0); } //매수포지션이면 if (Account1.Balance.position == 2) { //청산 Account1.OrderSell(cc, vv,Option.GetBid(cc, 5),0); } } Main.MessageLog("상방합성선물매수청산"); } } //Sell 신호발생 if (Signal.signalKind == 3 ) { Start = 1; BuyC2_code = Option.GetATMCallRecent(2,0); //콜 ATM+2 종목코드 var BuyC2_price = Option.GetAskByCode(BuyC2_code,2); var Vol = Signal.count; //신호수량 Account1.OrderBuy(BuyC2_code, Vol*2, BuyC2_price , 0); Main.MessageLog("하방합성선물매도"); } //매도청산신호 if (Start == 1 && Signal.signalKind == 4 ) { //전체 종목수 var num = Account1.GetTheNumberOfBalances(); //전체 종목 중 옵션만 청산 for(var i = 0 ; i < num ; i++) { //잔고셋팅 Account1.SetBalance(i); //옵션함수로 해당 종목이 옵션인지 확인 if (Option.GetCurrent(Account1.Balance.code) > 0 && Account1.Balance.count > 0) { //종목코드 var cc = Account1.Balance.code; //잔고수량 var vv = Account1.Balance.count; //매도포지션이면 if (Account1.Balance.position == 1) { //청산 Account1.OrderBuy(cc, vv,Option.GetAsk(cc, 5),0); } //매수포지션이면 if (Account1.Balance.position == 2) { //청산 Account1.OrderSell(cc, vv,Option.GetBid(cc, 5),0); } } Main.MessageLog("하방합성선물매도청산"); } } } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //만기일 15시 이후이면 if (nEventID == 1 && HHMMSS >= 150000) { //타이머종료 Main.KillTimer(2); //전체 종목수 var num = Account1.GetTheNumberOfBalances(); //전체 종목 중 옵션만 청산하고 차월물로 진입 for(var i = 0 ; i < num ; i++) { //잔고셋팅 Account1.SetBalance(i); //옵션함수로 해당 종목이 옵션인지 확인 if (Option.GetCurrent(Account1.Balance.code) > 0 && Account1.Balance.count > 0) { //종목코드 var cc = Account1.Balance.code; //잔고수량 var vv = Account1.Balance.count; //매도포지션이면 if (Account1.Balance.position == 1) { //청산 Account1.OrderBuy(cc, vv,Option.GetAsk(cc, 5),0); //차근월물 코드 찾기 var strike = Option.GetExercisePrice(cc); //잔고종목이 콜이면 if (cc == Option.GetCodeByExercisePrice(0,strike)) var NextMonth = Option.GetCodeByExercisePrice(2, strike); else //잔고종목이 풋이면 var NextMonth = Option.GetCodeByExercisePrice(3, strike); //동일행사가의 차근월물 매도주문 Account1.OrderSell(NextMonth,vv,Option.GetBid(NextMonth,5),0); } //매수포지션이면 if (Account1.Balance.position == 2) { //청산 Account1.OrderSell(cc, vv,Option.GetBid(cc, 5),0); //차근월물 코드 찾기 var strike = Option.GetExercisePrice(cc); //잔고종목이 콜이면 if (cc == Option.GetCodeByExercisePrice(0,strike)) var NextMonth = Option.GetCodeByExercisePrice(2, strike); else //잔고종목이 풋이면 var NextMonth = Option.GetCodeByExercisePrice(3, strike); //동일행사가의 차근월물 매수주문 Account1.OrderBuy(NextMonth,vv,Option.GetAsk(NextMonth,5),0); } } } } }
프로필 이미지
몬스터
2019-06-27
3373
글번호 224908
답변완료

수식 수정 부탁드립니다.

아래의 시스템은 진입 -> 청산 식으로 진행될때 옵션을 진입,청산는 시스템인데, 선물 신호가 진입 -> 청산과 진입 -> 리버스가 혼재되어 발생합니다. 선물 신호가 혼재되어 발생될때 함께 진입과 청산을 할 수 있는 식으로 수정 부탁드립니다. ================================================================ /*스크립트시작-----------------------------------------------------*/ var Start; var BuyC1_code; var BuyC2_code; var BuyP1_code; var BuyP2_code; var SellC1_code; var SellC2_code; var SellP1_code; var SellP2_code; function Main_OnStart() { Main.MessageLog("시작"); Start = 0; //옵션 Day청산이면 타이머셋팅 5초간격 if (Option.GetRemainDays(0,0) == 1) { Main.SetTimer(1, 5000); } } function Chart1_OnRiseSignal(Signal) { Main.MessageLog("신호완성/"+Signal.signalKind); //Buy 신호발생 if (Signal.signalKind == 1 ) { Start = 1; BuyC2_code = Option.GetATMCallRecent(2,0); //콜 ATM+2 종목코드 var BuyC2_price = Option.GetAskByCode(BuyC2_code,2); var Vol = Signal.count; //신호수량 Account1.OrderBuy(BuyC2_code, Vol*2, BuyC2_price, 0); Main.MessageLog("상방합성선물매수"); } //매수청산신호 if (Start == 1 && Signal.signalKind == 2 ) { //전체 종목수 var num = Account1.GetTheNumberOfBalances(); //전체 종목 중 옵션만 청산 for(var i = 0 ; i < num ; i++) { //잔고셋팅 Account1.SetBalance(i); //옵션함수로 해당 종목이 옵션인지 확인 if (Option.GetCurrent(Account1.Balance.code) > 0 && Account1.Balance.count > 0) { //종목코드 var cc = Account1.Balance.code; //잔고수량 var vv = Account1.Balance.count; //매도포지션이면 if (Account1.Balance.position == 1) { //청산 Account1.OrderBuy(cc, vv,Option.GetAsk(cc, 5),0); } //매수포지션이면 if (Account1.Balance.position == 2) { //청산 Account1.OrderSell(cc, vv,Option.GetBid(cc, 5),0); } } Main.MessageLog("상방합성선물매수청산"); } } //Sell 신호발생 if (Signal.signalKind == 3 ) { Start = 1; BuyC2_code = Option.GetATMCallRecent(2,0); //콜 ATM+2 종목코드 var BuyC2_price = Option.GetAskByCode(BuyC2_code,2); var Vol = Signal.count; //신호수량 Account1.OrderBuy(BuyC2_code, Vol*2, BuyC2_price , 0); Main.MessageLog("하방합성선물매도"); } //매도청산신호 if (Start == 1 && Signal.signalKind == 4 ) { //전체 종목수 var num = Account1.GetTheNumberOfBalances(); //전체 종목 중 옵션만 청산 for(var i = 0 ; i < num ; i++) { //잔고셋팅 Account1.SetBalance(i); //옵션함수로 해당 종목이 옵션인지 확인 if (Option.GetCurrent(Account1.Balance.code) > 0 && Account1.Balance.count > 0) { //종목코드 var cc = Account1.Balance.code; //잔고수량 var vv = Account1.Balance.count; //매도포지션이면 if (Account1.Balance.position == 1) { //청산 Account1.OrderBuy(cc, vv,Option.GetAsk(cc, 5),0); } //매수포지션이면 if (Account1.Balance.position == 2) { //청산 Account1.OrderSell(cc, vv,Option.GetBid(cc, 5),0); } } Main.MessageLog("하방합성선물매도청산"); } } } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //만기일 15시 이후이면 if (nEventID == 1 && HHMMSS >= 150000) { //타이머종료 Main.KillTimer(1); //전체 종목수 var num = Account1.GetTheNumberOfBalances(); //전체 종목 중 옵션만 청산하고 차월물로 진입 for(var i = 0 ; i < num ; i++) { //잔고셋팅 Account1.SetBalance(i); //옵션함수로 해당 종목이 옵션인지 확인 if (Option.GetCurrent(Account1.Balance.code) > 0 && Account1.Balance.count > 0) { //종목코드 var cc = Account1.Balance.code; //잔고수량 var vv = Account1.Balance.count; //매도포지션이면 if (Account1.Balance.position == 1) { //청산 Account1.OrderBuy(cc, vv,Option.GetAsk(cc, 5),0); //차근월물 코드 찾기 var strike = Option.GetExercisePrice(cc); //잔고종목이 콜이면 if (cc == Option.GetCodeByExercisePrice(0,strike)) var NextMonth = Option.GetCodeByExercisePrice(2, strike); else //잔고종목이 풋이면 var NextMonth = Option.GetCodeByExercisePrice(3, strike); //동일행사가의 차근월물 매도주문 Account1.OrderSell(NextMonth,vv,Option.GetBid(NextMonth,5),0); } //매수포지션이면 if (Account1.Balance.position == 2) { //청산 Account1.OrderSell(cc, vv,Option.GetBid(cc, 5),0); //차근월물 코드 찾기 var strike = Option.GetExercisePrice(cc); //잔고종목이 콜이면 if (cc == Option.GetCodeByExercisePrice(0,strike)) var NextMonth = Option.GetCodeByExercisePrice(2, strike); else //잔고종목이 풋이면 var NextMonth = Option.GetCodeByExercisePrice(3, strike); //동일행사가의 차근월물 매수주문 Account1.OrderBuy(NextMonth,vv,Option.GetAsk(NextMonth,5),0); } } } } }
프로필 이미지
몬스터
2019-06-27
3239
글번호 224907
답변완료

기 보유종목 매도(현물)

안녕하세요? 아래 수식 작성 부탁드립니다 (매번 큰 도움 감사드립니다.) 1) (예를들어) 삼성전자 를 10주 기보유 (스마트폰 등으로 몇일전에 매수) 2) 기 보유한 삼성전자가 예스트레이더 차트(차트명 C1)에서 시스템(시스템명: S1) 적용되어 있음 3) 시스템 S1에서 매도신호 발생 4) 예스 스팟으로 매도신호 받아서 매도 ------------------------------------- 위의 상황을 아래 수식으로 작성했을때, 이미 해당종목에 대해 보유 수량이 있음에도 매도신호가 발생을 안하네요.. 도움 부탁드립니다. (변수 선언 부분은 글에서 제거했습니다.) function Main_OnStart() { Main.MessageList("시작합니다."); Main.MessageList("C1 차트종목: ",C1.GetCode(1)); //S2차트종목코드를 불러와 종목객체를 요청 Main.ReqMarketData(C1.GetCode(1), 0, 0); Start = 0; state1 = 0; } //요청한 종목객체가 생성되어 수신되면 function Main_OnRcvMarketData(MarketData) { //현재 수신된 종목객체가 요청한 종목과 같으면 //item에 종목객체를 저장(이후에 item이 해당 종목객체로 사용됨) if (MarketData.code == C1.GetCode(1)) SSEobject = MarketData; } function C1_OnRiseSignal(Signal) { Skind = Signal.signalKind; Scode = Signal.code; Scount = Signal.count; if (Signal.signalKind == 2) { A1.SetBalance(scode,0); BxID=A1.OrderSell(Scode,A1.Balance.count,SSEobject.current,0); Main.MessageLog("매도주문"); Start1 = 0; //타이머 실행 Main.MessageLog("매도주문 후 타이머20초 시작"); Main.SetTimer(2, 1000);//1초 타이머 } } function Main_OnOrderResponse(OrderResponse) { //매수주문 접수되면 주문번호 저장 if (OrderResponse.orderID == BuyID) { BuyNum = OrderResponse.orderNum; } //매수청산주문 접수되면 주문번호 저장 if (OrderResponse.orderID == BxID) { BxNum = OrderResponse.orderNum; } } function Main_OnTimer(nEventID) { if (nEventID == 2) { //2번 타이머 종료 Main.KillTimer(2); //BxNum주문번호에 대한 미체결 객체 설정 A1.SetUnfillOrderNumber(BxNum); //설정된 미체결객체에 잔량이 있으면 if (A1.Unfill.count > 0) { //BxNum주문 정정 (매수1호가로 정정) if (A1.Unfill.price != SSEobject.Bid(1)) { BxID = A1.OrderReplacePrice(BxNum, SSEobject.Bid(1)); Main.MessageLog("매도 정정"); Main.SetTimer(3, 1000); } } } if (nEventID == 3) { //2번 타이머 종료 Main.KillTimer(3); //BxNum주문번호에 대한 미체결 객체 설정 A1.SetUnfillOrderNumber(BxNum); //설정된 미체결객체에 잔량이 있으면 if (A1.Unfill.count > 0) { //BxNum주문 정정 (매수1호가로 정정) if (A1.Unfill.price != SSEobject.Bid(1)) { BxID = A1.OrderReplacePrice(BxNum, SSEobject.Bid(1)); Main.MessageLog("매도 정정"); } } } }
프로필 이미지
adino30
2019-06-26
3297
글번호 224906
답변완료

확장차트로 거래 시 문의

var callCode = Option.GetCodeByExercisePrice(0, exercisePrice); // 0 : 최근월물 콜 // 시스템명, 일반수식 YL_TYPE_NORMAL, 입력변수 Array, 비용/수량 설정, 강제청산 설정 var callSysInfo = new SystemInfo("Test_Signal_1",YL_TYPE_NORMAL,null,null,null); //콜 차트, 1분봉, 10000개,수정주가x,갭보정x var callChartItem = new ReqChartItem(callCode, 1, CHART_PERIOD_MINUTE, 10000, CHART_REQCOUNT_BAR, false, false); // ReqChartItem, SystemInfo, IndicatorInfo, ReqRefItem Main.ReqChartEx(callChartItem, callSysInfo, null, null); 위의 식으로 테스트해보니, 스팟에서 차트와 "Test_Signal_1" 시스템이 걸리기는 합니다. 1. 스팟을 적용할 때 "자동주문" 으로 설정을 하여도, 스팟에서 차트를 열어보면 "Test_Signal_1" 시그널이 "시험" 으로 걸려있습니다. "Test_Signal_1" 을 "자동" 으로 바꾸어 자동매매가 되게 하려면 어떻게 해야 하나요? 2. 이 하나의 스팟전략 안에서 "Test_Signal_1" 뿐만 아니라 "Test_Signal_2", "Test_Signal_3" 등을 확장차트로 불러오고, 모두 같은 종목을 거래한다고 가정하겠습니다. 이 때 상황에 따라 시그널을 허용하게도 하고 무시하게도 하고 싶습니다. 시그널이 발생하였을 때, Main_OnRiseSignal() 등에서 이것이 "Test_Signal_1" 로부터 온 것인지, "Test_Signal_2" 에서 온 것인지를 판단할 수 있나요?
프로필 이미지
idnotbe
2019-06-25
3222
글번호 224905
답변완료

종목자동검색 문의

안녕하세요 예스스팟으로 정해진 검색식을 이용하여 장중에 조건에 맞는 종목을 찾아서 매매하고 싶습니다 전종목을 실시간으로 검색해서 자동매매할 수 있나요?
프로필 이미지
huma80
2019-06-24
3496
글번호 224904