커뮤니티

질문드립니다.

프로필 이미지
절제9단
2018-11-27 01:25:55
2909
글번호 224672
답변완료
아래와 같은 yeslanguage 전략을 이용하는 걸 테스트 중인데요. 예스 검색식에서 만들어서 파워검색식이나 종목검색식에서는 결과가 잘 나옵니다. 그런데 스팟의 아래식에 test 종목(만든것) 이름을 넣어서 해보니, "파일을 열 수 없습니다." 라는 에러가 뜨면서 안됩니다. 해결방법을 알려주시면 감사하겠습니다. 아래 업데이트는 *처리 하였습니다. var cond,rcvChart,rcvMK, RcvChartEnd = false; var item,itemcnt; //아래 배열변수를 사용하는 이유는 동일종목의 정보는 배열변수의 동일방번호에 저장하기 위함입니다. var CT = [];//차트객체 저장할 배열변수 var MK = [];//종목객체 저장할 배열변수 var IS = [];//미완성 신호횟수 저장할 배열변수 var VV = [];//주문수량 저장할 변수 var C1 = [];//첫 매수가격을 저장할 변수 var CC = [];//다음 하락시 가격을 저장할 변수 //스팟 시작시 종목검색 요청 function Main_OnStart() { Main.ReqPowerSearch("test");//사용자검색조건명 지정 var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); rcvChart = 0; } //종목검색 완료(aItemList : 종목리스트), (nCount : 종목수) function Main_OnRcvItemList(aItemList, nCount) { item = aItemList; itemcnt = nCount; RcvChart = 0; RcvChartEnd = false; //확장 챠트요청(최대 100개까지만 가능) // 확장챠트의 생성과 적용될 시스템의 세부 설정 var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 1000, // 최대진입수량 20); // 최대진입횟수 //종목검색된 종목의 차트와 종목객체 요청 for (var i = 0; i < Math.min(itemcnt,100); i++) { //생성할 차트 셋팅 var C1 = new ReqChartItem(item[i], 1, CHART_PERIOD_DAILY, 499,CHART_REQCOUNT_BAR,false, false); //차트에 적용할 시스템명 및 설정 var S1 = new SystemInfo("DMI스팟",YL_TYPE_NORMAL,null,TradeSet,null); Main.ReqChartEx(C1,S1); Main.ReqMarketData(item[i]); } } //차트객체 수신받으면 //해당 종목의 종목검색순번과 같은 번호의 배열방에 차트객체저장 function Main_OnRcvChartEx(ChartEx) { for (var i = 0; i < Math.min(itemcnt,100); i++) { if (ChartEx.code == item[i]) { CT[i] = ChartEx; } } } //차트객체 수신받으면 //해당 종목의 종목검색순번과 같은 번호의 배열방에 종목객체저장 function Main_OnRcvMarketData(MarketData) { for (var i = 0; i < Math.min(itemcnt,100); i++) { if (MarketData.code == item[i]) { MK[i] = MarketData; } } } //각 차트의 새로운 봉이 생성 function Main_OnBarAppended(ChartEx, nData) { //차트와 종목객체 전체가 수신이 완료된 상태이고 if (CT.length == Math.min(itemcnt,100) && MK.length == Math.min(itemcnt,100) ) { //새로운봉이 생성된 종목과 CT배열의 종목과 비교해 //같은 종목을 찾으면 미완성신호를 카운트 하는 배열변수의 동일방번호를 0으로 초기화 for (i = 0; i < Math.min(itemcnt,100); i++) { if (ChartEx.code == CT[i].code) { IS[i] = 0; } } } } //확장챠트에서 발생한 신호에 의해 주문을 넣는 단계 function Main_OnRiseIncompleteSignal(ChartEx, IncompleteSignal) { //차트와 종목객체 전체가 수신이 완료된 상태이고 if (CT.length == Math.min(itemcnt,100) && MK.length == Math.min(itemcnt,100) ) { //잔고세팅 A1.SetBalance(IncompleteSignal.code, nPosition); //buy신호 발생 if (IncompleteSignal.signalKind == 1) { //해당 종목의 방번호를 찾아서 for (i = 0; i < Math.min(itemcnt,100); i++) { if (ChartEx.code == CT[i].code && ChartEx.code == MK[i].code) { //카운트 1증가 IS[i] = IS[i]+1; //현재 미완성신호 발생하고 해당종목의 잔고가 0이고 첫번째 매수미완성신호이면 매수 if (A1.Balance.count == 0 && IS[i] == 1) { // 매수주문 A1.OrderBuy(IncompleteSignal.code, IncompleteSignal.count , MK[i].Ask(3), 0); //수량과 가격 저장 C1[i] = IncompleteSignal.price ;//최초매수가 CC[i] = 0.1;//하락시 가격 계산할 변수 VV[i] = (IncompleteSignal.price * IncompleteSignal.count)*0.1;//최초매수금의 10% } } } } //잔고에 수량이 있고 청산신호 발생하면 청산 if (A1.Balance.count > 0 && IncompleteSignal.signalKind == 2) { // 매도주문 A1.OrderSell(IncompleteSignal.code, A1.Balance.count, MK[i].Bid(3), 0); } } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID) { //체결데이터 수신 업데이트 if (lUp*dateID == 20001) { //루프를 돌아 생성된 종목중 어떤 종목인지 파악 for (i = 0; i < Math.min(itemcnt,100); i++) { //어떤 배열방의 종목인지 찾았으면 if (sItemCode == MK[i]) { //해당 종목 잔고셋팅 A1.SetBalance(MK[i].code, 0); //잔고 수량이 있을때만 if (A1.Balance.count > 0) { //최초 매수가격의 2% 이상 상승하면 전량청산 if (MK[i].current >= C1[i]*1.02) { A1.OrderSell(MK[i].code,A1.Balance.count, MK[i].Bid(3), 0); } //하락시 매수할 가격이하이면 추가매수 if (MK[i].current <= Ci[i]*(1-CC[i])) { A1.OrderBuy(MK[i].code,Math.floor(VV[i]/MK[i].Ask(3)),MK[i].Ask(3), 0); CC[i] = CC[i]+0.1;//0.1을 추가해줌 } } } } } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2018-12-24 17:05:07

