커뮤니티

질문드립니다.

프로필 이미지
stockric
2019-04-13 12:52:30
3264
글번호 224767
답변완료
var ItemList; var Count; var ReqCount; //#종목검색 실행 function Main_OnStart() { Main.MessageLog("스팟시작"); Main.ReqPowerSearch("검색"); Start = 0; Main.SetTimer(1, 1000); } function Main_OnRcvItemList(aItemList, nCount) { Main.MessageList("추가완료 : ",nCount); if (nCount >= 1) Main.SendInterests("테스트",aItemList, true); Main.MessageLog("관심종목생성시작"); Count = Main.GetItemCountOfInterest("테스트"); Main.MessageList("지정관심그룹 종목수 : ", Count); ItemList = []; for(var i = 0 ; i < Count ; i++) { ItemList.push(Main.GetItemCodeInInterest("테스트", i)); } Main.SetTimer(1, 1000); ReqCount = 0; } function Main_OnTimer(nEventID) { if (nEventID == 1) { var StopSet = new SystemStopInfo(new StopLoss(5, 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[ReqCount],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet); Main.ReqChartEx(ChartSet); Main.MessageLog("확장차트생성_"+ItemList[ReqCount]); ReqCount = ReqCount+1; if (ReqCount == Count) { Main.KillTimer(1); Main.MessageLog("start system trading"); } //신호발생 function Main_OnRiseSignal(ChartEx, Signal) { //신호발생 종목에 대해 잔고셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code),0); //매수신호이고 잔고가 없을때만 매수 if (Signal.signalKind == 1 && Account1.Balance.count == 0) { Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),0,1); Main.MessageLog("매수주문"); } if (Signal.signalKind == 2) { //전체미체결주문 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체 미체결수 만큼 루프를 돌면서 for (var i = 0; i < num; i++) { //미체결을 하나씩 셋팅하고 Account1.SetUnfill(i); //미체결종목이 신호종목과 같고 미체결수량이 있으면 if (Account1.Unfill.code == Main.GetOrderCode(Signal.code) && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //잔고수량만큼만 매도 if (Account1.Balance.count > 0) { Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,0,1); Main.MessageLog("매도주문"); } } } 1. 관종 추가된종목에 위와같이 차트셋팅하고나서 고가가 시가보다 10%미만으로 크고, 저가가 시가보다 7% 이상 작지않으며((DayOpen*1.10 > DayHigh and DayOpen*1.7 > DayLow)), 종가가 10이동평균선 값보다 n%위에 있다면 최대5회 피라미딩진입을 3시20분 동시호가에 진입하게할 수 있게 부탁드립니다.다만 20이평밑으로 종가가 8%내려가면 진입신호 중지라는 신호 소중한 시간 내어주시어 제게는 너무나도 필요하고 소중한 수식부탁드리겠습니다. 2. 아래 신호 변환 부탁드립니다. Var : profit(10),loss(5); if MarketPosition == 1 Then { ExitLong("매수익절",Atlimit,AvgEntryPrice*(1+profit/100)); //매입10%수익청 ExitLong("손절",AtStop,AvgEntryPrice*(1-loss/100)); //매입가5%손절청 } #14%수익이후 50% 수익 감소하면 청산 Var : UPrate(14),Dnrate(50); if MarketPosition == 1 Then{ Var5 = highest(H,BarsSinceEntry); if Var5 >= EntryPrice*(1+UPrate/100) then exitlong("전량14%-하락50%",AtStop,Var5-(Var5-EntryPrice)*(Dnrate/100)); } 3. 최초진입신호이후 10일이 지나면 전량청산 수식부탁드립니다. 4. 위의 손절, 익절, 제가 만든 신호(기타등등) 이후 당일 동시호가 진입x 신호부탁드립니다. 5. 종목에서 10%수익시 물량의 20% 청산식 부탁드립니다. 위 수식에서는 예스시스템없이 오로지 스팟에서만 진입청산수식이 나가게하고 있습니다만.. 예스랭귀지에서는 동시호가 주문이 안되다보니... 자바스크립트에 적응하는게 표본이 적다보니 여간 쉬운게 아니네요. 소중한 답변 긴 시간 기다리고 있습니다. 기다리는 만큼 답변 역시 제게는 너무 소중하고 감사한 답변입니다. 꼭 부탁드리겠습니다. 질문사항이 길어 누가 될 수 있지만, 답변의 속도가 예스랭귀지 수식보다 느리기도하고, 오래걸림을 아는지라 정말 필요하고 부족한지식으로 작성하기 어려운 부분들이 있어 어쩔 수 없음을 양해바랍니다. 수식짜주시는데에 항상 감사한 마음을 가지고있는 고객들이 많이 있습니다. 감사합니다.
답변 2
프로필 이미지

