커뮤니티

일봉에서 미완성 신호로 진입하는 수식

프로필 이미지
tktmsl
2020-06-25 22:07:26
3694
글번호 225246
답변완료
수고많으십니다 수식 수정 부탁드립니다(모든 수식은 아래 수식을 골격으로 작성 부탁드립니다) 1.아래와 같은 수식은 5분봉에서 매매가 이뤄지는데 일봉에서 미완성 신호로 진입하려고 합니다 청산은 TRAILING STOP 으로 청산합니다 종목당 1일 1회 진입입니다 2. 현재가+- 1 호가 로 매수(매도)주문 한후 1차정정 현재가+-2 , 2차정정 시장가 로 하는 수식 부탁드립니다 **기타문의 3.가격이 상한가일 경우 무조건 매수종목을 청산하는 수식 4.엑셀에 있는 자료를 읽어서 특정셀의 글자(예: "매수", "매도")나 숫자("1", "2")를 보고 매수, 매도, 주문이 나가게 할 수 있나요? 할 수 있다면 수식을 부탁드립니다 감사합니다~ ===== var 검색주기 = 60;//60초 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("매도주문"); } } }
답변 4
프로필 이미지

예스스탁 예스스탁 답변

2020-07-20 20:03:39

안녕하세요 예스스탁입니다. 1,2 문의하신 내용은 가이드를 작성해 드리기에 많은 시간이 소모되는 내용입니다. 업무상 일정 시간이상이 요구되는 내용은 저희가 답변을 드리기 어렵습니다. 일봉차트에서 최초 매수 미완성신호가 발생할때 매수하고 정정하는 내용만 작성해 드립니다. 청산관련부분은 2129번 문의에 동일 트레일링스탑내용이 있으므로 해당 내용을 참고해서 추가하시기 바랍니다. 차트는 일봉으로 생성하고 차트의 생성순서에 따라 CT배열방에 선차적으로 생성하고 동일방번호로 종목객체(MK),미완성신호발생횟수(sig), 타이머(Timer), 취소주문번호(CancelID)와 종목명(CancelSymbol)을 저장해서 사용하게 됩니다. var 검색주기 = 60; var 최대종목수 = 50; var ItemList = []; //차트생성할 종목코드 저장 배열변수 var CT = []; //차트객체 저장할 배열변수 var MK = []; //종목객체 저정할 배열변수 var Sig = []; //차트별로 매수신호 횟수 제어할 배열변수 var Timer = []; //타이머 번호 저장할 배열변수 var CancelID = [],CancelSymbol = []; 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 + GetTickSize()*2) { //현재가+2호가로 정정 Account1.OrderReplacePrice(Account1.Unfill.orderNum, MK[nEventID].current + GetTickSize()*2); } } } } 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) { CancelID[nEventID] = Account1.OrderCancel(Account1.Unfill.orderNum); CancelSymbol[nEventID] = Account1.OrderCancel(Account1.Unfill.orderNum); } } } } } 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],null,CHART_PERIOD_DAILY,5000,CHART_REQCOUNT_BAR,false,false); 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; Sig[CTcnt] = 0; CancelID[CTcnt] = ""; CancelSymbol[CTcnt] = ""; 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],null,CHART_PERIOD_DAILY,5000,CHART_REQCOUNT_BAR,false,false); 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_OnRiseIncompleteSignal(ChartEx, IncompleteSignal) { //신호발생 종목에 대해 잔고셋팅 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; } } } //차트와 동일한 배열번호이 값이 0이고 미완성 신호가 매수신호이고 잔고가 없을때만 현재가 매수 if (Sig[ii] == 0 && IncompleteSignal.signalKind == 1 && Account1.Balance.count == 0) { //sig 배열값은 1로 변경 Sig[ii] = 1; HH[ii] = 0; Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),MK[ii].current + GetTickSize()*1,0); Main.MessageLog("매수주문 : ",Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),MK[ii].current+ GetTickSize()*1); if (ii >= 0) { Main.SetTimer(ii,60000); Timer[ii] = 0; } } } //주문응답 수신 function Main_OnOrderResponse(OrderResponse) { for (var i = 0; i < CancelID.length) { //주문응답의 아이디와 같은 취소주문 번호 배열방을 찾아 if (OrderResponse.orderID == CancelID[i]) { //잔고 종목코드 셋팅 Account1.SetBalance(CancelSymbol[i],0); //매수 전량 시장가 매도 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0,1); CancelID[i] = ""; CancelSymbol[i] = ""; } } } } 2 상한가를 알기위해서는 종목객체가 필요합니다. 보유종목 전체의 종목객체를 만들고 이후 시세 업데이트때마다 현재가가 상한가인 종목이면 시장가로 전량 매도하는 수식입니다. 영문 업데이트가 게시판 금칙어라 Up*date와 같이 중간에 *가 삽입되어 있습니다. 삭제하고 적용하시기 바랍니다. var num; var List = []; //스팟 시작시 function Main_OnStart() { //잔고의 종목수 num = Account1.GetTheNumberOfBalances(); if (num > 0) { for (var i = 0; i < num; i++) { Account1.SetBalance(i) List[i] = Account1.Balance.code; } req = 0; Main.ReqMarketData(List[req]); } } function Main_OnRcvMarketData(MarketData) { if (MarketData.code == List[req]) { MK[req] = MarketData; req = req+1 if (req < List.length) { var S = Main.ReqMarketData(List[req]); //세시 생성제한시간(15초에 60건)에 걸리면 if (S == -1) { //15초 타이머 생성 Main.SetTimer(1, 15000); } } else { Main.MessageList("종목객체생성완료"); } } } function Main_OnTimer(nEventID) { //15초 후에 종모객체 다시 요청 if (nEventID == 1) { Main.KillTimer(1); Main.ReqMarketData(List[req]); } } function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거 { //시세 업데이트 발생 if (lUp*dateID == 20001) //*제거 { //전체 종목객체 중 현재 업데이트 된 종목을 찾고 for (var i = 0; i < num; i++) { //현재가가 상한가 이상이면 if (MK[i].code == sItemCode && MK[i].current >= MK[i].limitUp) { Account1.SetBalance(MK[i].code, 0); //매수잔고가 있으면 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //시장가로 전량 매도 Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } } } } } 3 엑셀객체는 스크립트 객체화면에서 추가후에 속성에서 파일을 지정해 주시면 됩니다. 엑셀객체에 Excel1.GetData(nSheetIndex, sCell)함수 이용하시면 됩니다. 동으로 값변경되면 읽어오지는 못하므로 일정시간간격으로 지정한 셀에서 값을 가져와 처리하게 하셔야 합니다. 매수와 매도등의 주문구분 텍스트만으로는 주문이 불가합니다. 엑셀의 A1셀에 종목코드, A2셀에 주문구분, A3에 수량이 적혀진다는 가정하에 작성해 드립니다. var num; var List = []; //스팟 시작시 function Main_OnStart() { //3초 타이머 Main.SetTimer(1, 3000);ㅣ } function Main_OnTimer(nEventID) { if (nEventID == 1) { //1번쉬트의 A1셀에서 값을 가져옴 var Code = Excel1.GetData(1, "A1") //1번쉬트의 A2셀에서 값을 가져옴 var Order = Excel1.GetData(1, "A2") //1번쉬트의 A3셀에서 값을 가져옴 var Vol = Excel1.GetData(1, "A3") if (Order == "매수") { Account1.OrderBuy(Code,Vol,0,1) } if (Order == "매도") { Account1.SetBalance(Code, 0) if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1); } } } 즐거운 하루되세요 > tktmsl 님이 쓴 글입니다. > 제목 : 일봉에서 미완성 신호로 진입하는 수식 > 수고많으십니다 수식 수정 부탁드립니다(모든 수식은 아래 수식을 골격으로 작성 부탁드립니다) 1.아래와 같은 수식은 5분봉에서 매매가 이뤄지는데 일봉에서 미완성 신호로 진입하려고 합니다 청산은 TRAILING STOP 으로 청산합니다 종목당 1일 1회 진입입니다 2. 현재가+- 1 호가 로 매수(매도)주문 한후 1차정정 현재가+-2 , 2차정정 시장가 로 하는 수식 부탁드립니다 **기타문의 3.가격이 상한가일 경우 무조건 매수종목을 청산하는 수식 4.엑셀에 있는 자료를 읽어서 특정셀의 글자(예: "매수", "매도")나 숫자("1", "2")를 보고 매수, 매도, 주문이 나가게 할 수 있나요? 할 수 있다면 수식을 부탁드립니다 감사합니다~ ===== var 검색주기 = 60;//60초 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("매도주문"); } } }
프로필 이미지