안녕하세요 예스스탁입니다. 예스스팟에서 Main.ReqPowerSearch는 예스랭귀지로 작성한 수식명을 직접 지정하는 것이 아닙니다. "파일을 열 수 없습니다." 위 메세지는 사용자조건검색명으로 저장된 이름이 없을때 발생합니다. 예스트레이더의 [3202] 파워종목검색화면이나 NH트레이더의 [5202] 종목검색화면에서 사용자검색조건으로 저장한 검색명을 지정해 검색을 수행합니다. 즐거운 하루되세요 > 절제9단 님이 쓴 글입니다. > 제목 : 질문드립니다. > 아래와 같은 yeslanguage 전략을 이용하는 걸 테스트 중인데요. 예스 검색식에서 만들어서 파워검색식이나 종목검색식에서는 결과가 잘 나옵니다. 그런데 스팟의 아래식에 test 종목(만든것) 이름을 넣어서 해보니, "파일을 열 수 없습니다." 라는 에러가 뜨면서 안됩니다. 해결방법을 알려주시면 감사하겠습니다. 아래 업데이트는 *처리 하였습니다. var cond,rcvChart,rcvMK, RcvChartEnd = false; var item,itemcnt; //아래 배열변수를 사용하는 이유는 동일종목의 정보는 배열변수의 동일방번호에 저장하기 위함입니다. var CT = [];//차트객체 저장할 배열변수 var MK = [];//종목객체 저장할 배열변수 var IS = [];//미완성 신호횟수 저장할 배열변수 var VV = [];//주문수량 저장할 변수 var C1 = [];//첫 매수가격을 저장할 변수 var CC = [];//다음 하락시 가격을 저장할 변수 //스팟 시작시 종목검색 요청 function Main_OnStart() { Main.ReqPowerSearch("test");//사용자검색조건명 지정 var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); rcvChart = 0; } //종목검색 완료(aItemList : 종목리스트), (nCount : 종목수) function Main_OnRcvItemList(aItemList, nCount) { item = aItemList; itemcnt = nCount; RcvChart = 0; RcvChartEnd = false; //확장 챠트요청(최대 100개까지만 가능) // 확장챠트의 생성과 적용될 시스템의 세부 설정 var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, 1, // 거래수량 123456789, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부 1000, // 최대진입수량 20); // 최대진입횟수 //종목검색된 종목의 차트와 종목객체 요청 for (var i = 0; i < Math.min(itemcnt,100); i++) { //생성할 차트 셋팅 var C1 = new ReqChartItem(item[i], 1, CHART_PERIOD_DAILY, 499,CHART_REQCOUNT_BAR,false, false); //차트에 적용할 시스템명 및 설정 var S1 = new SystemInfo("DMI스팟",YL_TYPE_NORMAL,null,TradeSet,null); Main.ReqChartEx(C1,S1); Main.ReqMarketData(item[i]); } } //차트객체 수신받으면 //해당 종목의 종목검색순번과 같은 번호의 배열방에 차트객체저장 function Main_OnRcvChartEx(ChartEx) { for (var i = 0; i < Math.min(itemcnt,100); i++) { if (ChartEx.code == item[i]) { CT[i] = ChartEx; } } } //차트객체 수신받으면 //해당 종목의 종목검색순번과 같은 번호의 배열방에 종목객체저장 function Main_OnRcvMarketData(MarketData) { for (var i = 0; i < Math.min(itemcnt,100); i++) { if (MarketData.code == item[i]) { MK[i] = MarketData; } } } //각 차트의 새로운 봉이 생성 function Main_OnBarAppended(ChartEx, nData) { //차트와 종목객체 전체가 수신이 완료된 상태이고 if (CT.length == Math.min(itemcnt,100) && MK.length == Math.min(itemcnt,100) ) { //새로운봉이 생성된 종목과 CT배열의 종목과 비교해 //같은 종목을 찾으면 미완성신호를 카운트 하는 배열변수의 동일방번호를 0으로 초기화 for (i = 0; i < Math.min(itemcnt,100); i++) { if (ChartEx.code == CT[i].code) { IS[i] = 0; } } } } //확장챠트에서 발생한 신호에 의해 주문을 넣는 단계 function Main_OnRiseIncompleteSignal(ChartEx, IncompleteSignal) { //차트와 종목객체 전체가 수신이 완료된 상태이고 if (CT.length == Math.min(itemcnt,100) && MK.length == Math.min(itemcnt,100) ) { //잔고세팅 A1.SetBalance(IncompleteSignal.code, nPosition); //buy신호 발생 if (IncompleteSignal.signalKind == 1) { //해당 종목의 방번호를 찾아서 for (i = 0; i < Math.min(itemcnt,100); i++) { if (ChartEx.code == CT[i].code && ChartEx.code == MK[i].code) { //카운트 1증가 IS[i] = IS[i]+1; //현재 미완성신호 발생하고 해당종목의 잔고가 0이고 첫번째 매수미완성신호이면 매수 if (A1.Balance.count == 0 && IS[i] == 1) { // 매수주문 A1.OrderBuy(IncompleteSignal.code, IncompleteSignal.count , MK[i].Ask(3), 0); //수량과 가격 저장 C1[i] = IncompleteSignal.price ;//최초매수가 CC[i] = 0.1;//하락시 가격 계산할 변수 VV[i] = (IncompleteSignal.price * IncompleteSignal.count)*0.1;//최초매수금의 10% } } } } //잔고에 수량이 있고 청산신호 발생하면 청산 if (A1.Balance.count > 0 && IncompleteSignal.signalKind == 2) { // 매도주문 A1.OrderSell(IncompleteSignal.code, A1.Balance.count, MK[i].Bid(3), 0); } } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID) { //체결데이터 수신 업데이트 if (lUp*dateID == 20001) { //루프를 돌아 생성된 종목중 어떤 종목인지 파악 for (i = 0; i < Math.min(itemcnt,100); i++) { //어떤 배열방의 종목인지 찾았으면 if (sItemCode == MK[i]) { //해당 종목 잔고셋팅 A1.SetBalance(MK[i].code, 0); //잔고 수량이 있을때만 if (A1.Balance.count > 0) { //최초 매수가격의 2% 이상 상승하면 전량청산 if (MK[i].current >= C1[i]*1.02) { A1.OrderSell(MK[i].code,A1.Balance.count, MK[i].Bid(3), 0); } //하락시 매수할 가격이하이면 추가매수 if (MK[i].current <= Ci[i]*(1-CC[i])) { A1.OrderBuy(MK[i].code,Math.floor(VV[i]/MK[i].Ask(3)),MK[i].Ask(3), 0); CC[i] = CC[i]+0.1;//0.1을 추가해줌 } } } } } }