커뮤니티

문의 드립니다.

프로필 이미지
초보로직
2020-07-31 23:24:26
2739
글번호 225284
답변완료
항상 노고의 감사드립니다. 랭귀지 가이드로 스팟구현을 하려고하는데 너무 초보라 많이 부족합니다. [밑에 랭귀지식을 스팟으로 가이드 부탁드립니다.]챠트객체없이 잔고객체만 추가해서 구현하려합니다. 종목수는 10-15개 종목정도.... 매수/매도의 (%수치만) 외부객체로 가능하면 부탁드립니다. 또한 매수 총금액의 범위는 "전날종가기준평가금액"의 50%이하입니다. input : ndate(),전날종가기준평가금액();//<==CurrentContracts*C(1)?? if sdate >= ndate Then { if MarketPosition == 0 Then buy();//<==(매수는 수동매수입니다.) if MarketPosition == 1 Then { if CurrentContracts*C > (전날종가기준평가금액*1.05) Then//<==1.05는 외부객체로 부탁드립니다. { ExitLong("매도종목코드",OnClose,def,"",int(abs(전날종가기준평가금액-(CurrentContracts*C))/C),시장가); } if CurrentContracts*C < (전날종가기준평가금액*0.95) Then//<==0.95는 외부객체로 부탁드립니다. { Buy("매수종목코드",OnClose,def,int(abs(전날종가기준평가금액-(CurrentContracts*C))/C),시장가); } } }
답변 2
프로필 이미지

예스스탁 예스스탁 답변

2020-08-07 14:46:09

안녕하세요 예스스탁입니다. 아래 가이드 참고하셔서 수정보완해 완성해 사용하시기 바랍니다. 잔고객체에 전일종가기준평가금액이 없습니다. 보유수량에 전일종가를 곱한 값을 사용해야 하므로 보유종목별 종목객체가 필요합니다. 아래식은 스팟이 시작하면 잔고의 보유종목에 대해서 모두 종목객체를 생성하고 이후에 5초단위로 계산해 매도 조건 체크해서 주문하게 됩니다. 매수나 매도는 각 한번씩만 발생하게 했습니다. 수식에 주석 참고하시기 바랍니다. 스크립트 객체설정 계좌객체 추가 --> 객체명은 Account1, 계좌번호 지정 외부변수 추가 --> 변수명 Per1,초기값 5, 데이터형 숫자 외부변수 추가 --> 변수명 Per2,초기값 -5, 데이터형 숫자 var req,Start; var item = [],MK = [],Bcnt = [],Scnt = []; //스파시작 function Main_OnStart() { Main.MessageList("start"); //Start 변수 초기값은 false Start = false //잔고의 보유종목수 var num = Account1.GetTheNumberOfBalances(); Main.MessageList("보유종목수 ; ",num); //보유종목이 1개이상이면 if (num >= 1) { //item배열변수에 종목코드 순서대로 추가 for (var i = 0; i < num; i++) { Account1.SetBalance(i); item[i] = Account1.Balance.code; } } //item변수에 값이 1개 이상이면 if (item.length >= 1) { //종목객체를 요청 req = 0; Main.MessageList("종목객체요청 : ",req,item[req]); Main.ReqMarketData(item[req]); } } function Main_OnRcvMarketData(MarketData) { //요청한 종목객체 생성이 완료되면 if (MarketData.code == item[req]) { Main.MessageList("종목객체생성 : ",MarketData.code); //MK배열변수에 종목객체 저장 MK[req] = MarketData; //매도횟수 저장할 변수는 초기값 0 Scnt[req] = 0; //매수횟수 저장할 변수는 초기값 0 Bcnt[req] = 0; //req는 1증가 req = req+1; //다음순번 종목요청 if (req < item.length) { Main.MessageList("종목객체요청 : ",req,item[req]); var S = Main.ReqMarketData(item[req]); //종목객체 생성제한에 걸리면(15초 60회) if (S == -1) { //11초 타이머 셋팅하고 15초 후에 다시 요청 Main.MessageList("종목객체생성제한 : 15초 재요청가능"); Main.SetTimer(99, 15000); } } else //순서대로 종목객체 생성이 모두 완료되면 { Main.MessageList("종목객체생성완료"); //5초 타이머 시작 Main.SetTimer(1, 5000); //Start는 true Start = true; } } } function Main_OnTimer(nEventID) { //종목객체 생성이 모두 완료되면 지정한 초간격으로 //모든 종목의 매수와 매도 조건체크 if (nEventID == 1 && Start == true) { for (var i = 0; i < MK.length; i++) { //순차적으로 잔고객체 셋팅하고 Account1.SetBalance(MK[i].code, 0); //매수보유잔고가 있을 경우 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //현재가*보유수량 > 전일종가*보유수량보다 Per1% 상승하면 전량 시장가로 매도 if (Scnt[i] == 0 && MK[i].current*Account1.Balance.count > MK[i].prevClose*Account1.Balance.count*(1+Per1/100)) { //해당종목 매도카운트는 1로 변경해서 더이상 동작하지 않게 함 Scnt[i] = 1; Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1); } //현재가*보유수량 < 전일종가*보유수량보다 -Per2% 하락하면 지정한 계산식으로 수량계산해서 추가매수 if (Bcnt[i] == 0 && MK[i].current*Account1.Balance.count < MK[i].prevClose*Account1.Balance.count*(1+Per2/100)) { //해당종목 매수카운트는 1로 변경해서 더이상 동작하지 않게 함 Bcnt[i] = 1; //수량 = int(abs(전일종가*보유수량-(현재가*보유수량))/현재가) var vol = Math.floor(Math.abs(MK[i].prevClose*Account1.Balance.count-MK[i].current*Account1.Balance.count )/MarketData1.current); //계산딘 수량이 1이상이면 시장가로 지정한 수량 매수 if (vol >= 1) { Account1.OrderBuy(Account1.Balance.code, vol,0,1); } } } } } //종목객체 생성제한에 걸리면 15초 후에 다시 요청 if (nEventID == 99) { Main.MessageList("종목객체재요청 : ",req,item[req]); } } 즐거운 하루되세요 > 초보로직 님이 쓴 글입니다. > 제목 : 문의 드립니다. > 항상 노고의 감사드립니다. 랭귀지 가이드로 스팟구현을 하려고하는데 너무 초보라 많이 부족합니다. [밑에 랭귀지식을 스팟으로 가이드 부탁드립니다.]챠트객체없이 잔고객체만 추가해서 구현하려합니다. 종목수는 10-15개 종목정도.... 매수/매도의 (%수치만) 외부객체로 가능하면 부탁드립니다. 또한 매수 총금액의 범위는 "전날종가기준평가금액"의 50%이하입니다. input : ndate(),전날종가기준평가금액();//<==CurrentContracts*C(1)?? if sdate >= ndate Then { if MarketPosition == 0 Then buy();//<==(매수는 수동매수입니다.) if MarketPosition == 1 Then { if CurrentContracts*C > (전날종가기준평가금액*1.05) Then//<==1.05는 외부객체로 부탁드립니다. { ExitLong("매도종목코드",OnClose,def,"",int(abs(전날종가기준평가금액-(CurrentContracts*C))/C),시장가); } if CurrentContracts*C < (전날종가기준평가금액*0.95) Then//<==0.95는 외부객체로 부탁드립니다. { Buy("매수종목코드",OnClose,def,int(abs(전날종가기준평가금액-(CurrentContracts*C))/C),시장가); } } }
프로필 이미지

