커뮤니티

확장차트생성해서 신호에 의해 매수 매도

프로필 이미지
하늘구름
2024-01-28 23:18:53.0
719
글번호 225929
답변완료
안녕하십니까? 아래 수식으로 테스트중인 데요 종목객체 생성제한으로 더이상 검색이 안되어 차트도 만들어 지지 않습니다. 초보라서 많이 어렵습니다. 수식을 첨가해 주시면 고맙겠습니다. var 검색주기 = 30;//30초 1분 var ItemList = [],CT = [],MK = []; var HHMMSS,req; function Main_OnStart() { CTcnt = 0;//지역변수 선언 차트객체 생성 숫자를 표시 Main.MessageLog("시작"); Main.SetTimer(1, 10000);//타이머를 실행 ===> 5000을 입력하면 5초마다 이벤트가 발생 } function Main_OnTimer(nEventID) { var d = new Date(); YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //9시 이후에 1분간격으로 종목검색 확장차트가가 20개 이하일때 반복적으로 검색 if (nEventID == 1 && HHMMSS >= 090010 && CT.length < 20) { Main.KillTimer(1); Main.MessageList("종목검색 요청"); Main.ReqPowerSearch("검색"); } } 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개 이상이면 순차적으로 차트객체 요청 //종목검색 후 종목코드가 aItemList에 배열로 담겨오는데 [0]번방 부터 요청 if (ItemList.length > 0 && CT.length < 20) { req = 0; var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, //기본거래수량 설정 1, // 거래수량 100000, // 고정자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_NONE, // 피라미딩 설정여부 100, // 최대진입수량 3); // 최대진입횟수 var StopSet = new SystemStopInfo(//new StopLoss(4, CALCMETHOD_PERCENT), //new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0), //new StopProfitTarget(20, CALCMETHOD_PERCENT), //new StopInactivity(0.5, 6, CALCMETHOD_PERCENT), new StopEndOfDay(151500)); //차트설정 :종목, 주기3분 분봉, 조회건수 1500 var ChartSet = new ReqChartItem(ItemList[req],3,CHART_PERIOD_MINUTE,1000,CHART_REQCOUNT_BAR,false,false); var SystemSet = new SystemInfo("전략", YL_TYPE_WIZARD, null, TradeSet, null); Main.MessageList("현재차트갯수 : ",CT.length); Main.MessageList(req,"차트객체요청 : ",ItemList[req]); Main.ReqChartEx(ChartSet,SystemSet); } else { if (CT.length < 20) { Main.SetTimer(1, 검색주기*1000);//30초 } } } } 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 < 20) { var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, //기본거래수량 설정 1, // 거래수량 100000, // 고정자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_NONE, // 피라미딩 설정여부 100, // 최대진입수량 3); // 최대진입횟수 var StopSet = new SystemStopInfo(//new StopLoss(4, CALCMETHOD_PERCENT), //new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0), //new StopProfitTarget(20, CALCMETHOD_PERCENT), //new StopInactivity(0.5, 6, CALCMETHOD_PERCENT), new StopEndOfDay(151500)); var ChartSet = new ReqChartItem(ItemList[req],3,CHART_PERIOD_MINUTE,1000,CHART_REQCOUNT_BAR,false,false); var SystemSet = new SystemInfo("전략", YL_TYPE_WIZARD, null, TradeSet, null); Main.MessageList("현재차트갯수 : ",CT.length); Main.MessageList(req,"차트객체요청 : ",ItemList[req]); Main.ReqChartEx(ChartSet,SystemSet); } else { Main.MessageList("Search1 차트객체요청종료"); //만들어진 차트가 10개 이하이면 if (CT.length < 20) { Main.SetTimer(1, 검색주기*1000);//30초 } } } } //신호발생 function Main_OnRiseSignal(ChartEx, Signal) { //신호발생 종목에 대해 잔고셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code),0); //매수신호이고 잔고가 없을때만 매수 if (Signal.signalKind == 1 && Account1.Balance.count == 0) { //Account1.OrderBuy(Main.GetOrderCode(ChartEx.GetCode(1)),1,0,1); // Account1.OrderBuy(Main.GetOrderCode(Signal.code),1,0,1); Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),0,1); Main.MessageLog("매수주문"); //1주종목 0현재봉 0주문가격 1시장가 } 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(ChartEx.GetCode(1)),1,0,1); Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,0,1); Main.MessageLog("매도주문"); } } }
답변 4
프로필 이미지

