커뮤니티

2414번 추가 질문입니다.

프로필 이미지
깜피
2023-05-18 10:33:16.0
1014
글번호 225801
답변완료
안녕하세요. 전에 작성해주신 수식에 대해서 추가 문의 드립니다. 제가 구상했던 시스템 운영 방식에 거의 다다른 것 같습니다. 큰 도움 주셔서 너무 감사합니다. 즐거운 하루 보내세요. ------------------------------------------------------------------------------------ 1. 미완성 신호로 매도하는 부분을 작성해주셨는데, 미완성 신호로 매수하는 부분 추가 (제가 내용을 추가 했는데 확인 부탁드립니다.) 2. 미완성 신호로 매수된 경우, 원래 익일 시가에 완성신호로 매수되는 금번차수 매수 금지 (미완성 1차 매수 시 완성 1차 매수 금지, 미완성 2차 매수시 완성 2차 매수 금지) var ItemList; var Count; var ReqCount; var d; var H; var CT = []; function Main_OnStart()   {       Main.MessageLog("스팟시작");       d = new Date();       h = d.getDate();       //지정한 관심그룹의 종목수(관심그룹지정 필요)       Count = Main.GetItemCountOfInterest("관심종목1");       Main.MessageList("지정관심그룹 종목수 : ", Count);       ItemList = [];             //관심그룹 종목코드를 ItemList로 옮김       for(var i = 0 ; i < Count ; i++)       {             //관심그룹지정 필요             ItemList.push(Main.GetItemCodeInInterest("관심종목1", i));       }       //관심종목이 1개 이상이면        if (Count > 0)     {             //첫종목부터 요청시작             //요청갯수 카운트 변수는 초기값 0             ReqCount = 0;                          var TradeSet =  new SystemTradeInfo(TRADE_FIXCAPITAL,                                              1,                         // 거래수량                                              100000000,                 // 자산                                              1,                         // 단위수량                                              0, 0, CALCMETHOD_PERCENT,  // 진입/청산 수수료                                              0, 0, CALCMETHOD_POINT,    // 진입/청산 슬리피지                                              PYRAMIDING_ENTRY,          // 피라미딩 설정여부(다른진입신호만 허용)                                              100000,                      // 최대진입수량                                              20);                       // 최대진입횟수             var ChartSet = new ReqChartItem(ItemList[ReqCount],1,CHART_PERIOD_DAILY,1000,CHART_REQCOUNT_BAR,true,false);             /////SystemInfo(name,kind,inputVar,tradeInfo,stopInfo)             var SystemSet  = new SystemInfo("YL_시스템(일봉)", YL_TYPE_NORMAL, null, TradeSet);             //차트객체 요청             Main.ReqChartEx(ChartSet,SystemSet);             Main.MessageList("확장차트생성요청:",ItemList[ReqCount]);             //1벝 타이머 10초 세팅             Main.SetTimer(1, 10000);       } }   //차트객체 수신 function Main_OnRcvChartEx(ChartEx) {       //방금 요청한 종목이 맞는지 확인       if (ChartEx.GetCode(1) == ItemList[ReqCount])          {             Main.MessageList("확장차트생성완료:",ChartEx.GetCode(1));             //차트객체를 순차적으로 CT배열변수에 저장             CT.push(ChartEx);                          //요청갯수 1증가             ReqCount = ReqCount+1;                             //요청갯수가 Count 미만이면             if (ReqCount < Count)             {                   //다음종목 요청                   var TradeSet =  new SystemTradeInfo(TRADE_FIXCAPITAL,                                                    1,                         // 거래수량                                                    100000000,                 // 자산                                                    1,                         // 단위수량                                                    0, 0, CALCMETHOD_PERCENT,  // 진입/청산 수수료                                                    0, 0, CALCMETHOD_POINT,    // 진입/청산 슬리피지                                                    PYRAMIDING_ENTRY,          // 피라미딩 설정여부(다른진입신호만 허용)                                                    100000,                      // 최대진입수량                                                    20);                       // 최대진입횟수                   var ChartSet = new ReqChartItem(ItemList[ReqCount],1,CHART_PERIOD_DAILY,1000,CHART_REQCOUNT_BAR,true,false);                   /////SystemInfo(name,kind,inputVar,tradeInfo,stopInfo)                   var SystemSet  = new SystemInfo("YL_시스템(일봉)", YL_TYPE_NORMAL, null, TradeSet);                   Main.ReqChartEx(ChartSet,SystemSet);                   Main.MessageList("확장차트생성요청:",ItemList[ReqCount]);                               }             else//아니면             {                   //종목객체생성 종료                   Main.MessageList("종목객체생성완료");                   }       } } //타이머 동작 function Main_OnTimer(nEventID) {       //1번 타이머 동작       if (nEventID == 1)       {             var d = new Date();             HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();             //15시 25분이 되면             if (HHMMSS >= 152500)             {                   //타이머종료                   Main.KillTimer(1); #######################################추가#####################################                   //생성된 전체차트에서 미완성 매수신호 있는 것을 확인하고                    //미완성매수신호가 있고 잔고에 보유수량이 없으면 매수                   for (var i = 0; i < CT.length; i++)                   {                         ///마지막봉의 미완성 신호 정보를 가져와 저장                         var Incom2 = CT[i].GetIncompleteSignal();                         //미완성 정보가 있고 매수 신호이면                         if (Incom2[0] != null && Incom2[0].signalKind == 1)                          {                               Account1.SetBalance(Incom2[0].code, 0)                               if (Account1.Balance.count > 0)                               {                                     Account1.OrderBuy(Incom2[0].code, Incom2[0].count, Incom2[0].price, 0);                               }                         }                   } ##############################################################################                   //생성된 전체차트에서 미완성 매도신호 있는 것을 확인하고                    //미완성매도신호가 있고 잔고에 보유수량이 있으면 전량 매도                   for (var i = 0; i < CT.length; i++)                   {                         ///마지막봉의 미완성 신호 정보를 가져와 저장                         var Incom = CT[i].GetIncompleteSignal();                         //미완성 정보가 있고 매수청산 신호이면                         if (Incom[0] != null && Incom[0].signalKind == 2)                          {                               Account1.SetBalance(Incom[0].code, 0)                               if (Account1.Balance.count > 0)                               {                                     Account1.OrderSell(Incom[0].code, Account1.Balance.count, Incom[0].price, 0);                               }                         }                   }             }       } } //신호발생 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), Signal.count, Signal.price, 0);                   Main.MessageList("매수주문9");       }       if (Signal.signalKind == 2)       {             //전체미체결주문 갯수             var num = Account1.GetTheNumberOfUnfills();             //전체 미체결수 만큼 루프를 돌면서             for (var i = 0; i < num; i++)             {                   //미체결을 하나씩 셋팅하고 Account1.GetTotalAmount(nCategory, nTradeKind)                   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), Signal.count, Signal.price, 0);                   Main.MessageList("매도주문");               }       } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2023-06-28 16:21:20.0

안녕하세요 예스스탁입니다. 스팟의 답변은 가이드일뿐입니다. 스팟은 사용자분 책임하에 테스트 하시면서 수식을 완성하셔야 합니다. 대략적인 내용에 대해서만 보완해 드립니다. 1 if (Account1.Balance.count > 0) 청산은 수량이 있을때만 발생하므로 위와 같은 조건이지만 매수는 if (Account1.Balance.count == 0으로 처리하셔야 할 것 같습니다. 별도로 수량이 0보다 큰경우로 지정하신 부분이 아니면 수량이 없을때 진입하게 하셔야 할 것 같습니다. 2 배열변수를 추가로 만드셔서 미완성진입신호가 발생하면 차트객체가 저장된 배열과 동일한 배열방번호에 신호의 시간을 저장하고 완성신호 발생시 시간을 비교해서 다를 때만 완성신호시 주문이 나가게 처리하시면 됩니다. 3 var ItemList; var Count; var ReqCount; var d; var H; var CT = [],II = []; function Main_OnStart() { Main.MessageLog("스팟시작"); d = new Date(); h = d.getDate(); //지정한 관심그룹의 종목수(관심그룹지정 필요) Count = Main.GetItemCountOfInterest("관심종목1"); Main.MessageList("지정관심그룹 종목수 : ", Count); ItemList = []; //관심그룹 종목코드를 ItemList로 옮김 for(var i = 0 ; i < Count ; i++) { //관심그룹지정 필요 ItemList.push(Main.GetItemCodeInInterest("관심종목1", i)); } //관심종목이 1개 이상이면 if (Count > 0) { //첫종목부터 요청시작 //요청갯수 카운트 변수는 초기값 0 ReqCount = 0; var TradeSet = new SystemTradeInfo(TRADE_FIXCAPITAL, 1, // 거래수량 100000000, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부(다른진입신호만 허용) 100000, // 최대진입수량 20); // 최대진입횟수 var ChartSet = new ReqChartItem(ItemList[ReqCount],1,CHART_PERIOD_DAILY,1000,CHART_REQCOUNT_BAR,true,false); /////SystemInfo(name,kind,inputVar,tradeInfo,stopInfo) var SystemSet = new SystemInfo("YL_시스템(일봉)", YL_TYPE_NORMAL, null, TradeSet); //차트객체 요청 Main.ReqChartEx(ChartSet,SystemSet); Main.MessageList("확장차트생성요청:",ItemList[ReqCount]); //1벝 타이머 10초 세팅 Main.SetTimer(1, 10000); } } //차트객체 수신 function Main_OnRcvChartEx(ChartEx) { //방금 요청한 종목이 맞는지 확인 if (ChartEx.GetCode(1) == ItemList[ReqCount]) { Main.MessageList("확장차트생성완료:",ChartEx.GetCode(1)); //차트객체를 순차적으로 CT배열변수에 저장 CT.push(ChartEx); II.push(0); //요청갯수 1증가 ReqCount = ReqCount+1; //요청갯수가 Count 미만이면 if (ReqCount < Count) { //다음종목 요청 var TradeSet = new SystemTradeInfo(TRADE_FIXCAPITAL, 1, // 거래수량 100000000, // 자산 1, // 단위수량 0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료 0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지 PYRAMIDING_ENTRY, // 피라미딩 설정여부(다른진입신호만 허용) 100000, // 최대진입수량 20); // 최대진입횟수 var ChartSet = new ReqChartItem(ItemList[ReqCount],1,CHART_PERIOD_DAILY,1000,CHART_REQCOUNT_BAR,true,false); /////SystemInfo(name,kind,inputVar,tradeInfo,stopInfo) var SystemSet = new SystemInfo("YL_시스템(일봉)", YL_TYPE_NORMAL, null, TradeSet); Main.ReqChartEx(ChartSet,SystemSet); Main.MessageList("확장차트생성요청:",ItemList[ReqCount]); } else//아니면 { //종목객체생성 종료 Main.MessageList("종목객체생성완료"); } } } //타이머 동작 function Main_OnTimer(nEventID) { //1번 타이머 동작 if (nEventID == 1) { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //15시 25분이 되면 if (HHMMSS >= 152500) { //타이머종료 Main.KillTimer(1); //#######################################추가##################################### //생성된 전체차트에서 미완성 매수신호 있는 것을 확인하고 //미완성매수신호가 있고 잔고에 보유수량이 없으면 매수 for (var i = 0; i < CT.length; i++) { ///마지막봉의 미완성 신호 정보를 가져와 저장 var Incom2 = CT[i].GetIncompleteSignal(); //미완성 정보가 있고 매수 신호이면 if (Incom2[0] != null && Incom2[0].signalKind == 1) { Account1.SetBalance(Incom2[0].code, 0) if (Account1.Balance.count == 0) { Account1.OrderBuy(Incom2[0].code, Incom2[0].count, Incom2[0].price, 0); II[i] = Incom2[0].time; } } } //############################################################################## //생성된 전체차트에서 미완성 매도신호 있는 것을 확인하고 //미완성매도신호가 있고 잔고에 보유수량이 있으면 전량 매도 for (var i = 0; i < CT.length; i++) { ///마지막봉의 미완성 신호 정보를 가져와 저장 var Incom = CT[i].GetIncompleteSignal(); //미완성 정보가 있고 매수청산 신호이면 if (Incom[0] != null && Incom[0].signalKind == 2) { Account1.SetBalance(Incom[0].code, 0) if (Account1.Balance.count > 0) { Account1.OrderSell(Incom[0].code, Account1.Balance.count, Incom[0].price, 0); } } } } } } //신호발생 function Main_OnRiseSignal(ChartEx, Signal) { //신호발생 종목에 대해 잔고셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code),0); //###############################추가 요청####################################### //#### 미완성 신호로 매수된 경우, 익일 시가에 완성신호로 금번 차수 매수 금지##### //########## 다음 차수 매수는 익일에 나오지 않습니다.########################### //매수신호 시 매수 if (Signal.signalKind == 1) ////// && Account1.Balance.count == 0) { var order = true; for (var i = 0; i < CT.length; i++) { if (ChartEx.GetCode(1) == CT.GetCode(1) && Signal.time == II[i]) { ordr = false; } } if (order == true) { Account1.OrderBuy(Main.GetOrderCode(Signal.code), Signal.count, Signal.price, 0); Main.MessageList("매수주문9"); } } if (Signal.signalKind == 2) { //전체미체결주문 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체 미체결수 만큼 루프를 돌면서 for (var i = 0; i < num; i++) { //미체결을 하나씩 셋팅하고 Account1.GetTotalAmount(nCategory, nTradeKind) 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), Signal.count, Signal.price, 0); Main.MessageList("매도주문"); } } } 즐거운 하루되세요 > 깜피 님이 쓴 글입니다. > 제목 : 2414번 추가 질문입니다. > 안녕하세요. 전에 작성해주신 수식에 대해서 추가 문의 드립니다. 제가 구상했던 시스템 운영 방식에 거의 다다른 것 같습니다. 큰 도움 주셔서 너무 감사합니다. 즐거운 하루 보내세요. ------------------------------------------------------------------------------------ 1. 미완성 신호로 매도하는 부분을 작성해주셨는데, 미완성 신호로 매수하는 부분 추가 (제가 내용을 추가 했는데 확인 부탁드립니다.) 2. 미완성 신호로 매수된 경우, 원래 익일 시가에 완성신호로 매수되는 금번차수 매수 금지 (미완성 1차 매수 시 완성 1차 매수 금지, 미완성 2차 매수시 완성 2차 매수 금지) var ItemList; var Count; var ReqCount; var d; var H; var CT = []; function Main_OnStart()   {       Main.MessageLog("스팟시작");       d = new Date();       h = d.getDate();       //지정한 관심그룹의 종목수(관심그룹지정 필요)       Count = Main.GetItemCountOfInterest("관심종목1");       Main.MessageList("지정관심그룹 종목수 : ", Count);       ItemList = [];             //관심그룹 종목코드를 ItemList로 옮김       for(var i = 0 ; i < Count ; i++)       {             //관심그룹지정 필요             ItemList.push(Main.GetItemCodeInInterest("관심종목1", i));       }       //관심종목이 1개 이상이면        if (Count > 0)     {             //첫종목부터 요청시작             //요청갯수 카운트 변수는 초기값 0             ReqCount = 0;                          var TradeSet =  new SystemTradeInfo(TRADE_FIXCAPITAL,                                              1,                         // 거래수량                                              100000000,                 // 자산                                              1,                         // 단위수량                                              0, 0, CALCMETHOD_PERCENT,  // 진입/청산 수수료                                              0, 0, CALCMETHOD_POINT,    // 진입/청산 슬리피지                                              PYRAMIDING_ENTRY,          // 피라미딩 설정여부(다른진입신호만 허용)                                              100000,                      // 최대진입수량                                              20);                       // 최대진입횟수             var ChartSet = new ReqChartItem(ItemList[ReqCount],1,CHART_PERIOD_DAILY,1000,CHART_REQCOUNT_BAR,true,false);             /////SystemInfo(name,kind,inputVar,tradeInfo,stopInfo)             var SystemSet  = new SystemInfo("YL_시스템(일봉)", YL_TYPE_NORMAL, null, TradeSet);             //차트객체 요청             Main.ReqChartEx(ChartSet,SystemSet);             Main.MessageList("확장차트생성요청:",ItemList[ReqCount]);             //1벝 타이머 10초 세팅             Main.SetTimer(1, 10000);       } }   //차트객체 수신 function Main_OnRcvChartEx(ChartEx) {       //방금 요청한 종목이 맞는지 확인       if (ChartEx.GetCode(1) == ItemList[ReqCount])          {             Main.MessageList("확장차트생성완료:",ChartEx.GetCode(1));             //차트객체를 순차적으로 CT배열변수에 저장             CT.push(ChartEx);                          //요청갯수 1증가             ReqCount = ReqCount+1;                             //요청갯수가 Count 미만이면             if (ReqCount < Count)             {                   //다음종목 요청                   var TradeSet =  new SystemTradeInfo(TRADE_FIXCAPITAL,                                                    1,                         // 거래수량                                                    100000000,                 // 자산                                                    1,                         // 단위수량                                                    0, 0, CALCMETHOD_PERCENT,  // 진입/청산 수수료                                                    0, 0, CALCMETHOD_POINT,    // 진입/청산 슬리피지                                                    PYRAMIDING_ENTRY,          // 피라미딩 설정여부(다른진입신호만 허용)                                                    100000,                      // 최대진입수량                                                    20);                       // 최대진입횟수                   var ChartSet = new ReqChartItem(ItemList[ReqCount],1,CHART_PERIOD_DAILY,1000,CHART_REQCOUNT_BAR,true,false);                   /////SystemInfo(name,kind,inputVar,tradeInfo,stopInfo)                   var SystemSet  = new SystemInfo("YL_시스템(일봉)", YL_TYPE_NORMAL, null, TradeSet);                   Main.ReqChartEx(ChartSet,SystemSet);                   Main.MessageList("확장차트생성요청:",ItemList[ReqCount]);                               }             else//아니면             {                   //종목객체생성 종료                   Main.MessageList("종목객체생성완료");                   }       } } //타이머 동작 function Main_OnTimer(nEventID) {       //1번 타이머 동작       if (nEventID == 1)       {             var d = new Date();             HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();             //15시 25분이 되면             if (HHMMSS >= 152500)             {                   //타이머종료                   Main.KillTimer(1); #######################################추가#####################################                   //생성된 전체차트에서 미완성 매수신호 있는 것을 확인하고                    //미완성매수신호가 있고 잔고에 보유수량이 없으면 매수                   for (var i = 0; i < CT.length; i++)                   {                         ///마지막봉의 미완성 신호 정보를 가져와 저장                         var Incom2 = CT[i].GetIncompleteSignal();                         //미완성 정보가 있고 매수 신호이면                         if (Incom2[0] != null && Incom2[0].signalKind == 1)                          {                               Account1.SetBalance(Incom2[0].code, 0)                               if (Account1.Balance.count > 0)                               {                                     Account1.OrderBuy(Incom2[0].code, Incom2[0].count, Incom2[0].price, 0);                               }                         }                   } ##############################################################################                   //생성된 전체차트에서 미완성 매도신호 있는 것을 확인하고                    //미완성매도신호가 있고 잔고에 보유수량이 있으면 전량 매도                   for (var i = 0; i < CT.length; i++)                   {                         ///마지막봉의 미완성 신호 정보를 가져와 저장                         var Incom = CT[i].GetIncompleteSignal();                         //미완성 정보가 있고 매수청산 신호이면                         if (Incom[0] != null && Incom[0].signalKind == 2)                          {                               Account1.SetBalance(Incom[0].code, 0)                               if (Account1.Balance.count > 0)                               {                                     Account1.OrderSell(Incom[0].code, Account1.Balance.count, Incom[0].price, 0);                               }                         }                   }             }       } } //신호발생 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), Signal.count, Signal.price, 0);                   Main.MessageList("매수주문9");       }       if (Signal.signalKind == 2)       {             //전체미체결주문 갯수             var num = Account1.GetTheNumberOfUnfills();             //전체 미체결수 만큼 루프를 돌면서             for (var i = 0; i < num; i++)             {                   //미체결을 하나씩 셋팅하고 Account1.GetTotalAmount(nCategory, nTradeKind)                   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), Signal.count, Signal.price, 0);                   Main.MessageList("매도주문");               }       } }