커뮤니티

예스스팟 Q&A

답변완료

전략 취합 방법 문의 드립니다.

안녕하세요? 예스스팟을 이용하여 예스랭귀지로 짜여진 전략을 취합하는 방법과 로그를 기록하는 방법에 대한 예제를 얻고 싶어서 이렇게 문의 드립니다. 이를 풀어서 다시 말씀드리면, (1) 예스랭귀지로 작성된 다수의 전략을 예스스팟에서 취합하여 주문을 내는 방법에 관해 알고싶습니다. 예를 들어 어떤 시점에서 "전략1"에서 매수 시그널이 나오고 "전략2"와 "전략3"에서 매도 시그널이 나오는 경우 각각의 전략이 걸려있는 차트에서 매수 1개 / 매도 2개의 주문이 나가는 것이 아니라, 이를 취합하여 1개의 매도 주문만 나가게 하는 스크립트에 대한 예제가 있으시면 부탁드립니다. (2) 또한 주문이 나온 전략명과 시그널을 (텍스트 또는 엑셀) 파일 형태의 로그를 남기는 방법에 대해서도 알고 싶습니다. 이 또한 가능하다면 도움 좀 부탁 드리겠습니다. 감사합니다. 즐거운 하루 되십시오.
프로필 이미지
롱감마
2017-06-12
2053
글번호 224183
답변완료

종목 선정 문의

안녕하세요 항상 주신 답변 잘 활용하고 있습니다. 미리 감사드립니다. 아래는 이용중인 스팟전략 중 일부로 종목 선정 부분입니다. 여기에 다음과 같은 조건을 추가하고 싶습니다 ㅇ 현재 : 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
2316
글번호 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
2193
글번호 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
2221
글번호 224178
답변완료

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

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

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

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

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

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