커뮤니티

기존의 파워종목검색 자동매매 수식에 정정주문 추가 부탁드립니다.

프로필 이미지
그린메일
2020-06-13 18:47:26
3757
글번호 225239
답변완료
이전에 게시판에서 올려주신 아래 수식을 수정, 보완 하여 매매를 하고 있습니다. 1. 2분간격으로 사용자 종목검색을 지속적으로 수행 2. 새로 검색된 종목에 대해 차트 생성, 기존 검색된 차트는 유지 3. 종목검색에서 새로 파악된 종목을 확장차트로 시스템 적용 4. 확장 차트 생성은 50개 이하로 제한 여기에 자동정정주문 기능을 추가하려고 하는데 잘 안되서 수식 부탁 드립니다. 매수 매도 공통적으로 지정가로 주문이 나간 후 미체결시 60초 후에 현재가 정정주문 다시 60초 후에 상대1호가 정정주문 (수식이 복잡하면 60초 후에 상대 1호가 정정 주문으로라도 작성 꼭 부탁드립니다.) 항상 감사합니다. 즐거운 한 주 되세요~ var 검색주기 = 120;//120초 var ItemList = [],CT = []; var HHMMSS,req; function Main_OnStart() { CTcnt = 0; Main.SetTimer(1, 5000); Main.MessageList("start"); } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //9시 이후에 2분간격으로 종목검색 확장차트가가 50개 이하일때 반복적으로 검색 if (nEventID == 1 && HHMMSS >= 090000 && CT.length < 50) { Main.KillTimer(1); Main.MessageList("종목검색 요청"); Main.ReqPowerSearch("전략1"); } } function Main_OnRcvItemList(aItemList, nCount) { Main.MessageList("종목검색 완료 nCount : ",nCount); if (nCount > 0) { ItemList = []; //첫검색일때 if (CT.length == 0) { ItemList = aItemList; } else //두번쨰 이후(차트가 만들어진 종목을 제외하고 새로운 종목만 집계) { for (var i = 0; i < nCount; i++ ) { var add = true; for (var x = 0; x < CT.length; x++ ) { if (aItemList[i] == CT[x].GetCode(1)) { add = false; } } if (add == true) { ItemList.push(aItemList[i]); } } } Main.MessageList("종목검색 완료 ItemList :",ItemList.length); //집계된 종목이 1개 이상이면 순차적으로 차트객체 요청 if (ItemList.length > 0 && CT.length < 50) { req = 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[req],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("10전략1", YL_TYPE_NORMAL, null, null, StopSet); Main.MessageList("현재차트갯수 : ",CT.length); Main.MessageList(req,"차트객체요청 : ",ItemList[req]); Main.ReqChartEx(ChartSet,SystemSet); } else { if (CT.length < 50) { Main.SetTimer(1, 검색주기*1000);//120초 } } } } function Main_OnRcvChartEx(ChartEx) { if (ItemList[req] == ChartEx.GetCode(1)) { CT[CTcnt] = ChartEx; Main.MessageList(CTcnt,"차트객체생성 : ",CT[CTcnt].GetCode(1)); CTcnt = CTcnt +1; req = req + 1; if (req < ItemList.length && CT.length < 50) { 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[req],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("10전략1", YL_TYPE_NORMAL, null, null, StopSet); Main.MessageList("현재차트갯수 : ",CT.length); Main.MessageList(req,"차트객체요청 : ",ItemList[req]); Main.ReqChartEx(ChartSet,SystemSet); } else { Main.MessageList("Search1 차트객체요청종료"); //만들어진 차트가 50개 이하이면 if (CT.length < 50) { Main.SetTimer(1, 검색주기*1000);//120초 } } } } //신호발생 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
프로필 이미지

예스스탁 예스스탁 답변

2020-07-14 14:47:41