tktmsl

2020-07-20 22:41:55

tktmsl 님에 의해 삭제된 답변입니다.
프로필 이미지

tktmsl

2020-08-14 10:02:22

수고많으십니다 1. 매수주문이 실행되지 않는것 같습니다 첨부와 같이 차트는 잘 생성되는것 같은데 미완성신호가 떠도 주문이 발생 안됩니다 2. 첨부와 같은 에러 메시지가 뜹니다 수식확인 부탁드립니다 =========================================== > 예스스탁 님이 쓴 글입니다. > 제목 : Re : 일봉에서 미완성 신호로 진입하는 수식 > 안녕하세요 예스스탁입니다. 1,2 문의하신 내용은 가이드를 작성해 드리기에 많은 시간이 소모되는 내용입니다. 업무상 일정 시간이상이 요구되는 내용은 저희가 답변을 드리기 어렵습니다. 일봉차트에서 최초 매수 미완성신호가 발생할때 매수하고 정정하는 내용만 작성해 드립니다. 청산관련부분은 2129번 문의에 동일 트레일링스탑내용이 있으므로 해당 내용을 참고해서 추가하시기 바랍니다. 차트는 일봉으로 생성하고 차트의 생성순서에 따라 CT배열방에 선차적으로 생성하고 동일방번호로 종목객체(MK),미완성신호발생횟수(sig), 타이머(Timer), 취소주문번호(CancelID)와 종목명(CancelSymbol)을 저장해서 사용하게 됩니다. var 검색주기 = 60; var 최대종목수 = 50; var ItemList = []; //차트생성할 종목코드 저장 배열변수 var CT = []; //차트객체 저장할 배열변수 var MK = []; //종목객체 저정할 배열변수 var Sig = []; //차트별로 매수신호 횟수 제어할 배열변수 var Timer = []; //타이머 번호 저장할 배열변수 var CancelID = [],CancelSymbol = []; 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 + GetTickSize()*2) { //현재가+2호가로 정정 Account1.OrderReplacePrice(Account1.Unfill.orderNum, MK[nEventID].current + GetTickSize()*2); } } } } 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) { CancelID[nEventID] = Account1.OrderCancel(Account1.Unfill.orderNum); CancelSymbol[nEventID] = Account1.OrderCancel(Account1.Unfill.orderNum); } } } } } 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],null,CHART_PERIOD_DAILY,5000,CHART_REQCOUNT_BAR,false,false); 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; Sig[CTcnt] = 0; CancelID[CTcnt] = ""; CancelSymbol[CTcnt] = ""; 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],null,CHART_PERIOD_DAILY,5000,CHART_REQCOUNT_BAR,false,false); 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_OnRiseIncompleteSignal(ChartEx, IncompleteSignal) { //신호발생 종목에 대해 잔고셋팅 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; } } } //차트와 동일한 배열번호이 값이 0이고 미완성 신호가 매수신호이고 잔고가 없을때만 현재가 매수 if (Sig[ii] == 0 && IncompleteSignal.signalKind == 1 && Account1.Balance.count == 0) { //sig 배열값은 1로 변경 Sig[ii] = 1; HH[ii] = 0; Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),MK[ii].current + GetTickSize()*1,0); Main.MessageLog("매수주문 : ",Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),MK[ii].current+ GetTickSize()*1); if (ii >= 0) { Main.SetTimer(ii,60000); Timer[ii] = 0; } } } //주문응답 수신 function Main_OnOrderResponse(OrderResponse) { for (var i = 0; i < CancelID.length) { //주문응답의 아이디와 같은 취소주문 번호 배열방을 찾아 if (OrderResponse.orderID == CancelID[i]) { //잔고 종목코드 셋팅 Account1.SetBalance(CancelSymbol[i],0); //매수 전량 시장가 매도 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0,1); CancelID[i] = ""; CancelSymbol[i] = ""; } } } }
프로필 이미지

