커뮤니티

미완성신호에서 매수매도

프로필 이미지
hyon707
2023-09-25 11:29:57.0
936
글번호 225845
답변완료

첨부 이미지

사용자의 편의를 위한 도움에 항상 감사드립니다. 아래와 같이 작성해서 실행하니 사진과 같이 종목이 선정되는데 signal is not defined 에러 발생으로실제 매매가 이루어지지 않고 있습니다. 수정 부탁드립니다. 미완성신호로 매수매도를 하고 싶습니다. 매수매도 둘다 미완성이 안된다면 매수는 종목검색이 되면 바로 매수 하고 매도는 미완성 신호로 하고 싶습니다. 1.차트와 확장차트의 다른점을 모르겠고 코딩이 어떻게 달라지나요? 2. 스크립트객체 설정 차트객체추가에서 아래와 같이 코딩할 경우 차트명과 차트id는 어떻게해야하나요? 3.아래코드에서 미완성신호에서 매수와 매도가 이루어졌어면 합니다. 추가 부탁드립니다. 4. -풍성하고 행복한 추석이 되시길 바랍니다. *건의사항 예스스팟의 경우 동일한 질문이 많고 일부의 질문자의 경우 답을 얻고 삭제를 하는군요. 일정양식을 작성하여 지워지지 않게 고정해 둔다면 답변하시는분이나 질문자가 서로 편할듯 합니다. var 검색주기 = 10; var 최대종목수 = 3; var 매수금액=30000; var ItemList = [];//검색 후 생성할 종목의 리스트를 저장하기 위한 배열변수 var CT = []; var MK = []; var ID = []; var Num = []; var Timer = []; var HHMMSS,req; var BuyEntry,BuyVol; function Main_OnStart() { CTcnt = 0; Main.SetTimer(999, 8000); 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 >= 090100 && CT.length < 최대종목수) { Main.KillTimer(999); Main.MessageList("종목검색 요청"); Main.ReqPowerSearch("@@기본조건"); } 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(5)); } //매도주문이고 주문가격과 매수1호가가 다르면(같으면 정정불가) if (Account1.Unfill.orderKind == 1 && Account1.Unfill.price != MK[nEventID].Bid(1)) { //매수1호가로 정정 Account1.OrderReplacePrice(Account1.Unfill.orderNum, MK[nEventID].Bid(5)); } } } } } } 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 < 최대종목수) { req = 0; var StopSet = new SystemStopInfo(new StopLoss(3, CALCMETHOD_PERCENT, 0xFFDA93), // new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0), new StopProfitTarget(20, CALCMETHOD_PERCENT, 0xFFDA93), //new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93), new StopEndOfDay(151500)); var ChartSet = new ReqChartItem(ItemList[req],1,CHART_PERIOD_DAILY,500,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("@@test_이상한", 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);//5초 } } } } 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 < 최대종목수) { 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)); // new StopTiming(STOP_INSTANT,0xFFDA93)) ; var ChartSet = new ReqChartItem(ItemList[req],1,CHART_PERIOD_DAILY,500,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("@@test_이상한", YL_TYPE_NORMAL, null, null, StopSet); //var idset = new Array(new IndicatorInfo("2.이동평균(계절)"),new IndicatorInfo("단순이동평균3")); 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; } } } //매수신호이고 잔고가 없을때만 현재가 매수 signalking1:미완성신호 buy, signalKind == 2:미완성신호 sell if (Signal.signalKind == 1 && Account1.Balance.count == 0) { // Account1.OrderBuy(Main.GetOrderCode(Signal.code),1,0,1); //Accountl.OrdAccount1.BalanceAccount1.numberAccount1.UnfillAccount1.nameAccount1.numbererBuy(MarketData.code,1,0,1); //Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(매수글액/ChartEx.GetClose(1,0)),MK[ii].current,0); Main.MessageLog("매수주문 : ",Main.GetOrderCode(Signal.code),Math.floor(매수글액/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; } } } } */ // 미 신호발생 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; } } } //매수신호이고 잔고가 없을때만 현재가 매수 signalking1:미완성신호 buy, signalKind == 2:미완성신호 sell 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),1,0,1); //Accountl.OrdAccount1.BalanceAccount1.numberAccount1.UnfillAccount1.nameAccount1.numbererBuy(MarketData.code,1,0,1); //Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(매수글액/ChartEx.GetClose(1,0)),MK[ii].current,0); //Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(매수글액/ChartEx.GetClose(1,0)),MK[ii].current + GetTickSize()*5,0); Main.MessageLog("매수주문 : ",Main.GetOrderCode(Signal.code),Math.floor(매수금액/ChartEx.GetClose(1,0)),MK[ii].current+ GetTickSize()*1); if (ii >= 0) { Main.SetTimer(ii,60000); Timer[ii] = 0; } } //잔고수량만큼만 매도 if (Account1.Balance.count > 0) { Account1.OrderSell(Main.GetOrderCode(Signal.code),Math.floor(매수금액/ChartEx.GetClose(1,0)),MK[ii].current + GetTickSize()*2,0); Main.MessageLog("매도주문 : ",Main.GetOrderCode(Signal.code),Account1.Balance.count,MK[ii].current); if (ii >= 0) { Main.SetTimer(ii,60000); Timer[ii] = 0; } } }
답변 3
프로필 이미지