예스스탁 예스스탁 답변

2024-02-20 14:56:02.0

안녕하세요 예스스탁입니다. 1 종목객체는 15초에 최대 60개까지 요청이 가능합니다. 생성제한이 걸리면 15초 뒤 다시 요청되게 하셔야 합니다. 2 수식에 최대 종목수가 20개로 정해져 있습니다. 조정가능하게 수식상단에 변수처리해 드립니다. 3 var 최대종목수 = 20; var 검색주기 = 30;//30초 1분 var ItemList = [],CT = [],MK = []; var HHMMSS,req; function Main_OnStart() { Main.MessageLog("시작"); Main.SetTimer(1, 1000);//타이머를 실행 ===> 5000을 입력하면 5초마다 이벤트가 발생 } function Main_OnTimer(nEventID) { var d = new Date(); YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //9시 이후에 1분간격으로 종목검색 확장차트가가 20개 이하일때 반복적으로 검색 if (nEventID == 1 && HHMMSS >= 090010 && CT.length < 최대종목수) { Main.KillTimer(1); Main.MessageList("종목검색 요청"); Main.ReqPowerSearch("검색"); } if (nEventID == 2 ) { Main.ReqMarketData(ItemList[req]); Main.MessageList(req,"종목객체 재요청 : ",ItemList[req]); } } 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개 이상이면 순차적으로 차트객체 요청 //종목검색 후 종목코드가 aItemList에 배열로 담겨오는데 [0]번방 부터 요청 if (ItemList.length > 0 && CT.length < 최대종목수) { req = 0; var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, //기본거래수량 설정 1, // 거래수량 100000, // 고정자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_NONE, // 피라미딩 설정여부 100, // 최대진입수량 3); // 최대진입횟수 var StopSet = new SystemStopInfo(//new StopLoss(4, CALCMETHOD_PERCENT), //new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0), //new StopProfitTarget(20, CALCMETHOD_PERCENT), //new StopInactivity(0.5, 6, CALCMETHOD_PERCENT), new StopEndOfDay(151500)); //차트설정 :종목, 주기3분 분봉, 조회건수 1500 var ChartSet = new ReqChartItem(ItemList[req],3,CHART_PERIOD_MINUTE,1000,CHART_REQCOUNT_BAR,false,false); var SystemSet = new SystemInfo("전략", YL_TYPE_WIZARD, null, TradeSet, null); Main.MessageList("현재차트갯수 : ",CT.length); Main.MessageList(req,"차트객체요청 : ",ItemList[req]); Main.ReqChartEx(ChartSet,SystemSet); } else { if (CT.length < 최대종목수) { Main.SetTimer(1, 검색주기*1000);//30초 } } } } function Main_OnRcvChartEx(ChartEx) { Main.MessageList("Main_OnRcvChartEx : ",ChartEx.GetCode(1)); if (ItemList[req] == ChartEx.GetCode(1)) { CT.push(ChartEx); Main.MessageList(req,"차트객체생성 : ",ChartEx.GetCode(1)); var S = Main.ReqMarketData(ItemList[req]); Main.MessageList(req,"종목객체요청 : ",ItemList[req]); if (S == -1) { //2번 타이머 15초 Main.SetTimer(2,15000); Main.MessageList(req,"종목객체 생성제한 :15초뒤 다시 요청 "); } } } function Main_OnRcvMarketData(MarketData) { if (ItemList[req] == MarketData.code) { Main.MessageList(req,"종목객체생성 : ",MarketData.code); MK.push(MarketData); req = req + 1; if (req < ItemList.length && CT.length < 최대종목수) { var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, //기본거래수량 설정 1, // 거래수량 100000, // 고정자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_NONE, // 피라미딩 설정여부 100, // 최대진입수량 3); // 최대진입횟수 var StopSet = new SystemStopInfo(//new StopLoss(4, CALCMETHOD_PERCENT), //new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0), //new StopProfitTarget(20, CALCMETHOD_PERCENT), //new StopInactivity(0.5, 6, CALCMETHOD_PERCENT), new StopEndOfDay(151500)); var ChartSet = new ReqChartItem(ItemList[req],3,CHART_PERIOD_MINUTE,1000,CHART_REQCOUNT_BAR,false,false); var SystemSet = new SystemInfo("전략", YL_TYPE_WIZARD, null, TradeSet, null); Main.MessageList("현재차트갯수 : ",CT.length); Main.MessageList(req,"차트객체요청 : ",ItemList[req]); Main.ReqChartEx(ChartSet,SystemSet); } else { Main.MessageList("Search1 차트객체요청종료"); //만들어진 차트가 10개 이하이면 if (CT.length < 최대종목수) { Main.SetTimer(1, 검색주기*1000);//30초 } } } } //신호발생 function Main_OnRiseSignal(ChartEx, Signal) { //신호발생 종목에 대해 잔고셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code),0); //매수신호이고 잔고가 없을때만 매수 if (Signal.signalKind == 1 && Account1.Balance.count == 0) { //Account1.OrderBuy(Main.GetOrderCode(ChartEx.GetCode(1)),1,0,1); // Account1.OrderBuy(Main.GetOrderCode(Signal.code),1,0,1); Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),0,1); Main.MessageLog("매수주문"); //1주종목 0현재봉 0주문가격 1시장가 } 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(ChartEx.GetCode(1)),1,0,1); Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,0,1); Main.MessageLog("매도주문"); } } } 즐거운 하루되세요 > 하늘구름 님이 쓴 글입니다. > 제목 : 확장차트생성해서 신호에 의해 매수 매도 > 안녕하십니까? 아래 수식으로 테스트중인 데요 종목객체 생성제한으로 더이상 검색이 안되어 차트도 만들어 지지 않습니다. 초보라서 많이 어렵습니다. 수식을 첨가해 주시면 고맙겠습니다. var 검색주기 = 30;//30초 1분 var ItemList = [],CT = [],MK = []; var HHMMSS,req; function Main_OnStart() { CTcnt = 0;//지역변수 선언 차트객체 생성 숫자를 표시 Main.MessageLog("시작"); Main.SetTimer(1, 10000);//타이머를 실행 ===> 5000을 입력하면 5초마다 이벤트가 발생 } function Main_OnTimer(nEventID) { var d = new Date(); YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //9시 이후에 1분간격으로 종목검색 확장차트가가 20개 이하일때 반복적으로 검색 if (nEventID == 1 && HHMMSS >= 090010 && CT.length < 20) { Main.KillTimer(1); Main.MessageList("종목검색 요청"); Main.ReqPowerSearch("검색"); } } 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개 이상이면 순차적으로 차트객체 요청 //종목검색 후 종목코드가 aItemList에 배열로 담겨오는데 [0]번방 부터 요청 if (ItemList.length > 0 && CT.length < 20) { req = 0; var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, //기본거래수량 설정 1, // 거래수량 100000, // 고정자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_NONE, // 피라미딩 설정여부 100, // 최대진입수량 3); // 최대진입횟수 var StopSet = new SystemStopInfo(//new StopLoss(4, CALCMETHOD_PERCENT), //new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0), //new StopProfitTarget(20, CALCMETHOD_PERCENT), //new StopInactivity(0.5, 6, CALCMETHOD_PERCENT), new StopEndOfDay(151500)); //차트설정 :종목, 주기3분 분봉, 조회건수 1500 var ChartSet = new ReqChartItem(ItemList[req],3,CHART_PERIOD_MINUTE,1000,CHART_REQCOUNT_BAR,false,false); var SystemSet = new SystemInfo("전략", YL_TYPE_WIZARD, null, TradeSet, null); Main.MessageList("현재차트갯수 : ",CT.length); Main.MessageList(req,"차트객체요청 : ",ItemList[req]); Main.ReqChartEx(ChartSet,SystemSet); } else { if (CT.length < 20) { Main.SetTimer(1, 검색주기*1000);//30초 } } } } 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 < 20) { var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, //기본거래수량 설정 1, // 거래수량 100000, // 고정자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_NONE, // 피라미딩 설정여부 100, // 최대진입수량 3); // 최대진입횟수 var StopSet = new SystemStopInfo(//new StopLoss(4, CALCMETHOD_PERCENT), //new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0), //new StopProfitTarget(20, CALCMETHOD_PERCENT), //new StopInactivity(0.5, 6, CALCMETHOD_PERCENT), new StopEndOfDay(151500)); var ChartSet = new ReqChartItem(ItemList[req],3,CHART_PERIOD_MINUTE,1000,CHART_REQCOUNT_BAR,false,false); var SystemSet = new SystemInfo("전략", YL_TYPE_WIZARD, null, TradeSet, null); Main.MessageList("현재차트갯수 : ",CT.length); Main.MessageList(req,"차트객체요청 : ",ItemList[req]); Main.ReqChartEx(ChartSet,SystemSet); } else { Main.MessageList("Search1 차트객체요청종료"); //만들어진 차트가 10개 이하이면 if (CT.length < 20) { Main.SetTimer(1, 검색주기*1000);//30초 } } } } //신호발생 function Main_OnRiseSignal(ChartEx, Signal) { //신호발생 종목에 대해 잔고셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code),0); //매수신호이고 잔고가 없을때만 매수 if (Signal.signalKind == 1 && Account1.Balance.count == 0) { //Account1.OrderBuy(Main.GetOrderCode(ChartEx.GetCode(1)),1,0,1); // Account1.OrderBuy(Main.GetOrderCode(Signal.code),1,0,1); Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),0,1); Main.MessageLog("매수주문"); //1주종목 0현재봉 0주문가격 1시장가 } 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(ChartEx.GetCode(1)),1,0,1); Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,0,1); Main.MessageLog("매도주문"); } } }
프로필 이미지

