커뮤니티

종목검색 후 자동매매(3) _ 검색종목의 선별작업

프로필 이미지
아름다운사람들
2023-09-10 18:00:46.0
1198
글번호 225836
답변완료
안녕하세요. 약 5년전에(2018년5월) 질문드리고 다시 돌아왔습니다. ^^;; 요점을 간단하게 말씀드리면, 아래의 방법이 파워종목검색식으로 종목을 검색하고, 확장차트를 생성한 다음에, 시스템식으로 시그널이 발생하면 바로바로 매수하는 로직인데요. 여기서 발전해서 종가에 매수를 하려고 합니다. 15시10분에 파워종목검색식으로 종목을 검색하고, , 확장차트를 생성한 다음에, 시스템식으로 시그널이 발생하는데요. 약 20개 종목에서 동시에 시그널이 발생하고 있습니다. 이 중에서 특정 선별조건으로(예, RSI가 가장 큰 순으로) 5개 종목만 골라서 매수하려고 하는데, 이 부분을 예스스팟에서 구현할 수 있을까요? 언제나 감사드립니다. 수고하세요. ######################################################################### ######################################################################### 1. 2분간격으로 사용자 종목검색을 지속적으로 수행 2. 새로 검색된 종목에 대해 차트 생성, 기존 검색된 차트는 유지 3. 종목검색에서 새로 파악된 종목을 종목차트로 시스템 적용 4. 생성된 차트에 시스템 적용 5. 차트 생성이 50개가 되면 새 종목 추가 완료 아래 내용은 다른분이 이전에 질문한 답변입니다. 여기에서 파워종목검색이 2분간격시간에 따라 추가되는 종목에 대한 추가 매수는 어떻게 하면 좋을까요? var ItemList; var Count; var ReqCount; function Main_OnStart() { Main.MessageLog("스팟시작"); Main.MessageLog("종목검색시작"); Main.ReqPowerSearch("전략1"); } function Main_OnRcvItemList(aItemList, nCount) { ItemList = aItemList; Count = nCount; Main.SetTimer(1, 1000); ReqCount = 0; } function Main_OnTimer(nEventID) { if (nEventID == 1) { var StopSet = new SystemStopInfo(new StopLoss(4, CALCMETHOD_PERCENT, 0xFFDA93), new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0), //new StopProfitTarget(10, CALCMETHOD_PERCENT, 0xFFDA93), //new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93), new StopEndOfDay(151500)); var ChartSet = new ReqChartItem(ItemList[ReqCount],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("10전략1", YL_TYPE_NORMAL, null, null, null); Main.ReqChartEx(ChartSet,SystemSet); Main.MessageLog("확장차트생성_"+ItemList[ReqCount]); ReqCount = ReqCount+1; if (ReqCount == Count) { Main.KillTimer(1); Main.MessageLog("종목검색완료"); } } } //신호발생 function Main_OnRiseSignal(ChartEx, Signal) { //신호발생 종목에 대해 잔고셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code),0); //매수신호이고 잔고가 없을때만 매수 if (Signal.signalKind == 1 && Account1.Balance.count == 0) { Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),0,1); Main.MessageLog("매수주문"); } if (Signal.signalKind == 2) { //전체미체결주문 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체 미체결수 만큼 루프를 돌면서 for (var i = 0; i < num; i++) { //미체결을 하나씩 셋팅하고 Account1.SetUnfill(i); //미체결종목이 신호종목과 같고 미체결수량이 있으면 if (Account1.Unfill.code == Main.GetOrderCode(Signal.code) && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //잔고수량만큼만 매도 if (Account1.Balance.count > 0) { Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,0,1); Main.MessageLog("매도주문"); } } } ######################################################################### #########################################################################
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2023-10-17 08:21:17.0