예스스탁 예스스탁 답변

2019-04-18 14:01:56

> stockric 님이 쓴 글입니다. > 제목 : 질문드립니다. > var ItemList; var Count; var ReqCount; //#종목검색 실행 function Main_OnStart() { Main.MessageLog("스팟시작"); Main.ReqPowerSearch("검색"); Start = 0; Main.SetTimer(1, 1000); } function Main_OnRcvItemList(aItemList, nCount) { Main.MessageList("추가완료 : ",nCount); if (nCount >= 1) Main.SendInterests("테스트",aItemList, true); Main.MessageLog("관심종목생성시작"); Count = Main.GetItemCountOfInterest("테스트"); Main.MessageList("지정관심그룹 종목수 : ", Count); ItemList = []; for(var i = 0 ; i < Count ; i++) { ItemList.push(Main.GetItemCodeInInterest("테스트", i)); } Main.SetTimer(1, 1000); ReqCount = 0; } function Main_OnTimer(nEventID) { if (nEventID == 1) { var StopSet = new SystemStopInfo(new StopLoss(5, 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[ReqCount],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet); Main.ReqChartEx(ChartSet); Main.MessageLog("확장차트생성_"+ItemList[ReqCount]); ReqCount = ReqCount+1; if (ReqCount == Count) { Main.KillTimer(1); Main.MessageLog("start system trading"); } //신호발생 function Main_OnRiseSignal(ChartEx, Signal) { //신호발생 종목에 대해 잔고셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code),0); //매수신호이고 잔고가 없을때만 매수 if (Signal.signalKind == 1 && Account1.Balance.count == 0) { Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),0,1); Main.MessageLog("매수주문"); } if (Signal.signalKind == 2) { //전체미체결주문 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체 미체결수 만큼 루프를 돌면서 for (var i = 0; i < num; i++) { //미체결을 하나씩 셋팅하고 Account1.SetUnfill(i); //미체결종목이 신호종목과 같고 미체결수량이 있으면 if (Account1.Unfill.code == Main.GetOrderCode(Signal.code) && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //잔고수량만큼만 매도 if (Account1.Balance.count > 0) { Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,0,1); Main.MessageLog("매도주문"); } } } 1. 관종 추가된종목에 위와같이 차트셋팅하고나서 고가가 시가보다 10%미만으로 크고, 저가가 시가보다 7% 이상 작지않으며((DayOpen*1.10 > DayHigh and DayOpen*1.7 > DayLow)), 종가가 10이동평균선 값보다 n%위에 있다면 최대5회 피라미딩진입을 3시20분 동시호가에 진입하게할 수 있게 부탁드립니다.다만 20이평밑으로 종가가 8%내려가면 진입신호 중지라는 신호 소중한 시간 내어주시어 제게는 너무나도 필요하고 소중한 수식부탁드리겠습니다. 2. 아래 신호 변환 부탁드립니다. Var : profit(10),loss(5); if MarketPosition == 1 Then { ExitLong("매수익절",Atlimit,AvgEntryPrice*(1+profit/100)); //매입10%수익청 ExitLong("손절",AtStop,AvgEntryPrice*(1-loss/100)); //매입가5%손절청 } #14%수익이후 50% 수익 감소하면 청산 Var : UPrate(14),Dnrate(50); if MarketPosition == 1 Then{ Var5 = highest(H,BarsSinceEntry); if Var5 >= EntryPrice*(1+UPrate/100) then exitlong("전량14%-하락50%",AtStop,Var5-(Var5-EntryPrice)*(Dnrate/100)); } 3. 최초진입신호이후 10일이 지나면 전량청산 수식부탁드립니다. 4. 위의 손절, 익절, 제가 만든 신호(기타등등) 이후 당일 동시호가 진입x 신호부탁드립니다. 5. 종목에서 10%수익시 물량의 20% 청산식 부탁드립니다. 위 수식에서는 예스시스템없이 오로지 스팟에서만 진입청산수식이 나가게하고 있습니다만.. 예스랭귀지에서는 동시호가 주문이 안되다보니... 자바스크립트에 적응하는게 표본이 적다보니 여간 쉬운게 아니네요. 소중한 답변 긴 시간 기다리고 있습니다. 기다리는 만큼 답변 역시 제게는 너무 소중하고 감사한 답변입니다. 꼭 부탁드리겠습니다. 질문사항이 길어 누가 될 수 있지만, 답변의 속도가 예스랭귀지 수식보다 느리기도하고, 오래걸림을 아는지라 정말 필요하고 부족한지식으로 작성하기 어려운 부분들이 있어 어쩔 수 없음을 양해바랍니다. 수식짜주시는데에 항상 감사한 마음을 가지고있는 고객들이 많이 있습니다. 감사합니다.
프로필 이미지

