커뮤니티

차트객체를 이용한 매매와 복수의 검색식 사용에 대해서

프로필 이미지
cs아빠
2019-11-14 16:07:12
3173
글번호 225059
답변완료
A. 14시부터 15초 간격으로 검색식 ㄱ,ㄴ,ㄷ 을 실행시켜 종목을 받고, 각각 검색완료 직후부터 5분간 5회 분할 매수한다. (종목당 매수갯수 = 검색식당투입금액/검색갯수/종목현재가) (예: 검색식'ㄱ' 14시00분00초 검색직후 5분간5회 분할매수 검색식'ㄴ' 14시00분15초 검색직후 5분간5회 분할매수) B. 관심종목을 불러와서 거래 예정입니다. 모두 동일한 예스랭귀지 파일을 불러서 매수 매도할 계획입니다. 1. 매수 신호가 오면 a1분간 b1회 분할매수 한다. 2. 매도 신호가 오면 미체결 매수를 취소한다. 3. 미체결 매수 취소후 보유수량을 a2분간 b2회 분할매도 한다. 감사합니다.
답변 2
프로필 이미지

예스스탁 예스스탁 답변

2019-11-19 09:23:50

안녕하세요 예스스탁입니다, 1 검색식별로 각각 스팟식 작성하셔야 합니다. 수식에서 종목객체를 생성해야 하는데 15초에 60회로 제한이 있고 종목이 겹치면 파악하기 어렵습니다. ㄱ,ㄴ,ㄷ별로 금액,시간을 별도로 지정해서 식 3개 만드시면 됩니다 var TotalMoney = 10000000;//금액 var SearchTime = 140000; var SearchName = "사용자검색조건명"; //ㄱ or ㄴ or ㄷ var HHMMSS, HHMMSS1, S, MM,Req,Cnt; var List = [],MK = []; function Main_OnStart() { S = 0; Main.SetTimer(1, 5000); } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS1 = HHMMSS; HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1) { Main.KillTimer(1); if (S == 0 && HHMMSS >= SearchTime && HHMMSS1 < SearchTime) { S = 1; Main.ReqPowerSearch(SearchName); } } if (nEventID == 2) { Cnt = Cnt+1; if (Cnt <= 4) { for (var i = 0; i < List.length; i++) { Account1.OrderBuy(MK[i].code,Math.floor(M1/MK[i].current),MK[i].current,0); } } } } function Main_OnRcvItemList(aItemList, nCount) { if (nCount > 0) { var M1 = Math.floor((TotalMoney/nCount)/5); for (var i = 0; i < nCount; i++) { List.push(aItemList[i]); } 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) { Main.ReqMarketData(List[Req]); } else { for (var i = 0; i < List.length; i++) { Account1.OrderBuy(MK[i].code,Math.floor(M1/MK[i].current),MK[i].current,0); } Cnt = 0; Main.SetTimer(2, 60000); } } } 2 var InterestName = "MyItem";// "관심그룹명"; var SystemName = "#test";//시스템명 var ChartTime = 1;//분 var a1 = 5;//5분 var b1 = 5;//5회 var a2 = 5;//5분 var b2 = 5;//5회 var Binterval = ((a1*60)/b1)*1000; var Xinterval = ((a2*60)/b2)*1000; var List = [],CT = [],MK = [],PST = []; var Bvol = [],Bv1 = [],SumBV1 = []; var Xvol = [],Xv1 = [],SumXV1 = []; var step,req1,req2; function Main_OnStart() { step = 0; var num = Main.GetItemCountOfInterest(InterestName); Main.MessageList("관심그룹의 종목수 : ",num); if (num > 0) { for (var i = 0; i < num; i++) { List.push(Main.GetItemCodeInInterest(InterestName, i)); Bvol.push(0); Bv1.push(0); Xvol.push(0); Xv1.push(0); } if (List.length > 0) { step = 1; Main.MessageList("종목객체요청시작------",List); req1 = 0; Main.MessageList("종목객체요청 : ",List[req1]); Main.ReqMarketData(List[req1]); } } } function Main_OnRcvMarketData(MarketData) { if (step == 1 && List[req1] == MarketData.code) { MK[req1] = MarketData; Main.MessageList("종목객체생성 : ",MK[req1].code); req1 = req1 + 1; if (req1 < List.length) { Main.MessageList("종목객체요청 : ",List[req1]); var S = Main.ReqMarketData(List[req1]); if (S == -1) { Main.MessageList("종목객체요청제한-----------------"); Main.SetTimer(1, 20000); } } else { step = 2; Main.MessageList("종목객체요청종료"); req2 = 0; Main.MessageList("차트객체요청시작-----"); Main.MessageList("종목객체요청 : ",List[req2]); var CTSet = new ReqChartItem(List[req2],ChartTime,CHART_PERIOD_MINUTE,1000,CHART_REQCOUNT_BAR,false,false); var STSet = new SystemInfo(SystemName); Main.ReqChartEx(CTSet, STSet); } } } function Main_OnRcvChartEx(ChartEx) { if (step == 2 && List[req2] == ChartEx.GetCode(1)) { CT[req2] = ChartEx; Main.MessageList("차트객체생성 : ",CT[req2].GetCode(1)); req2 = req2 + 1; if (req2 < List.length) { Main.MessageList("차트객체요청 : ",List[req2]); var CTSet = new ReqChartItem(List[req2],ChartTime,CHART_PERIOD_MINUTE,1000,CHART_REQCOUNT_BAR,false,false); var STSet = new SystemInfo(SystemName); Main.ReqChartEx(CTSet, STSet); } else { step = 3; Main.MessageList("차트객체요청종료"); } } } function Main_OnRiseSignal(ChartEx, Signal) { if (step == 3) { Main.MessageList("OnRiseSignal",ChartEx.GetCode(1),Signal.signalKind); for (var i = 0; i < List.length; i++ ) { if (ChartEx.GetCode(1) == List[i]) { if (Signal.signalKind == 1) { Main.KillTimer(i); PST[i] = 1; Bvol[i] = Signal.count; Bv1[i] = Math.round((Bvol[i])/b1); SumBV1[i] = 0; Account1.OrderBuy(List[i], Bv1[i], MK[i].Ask(3),0); Main.SetTimer(i, Binterval); } if (PST[i] == 1 && Signal.signalKind == 2) { Main.KillTimer(i); PST[i] = -1; var num = Account1.GetTheNumberOfUnfills(); for (var z = 0; z < num; z++) { Account1.SetUnfill(z); if (Account1.Unfill.code == Signal.code && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); } } Account1.SetBalance(Signal.code, 0) Xvol[i] = Account1.Balance.count; Xv1[i] = Math.round((Xvol[i])/b2); SumXV1[i] = 0; Account1.OrderSell(List[i], Xv1[i], MK[i].Bid(3),0); Main.SetTimer(i, Xinterval); } } } } } function Main_OnTimer(nEventID) { if (step == 1 && nEventID == 1) { Main.KillTimer(1); Main.MessageList("종목객체요청 : ",List[req1]); Main.ReqMarketData(List[req1]); } if (step == 3 && PST[nEventID] == 1) { SumBV1[nEventID] = SumBV1[nEventID] + Bv1[nEventID]; if (SumBV1[nEventID] + Bv1[nEventID] <= Bvol[nEventID]) { Account1.OrderBuy(List[nEventID], Bv1[nEventID], MK[nEventID].Ask(3),0); } else { if ((SumBV1[nEventID] + Bv1[nEventID]) - Bvol[nEventID] > 0) { Account1.OrderBuy(List[nEventID],(SumBV1[nEventID] + Bv1[nEventID]) - Bvol[nEventID], MK[nEventID].Ask(3),0); } Main.KillTimer(nEventID); } } if (step == 3 && PST[nEventID] == -1) { SumXV1[nEventID] = SumXV1[nEventID] + Xv1[nEventID]; if (SumXV1[nEventID] + Xv1[nEventID] <= Xvol[nEventID]) { Account1.OrderSell(List[nEventID], Xv1[nEventID], MK[nEventID].Bid(3),0); } else { if ((SumXV1[nEventID] + Xv1[nEventID]) - Xvol[nEventID] > 0) { Account1.OrderSell(List[nEventID],(SumXV1[nEventID] + Xv1[nEventID]) - Xvol[nEventID], MK[nEventID].Bid(3),0); } Main.KillTimer(nEventID); } } } 즐거운 하루되세요 > cs아빠 님이 쓴 글입니다. > 제목 : 차트객체를 이용한 매매와 복수의 검색식 사용에 대해서 > A. 14시부터 15초 간격으로 검색식 ㄱ,ㄴ,ㄷ 을 실행시켜 종목을 받고, 각각 검색완료 직후부터 5분간 5회 분할 매수한다. (종목당 매수갯수 = 검색식당투입금액/검색갯수/종목현재가) (예: 검색식'ㄱ' 14시00분00초 검색직후 5분간5회 분할매수 검색식'ㄴ' 14시00분15초 검색직후 5분간5회 분할매수) B. 관심종목을 불러와서 거래 예정입니다. 모두 동일한 예스랭귀지 파일을 불러서 매수 매도할 계획입니다. 1. 매수 신호가 오면 a1분간 b1회 분할매수 한다. 2. 매도 신호가 오면 미체결 매수를 취소한다. 3. 미체결 매수 취소후 보유수량을 a2분간 b2회 분할매도 한다. 감사합니다.
프로필 이미지