예스스탁 예스스탁 답변

2023-10-26 17:47:59.0

안녕하세요 예스스탁입니다. 1 function Main_OnRiseSignal(ChartEx, Signal) { } Signal은 위 완성신호 발생 이벤트가 발생되면 그 정보를 담아 리턴해 주는 객체입니다. function Main_OnRiseIncompleteSignal(ChartEx, IncompleteSignal) { } 미완성신호가 발생하면 위 이벤트가 발생하고 IncompleteSignal에 정보를 담아 리턴해 주게 됩니다. 그러므로 미완성신호 발생 이벤트에서 신호에 대해 확인하실 경우에 IncompleteSignal객체를 이용하셔야 합니다. 2 일반 차트객체는 직접 차트를 열고 차트에 아이디를 부여한 후에 사용하는 객체이고 확장 차트객체는 스크립트 객체화면이나 수식안에서 차트를 만들어 사용하는 객체입니다. 해당 부분은 예스스팟 도움말에 설명이 있으므로 도움말 다운받으셔서 참고하시기 바랍니다. 3 var 검색주기 = 10; var 최대종목수 = 3; var 매수금액=30000; var ItemList = [];//검색 후 생성할 종목의 리스트를 저장하기 위한 배열변수 var CT = []; var MK = []; var ID = []; var Num = []; var Timer = []; var HHMMSS,req; var BuyEntry,BuyVol; function Main_OnStart() { CTcnt = 0; Main.SetTimer(999, 8000); 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 >= 090100 && CT.length < 최대종목수) { Main.KillTimer(999); Main.MessageList("종목검색 요청"); Main.ReqPowerSearch("@@기본조건"); } 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(5)); } //매도주문이고 주문가격과 매수1호가가 다르면(같으면 정정불가) if (Account1.Unfill.orderKind == 1 && Account1.Unfill.price != MK[nEventID].Bid(1)) { //매수1호가로 정정 Account1.OrderReplacePrice(Account1.Unfill.orderNum, MK[nEventID].Bid(5)); } } } } } } 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 < 최대종목수) { req = 0; var StopSet = new SystemStopInfo(new StopLoss(3, CALCMETHOD_PERCENT, 0xFFDA93), // new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0), new StopProfitTarget(20, CALCMETHOD_PERCENT, 0xFFDA93), //new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93), new StopEndOfDay(151500)); var ChartSet = new ReqChartItem(ItemList[req],1,CHART_PERIOD_DAILY,500,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("@@test_이상한", 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);//5초 } } } } 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 < 최대종목수) { 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)); // new StopTiming(STOP_INSTANT,0xFFDA93)) ; var ChartSet = new ReqChartItem(ItemList[req],1,CHART_PERIOD_DAILY,500,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("@@test_이상한", YL_TYPE_NORMAL, null, null, StopSet); //var idset = new Array(new IndicatorInfo("2.이동평균(계절)"),new IndicatorInfo("단순이동평균3")); 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; } } } //매수신호이고 잔고가 없을때만 현재가 매수 signalking1:미완성신호 buy, signalKind == 2:미완성신호 sell if (Signal.signalKind == 1 && Account1.Balance.count == 0) { // Account1.OrderBuy(Main.GetOrderCode(Signal.code),1,0,1); //Accountl.OrdAccount1.BalanceAccount1.numberAccount1.UnfillAccount1.nameAccount1.numbererBuy(MarketData.code,1,0,1); //Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(매수글액/ChartEx.GetClose(1,0)),MK[ii].current,0); Main.MessageLog("매수주문 : ",Main.GetOrderCode(Signal.code),Math.floor(매수글액/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; } } } } */ // 미 신호발생 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; } } } //매수신호이고 잔고가 없을때만 현재가 매수 signalking1:미완성신호 buy, signalKind == 2:미완성신호 sell 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),1,0,1); //Accountl.OrdAccount1.BalanceAccount1.numberAccount1.UnfillAccount1.nameAccount1.numbererBuy(MarketData.code,1,0,1); //Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(매수글액/ChartEx.GetClose(1,0)),MK[ii].current,0); //Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(매수글액/ChartEx.GetClose(1,0)),MK[ii].current + GetTickSize()*5,0); Main.MessageLog("매수주문 : ",Main.GetOrderCode(IncompleteSignal.code),Math.floor(매수금액/ChartEx.GetClose(1,0)),MK[ii].current+ GetTickSize()*1); if (ii >= 0) { Main.SetTimer(ii,60000); Timer[ii] = 0; } } //잔고수량만큼만 매도 if (Account1.Balance.count > 0) { Account1.OrderSell(Main.GetOrderCode(IncompleteSignal.code),Math.floor(매수금액/ChartEx.GetClose(1,0)),MK[ii].current + GetTickSize()*2,0); Main.MessageLog("매도주문 : ",Main.GetOrderCode(IncompleteSignal.code),Account1.Balance.count,MK[ii].current); if (ii >= 0) { Main.SetTimer(ii,60000); Timer[ii] = 0; } } } 즐거운 하루되세요 > hyon707 님이 쓴 글입니다. > 제목 : 미완성신호에서 매수매도 > 사용자의 편의를 위한 도움에 항상 감사드립니다. 아래와 같이 작성해서 실행하니 사진과 같이 종목이 선정되는데 signal is not defined 에러 발생으로실제 매매가 이루어지지 않고 있습니다. 수정 부탁드립니다. 미완성신호로 매수매도를 하고 싶습니다. 매수매도 둘다 미완성이 안된다면 매수는 종목검색이 되면 바로 매수 하고 매도는 미완성 신호로 하고 싶습니다. 1.차트와 확장차트의 다른점을 모르겠고 코딩이 어떻게 달라지나요? 2. 스크립트객체 설정 차트객체추가에서 아래와 같이 코딩할 경우 차트명과 차트id는 어떻게해야하나요? 3.아래코드에서 미완성신호에서 매수와 매도가 이루어졌어면 합니다. 추가 부탁드립니다. 4. -풍성하고 행복한 추석이 되시길 바랍니다. *건의사항 예스스팟의 경우 동일한 질문이 많고 일부의 질문자의 경우 답을 얻고 삭제를 하는군요. 일정양식을 작성하여 지워지지 않게 고정해 둔다면 답변하시는분이나 질문자가 서로 편할듯 합니다. var 검색주기 = 10; var 최대종목수 = 3; var 매수금액=30000; var ItemList = [];//검색 후 생성할 종목의 리스트를 저장하기 위한 배열변수 var CT = []; var MK = []; var ID = []; var Num = []; var Timer = []; var HHMMSS,req; var BuyEntry,BuyVol; function Main_OnStart() { CTcnt = 0; Main.SetTimer(999, 8000); 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 >= 090100 && CT.length < 최대종목수) { Main.KillTimer(999); Main.MessageList("종목검색 요청"); Main.ReqPowerSearch("@@기본조건"); } 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(5)); } //매도주문이고 주문가격과 매수1호가가 다르면(같으면 정정불가) if (Account1.Unfill.orderKind == 1 && Account1.Unfill.price != MK[nEventID].Bid(1)) { //매수1호가로 정정 Account1.OrderReplacePrice(Account1.Unfill.orderNum, MK[nEventID].Bid(5)); } } } } } } 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 < 최대종목수) { req = 0; var StopSet = new SystemStopInfo(new StopLoss(3, CALCMETHOD_PERCENT, 0xFFDA93), // new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0), new StopProfitTarget(20, CALCMETHOD_PERCENT, 0xFFDA93), //new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93), new StopEndOfDay(151500)); var ChartSet = new ReqChartItem(ItemList[req],1,CHART_PERIOD_DAILY,500,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("@@test_이상한", 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);//5초 } } } } 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 < 최대종목수) { 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)); // new StopTiming(STOP_INSTANT,0xFFDA93)) ; var ChartSet = new ReqChartItem(ItemList[req],1,CHART_PERIOD_DAILY,500,CHART_REQCOUNT_BAR,false,StopSet); var SystemSet = new SystemInfo("@@test_이상한", YL_TYPE_NORMAL, null, null, StopSet); //var idset = new Array(new IndicatorInfo("2.이동평균(계절)"),new IndicatorInfo("단순이동평균3")); 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; } } } //매수신호이고 잔고가 없을때만 현재가 매수 signalking1:미완성신호 buy, signalKind == 2:미완성신호 sell if (Signal.signalKind == 1 && Account1.Balance.count == 0) { // Account1.OrderBuy(Main.GetOrderCode(Signal.code),1,0,1); //Accountl.OrdAccount1.BalanceAccount1.numberAccount1.UnfillAccount1.nameAccount1.numbererBuy(MarketData.code,1,0,1); //Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(매수글액/ChartEx.GetClose(1,0)),MK[ii].current,0); Main.MessageLog("매수주문 : ",Main.GetOrderCode(Signal.code),Math.floor(매수글액/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; } } } } */ // 미 신호발생 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; } } } //매수신호이고 잔고가 없을때만 현재가 매수 signalking1:미완성신호 buy, signalKind == 2:미완성신호 sell 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),1,0,1); //Accountl.OrdAccount1.BalanceAccount1.numberAccount1.UnfillAccount1.nameAccount1.numbererBuy(MarketData.code,1,0,1); //Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(매수글액/ChartEx.GetClose(1,0)),MK[ii].current,0); //Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(매수글액/ChartEx.GetClose(1,0)),MK[ii].current + GetTickSize()*5,0); Main.MessageLog("매수주문 : ",Main.GetOrderCode(Signal.code),Math.floor(매수금액/ChartEx.GetClose(1,0)),MK[ii].current+ GetTickSize()*1); if (ii >= 0) { Main.SetTimer(ii,60000); Timer[ii] = 0; } } //잔고수량만큼만 매도 if (Account1.Balance.count > 0) { Account1.OrderSell(Main.GetOrderCode(Signal.code),Math.floor(매수금액/ChartEx.GetClose(1,0)),MK[ii].current + GetTickSize()*2,0); Main.MessageLog("매도주문 : ",Main.GetOrderCode(Signal.code),Account1.Balance.count,MK[ii].current); if (ii >= 0) { Main.SetTimer(ii,60000); Timer[ii] = 0; } } }
프로필 이미지

hyon707

2023-12-04 17:50:12.0

장문의 내용을 확인 해주셨어 감사합니다.. ^^
프로필 이미지

hyon707

2023-12-11 11:13:48.0

hyon707 님에 의해 삭제된 답변입니다.