안녕하세요 예스스탁입니다. 아래 가이드 내용 참고하셔서 수정보완해 사용하시기 바랍니다. 현재가나 매도/매수호가에 주문하기 위해서는 각 종목의 종목객체가 필요합니다. 차트객체 생성시에 동시에 해당 종목에 대한 종목객체도 같이 생성되게 추가했습니다. 차트객체(CT), 종목객체(MK), 타이머횟수(Timer)는 모두 같은 배열번호에 정보가 담기게 됩니다. 예를 들어 CT[10]차트에서 신호가 발생하면 10번 번호로 타이머를 셋팅하고 정정을 수행합니다. 기존에 검색주기 타이머는 1번에서 999번으로 변경했습니다. var 검색주기 = 120;//120초 var 최대종목수 = 50; var ItemList = [];//검색 후 생성할 종목의 리스트를 저장하기 위한 배열변수 var CT = []; var MK = []; var ID = []; var Num = []; var Timer = []; var HHMMSS,req; function Main_OnStart() { CTcnt = 0; Main.SetTimer(999, 5000); Main.MessageList("start"); } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //9시 이후에 2분간격으로 종목검색 확장차트가가 50개 이하일때 반복적으로 검색 if (nEventID == 999 && HHMMSS >= 090000 && CT.length < 50) { Main.KillTimer(999); Main.MessageList("종목검색 요청"); Main.ReqPowerSearch("전략1"); } if (nEventID < 최대종목수) { Timer[nEventID] = Timer[nEventID]+1; //1차 정정 if (Timer[nEventID] == 1) { //전체미체결주문 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체 미체결수 만큼 루프를 돌면서 for (var i = 0; i < num; i++) { //미체결을 하나씩 셋팅하고 Account1.SetUnfill(i); //타이머와 같은 미체결종목을 찾아 if (Account1.Unfill.code == CT[nEventID].GetCode && Account1.Unfill.count > 0) { //주문가격과 현재가가 다르면(같으면 정정불가) if (Account1.Unfill.price != MK[nEventID].current) { //현재가로 정정 Account1.OrderReplacePrice(Account1.Unfill.orderNum, MK[nEventID].current); } } } } if (Timer[nEventID] == 2) { //타이머가 2번 동작했으므로 타이머는 종료 Main.KillTimer(Timer[nEventID]); //전체미체결주문 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체 미체결수 만큼 루프를 돌면서 for (var i = 0; i < num; i++) { //미체결을 하나씩 셋팅하고 Account1.SetUnfill(i); //타이머와 같은 미체결종목을 찾아 if (Account1.Unfill.code == CT[nEventID].GetCode && Account1.Unfill.count > 0) { //매수주문이고 주문가격과 매도1호가가 다르면(같으면 정정불가) if (Account1.Unfill.orderKind == 2 && Account1.Unfill.price != MK[nEventID].Ask(1)) { //매도1호가로 정정 Account1.OrderReplacePrice(Account1.Unfill.orderNum, MK[nEventID].Ask(1)); } //매도주문이고 주문가격과 매수1호가가 다르면(같으면 정정불가) if (Account1.Unfill.orderKind == 1 && Account1.Unfill.price != MK[nEventID].Bid(1)) { //매수1호가로 정정 Account1.OrderReplacePrice(Account1.Unfill.orderNum, MK[nEventID].Bid(1)); } } } } } } function Main_OnRcvItemList(aItemList, nCount) { Main.MessageList("종목검색 완료 nCount : ",nCount); if (nCount > 0) { ItemList = []; //첫검색일때 if (CT.length == 0) { ItemList = aItemList; } else //두번쨰 이후(차트가 만들어진 종목을 제외하고 새로운 종목만 집계) { for (var i = 0; i < nCount; i++ ) { var add = true; for (var x = 0; x < CT.length; x++ ) { if (aItemList[i] == CT[x].GetCode(1)) { add = false; } } if (add == true) { ItemList.push(aItemList[i]); } } } Main.MessageList("종목검색 완료 ItemList :",ItemList.length); //집계된 종목이 1개 이상이면 순차적으로 차트객체 요청 if (ItemList.length > 0 && CT.length < 50) { req = 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[req],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("10전략1", YL_TYPE_NORMAL, null, null, StopSet); Main.MessageList("현재차트갯수 : ",CT.length); Main.MessageList(req,"차트객체요청 : ",ItemList[req]); Main.ReqChartEx(ChartSet,SystemSet); } else { if (CT.length < 최대종목수) { Main.SetTimer(999, 검색주기*1000);//120초 } } } } function Main_OnRcvChartEx(ChartEx) { if (ItemList[req] == ChartEx.GetCode(1)) { CT[CTcnt] = ChartEx; Main.MessageList(CTcnt,"차트객체생성 : ",CT[CTcnt].GetCode(1)); Main.ReqMarketData(ItemList[req]); Main.MessageList(CTcnt,"종목객체요청 : ",ItemList[req]); } } function Main_OnRcvMarketData(MarketData) { if (ItemList[req] == MarketData.code) { Main.MessageList(CTcnt,"종목객체생성 : ",MarketData.code); MK[CTcnt] = MarketData; CTcnt = CTcnt +1; req = req + 1; if (req < ItemList.length && CT.length < 50) { 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[req],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("10전략1", YL_TYPE_NORMAL, null, null, StopSet); Main.MessageList("현재차트갯수 : ",CT.length); Main.MessageList(req,"차트객체요청 : ",ItemList[req]); Main.ReqChartEx(ChartSet,SystemSet); } else { Main.MessageList("Search1 차트객체요청종료"); for (var i = 0; i < CT.length; i++) { Main.MessageList(CT[i].GetCode(1),MK[i].code); } //만들어진 차트가 50개 이하이면 if (CT.length < 최대종목수) { Main.SetTimer(999, 검색주기*1000);//120초 } } } } //신호발생 function Main_OnRiseSignal(ChartEx, Signal) { //신호발생 종목에 대해 잔고셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code),0); //신호발생한 차트객체의 배열번호 찾음 var ii; if (CT.length > 0) { for (var i = 0; i < CT.length; i++) { if(CT[i].GetCode(1) == ChartEx.GetCode(1)) { ii = i; } } } //매수신호이고 잔고가 없을때만 현재가 매수 if (Signal.signalKind == 1 && Account1.Balance.count == 0) { Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),MK[ii].current,0); Main.MessageLog("매수주문 : ",Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),MK[ii].current); if (ii >= 0) { Main.SetTimer(ii,60000); Timer[ii] = 0; } } 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,MK[ii].current,1); Main.MessageLog("매도주문 : ",Main.GetOrderCode(Signal.code),Account1.Balance.count,MK[ii].current); if (ii >= 0) { Main.SetTimer(ii,60000); Timer[ii] = 0; } } } } 즐거운 하루되세요 > 그린메일 님이 쓴 글입니다. > 제목 : 기존의 파워종목검색 자동매매 수식에 정정주문 추가 부탁드립니다. > 이전에 게시판에서 올려주신 아래 수식을 수정, 보완 하여 매매를 하고 있습니다. 1. 2분간격으로 사용자 종목검색을 지속적으로 수행 2. 새로 검색된 종목에 대해 차트 생성, 기존 검색된 차트는 유지 3. 종목검색에서 새로 파악된 종목을 확장차트로 시스템 적용 4. 확장 차트 생성은 50개 이하로 제한 여기에 자동정정주문 기능을 추가하려고 하는데 잘 안되서 수식 부탁 드립니다. 매수 매도 공통적으로 지정가로 주문이 나간 후 미체결시 60초 후에 현재가 정정주문 다시 60초 후에 상대1호가 정정주문 (수식이 복잡하면 60초 후에 상대 1호가 정정 주문으로라도 작성 꼭 부탁드립니다.) 항상 감사합니다. 즐거운 한 주 되세요~ var 검색주기 = 120;//120초 var ItemList = [],CT = []; var HHMMSS,req; function Main_OnStart() { CTcnt = 0; Main.SetTimer(1, 5000); Main.MessageList("start"); } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //9시 이후에 2분간격으로 종목검색 확장차트가가 50개 이하일때 반복적으로 검색 if (nEventID == 1 && HHMMSS >= 090000 && CT.length < 50) { Main.KillTimer(1); Main.MessageList("종목검색 요청"); Main.ReqPowerSearch("전략1"); } } function Main_OnRcvItemList(aItemList, nCount) { Main.MessageList("종목검색 완료 nCount : ",nCount); if (nCount > 0) { ItemList = []; //첫검색일때 if (CT.length == 0) { ItemList = aItemList; } else //두번쨰 이후(차트가 만들어진 종목을 제외하고 새로운 종목만 집계) { for (var i = 0; i < nCount; i++ ) { var add = true; for (var x = 0; x < CT.length; x++ ) { if (aItemList[i] == CT[x].GetCode(1)) { add = false; } } if (add == true) { ItemList.push(aItemList[i]); } } } Main.MessageList("종목검색 완료 ItemList :",ItemList.length); //집계된 종목이 1개 이상이면 순차적으로 차트객체 요청 if (ItemList.length > 0 && CT.length < 50) { req = 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[req],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("10전략1", YL_TYPE_NORMAL, null, null, StopSet); Main.MessageList("현재차트갯수 : ",CT.length); Main.MessageList(req,"차트객체요청 : ",ItemList[req]); Main.ReqChartEx(ChartSet,SystemSet); } else { if (CT.length < 50) { Main.SetTimer(1, 검색주기*1000);//120초 } } } } function Main_OnRcvChartEx(ChartEx) { if (ItemList[req] == ChartEx.GetCode(1)) { CT[CTcnt] = ChartEx; Main.MessageList(CTcnt,"차트객체생성 : ",CT[CTcnt].GetCode(1)); CTcnt = CTcnt +1; req = req + 1; if (req < ItemList.length && CT.length < 50) { 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[req],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("10전략1", YL_TYPE_NORMAL, null, null, StopSet); Main.MessageList("현재차트갯수 : ",CT.length); Main.MessageList(req,"차트객체요청 : ",ItemList[req]); Main.ReqChartEx(ChartSet,SystemSet); } else { Main.MessageList("Search1 차트객체요청종료"); //만들어진 차트가 50개 이하이면 if (CT.length < 50) { Main.SetTimer(1, 검색주기*1000);//120초 } } } } //신호발생 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("매도주문"); } } }