커뮤니티

예스스팟 Q&A

답변완료

종목 선정 문의

안녕하세요 항상 주신 답변 잘 활용하고 있습니다. 미리 감사드립니다. 아래는 이용중인 스팟전략 중 일부로 종목 선정 부분입니다. 여기에 다음과 같은 조건을 추가하고 싶습니다 ㅇ 현재 : 9시 35초에 설정된 2.7에 가까운 콜풋 종목 선정 ㅇ 추가내용 : 9시 35초에 2.7에 가까은 콜풋, 2.1에 가까운 콜풋 종목을 각각 선정하여 2.7에 가까운 콜풋종목의 절대값의 차이가 0.8 이상이면 2.1에 가까운 콜풋종목으로 최종 거래종목을 선정 현재의 수식은 아래와 같습니다. ========================================================================== var Start = 0; var BC; var BP; var SC; var SP; var CPEntryPrice = 0; var PEntryPrice = 0; var CEntryPrice = 0; var CPLsum = 0; var PLsum = 0; var CLsum = 0; var EntryPercent = 0; var Entry1; var Entry2; var InHMS; var SCP1; var SCP2; var SCP3; var SCP4; var SPP1; var SPP2; var SPP3; var SPP4; var CPLsumin = 0; function Main_OnStart() { Start = 0; Main.MessageList("시작"); Entry1 = false; Entry2 = false; //타이머 셋팅(1번,5초) Main.SetTimer(1, 5000); } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //1번 타이머 동작 if (nEventID == 1 && HHMMSS >= 090035 && Entry1 == false) { //ATM위 행사가 갯수 var UNum = Option.uppersATM; //ATM아래 행사가 갯수 var LNum = Option.lowersATM; //각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언 var CallCode = new Array(UNum+LNum+1); //각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언 var CallPrice = new Array(UNum+LNum+1); //각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언 var PutCode = new Array(UNum+LNum+1); //각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언 var PutPrice = new Array(UNum+LNum+1); //콜종목 찾기 //콜옵션중 2.7에 가장 가까운 종목 //콜옵션 모든 종목을 현재가-2.7을 해서 절대값을 취해 저장 for (var i = -LNum; i <= UNum; i++) { CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.7); 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.7에 가장 가까운 종목 //풋옵션 모든 종목을 현재가-2.7을 해서 절대값을 취해 저장 for (var i = -UNum; i <= LNum; i++) { PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.7); 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) { Start = 1; SC = CallOrderCode; SP = PutOrderCode; CEntryPrice = Option.GetCurrentByCode(SC); PEntryPrice = Option.GetCurrentByCode(SP); CPEntryPrice = Math.round(CEntryPrice*100 + PEntryPrice*100)/100; Entry1 = true; Main.MessageList("콜종목:", SC, "풋종목:", SP, "기준양합:", CPEntryPrice); //청산신호발생했으므로 타이머 종료 Main.KillTimer(1); //타이머 셋팅(2번,5초) Main.SetTimer(2, 5000); } }
프로필 이미지
탄젠트80
2017-06-15
2347
글번호 224181
답변완료

옵션 합성

안녕하세요? 아래와 같은 조건을 만족하는 시스템을 작성하고자 합니다. 0. 콜과 풋의 가격이 1.0 ~ 2.0인 양 옵션 종목을 사용한다. 1. 진입1: 장 시작 후 콜과 풋이 교차(수렴)할 때, 교차가 + 1틱에 먼저 도달하는 옵션(상승 종목)을 매수한다 2. 진입2: 잠시 후 양옵션이 등락하여 반대 옵션(하락 종목)이 교차가 + 1틱에 도달하는 경우 이 종목도 매수한다. 이 때는 양매수 상태가 된다. 3. 손절1: 하락종목이 반등하여 교차가를 넘지 못하고 직저(반등시 저가)를 이탈할 때 스탑한다. 이 때 상승 종목만 남는다. 4. 손절2: 하락 종목이 상대(상승종목)의 최저가를 이탈 시 스탑한다. 이 때 상승 종목만 남는다. 만일 이탈 가격를 돌파하면 재매수 한다. 5. 상승 종목이 목표가 도달 시(시초가 + 1.25 P) 또는 가격 = 2.5 P에서 익절한다. 6. 당일 장 마감시 청산 한다. 감사합니다.
프로필 이미지
리턴
2017-05-31
2214
글번호 224179
답변완료

함수 작성 방법 검토 부탁드립니다.

아래 예와 같이 전역변수 C2_f_rsi1, C2_f_rsi2, C2_f_rsi4에 차트에 적용된 indicator 값을 받아오는 코딩을 하려고 하는데요... case3는 잘동작하는데, 사용자정의 모듈 함수로 처리하고자 할 때 case1, case2 어떤 방식이 맞는 건가여? var C2_f_rsi1, C2_f_rsi2, C2_f_rsi4; function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) { // case1 CollectIndicators_Test1(); Main.MessageList("test1", C2_f_rsi1.toFixed(2), C2_f_rsi2.toFixed(2), C2_f_rsi4.toFixed(2)); // case2 CollectIndicators_Test2(C2_f_rsi1, C2_f_rsi2, C2_f_rsi4); Main.MessageList("test2", C2_f_rsi1.toFixed(2), C2_f_rsi2.toFixed(2), C2_f_rsi4.toFixed(2)); // case3 C2_f_rsi1 = Chart_2min.GetIndicatorData("___000rsi_data1", 1, 0); C2_f_rsi2 = Chart_2min.GetIndicatorData("___000rsi_data1", 2, 0); C2_f_rsi4 = Chart_2min.GetIndicatorData("___000rsi_data1", 3, 0); Main.MessageList("test3", C2_f_rsi1.toFixed(2), C2_f_rsi2.toFixed(2), C2_f_rsi4.toFixed(2)); } CollectIndicators_Test1() { C2_f_rsi1 = Chart_2min.GetIndicatorData("___000rsi_data1", 1, 0); C2_f_rsi2 = Chart_2min.GetIndicatorData("___000rsi_data1", 2, 0); C2_f_rsi4 = Chart_2min.GetIndicatorData("___000rsi_data1", 3, 0); } CollectIndicators_Test2(_C2_f_rsi1, _C2_f_rsi2, _C2_f_rsi4) { _C2_f_rsi1 = Chart_2min.GetIndicatorData("___000rsi_data1", 1, 0); _C2_f_rsi2 = Chart_2min.GetIndicatorData("___000rsi_data1", 2, 0); _C2_f_rsi4 = Chart_2min.GetIndicatorData("___000rsi_data1", 3, 0); }
프로필 이미지
개똥이
2017-05-31
2241
글번호 224178
답변완료

장시간 이후에 예스스팟을 테스트 어떻케 하나요 ?

수고가 많으십니다. 1. 시험적용 과 자동주문에 차이는 무엇인가여? 2. 장시간 이후에 예스스팟을 테스트 어떻케 하나요? 자동주문을 선택하고 장시간 이후에는 매수,매도 할경우 장마감시간이라고 메시지 뜨면서 매수.매도가 안되던데. 꼭 장시간에만 테스트를 할수 있는건지? 장시간 이후에도 별도로 테스트 할수 있는 방법좀 알려주세요.
프로필 이미지
찬홍아빠
2017-05-29
2269
글번호 224176

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

프로필 이미지
somun
2017-05-29
3
글번호 224174

개똥이 님에 의해서 삭제되었습니다.

프로필 이미지
개똥이
2017-05-29
3
글번호 224173

확장차트 생성 후 엑셀 작성 문의합니다.

안녕하세요. 예스스팟으로 매매에 도움을 얻고자 하는 1인입니다. 최근 여러 종목에서 필요한 값을 엑셀에 정리할 때 예스스팟을 활용할려고 합니다. 그래서 구상한 형태는 다음과 같은데요. 1 엑셀에 종목코드, 코스닥/코스피 표시 해두기 2 엑셀에 종목코드 읽어들여서 확장차트 생성하기 3 확장차트에서 최근 260일 종가 읽어들여서 수식 값 계산하기 4 수식 결과값 엑셀에 출력 그런데 현재 2번 확장차트 생성하기까지는 실행이 되는데, 이후 확장차트가 생성이 되어도 function Main_OnRcvChartEx(ChartEx) 로 진행이 되질 않습니다. 무엇이 잘못되었는지 참 고민하다가 여기에 글을 올립니다. 조언 부탁드립니다. ------------ 엑셀 파일 A B C D 1 종목코드 종목명 K (수식결과값입력란:빈칸) 2 종목코드 종목명 Q (수식결과값입력란:빈칸) (K면 코스피, Q면 코스닥) -------------- 코드 var ExcelCode = [], InMarket = [], Code = []; var KPprofit = [], KQprofit = [], Profit = [], Covar = [], Beta = []; var rcv, rcv1, ExcelRow, C1, ChartEx1, Period; var Avgpf, AvgKPpf, AvgKQpf, VarKP, VarKQ, AvgCovItem; function Main_OnStart() //특정이벤트에서 { Main.MessageLog("시작") ExcelRow = Excel1.GetRowCount(1); //엑셀에서 종목코드를 가져와 ExcelCode에 저장 for (var i = 2; i <= ExcelRow; i++) { ExcelCode[i-2] = Excel1.GetData(1, "A"+i); InMarket[i-2] = Excel1.GetData(1, "C"+i); } //객체수신 횟수를 카운트할 변수 rcv = 0; //객체수신하면 저장할 배열변수 Code = []; //자료수집 기간 설정 Period = 260; //코스피, 코스닥 지수 수익률 분산 계산 for (var j = 0 ; j < Period ; j++) { KPprofit[j] = ( ChartExKP.GetClose(1,j) / ChartExKP.GetClose(1,j+1) ) - 1; AvgKPpf = AvgKPpf + KPprofit[j] / Period; KQprofit[j] = ( ChartExKQ.GetClose(1,j) / ChartExKQ.GetClose(1,j+1) ) - 1; AvgKQpf = AvgKQpf + KQprofit[j] / Period; } for (var k = 0 ; k < Period ; k++) { VarKP = VarKP + Math.pow( AvgKPpf - KPprofit[k], 2); VarKQ = VarKQ + Math.pow( AvgKQpf - KQprofit[k], 2); } Main.MessageLog("KP, KQ 분산 측정, 타이머 시작"); Main.SetTimer(1,1000) } function Main_OnTimer(nEventID) //특정이벤트에서 { //ExcelCode에 저장된 값이 1개이상이면 if (nEventID == 1 && ExcelCode.length >= 1 && ExcelCode.length <= ExcelRow + 1 ) { //ExcelCode[rcv]방의 종목요청 Main.ReqMarketData(ExcelCode[rcv]); Main.MessageList("종목 <",ExcelCode[rcv],"> 생성 요청"); } Main.KillTimer(1); } function Main_OnRcvMarketData(MarketData) { //확장차트 객체 초기화 // var ChartEx1 = null; //직전 요청산 종목이 수신되면 if (MarketData.code == ExcelCode[rcv]) { //Object의 rcv방에 해당종목객체 저장 Code[rcv] = MarketData; var C1 = new ReqChartItem(MarketData.code, 1, CHART_PERIOD_DAILY, 261, CHART_REQCOUNT_BAR,false, false); Main.ReqChartEx(C1, null, null, null); Main.MessageList("종목 <",ExcelCode[rcv],">의 확장차트 생성"); } function Main_OnRcvChartEx(ChartEx) { ChartExA = ChartEx; for (var l = 0 ; l < Period; l++) { Profit[l] = ( ChartExA.GetClose(1,l) / ChartExA.GetClose(1,l+1) ) - 1; Avgpf = Avgpf + Profit[l] / Period; Main.MessageLog("Avgpf 측정"); } //코스피, 코스닥 종목 구분 if ( InMarket[rcv] == "K" ) { for (var m = 0 ; m < Period ; m++) { Covar[m] = ( Profit[m] - AvgKPpf )*( KPprofit[m] - Avgpf ); AvgCovItem = AvgCovItem + Covar[m] / Period; } Beta[rcv] = AvgCovItem / VarKP; Main.MessageLog("Beta 측정"); } if ( InMarket[rcv] == "Q" ) { for (var n = 0 ; n < Period ; n++) { Covar[n] = ( Profit[n] - AvgKQpf )*( KQprofit[n] - Avgpf ); AvgCovItem = AvgCovItem + Covar[n] / Period; } Beta[rcv] = AvgCovItem / VarKQ; Main.MessageLog("Beta 측정"); } if ( InMarket[rcv] == "" ) { Beta[rcv] = 0; Main.MessageLog("Beta 측정"); } rcv1 = rcv + 2; //엑셀에 베타(1년) 입력 Excel1.SetColData(1, "D"+rcv1, Beta[rcv]); Main.MessageList("종목 <",ExcelCode[rcv],">의 Beta 출력"); //필요한 변수 초기화 Avgpf = 0; AvgCovItem = 0; //rcv는 1증가 rcv = rcv+1; //타이머 재설정 Main.SetTimer(1,5000); //배열변수가 0부터 존재하므로 //rcv가 종목코드갯수 이하일때만 요청 if (rcv < ExcelCode.length) { Main.ReqMarketData(ExcelCode[rcv]); } if ( rcv >= ExcelRow - 1 ) { Excel1.Save() }; } }
프로필 이미지
매매광
2017-05-25
2546
글번호 224172

찬홍아빠 님에 의해서 삭제되었습니다.

프로필 이미지
찬홍아빠
2017-05-25
14
글번호 224171

찬홍아빠 님에 의해서 삭제되었습니다.

프로필 이미지
찬홍아빠
2017-05-22
7
글번호 224170
답변완료

Grid 와 엑셀 객체 사용관련 문의 드립니다.

예스스팟에서 그리드를 활용하여 수시로 변경되는 데이터들을 보관하고, 업데이트하여 사용중입니다. 질문이 좀 여러가지네요. ^__^ 1. 전략을 실행하면 Grid 부분에서 마우스로 보이기 를 클릭해 줘야 보이는데, 기본적으로 보이도록 할 방법은 없는지요? 2. Grid 객체를 예스스팟 편집기에서 사용시 row는 최소 1 이상으로 줘야 합니다. 이런 경우 실행시 grid.rows 하면 1이 아닌 0이 리턴 됩니다. 맞는 건가요? 이걸 알아야 새로운 row 추가 후 사용시 0 또는 1로 결정해서 set data를 할 수 있거든요. 3. Grid의 row 나 col은 0부터 시작된다고 하였는데요. 모두 0부터 사용이 되는게 맞는것 같은데, deleterow(0) 이렇게 하면 0 row가 아닌 1번 row가 삭제되는 것으로 테스트가 됩니다. 4. 엑셀객체를 사용하는데, 항상 화면에 엑셀이 나타나는데, 이거 나타나지 않게 할 수 있나요? 5. 엑셀객체 사용시 새로운 프로세스로 가동이라는 게 있던데, 이거는 Y / N 으로 해도 큰 차이를 알수가 없네요. 6. 전략 실행 후 엑셀객체가 뜬 상태에서 전략을 중지하거나 취소하면 PC가 종료되어 버리는 경우가 있습니다. 어떤 경우에 해당되는지 알 수가 없네요. 예스트레이더 파일 전체 새로 받아서 해 보아도 마찬가지 입니다. 7. 엑셀에는 예스스팟에서 사용할 여러 설정값을 저장해 놓고 불러다 사용하는 용도입니다. 그냥 txt 파일에 저장해 놓고 불러다 사용토록 하면 더 좋을 것 같은데요. 좋은 방법이 없을까요? (일반적인 스크립트의 파일스트림은 사용 불가한 듯) 좀 여러가지이지만 성실한 답변 부탁드립니다.
프로필 이미지
파워풀맨
2017-05-15
2472
글번호 224166