안녕하세요 예스스탁입니다. 아래 가이드 수식 참고하시기 바랍니다. 수식 흐름은 아래와 같습니다. 15시10분이 되면 종목검색을 하고 종목검색이 완료되면 검색된 종목에 지정한 시스템과 RSI지표를 적용해서 모두 차트 객체를생성한 다음 각 차트객체별로 RSI값을 비교해 높은순으로 모두 순위를 지정합니다. 이후 순위 5위까지만 매수신호가 발생하면 매수주문을 집행합니다. var ItemList= []; var CT = []; var RSI = []; var NTH = []; var ReqCount; function Main_OnStart() { Main.MessageList("스팟시작"); Main.SetTimer(1, 10000); //10초 } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //15시 10분이 되면 if (nEventID == 1 && HHMMSS >= 151000) { Main.KillTimer(1); Main.MessageList("종목검색시작"); Main.ReqPowerSearch("전략1"); } } function Main_OnRcvItemList(aItemList, nCount) { ItemList = aItemList; //검색된 종목이 1개이상이면 if (ItemList.length >= 1) { ReqCount = 0; var StopSet = new SystemStopInfo(new StopLoss(4, CALCMETHOD_PERCENT, 0xFFDA93), new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0), //new StopProfitTarget(10, CALCMETHOD_PERCENT, 0xFFDA93), //new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93), new StopEndOfDay(151500)); var ChartSet = new ReqChartItem(ItemList[ReqCount],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("10전략1", YL_TYPE_NORMAL, null, null, null); var IndiSet = new Array(new IndicatorInfo("RSI")); //지정한 종목, 시스템, 지표(RSI)를 적용해 확장차트 요청 Main.ReqChartEx(ChartSet,SystemSet,IndiSet); Main.MessageList(ReqCount,"|확장차트요청 : ",ItemList[ReqCount]); } } function Main_OnRcvChartEx(ChartEx) { if (ChartEx.GetCode(1) == ItemList[ReqCount]) { CT.push(ChartEx); RSI.push(ChartEx.GetIndicatorData("RSI",1,0)); NTH.push(-1); Main.MessageList(ReqCount,"|확장차트생성 : ",ChartEx.GetCode(1)); ReqCount = ReqCount+1; //다음종목 요청 if (ReqCount < ItemList.length) { var StopSet = new SystemStopInfo(new StopLoss(4, CALCMETHOD_PERCENT, 0xFFDA93), new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0), //new StopProfitTarget(10, CALCMETHOD_PERCENT, 0xFFDA93), //new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93), new StopEndOfDay(151500)); var ChartSet = new ReqChartItem(ItemList[ReqCount],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("10전략1", YL_TYPE_NORMAL, null, null, null); var IndiSet = new Array(new IndicatorInfo("RSI")); Main.ReqChartEx(ChartSet,SystemSet,IndiSet); Main.MessageList(ReqCount,"|확장차트요청 : ",ItemList[ReqCount]); } else { Main.MessageList("확장차트생성완료"); Main.MessageList("각 차트 RSI 확인"); for (var i = 0; i < CT.length; i++) { Main.MessageList("종목명 : ",CT[i].GetCode(1),"|RSI:",RSI[i],"|NTH:",NTH[i]); } Main.MessageList("RSI종목 순위 계산"); var Period = RSI.length; for (var a = 0; a < Period; a++) { tempmax = -1; for (var b = 0; b < Period; b++) { if (RSI[b] > tempmax) { tempmax = RSI[b]; tempIndex = b; } } RSI[tempIndex] = -1; NTH[tempIndex] = a; } for (var i = 0; i < CT.length; i++) { Main.MessageList("종목명 : ",CT[i].GetCode(1),"|RSI순위:",NTH[i]); } } } } //신호발생 function Main_OnRiseSignal(ChartEx, Signal) { //신호발생 종목에 대해 잔고셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code),0); var 순위; for (var i = 0; i < CT.length; i++) { if (ChartEx.GetCode(1) == CT[i].GetCode(1)) { 순위 = NTH[i]; } } //매수신호 발생 종목의 RSI가 높은순으로 5위(0~4)이내이고 잔고가 없을때만 매수 if (Signal.signalKind == 1 && Account1.Balance.count == 0 && 순위 >= 0 && 순위 < 5) { Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),0,1); Main.MessageList("매수주문"); } if (Signal.signalKind == 2) { //전체미체결주문 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체 미체결수 만큼 루프를 돌면서 for (var i = 0; i < num; i++) { //미체결을 하나씩 셋팅하고 Account1.SetUnfill(i); //미체결종목이 신호종목과 같고 미체결수량이 있으면 if (Account1.Unfill.code == Main.GetOrderCode(Signal.code) && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //잔고수량만큼만 매도 if (Account1.Balance.count > 0) { Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,0,1); Main.MessageList("매도주문"); } } } 즐거운 하루되세요 > 아름다운사람들 님이 쓴 글입니다. > 제목 : 종목검색 후 자동매매(3) _ 검색종목의 선별작업 > 안녕하세요. 약 5년전에(2018년5월) 질문드리고 다시 돌아왔습니다. ^^;; 요점을 간단하게 말씀드리면, 아래의 방법이 파워종목검색식으로 종목을 검색하고, 확장차트를 생성한 다음에, 시스템식으로 시그널이 발생하면 바로바로 매수하는 로직인데요. 여기서 발전해서 종가에 매수를 하려고 합니다. 15시10분에 파워종목검색식으로 종목을 검색하고, , 확장차트를 생성한 다음에, 시스템식으로 시그널이 발생하는데요. 약 20개 종목에서 동시에 시그널이 발생하고 있습니다. 이 중에서 특정 선별조건으로(예, RSI가 가장 큰 순으로) 5개 종목만 골라서 매수하려고 하는데, 이 부분을 예스스팟에서 구현할 수 있을까요? 언제나 감사드립니다. 수고하세요. ######################################################################### ######################################################################### 1. 2분간격으로 사용자 종목검색을 지속적으로 수행 2. 새로 검색된 종목에 대해 차트 생성, 기존 검색된 차트는 유지 3. 종목검색에서 새로 파악된 종목을 종목차트로 시스템 적용 4. 생성된 차트에 시스템 적용 5. 차트 생성이 50개가 되면 새 종목 추가 완료 아래 내용은 다른분이 이전에 질문한 답변입니다. 여기에서 파워종목검색이 2분간격시간에 따라 추가되는 종목에 대한 추가 매수는 어떻게 하면 좋을까요? var ItemList; var Count; var ReqCount; function Main_OnStart() { Main.MessageLog("스팟시작"); Main.MessageLog("종목검색시작"); Main.ReqPowerSearch("전략1"); } function Main_OnRcvItemList(aItemList, nCount) { ItemList = aItemList; Count = nCount; Main.SetTimer(1, 1000); ReqCount = 0; } function Main_OnTimer(nEventID) { if (nEventID == 1) { var StopSet = new SystemStopInfo(new StopLoss(4, CALCMETHOD_PERCENT, 0xFFDA93), new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0), //new StopProfitTarget(10, CALCMETHOD_PERCENT, 0xFFDA93), //new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93), new StopEndOfDay(151500)); var ChartSet = new ReqChartItem(ItemList[ReqCount],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("10전략1", YL_TYPE_NORMAL, null, null, null); Main.ReqChartEx(ChartSet,SystemSet); Main.MessageLog("확장차트생성_"+ItemList[ReqCount]); ReqCount = ReqCount+1; if (ReqCount == Count) { Main.KillTimer(1); Main.MessageLog("종목검색완료"); } } } //신호발생 function Main_OnRiseSignal(ChartEx, Signal) { //신호발생 종목에 대해 잔고셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code),0); //매수신호이고 잔고가 없을때만 매수 if (Signal.signalKind == 1 && Account1.Balance.count == 0) { Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),0,1); Main.MessageLog("매수주문"); } if (Signal.signalKind == 2) { //전체미체결주문 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체 미체결수 만큼 루프를 돌면서 for (var i = 0; i < num; i++) { //미체결을 하나씩 셋팅하고 Account1.SetUnfill(i); //미체결종목이 신호종목과 같고 미체결수량이 있으면 if (Account1.Unfill.code == Main.GetOrderCode(Signal.code) && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //잔고수량만큼만 매도 if (Account1.Balance.count > 0) { Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,0,1); Main.MessageLog("매도주문"); } } } ######################################################################### #########################################################################