예스스탁 예스스탁 답변

2020-08-27 16:41:53

안녕하세요 예스스탁입니다. 미완성신호 이벤트에 객체지정에 오류가 있어 수정했습니다. var 검색주기 = 60; var 최대종목수 = 50; var ItemList = []; //차트생성할 종목코드 저장 배열변수 var CT = []; //차트객체 저장할 배열변수 var MK = []; //종목객체 저정할 배열변수 var Sig = []; //차트별로 매수신호 횟수 제어할 배열변수 var Timer = []; //타이머 번호 저장할 배열변수 var CancelID = [],CancelSymbol = []; 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 + GetTickSize()*2) { //현재가+2호가로 정정 Account1.OrderReplacePrice(Account1.Unfill.orderNum, MK[nEventID].current + GetTickSize()*2); } } } } 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) { CancelID[nEventID] = Account1.OrderCancel(Account1.Unfill.orderNum); CancelSymbol[nEventID] = Account1.OrderCancel(Account1.Unfill.orderNum); } } } } } 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],null,CHART_PERIOD_DAILY,5000,CHART_REQCOUNT_BAR,false,false); 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; Sig[CTcnt] = 0; CancelID[CTcnt] = ""; CancelSymbol[CTcnt] = ""; 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],null,CHART_PERIOD_DAILY,5000,CHART_REQCOUNT_BAR,false,false); 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_OnRiseIncompleteSignal(ChartEx, IncompleteSignal) { //신호발생 종목에 대해 잔고셋팅 Account1.SetBalance(Main.GetOrderCode(IncompleteSignal.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; } } } //차트와 동일한 배열번호이 값이 0이고 미완성 신호가 매수신호이고 잔고가 없을때만 현재가 매수 if (Sig[ii] == 0 && IncompleteSignal.signalKind == 1 && Account1.Balance.count == 0) { //sig 배열값은 1로 변경 Sig[ii] = 1; HH[ii] = 0; Account1.OrderBuy(Main.GetOrderCode(IncompleteSignal.code),Math.floor(100000/ChartEx.GetClose(1,0)),MK[ii].current + GetTickSize()*1,0); Main.MessageLog("매수주문 : ",Main.GetOrderCode(IncompleteSignal.code),Math.floor(100000/ChartEx.GetClose(1,0)),MK[ii].current+ GetTickSize()*1); if (ii >= 0) { Main.SetTimer(ii,60000); Timer[ii] = 0; } } } //주문응답 수신 function Main_OnOrderResponse(OrderResponse) { for (var i = 0; i < CancelID.length) { //주문응답의 아이디와 같은 취소주문 번호 배열방을 찾아 if (OrderResponse.orderID == CancelID[i]) { //잔고 종목코드 셋팅 Account1.SetBalance(CancelSymbol[i],0); //매수 전량 시장가 매도 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0,1); CancelID[i] = ""; CancelSymbol[i] = ""; } } } } 즐거운 하루되세요 > tktmsl 님이 쓴 글입니다. > 제목 : Re : Re : 일봉에서 미완성 신호로 진입하는 수식 > 수고많으십니다 1. 매수주문이 실행되지 않는것 같습니다 첨부와 같이 차트는 잘 생성되는것 같은데 미완성신호가 떠도 주문이 발생 안됩니다 2. 첨부와 같은 에러 메시지가 뜹니다 수식확인 부탁드립니다 =========================================== > 예스스탁 님이 쓴 글입니다. > 제목 : Re : 일봉에서 미완성 신호로 진입하는 수식 > 안녕하세요 예스스탁입니다. 1,2 문의하신 내용은 가이드를 작성해 드리기에 많은 시간이 소모되는 내용입니다. 업무상 일정 시간이상이 요구되는 내용은 저희가 답변을 드리기 어렵습니다. 일봉차트에서 최초 매수 미완성신호가 발생할때 매수하고 정정하는 내용만 작성해 드립니다. 청산관련부분은 2129번 문의에 동일 트레일링스탑내용이 있으므로 해당 내용을 참고해서 추가하시기 바랍니다. 차트는 일봉으로 생성하고 차트의 생성순서에 따라 CT배열방에 선차적으로 생성하고 동일방번호로 종목객체(MK),미완성신호발생횟수(sig), 타이머(Timer), 취소주문번호(CancelID)와 종목명(CancelSymbol)을 저장해서 사용하게 됩니다. var 검색주기 = 60; var 최대종목수 = 50; var ItemList = []; //차트생성할 종목코드 저장 배열변수 var CT = []; //차트객체 저장할 배열변수 var MK = []; //종목객체 저정할 배열변수 var Sig = []; //차트별로 매수신호 횟수 제어할 배열변수 var Timer = []; //타이머 번호 저장할 배열변수 var CancelID = [],CancelSymbol = []; 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 + GetTickSize()*2) { //현재가+2호가로 정정 Account1.OrderReplacePrice(Account1.Unfill.orderNum, MK[nEventID].current + GetTickSize()*2); } } } } 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) { CancelID[nEventID] = Account1.OrderCancel(Account1.Unfill.orderNum); CancelSymbol[nEventID] = Account1.OrderCancel(Account1.Unfill.orderNum); } } } } } 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],null,CHART_PERIOD_DAILY,5000,CHART_REQCOUNT_BAR,false,false); 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; Sig[CTcnt] = 0; CancelID[CTcnt] = ""; CancelSymbol[CTcnt] = ""; 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],null,CHART_PERIOD_DAILY,5000,CHART_REQCOUNT_BAR,false,false); 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_OnRiseIncompleteSignal(ChartEx, IncompleteSignal) { //신호발생 종목에 대해 잔고셋팅 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; } } } //차트와 동일한 배열번호이 값이 0이고 미완성 신호가 매수신호이고 잔고가 없을때만 현재가 매수 if (Sig[ii] == 0 && IncompleteSignal.signalKind == 1 && Account1.Balance.count == 0) { //sig 배열값은 1로 변경 Sig[ii] = 1; HH[ii] = 0; Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),MK[ii].current + GetTickSize()*1,0); Main.MessageLog("매수주문 : ",Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),MK[ii].current+ GetTickSize()*1); if (ii >= 0) { Main.SetTimer(ii,60000); Timer[ii] = 0; } } } //주문응답 수신 function Main_OnOrderResponse(OrderResponse) { for (var i = 0; i < CancelID.length) { //주문응답의 아이디와 같은 취소주문 번호 배열방을 찾아 if (OrderResponse.orderID == CancelID[i]) { //잔고 종목코드 셋팅 Account1.SetBalance(CancelSymbol[i],0); //매수 전량 시장가 매도 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0,1); CancelID[i] = ""; CancelSymbol[i] = ""; } } } }