cs아빠

2019-11-21 12:36:50

답변 감사드립니다. 스팟 하나에서 여러개 검색식을 쓰는 건 불가능하다는 말씀이신거죠? > 예스스탁 님이 쓴 글입니다. > 제목 : Re : 차트객체를 이용한 매매와 복수의 검색식 사용에 대해서 > 안녕하세요 예스스탁입니다, 1 검색식별로 각각 스팟식 작성하셔야 합니다. 수식에서 종목객체를 생성해야 하는데 15초에 60회로 제한이 있고 종목이 겹치면 파악하기 어렵습니다. ㄱ,ㄴ,ㄷ별로 금액,시간을 별도로 지정해서 식 3개 만드시면 됩니다 var TotalMoney = 10000000;//금액 var SearchTime = 140000; var SearchName = "사용자검색조건명"; //ㄱ or ㄴ or ㄷ var HHMMSS, HHMMSS1, S, MM,Req,Cnt; var List = [],MK = []; function Main_OnStart() { S = 0; Main.SetTimer(1, 5000); } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS1 = HHMMSS; HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (nEventID == 1) { Main.KillTimer(1); if (S == 0 && HHMMSS >= SearchTime && HHMMSS1 < SearchTime) { S = 1; Main.ReqPowerSearch(SearchName); } } if (nEventID == 2) { Cnt = Cnt+1; if (Cnt <= 4) { for (var i = 0; i < List.length; i++) { Account1.OrderBuy(MK[i].code,Math.floor(M1/MK[i].current),MK[i].current,0); } } } } function Main_OnRcvItemList(aItemList, nCount) { if (nCount > 0) { var M1 = Math.floor((TotalMoney/nCount)/5); for (var i = 0; i < nCount; i++) { List.push(aItemList[i]); } 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) { Main.ReqMarketData(List[Req]); } else { for (var i = 0; i < List.length; i++) { Account1.OrderBuy(MK[i].code,Math.floor(M1/MK[i].current),MK[i].current,0); } Cnt = 0; Main.SetTimer(2, 60000); } } } 2 var InterestName = "MyItem";// "관심그룹명"; var SystemName = "#test";//시스템명 var ChartTime = 1;//분 var a1 = 5;//5분 var b1 = 5;//5회 var a2 = 5;//5분 var b2 = 5;//5회 var Binterval = ((a1*60)/b1)*1000; var Xinterval = ((a2*60)/b2)*1000; var List = [],CT = [],MK = [],PST = []; var Bvol = [],Bv1 = [],SumBV1 = []; var Xvol = [],Xv1 = [],SumXV1 = []; var step,req1,req2; function Main_OnStart() { step = 0; var num = Main.GetItemCountOfInterest(InterestName); Main.MessageList("관심그룹의 종목수 : ",num); if (num > 0) { for (var i = 0; i < num; i++) { List.push(Main.GetItemCodeInInterest(InterestName, i)); Bvol.push(0); Bv1.push(0); Xvol.push(0); Xv1.push(0); } if (List.length > 0) { step = 1; Main.MessageList("종목객체요청시작------",List); req1 = 0; Main.MessageList("종목객체요청 : ",List[req1]); Main.ReqMarketData(List[req1]); } } } function Main_OnRcvMarketData(MarketData) { if (step == 1 && List[req1] == MarketData.code) { MK[req1] = MarketData; Main.MessageList("종목객체생성 : ",MK[req1].code); req1 = req1 + 1; if (req1 < List.length) { Main.MessageList("종목객체요청 : ",List[req1]); var S = Main.ReqMarketData(List[req1]); if (S == -1) { Main.MessageList("종목객체요청제한-----------------"); Main.SetTimer(1, 20000); } } else { step = 2; Main.MessageList("종목객체요청종료"); req2 = 0; Main.MessageList("차트객체요청시작-----"); Main.MessageList("종목객체요청 : ",List[req2]); var CTSet = new ReqChartItem(List[req2],ChartTime,CHART_PERIOD_MINUTE,1000,CHART_REQCOUNT_BAR,false,false); var STSet = new SystemInfo(SystemName); Main.ReqChartEx(CTSet, STSet); } } } function Main_OnRcvChartEx(ChartEx) { if (step == 2 && List[req2] == ChartEx.GetCode(1)) { CT[req2] = ChartEx; Main.MessageList("차트객체생성 : ",CT[req2].GetCode(1)); req2 = req2 + 1; if (req2 < List.length) { Main.MessageList("차트객체요청 : ",List[req2]); var CTSet = new ReqChartItem(List[req2],ChartTime,CHART_PERIOD_MINUTE,1000,CHART_REQCOUNT_BAR,false,false); var STSet = new SystemInfo(SystemName); Main.ReqChartEx(CTSet, STSet); } else { step = 3; Main.MessageList("차트객체요청종료"); } } } function Main_OnRiseSignal(ChartEx, Signal) { if (step == 3) { Main.MessageList("OnRiseSignal",ChartEx.GetCode(1),Signal.signalKind); for (var i = 0; i < List.length; i++ ) { if (ChartEx.GetCode(1) == List[i]) { if (Signal.signalKind == 1) { Main.KillTimer(i); PST[i] = 1; Bvol[i] = Signal.count; Bv1[i] = Math.round((Bvol[i])/b1); SumBV1[i] = 0; Account1.OrderBuy(List[i], Bv1[i], MK[i].Ask(3),0); Main.SetTimer(i, Binterval); } if (PST[i] == 1 && Signal.signalKind == 2) { Main.KillTimer(i); PST[i] = -1; var num = Account1.GetTheNumberOfUnfills(); for (var z = 0; z < num; z++) { Account1.SetUnfill(z); if (Account1.Unfill.code == Signal.code && Account1.Unfill.count > 0) { Account1.OrderCancel(Account1.Unfill.orderNum); } } Account1.SetBalance(Signal.code, 0) Xvol[i] = Account1.Balance.count; Xv1[i] = Math.round((Xvol[i])/b2); SumXV1[i] = 0; Account1.OrderSell(List[i], Xv1[i], MK[i].Bid(3),0); Main.SetTimer(i, Xinterval); } } } } } function Main_OnTimer(nEventID) { if (step == 1 && nEventID == 1) { Main.KillTimer(1); Main.MessageList("종목객체요청 : ",List[req1]); Main.ReqMarketData(List[req1]); } if (step == 3 && PST[nEventID] == 1) { SumBV1[nEventID] = SumBV1[nEventID] + Bv1[nEventID]; if (SumBV1[nEventID] + Bv1[nEventID] <= Bvol[nEventID]) { Account1.OrderBuy(List[nEventID], Bv1[nEventID], MK[nEventID].Ask(3),0); } else { if ((SumBV1[nEventID] + Bv1[nEventID]) - Bvol[nEventID] > 0) { Account1.OrderBuy(List[nEventID],(SumBV1[nEventID] + Bv1[nEventID]) - Bvol[nEventID], MK[nEventID].Ask(3),0); } Main.KillTimer(nEventID); } } if (step == 3 && PST[nEventID] == -1) { SumXV1[nEventID] = SumXV1[nEventID] + Xv1[nEventID]; if (SumXV1[nEventID] + Xv1[nEventID] <= Xvol[nEventID]) { Account1.OrderSell(List[nEventID], Xv1[nEventID], MK[nEventID].Bid(3),0); } else { if ((SumXV1[nEventID] + Xv1[nEventID]) - Xvol[nEventID] > 0) { Account1.OrderSell(List[nEventID],(SumXV1[nEventID] + Xv1[nEventID]) - Xvol[nEventID], MK[nEventID].Bid(3),0); } Main.KillTimer(nEventID); } } } 즐거운 하루되세요 > cs아빠 님이 쓴 글입니다. > 제목 : 차트객체를 이용한 매매와 복수의 검색식 사용에 대해서 > A. 14시부터 15초 간격으로 검색식 ㄱ,ㄴ,ㄷ 을 실행시켜 종목을 받고, 각각 검색완료 직후부터 5분간 5회 분할 매수한다. (종목당 매수갯수 = 검색식당투입금액/검색갯수/종목현재가) (예: 검색식'ㄱ' 14시00분00초 검색직후 5분간5회 분할매수 검색식'ㄴ' 14시00분15초 검색직후 5분간5회 분할매수) B. 관심종목을 불러와서 거래 예정입니다. 모두 동일한 예스랭귀지 파일을 불러서 매수 매도할 계획입니다. 1. 매수 신호가 오면 a1분간 b1회 분할매수 한다. 2. 매도 신호가 오면 미체결 매수를 취소한다. 3. 미체결 매수 취소후 보유수량을 a2분간 b2회 분할매도 한다. 감사합니다.