커뮤니티

수식 보완 부탁드립니다.

프로필 이미지
dayun01
2019-09-06 11:03:04
3239
글번호 224984
답변완료
평소 도움에 감사드립니다. 조건검색으로 검색된 종목을 특정기준으로 정렬해서 그중 10종목만 매수하려합니다. -정렬기준: (전일고가-전일종가/(전일종가) (내림차순) * 전일 데이타를 가져오는게 어려움이 많다면 전일 15:30분이후에 검색해서 종목정렬 및 관심종목 저장한후 당일에 가져오는 로직도 좋습니다. *아래 수식은 기존 QnA에 있던 건데 여기에 수정 보완해주시면 감사하겠습니다. ------------------------------------------------------------------- var list; //차트객체 순서대로 저장할 변수 var ct = []; //스파시작 function Main_OnStart() { //종목검색 Main.ReqPowerSearch("aaa"); } //종목검색완료 function Main_OnRcvItemList(aItemList, nCount) { //검색된 종목을 전역변수에 저장 //list = aItemList; list = ["005930","000660","010950","090430","299660"]; //요청카운트 (첫종목 0으로 시작) req = 0; //차트설정, 시스템 설정 var ChartSet = new ReqChartItem(list[req],1,CHART_PERIOD_MINUTE,100,CHART_REQCOUNT_BAR,false,false); var SystemSet = new SystemInfo("시스템이름", YL_TYPE_NORMAL, null, null, null); //차트객체 요청 Main.ReqChartEx(ChartSet,SystemSet); } //차트객체 생성완료 function Main_OnRcvChartEx(ChartEx) { //ct배열에 차트객체 저장 ct[req] = ChartEx; Main.MessageList(req,ct[req].GetCode(1)); //요청횟수 1 증가 req = req+1; //요청횟수가 검색된 종목수 보다 작으면 //다음종목 요청 if (req < list.length) { //차트설정, 시스템 설정 var ChartSet = new ReqChartItem(list[req],1,CHART_PERIOD_MINUTE,100,CHART_REQCOUNT_BAR,false,false); var SystemSet = new SystemInfo("시스템이름", YL_TYPE_NORMAL, null, null, null); //차트객체 요청 Main.ReqChartEx(ChartSet,SystemSet); } else //요청횟수가 검색된 종목수 이상이면 모두 요청했으므로 끝 { Main.MessageList("차트객체 생성끝"); } } //차트에서 신호가 발생하면 function Main_OnRiseSignal(ChartEx, Signal) { Main.MessageList("신호발생 : ",Signal.code,Signal.signalKind); for (var i = 0; i < ct.length; i++) { //전체 차트 객체 중 신호발생된 객체를 찾고 if (ChartEx.GetCode(1) == ct[i].GetCode(1)) { //매수신호이면 신호가격으로 10주 주문 if (Signal.signalKind == 1) { Main.MessageList("매수주문 : ",i,ct[i].GetCode(1)); Account1.OrderBuy(ct[i].GetCode(1), 10, Signal.price,0); //타이머를 차트객체 배열방 번호와 동일번호로 지정 Main.SetTimer(i, 10000);//10초 타이머 } //매도신호이면 if (Signal.signalKind == 2) { //전체 미체결 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체미체결 중 신호발생 종목과 같은 종목의 미체결은 모두 취소 for (var z = 0; z < num; z++) { Account1.SetUnfill(z); if (Account1.Unfill.count > 0 && Account1.Unfill.code == ChartEx.GetCode(1)) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //잔고셋팅 Account1.SetBalance(ct[i].GetCode(1), 0); //잔고수량이 있으면 신호가격으로 전량청산 if (Account1.Balance.count > 0) { Main.MessageList("매도주문 : ",i,ct[i].GetCode(1)); Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,Signal.price, 0); //타이머를 차트객체 배열방 번호와 동일번호로 지정 Main.SetTimer(i, 10000);//10초 타이머 } } break; } } } //타이머가 동작하면 function Main_OnTimer(nEventID) { Main.MessageList("타이머 : ",nEventID); //동작된 타이머 번호의 차트객체에서 종목코드 가져와 종목객체생성 Main.ReqMarketData(ct[nEventID].GetCode(1)); //1회 동작 후 타이머 종료 Main.KillTimer(nEventID); } //종목객체 생성되면 function Main_OnRcvMarketData(MarketData) { Main.MessageList("종목객체생성 : ",MarketData.code); //종목객체 MD변수에 저장 var MD = MarketData; //전체 미체결 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체미체결 중 신호발생 종목과 같은 종목의 미체결을 찾아 for (var z = 0; z < num; i++) { Account1.SetUnfill(z); if (Account1.Unfill.count > 0 && Account1.Unfill.code == MD.code) { //매수주문이면 if (Account1.Unfill.orderKind == 2) { //정정할 가격 매도1호가 var ReplacePrice = MD.Ask(1); //정정할 가격이 주문가겨과 다르면 if (ReplacePrice > 0 && ReplacePrice != Account1.Unfill.price) { //정정주문 Account1.OrderReplacePrice(Account1.Unfill.orderNum,ReplacePrice); } } //매도주문이면 if (Account1.Unfill.orderKind == 1) { //정정할 가격 매수 1호가 var ReplacePrice = MD.Bid(1); //정정할 가격이 주문가격과 다르면 if (ReplacePrice > 0 && ReplacePrice != Account1.Unfill.price) { //정정주문 Account1.OrderReplacePrice(Account1.Unfill.orderNum,ReplacePrice); } } } break; } //종목객체 삭제 Main.RemoveObject(MD); }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2019-09-19 17:35:53

안녕하세요 예스스탁입니다. 올려주신 수식에 내용을 추가해 드리기 어렵습니다. 별도로 예제 올려드립니다. 종목검색후 각 종목에 대한 종목객체를 생성해서 (전일고가-전일종가/(전일종가)를 계산하고 내림차순으로 정렬후 10종목 매수입니다. 아래 가이드 수식 참고하셔서 수정보완해 사용하시기 바랍니다. var Slist = [],nCnt; var req; function Main_OnStart() { Main.MessageList("종목검색요청"); Main.ReqPowerSearch("PSW1"); } //종목검색완료 function Main_OnRcvItemList(aItemList, nCount) { Main.MessageList("종목검색완료"); //검색된 종목의 종목코드를 Slist에 배열에 추가 Slist = []; if (nCount >= 1) { for (var i = 0; i < nCount; i++) { //2중 배열과 같이 i번방은 [0]은 계산값(초기값 -999), [1]은 종목코드를 저장 Slist[i] = new Array(-999,aItemList[i]); } req = 0; Main.MessageList("종목객체요청",Slist[req][1]); Main.ReqMarketData(Slist[req][1],1,0); } } //종목객체 생성완료 function Main_OnRcvMarketData(MarketData) { //방금 요청한 종목코드와 같은지 확인해서 같으면 if (MarketData.code == Slist[req][1]) { //배열 [0]에 계산값 할당 Slist[req][0] = (MarketData.GetPrevHigh(1) - MarketData.GetPrevClose(1))/MarketData.GetPrevClose(1); //종목객체 삭제 Main.RemoveMarketData(MarketData); //req 1씩증가 req = req+1; //req과 요청할 종목수보다 작으면 다음순번 종목 요청 if (req < Slist.length) { var S = Main.ReqMarketData(Slist[req][1],1,0); //종목객체요청제한에 걸리면 15초 뒤에 다시 요청 if (S == -1) { Main.SetTimer(1, 15000); } } else { Main.MessageList("전종목계산완료"); Main.MessageList("내림차순 정렬전",Slist); Slist.sort(CompareForSort); Main.MessageList("내림차순 정렬후",Slist); //10종목만 매수하므로 해당 리스트의 종목수와 10중에 작은값으로 //loop돌면수 주문집행(1주 시장가) for (i=0; i < Math.min(Slist.length,10); i++) { Main.MessageList("매수주문",Slist[i][1]); Account1.OrderBuy(Slist[i][1],1,0,1); } } } } function Main_OnTimer(nEventID) { if (nEventID == 1) { Main.KillTimer(1); Main.ReqMarketData(Slist[req][1],1,0); } } function CompareForSort(a, b) { //내림차순 return( a[0] < b[0] ? 1 : a[0] > b[0] ? -1 : 0 ); //오름차순 //return( a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0 ); } 즐거운 하루되세요 > dayun01 님이 쓴 글입니다. > 제목 : 수식 보완 부탁드립니다. > 평소 도움에 감사드립니다. 조건검색으로 검색된 종목을 특정기준으로 정렬해서 그중 10종목만 매수하려합니다. -정렬기준: (전일고가-전일종가/(전일종가) (내림차순) * 전일 데이타를 가져오는게 어려움이 많다면 전일 15:30분이후에 검색해서 종목정렬 및 관심종목 저장한후 당일에 가져오는 로직도 좋습니다. *아래 수식은 기존 QnA에 있던 건데 여기에 수정 보완해주시면 감사하겠습니다. ------------------------------------------------------------------- var list; //차트객체 순서대로 저장할 변수 var ct = []; //스파시작 function Main_OnStart() { //종목검색 Main.ReqPowerSearch("aaa"); } //종목검색완료 function Main_OnRcvItemList(aItemList, nCount) { //검색된 종목을 전역변수에 저장 //list = aItemList; list = ["005930","000660","010950","090430","299660"]; //요청카운트 (첫종목 0으로 시작) req = 0; //차트설정, 시스템 설정 var ChartSet = new ReqChartItem(list[req],1,CHART_PERIOD_MINUTE,100,CHART_REQCOUNT_BAR,false,false); var SystemSet = new SystemInfo("시스템이름", YL_TYPE_NORMAL, null, null, null); //차트객체 요청 Main.ReqChartEx(ChartSet,SystemSet); } //차트객체 생성완료 function Main_OnRcvChartEx(ChartEx) { //ct배열에 차트객체 저장 ct[req] = ChartEx; Main.MessageList(req,ct[req].GetCode(1)); //요청횟수 1 증가 req = req+1; //요청횟수가 검색된 종목수 보다 작으면 //다음종목 요청 if (req < list.length) { //차트설정, 시스템 설정 var ChartSet = new ReqChartItem(list[req],1,CHART_PERIOD_MINUTE,100,CHART_REQCOUNT_BAR,false,false); var SystemSet = new SystemInfo("시스템이름", YL_TYPE_NORMAL, null, null, null); //차트객체 요청 Main.ReqChartEx(ChartSet,SystemSet); } else //요청횟수가 검색된 종목수 이상이면 모두 요청했으므로 끝 { Main.MessageList("차트객체 생성끝"); } } //차트에서 신호가 발생하면 function Main_OnRiseSignal(ChartEx, Signal) { Main.MessageList("신호발생 : ",Signal.code,Signal.signalKind); for (var i = 0; i < ct.length; i++) { //전체 차트 객체 중 신호발생된 객체를 찾고 if (ChartEx.GetCode(1) == ct[i].GetCode(1)) { //매수신호이면 신호가격으로 10주 주문 if (Signal.signalKind == 1) { Main.MessageList("매수주문 : ",i,ct[i].GetCode(1)); Account1.OrderBuy(ct[i].GetCode(1), 10, Signal.price,0); //타이머를 차트객체 배열방 번호와 동일번호로 지정 Main.SetTimer(i, 10000);//10초 타이머 } //매도신호이면 if (Signal.signalKind == 2) { //전체 미체결 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체미체결 중 신호발생 종목과 같은 종목의 미체결은 모두 취소 for (var z = 0; z < num; z++) { Account1.SetUnfill(z); if (Account1.Unfill.count > 0 && Account1.Unfill.code == ChartEx.GetCode(1)) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //잔고셋팅 Account1.SetBalance(ct[i].GetCode(1), 0); //잔고수량이 있으면 신호가격으로 전량청산 if (Account1.Balance.count > 0) { Main.MessageList("매도주문 : ",i,ct[i].GetCode(1)); Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,Signal.price, 0); //타이머를 차트객체 배열방 번호와 동일번호로 지정 Main.SetTimer(i, 10000);//10초 타이머 } } break; } } } //타이머가 동작하면 function Main_OnTimer(nEventID) { Main.MessageList("타이머 : ",nEventID); //동작된 타이머 번호의 차트객체에서 종목코드 가져와 종목객체생성 Main.ReqMarketData(ct[nEventID].GetCode(1)); //1회 동작 후 타이머 종료 Main.KillTimer(nEventID); } //종목객체 생성되면 function Main_OnRcvMarketData(MarketData) { Main.MessageList("종목객체생성 : ",MarketData.code); //종목객체 MD변수에 저장 var MD = MarketData; //전체 미체결 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체미체결 중 신호발생 종목과 같은 종목의 미체결을 찾아 for (var z = 0; z < num; i++) { Account1.SetUnfill(z); if (Account1.Unfill.count > 0 && Account1.Unfill.code == MD.code) { //매수주문이면 if (Account1.Unfill.orderKind == 2) { //정정할 가격 매도1호가 var ReplacePrice = MD.Ask(1); //정정할 가격이 주문가겨과 다르면 if (ReplacePrice > 0 && ReplacePrice != Account1.Unfill.price) { //정정주문 Account1.OrderReplacePrice(Account1.Unfill.orderNum,ReplacePrice); } } //매도주문이면 if (Account1.Unfill.orderKind == 1) { //정정할 가격 매수 1호가 var ReplacePrice = MD.Bid(1); //정정할 가격이 주문가격과 다르면 if (ReplacePrice > 0 && ReplacePrice != Account1.Unfill.price) { //정정주문 Account1.OrderReplacePrice(Account1.Unfill.orderNum,ReplacePrice); } } } break; } //종목객체 삭제 Main.RemoveObject(MD); }