하늘구름

2024-02-21 10:46:37.0

하늘구름 님에 의해 삭제된 답변입니다.
프로필 이미지

하늘구름

2024-02-21 11:05:08.0

안녕하세요. 첨부한 파일과 같이 종목 검색재요청이 안돼고 계속해서 앤카운트 -1에서 멈춘이후 재요청이 안됩니다. 다시한번 수식을 검토해 주시면 고맙겠습니다.
프로필 이미지

예스스탁 예스스탁 답변

2024-02-21 14:53:03.0

안녕하세요 예스스탁입니다. nCount가 -1은 검색된 종목이 없을때 발생합니다. 기존수식에 해당 부분에 대해 처리하는 내용이 없어 추가해 드립니다. var 최대종목수 = 20; var 검색주기 = 30;//30초 1분 var ItemList = [],CT = [],MK = []; var HHMMSS,req; function Main_OnStart() { Main.MessageLog("시작"); Main.SetTimer(1, 1000);//타이머를 실행 ===> 5000을 입력하면 5초마다 이벤트가 발생 } function Main_OnTimer(nEventID) { var d = new Date(); YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //9시 이후에 1분간격으로 종목검색 확장차트가가 20개 이하일때 반복적으로 검색 if (nEventID == 1 && HHMMSS >= 090010 && CT.length < 최대종목수) { Main.KillTimer(1); Main.MessageList("종목검색 요청"); Main.ReqPowerSearch("검색"); } if (nEventID == 2 ) { Main.ReqMarketData(ItemList[req]); Main.MessageList(req,"종목객체 재요청 : ",ItemList[req]); } } 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개 이상이면 순차적으로 차트객체 요청 //종목검색 후 종목코드가 aItemList에 배열로 담겨오는데 [0]번방 부터 요청 if (ItemList.length > 0 && CT.length < 최대종목수) { req = 0; var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, //기본거래수량 설정 1, // 거래수량 100000, // 고정자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_NONE, // 피라미딩 설정여부 100, // 최대진입수량 3); // 최대진입횟수 var StopSet = new SystemStopInfo(//new StopLoss(4, CALCMETHOD_PERCENT), //new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0), //new StopProfitTarget(20, CALCMETHOD_PERCENT), //new StopInactivity(0.5, 6, CALCMETHOD_PERCENT), new StopEndOfDay(151500)); //차트설정 :종목, 주기3분 분봉, 조회건수 1500 var ChartSet = new ReqChartItem(ItemList[req],3,CHART_PERIOD_MINUTE,1000,CHART_REQCOUNT_BAR,false,false); var SystemSet = new SystemInfo("전략", YL_TYPE_WIZARD, null, TradeSet, null); Main.MessageList("현재차트갯수 : ",CT.length); Main.MessageList(req,"차트객체요청 : ",ItemList[req]); Main.ReqChartEx(ChartSet,SystemSet); } else { if (CT.length < 최대종목수) { Main.SetTimer(1, 검색주기*1000);//30초 } } } else { Main.SetTimer(1, 검색주기*1000);//30초 } } function Main_OnRcvChartEx(ChartEx) { Main.MessageList("Main_OnRcvChartEx : ",ChartEx.GetCode(1)); if (ItemList[req] == ChartEx.GetCode(1)) { CT.push(ChartEx); Main.MessageList(req,"차트객체생성 : ",ChartEx.GetCode(1)); var S = Main.ReqMarketData(ItemList[req]); Main.MessageList(req,"종목객체요청 : ",ItemList[req]); if (S == -1) { //2번 타이머 15초 Main.SetTimer(2,15000); Main.MessageList(req,"종목객체 생성제한 :15초뒤 다시 요청 "); } } } function Main_OnRcvMarketData(MarketData) { if (ItemList[req] == MarketData.code) { Main.MessageList(req,"종목객체생성 : ",MarketData.code); MK.push(MarketData); req = req + 1; if (req < ItemList.length && CT.length < 최대종목수) { var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT, //기본거래수량 설정 1, // 거래수량 100000, // 고정자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_NONE, // 피라미딩 설정여부 100, // 최대진입수량 3); // 최대진입횟수 var StopSet = new SystemStopInfo(//new StopLoss(4, CALCMETHOD_PERCENT), //new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0), //new StopProfitTarget(20, CALCMETHOD_PERCENT), //new StopInactivity(0.5, 6, CALCMETHOD_PERCENT), new StopEndOfDay(151500)); var ChartSet = new ReqChartItem(ItemList[req],3,CHART_PERIOD_MINUTE,1000,CHART_REQCOUNT_BAR,false,false); var SystemSet = new SystemInfo("전략", YL_TYPE_WIZARD, null, TradeSet, null); Main.MessageList("현재차트갯수 : ",CT.length); Main.MessageList(req,"차트객체요청 : ",ItemList[req]); Main.ReqChartEx(ChartSet,SystemSet); } else { Main.MessageList("Search1 차트객체요청종료"); //만들어진 차트가 10개 이하이면 if (CT.length < 최대종목수) { Main.SetTimer(1, 검색주기*1000);//30초 } } } } //신호발생 function Main_OnRiseSignal(ChartEx, Signal) { //신호발생 종목에 대해 잔고셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code),0); //매수신호이고 잔고가 없을때만 매수 if (Signal.signalKind == 1 && Account1.Balance.count == 0) { //Account1.OrderBuy(Main.GetOrderCode(ChartEx.GetCode(1)),1,0,1); // Account1.OrderBuy(Main.GetOrderCode(Signal.code),1,0,1); Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),0,1); Main.MessageLog("매수주문"); //1주종목 0현재봉 0주문가격 1시장가 } 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(ChartEx.GetCode(1)),1,0,1); Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,0,1); Main.MessageLog("매도주문"); } } } 즐거운 하루되세요 > 하늘구름 님이 쓴 글입니다. > 제목 : 잘 안돼요. 다시 한번 요청합니다. > 안녕하세요. 첨부한 파일과 같이 종목 검색재요청이 안돼고 계속해서 앤카운트 -1에서 멈춘이후 재요청이 안됩니다. 다시한번 수식을 검토해 주시면 고맙겠습니다.