초보로직

2021-05-31 19:02:09

항상 노고에 감사드립니다. 1.자동적용시 매수/매도 조건을 첫 주문은 실행하는데 다음 조건만족후부터는 주문이 실행이 않되고있습니다. 혹시==> Scnt[i] = 1; //해당종목 매도카운트는 1로 변경해서 더이상 동작하지 않게 함 ==> Bcnt[i] = 1; //해당종목 매수카운트는 1로 변경해서 더이상 동작하지 않게 함 IF부분의 이부분때문에 반복 조건만족 실행이 1번만 되는건가요? 전체 스팟을 Main.SetTimer로 반복할수있나요? 부탁드립니다. > 예스스탁 님이 쓴 글입니다. > 제목 : Re : 문의 드립니다. > 안녕하세요 예스스탁입니다. 아래 가이드 참고하셔서 수정보완해 완성해 사용하시기 바랍니다. 잔고객체에 전일종가기준평가금액이 없습니다. 보유수량에 전일종가를 곱한 값을 사용해야 하므로 보유종목별 종목객체가 필요합니다. 아래식은 스팟이 시작하면 잔고의 보유종목에 대해서 모두 종목객체를 생성하고 이후에 5초단위로 계산해 매도 조건 체크해서 주문하게 됩니다. 매수나 매도는 각 한번씩만 발생하게 했습니다. 수식에 주석 참고하시기 바랍니다. 스크립트 객체설정 계좌객체 추가 --> 객체명은 Account1, 계좌번호 지정 외부변수 추가 --> 변수명 Per1,초기값 5, 데이터형 숫자 외부변수 추가 --> 변수명 Per2,초기값 -5, 데이터형 숫자 var req,Start; var item = [],MK = [],Bcnt = [],Scnt = []; //스파시작 function Main_OnStart() { Main.MessageList("start"); //Start 변수 초기값은 false Start = false //잔고의 보유종목수 var num = Account1.GetTheNumberOfBalances(); Main.MessageList("보유종목수 ; ",num); //보유종목이 1개이상이면 if (num >= 1) { //item배열변수에 종목코드 순서대로 추가 for (var i = 0; i < num; i++) { Account1.SetBalance(i); item[i] = Account1.Balance.code; } } //item변수에 값이 1개 이상이면 if (item.length >= 1) { //종목객체를 요청 req = 0; Main.MessageList("종목객체요청 : ",req,item[req]); Main.ReqMarketData(item[req]); } } function Main_OnRcvMarketData(MarketData) { //요청한 종목객체 생성이 완료되면 if (MarketData.code == item[req]) { Main.MessageList("종목객체생성 : ",MarketData.code); //MK배열변수에 종목객체 저장 MK[req] = MarketData; //매도횟수 저장할 변수는 초기값 0 Scnt[req] = 0; //매수횟수 저장할 변수는 초기값 0 Bcnt[req] = 0; //req는 1증가 req = req+1; //다음순번 종목요청 if (req < item.length) { Main.MessageList("종목객체요청 : ",req,item[req]); var S = Main.ReqMarketData(item[req]); //종목객체 생성제한에 걸리면(15초 60회) if (S == -1) { //11초 타이머 셋팅하고 15초 후에 다시 요청 Main.MessageList("종목객체생성제한 : 15초 재요청가능"); Main.SetTimer(99, 15000); } } else //순서대로 종목객체 생성이 모두 완료되면 { Main.MessageList("종목객체생성완료"); //5초 타이머 시작 Main.SetTimer(1, 5000); //Start는 true Start = true; } } } function Main_OnTimer(nEventID) { //종목객체 생성이 모두 완료되면 지정한 초간격으로 //모든 종목의 매수와 매도 조건체크 if (nEventID == 1 && Start == true) { for (var i = 0; i < MK.length; i++) { //순차적으로 잔고객체 셋팅하고 Account1.SetBalance(MK[i].code, 0); //매수보유잔고가 있을 경우 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //현재가*보유수량 > 전일종가*보유수량보다 Per1% 상승하면 전량 시장가로 매도 if (Scnt[i] == 0 && MK[i].current*Account1.Balance.count > MK[i].prevClose*Account1.Balance.count*(1+Per1/100)) { //해당종목 매도카운트는 1로 변경해서 더이상 동작하지 않게 함 Scnt[i] = 1; Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1); } //현재가*보유수량 < 전일종가*보유수량보다 -Per2% 하락하면 지정한 계산식으로 수량계산해서 추가매수 if (Bcnt[i] == 0 && MK[i].current*Account1.Balance.count < MK[i].prevClose*Account1.Balance.count*(1+Per2/100)) { //해당종목 매수카운트는 1로 변경해서 더이상 동작하지 않게 함 Bcnt[i] = 1; //수량 = int(abs(전일종가*보유수량-(현재가*보유수량))/현재가) var vol = Math.floor(Math.abs(MK[i].prevClose*Account1.Balance.count-MK[i].current*Account1.Balance.count )/MarketData1.current); //계산딘 수량이 1이상이면 시장가로 지정한 수량 매수 if (vol >= 1) { Account1.OrderBuy(Account1.Balance.code, vol,0,1); } } } } } //종목객체 생성제한에 걸리면 15초 후에 다시 요청 if (nEventID == 99) { Main.MessageList("종목객체재요청 : ",req,item[req]); } } 즐거운 하루되세요 > 초보로직 님이 쓴 글입니다. > 제목 : 문의 드립니다. > 항상 노고의 감사드립니다. 랭귀지 가이드로 스팟구현을 하려고하는데 너무 초보라 많이 부족합니다. [밑에 랭귀지식을 스팟으로 가이드 부탁드립니다.]챠트객체없이 잔고객체만 추가해서 구현하려합니다. 종목수는 10-15개 종목정도.... 매수/매도의 (%수치만) 외부객체로 가능하면 부탁드립니다. 또한 매수 총금액의 범위는 "전날종가기준평가금액"의 50%이하입니다. input : ndate(),전날종가기준평가금액();//<==CurrentContracts*C(1)?? if sdate >= ndate Then { if MarketPosition == 0 Then buy();//<==(매수는 수동매수입니다.) if MarketPosition == 1 Then { if CurrentContracts*C > (전날종가기준평가금액*1.05) Then//<==1.05는 외부객체로 부탁드립니다. { ExitLong("매도종목코드",OnClose,def,"",int(abs(전날종가기준평가금액-(CurrentContracts*C))/C),시장가); } if CurrentContracts*C < (전날종가기준평가금액*0.95) Then//<==0.95는 외부객체로 부탁드립니다. { Buy("매수종목코드",OnClose,def,int(abs(전날종가기준평가금액-(CurrentContracts*C))/C),시장가); } } }