예스스탁 예스스탁 답변

2019-04-19 11:28:05

안녕하세요 예스스탁입니다. 업무상 많은 내용에 대해서는 가이드를 해드리기 어렵습니다. 1번수식에 대해서는 가이드수식 올려드립니다. 2~5번에 대한 내용은 스팟으로 구현하기 위해서는 케이스별로 처리가 복잡해서 저희가 답변드리기는 어렵습니다. 1 스팟에서는 차트에서 발생한 신호를 인지는 가능하지만 반대로 스팟에서 어떤 조건을 주어 신호를 제어를 하지는 못합니다. 그러므로 구현하고자 하는 내용 중 신호의 제어와 관련된 내용은 사용하는 시스템 수식에 해당 내용이 들어가야 합니다. 또한 기존 수식에 강제청산 설정등의 내용은 있는데 차트에 적용할 시스템을 지정하는 부분이 없어 추가했습니다. 시스템에 대한 강제청산은 모두 적용하는 시스템 수식안에 지정하시기 바랍니다. 그러면 스팟에서는 이름을 지정해 시스템을 적용만 하면 되므로 스팟코딩이 간단하게 됩니다. 1520분에 차트가 매수상태이면 신호의 수량으로 주문을 집행하고 차트가 매도되어 포지션이 없는 상태이면 해당종목에 대해 잔고수량 전체를 매도하는 내용으로 수정해 드립니다. 기존 수식에는 차트생성후에 신호발생시 주문하는 내용이 있는데 1520분에 주문하므로 해당 내용은 필요가 없습니다. var ItemList = []; var CT = []; var Count; var ReqCount; //#종목검색 실행 function Main_OnStart() { Start = 0; Main.MessageList("스팟시작"); //종목검색 Main.ReqPowerSearch("검색"); } function Main_OnRcvItemList(aItemList, nCount) { Main.MessageList("검색완료 : ",nCount); //1종목 이상 검색되면 관심그룹에 추가 if (nCount >= 1) Main.SendInterests("테스트",aItemList, true); Main.MessageList("관심종목생성시작"); //관심그룹의 종목수 Count = Main.GetItemCountOfInterest("테스트"); Main.MessageList("지정관심그룹 종목수 : ", Count); //관심그룹의 종목을 불러와 ItemList 배열변수에 순차적으로 저장 ItemList = []; for(var i = 0 ; i < Count ; i++) { ItemList.push(Main.GetItemCodeInInterest("테스트", i)); } Main.MessageList("확장차트생성할종목수 : ", ItemList.length); if (ItemList.length > 0) { //차트생성 카운트 변수, 초기값 0 ReqCount = 0; //차트설정(3분,5000개봉,수정주가와 갭보정하지 않음) var ChartSet = new ReqChartItem(ItemList[ReqCount],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,false); //적용할 시스템(이름지정) var SymSet = new SystemInfo("#test"); Main.ReqChartEx(ChartSet,SymSet); Main.MessageList("확장차트생성 :",ItemList[ReqCount]); } } function Main_OnRcvChartEx(ChartEx) { //방금 요청한 종목에 대해 차트가 생성되면 if (ChartEx.GetCode(1) == ItemList[ReqCount]) { //CT배열변수에 차트객체를 저장 CT[ReqCount] = ChartEx; //카운트는 1증가 ReqCount = ReqCount+1; //요청산 종목이 남았으면 다음종목의 차트객체 요청 if (ReqCount < ItemList.length) { //차트설정(3분,5000개봉,수정주가와 갭보정하지 않음) var ChartSet = new ReqChartItem(ItemList[ReqCount],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,false); //적용할 시스템(이름지정) var SymSet = new SystemInfo("#test"); Main.ReqChartEx(ChartSet,SymSet); Main.MessageList("확장차트생성 :",ItemList[ReqCount]); } else { //요청이 모두 완료되면 Main.MessageList("확장차트생성완료:생성된 차트객체수",CT.length); //1번,5초 타이머 동작 Main.SetTimer(1, 5000); } } } function Main_OnTimer(nEventID) { //1번타이머 동작 if (nEventID == 1) { //자바스크립트 기본제공 날짜시간 객체 var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //현재 시간을 확인해 15시 20분 이후이면 if (HHMMSS >= 102000) { //타이머중지 Main.KillTimer(1); for(var i = 0 ; i < CT.length ; i++) { Main.MessageList("종목코드:",CT[i].GetCode(1),"차트최종보유수량 :",CT[i].GetOpenContracts()) //차트가 매수상태이면 if (CT[i].GetOpenContracts() > 0) { //차트수량으로 시장가매수 Account1.OrderBuy(CT[i].GetCode(1), CT[i].GetOpenContracts(), 0,1); Main.MessageList("매수"); } //차트가 매도상태이면 if (CT[i].GetOpenContracts() == 0) { //해당종목 잔고셋팅 Account1.SetBalance(CT[i].GetCode(1), 0) //해당 종목에 대해 잔고에 보유한 수량이 있으면 if (Account1.Balance.count > 0) { //전량 시장가 매도 Account1.OrderSell(CT[i].GetCode(1),Account1.Balance.count, 0,1); Main.MessageList("매도"); } } } } } } 2 매도 중에 익절이나 손절은 스팟식으로는 아래와 같이 간단합니다. function Main_OnStart() { Main.SetTimer(1, 5000); } function Main_OnTimer(nEventID) { if (nEventID == 1) { //계좌보유 종목수 var num = Account1.GetTheNumberOfBalances(); //보유종목에 대해 for (var i = 0; i < num; i++) { //순차적으로 잔고를 셋팅해 Account1.SetBalance(i) //보유수량이 있고 if (Account1.Balance.count > 0) { //현재가가 평단가+1%이상이거나 평단가-5%이하이면 전량청산 if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.10 || Account1.Balance.current <= Account1.Balance.avgUnitCost*0.95) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, 0, 1) } } } } } 다만 차트와 다르게 스팟은 과거 데이타가 없고 실제 잔고도 보유종목을 보유한 이후에 최고가나 보유경과일수등은 기억하고 있지 않습니다. 이를 해결하려면 보유시점부터 종목객체등을 호출해서 모두 시세를 받으면서 최고가를 계산해서 DB를 구축해 기억시키거나 엑셀 혹은 내부저장파일에 값을 모두 저장하고 별도로 관리해 가야하는 부분이 있습니다. 해당 부분들은 가이드를 드리기 어렵습니다. 도움을 드리지 못해 죄송합니다. 즐거운 하루되세요 > stockric 님이 쓴 글입니다. > 제목 : 질문드립니다. > var ItemList; var Count; var ReqCount; //#종목검색 실행 function Main_OnStart() { Main.MessageLog("스팟시작"); Main.ReqPowerSearch("검색"); Start = 0; Main.SetTimer(1, 1000); } function Main_OnRcvItemList(aItemList, nCount) { Main.MessageList("추가완료 : ",nCount); if (nCount >= 1) Main.SendInterests("테스트",aItemList, true); Main.MessageLog("관심종목생성시작"); Count = Main.GetItemCountOfInterest("테스트"); Main.MessageList("지정관심그룹 종목수 : ", Count); ItemList = []; for(var i = 0 ; i < Count ; i++) { ItemList.push(Main.GetItemCodeInInterest("테스트", i)); } Main.SetTimer(1, 1000); ReqCount = 0; } function Main_OnTimer(nEventID) { if (nEventID == 1) { var StopSet = new SystemStopInfo(new StopLoss(5, 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[ReqCount],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet); Main.ReqChartEx(ChartSet); Main.MessageLog("확장차트생성_"+ItemList[ReqCount]); ReqCount = ReqCount+1; if (ReqCount == Count) { Main.KillTimer(1); Main.MessageLog("start system trading"); } //신호발생 function Main_OnRiseSignal(ChartEx, Signal) { //신호발생 종목에 대해 잔고셋팅 Account1.SetBalance(Main.GetOrderCode(Signal.code),0); //매수신호이고 잔고가 없을때만 매수 if (Signal.signalKind == 1 && Account1.Balance.count == 0) { Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),0,1); Main.MessageLog("매수주문"); } if (Signal.signalKind == 2) { //전체미체결주문 갯수 var num = Account1.GetTheNumberOfUnfills(); //전체 미체결수 만큼 루프를 돌면서 for (var i = 0; i < num; i++) { //미체결을 하나씩 셋팅하고 Account1.SetUnfill(i); //미체결종목이 신호종목과 같고 미체결수량이 있으면 if (Account1.Unfill.code == Main.GetOrderCode(Signal.code) && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); } } //잔고수량만큼만 매도 if (Account1.Balance.count > 0) { Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,0,1); Main.MessageLog("매도주문"); } } } 1. 관종 추가된종목에 위와같이 차트셋팅하고나서 고가가 시가보다 10%미만으로 크고, 저가가 시가보다 7% 이상 작지않으며((DayOpen*1.10 > DayHigh and DayOpen*1.7 > DayLow)), 종가가 10이동평균선 값보다 n%위에 있다면 최대5회 피라미딩진입을 3시20분 동시호가에 진입하게할 수 있게 부탁드립니다.다만 20이평밑으로 종가가 8%내려가면 진입신호 중지라는 신호 소중한 시간 내어주시어 제게는 너무나도 필요하고 소중한 수식부탁드리겠습니다. 2. 아래 신호 변환 부탁드립니다. Var : profit(10),loss(5); if MarketPosition == 1 Then { ExitLong("매수익절",Atlimit,AvgEntryPrice*(1+profit/100)); //매입10%수익청 ExitLong("손절",AtStop,AvgEntryPrice*(1-loss/100)); //매입가5%손절청 } #14%수익이후 50% 수익 감소하면 청산 Var : UPrate(14),Dnrate(50); if MarketPosition == 1 Then{ Var5 = highest(H,BarsSinceEntry); if Var5 >= EntryPrice*(1+UPrate/100) then exitlong("전량14%-하락50%",AtStop,Var5-(Var5-EntryPrice)*(Dnrate/100)); } 3. 최초진입신호이후 10일이 지나면 전량청산 수식부탁드립니다. 4. 위의 손절, 익절, 제가 만든 신호(기타등등) 이후 당일 동시호가 진입x 신호부탁드립니다. 5. 종목에서 10%수익시 물량의 20% 청산식 부탁드립니다. 위 수식에서는 예스시스템없이 오로지 스팟에서만 진입청산수식이 나가게하고 있습니다만.. 예스랭귀지에서는 동시호가 주문이 안되다보니... 자바스크립트에 적응하는게 표본이 적다보니 여간 쉬운게 아니네요. 소중한 답변 긴 시간 기다리고 있습니다. 기다리는 만큼 답변 역시 제게는 너무 소중하고 감사한 답변입니다. 꼭 부탁드리겠습니다. 질문사항이 길어 누가 될 수 있지만, 답변의 속도가 예스랭귀지 수식보다 느리기도하고, 오래걸림을 아는지라 정말 필요하고 부족한지식으로 작성하기 어려운 부분들이 있어 어쩔 수 없음을 양해바랍니다. 수식짜주시는데에 항상 감사한 마음을 가지고있는 고객들이 많이 있습니다. 감사합니다.