커뮤니티

매도, 매도식 부탁드립니다.

프로필 이미지
cs아빠
2019-09-05 10:53:45
3376
글번호 224970
답변완료
=======매수======== 1. a,b,c,d종목의 전일종가대비 n%에 m1 수량만큼 매수주문한다.(장전 주문) 2. a,b,c,d종목 현재가가 전일종가의 n%(==매수가) 보다 p% 낮으면 m2 매수주문한다. 3. t1시에 미체결 매수 취소 (영어는 외부변수로 빠지게 해 주세요) =======매도======== 1. t2시부터 미체결 매도 취소 2. 보유종목 호출 3. s회차 매도 시행(최우선) : 매도량은 (호출시 보유량)/(k-s+1) (총 k회 분할매도) ***매도간격은 t3*** ex) 총10회 매도 예정일 때, 1회차 매도시 (호출된 보유량)/(10-1+1) = (보유량)/10 5회차 매도시 (호출된 보유량)/(10-5+1) = (보유량)/6 4. 마지막 회차에서는 (1번,2번) 진행후 잔량 모두 시장가 매도 ==> 1-3번을 (k-1)회차 진행후 마지막회차 시장가 매도 진행(4번 항목) (영어는 외부변수로 빠지게 해 주세요) 부탁드리겠습니다. 감사합니다.
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2019-09-10 14:00:43

안녕하세요 예스스탁입니다. 스팟은 가이드 정도만 작성해 드립니다. 아래 내용 참고하셔서 이후 수정보완하시기 바랍니다. 스팟은 외부변수를 수식안에서 지정할수 없습니다. 스크립트 설정에서 설정하셔야 합니다. 스크립트 객체설정 종목객체추가 ---> 객체명 MarketData1, a종목으로 지정 종목객체추가 ---> 객체명 MarketData2, b종목으로 지정 종목객체추가 ---> 객체명 MarketData3, c종목으로 지정 종목객체추가 ---> 객체명 MarketData4, d종목으로 지정 계좌객체추가 --> 객체명 Account1, 주문계좌번호 지정 외부변수 추가 --> 변수명 bt, 초기값에 매수할 시간지정(8시30분이면 83000) , 데이터형 숫자 외부변수 추가 --> 변수명 t1, 초기값에 매수주문 취소할 시간지정(11시00분이면 110000) , 데이터형 숫자 외부변수 추가 --> 변수명 t2, 초기값에 매도 시작할 시간지정(13시00분이면 130000) , 데이터형 숫자 외부변수 추가 --> 변수명 t3, 초기값에 매도간격 지정(초간격으로 지정) , 데이터형 숫자 외부변수 추가 --> 변수명 n, 상승율값 지정, 데이터형 숫자 외부변수 추가 --> 변수명 p, 하락율값 지정, 데이터형 숫자 외부변수 추가 --> 변수명 m1, 수량지정, 데이터형 숫자 외부변수 추가 --> 변수명 m2, 수량지정, 데이터형 숫자 var HHMMSS, HHMMSS1; //스팟 첫 실행시 function Main_OnStart() { //1번 타이머, 10초 Main.SetTimer(1, 10000); } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS1 = HHMMSS; HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //지정시간(bt) 매수 if (nEventID == 1 && HHMMSS >= bt && HHMMSS1 < bt) { var P1 = MarketData1.prevClose*(1+n/100); var P2 = Math.floor(P1/MarketData1.GetTickSize(P1)); var P3 = P2*MarketData1.GetTickSize(P1); Account1.OrderBuy(MarketData1.code, m1,P3,0); var P1 = MarketData2.prevClose*(1+n/100); var P2 = Math.floor(P1/MarketData2.GetTickSize(P1)); var P3 = P2*MarketData2.GetTickSize(P1); Account1.OrderBuy(MarketData2.code, m1,P3,0); var P1 = MarketData3.prevClose*(1+n/100); var P2 = Math.floor(P1/MarketData3.GetTickSize(P1)); var P3 = P2*MarketData3.GetTickSize(P1); Account1.OrderBuy(MarketData3.code, m1,P3,0); var P1 = MarketData4.prevClose*(1+n/100); var P2 = Math.floor(P1/MarketData4.GetTickSize(P1)); var P3 = P2*MarketData4.GetTickSize(P1); Account1.OrderBuy(MarketData4.code, m1,P3,0); } if (nEventID == 1 && HHMMSS >= 90000 && HHMMSS1 < t1) { if (MarketData1.open > 0 && MarketData1.current <= (MarketData1.prevClose*(1+n/100))*(1-P/100)) Account1.OrderBuy(MarketData1.code, m2,MarketData1.current,0); if (MarketData2.open > 0 && MarketData2.current <= (MarketData2.prevClose*(1+n/100))*(1-P/100)) Account1.OrderBuy(MarketData2.code, m2,MarketData2.current,0); if (MarketData3.open > 0 && MarketData3.current <= (MarketData3.prevClose*(1+n/100))*(1-P/100)) Account1.OrderBuy(MarketData3.code, m2,MarketData3.current,0); if (MarketData4.open > 0 && MarketData4.current <= (MarketData4.prevClose*(1+n/100))*(1-P/100)) Account1.OrderBuy(MarketData4.code, m2,MarketData4.current,0); } //t1으로 지정한 시간에 매수 미체결 모두 취소 if (nEventID == 1 && HHMMSS >= t1 && HHMMSS1 < t1) { var num = Account1.GetTheNumberOfUnfills(); if (num >= 1) { for (var i = 0; i < num;i++ ) { Account1.SetUnfill(i); if (Account1.Unfill.orderKind == 2 && (Account1.Unfill.code == MarketData1.code || Account1.Unfill.code == MarketData2.code || Account1.Unfill.code == MarketData3.code || Account1.Unfill.code == MarketData4.code)) { Account1.OrderCancel(Account1.Unfill.orderNum); } } } } //t1으로 지정한 시간에 매수 미체결 모두 취소 if (nEventID == 1 && HHMMSS >= t2 && HHMMSS1 < t2) { s = 1; Account1.SetBalance(MarketData1.code, 0); if (Account1.Balance.count > 0) { var vv = Math.floor(Account1.Balance.count/(k-s+1)); if (vv >= 1) Account1.OrderSell(MarketData1.code,vv,0,10); } Account1.SetBalance(MarketData2.code, 0); if (Account1.Balance.count > 0) { var vv = Math.floor(Account1.Balance.count/(k-s+1)); if (vv >= 1) Account1.OrderSell(MarketData2.code,vv,0,10); } Account1.SetBalance(MarketData3.code, 0); if (Account1.Balance.count > 0) { var vv = Math.floor(Account1.Balance.count/(k-s+1)); if (vv >= 1) Account1.OrderSell(MarketData3.code,vv,0,10); } Account1.SetBalance(MarketData4.code, 0); if (Account1.Balance.count > 0) { var vv = Math.floor(Account1.Balance.count/(k-s+1)); if (vv >= 1) Account1.OrderSell(MarketData4.code,vv,0,10); } Main.SetTimer(2, t3*1000); } //t1으로 지정한 시간에 매수 미체결 모두 취소 if (nEventID == 2) { s = s+1; if (s < k) { Account1.SetBalance(MarketData1.code, 0); if (Account1.Balance.count > 0) { var vv = Math.floor(Account1.Balance.count/(k-s+1)); if (vv >= 1) Account1.OrderSell(MarketData1.code,vv,0,10); } Account1.SetBalance(MarketData2.code, 0); if (Account1.Balance.count > 0) { var vv = Math.floor(Account1.Balance.count/(k-s+1)); if (vv >= 1) Account1.OrderSell(MarketData2.code,vv,0,10); } Account1.SetBalance(MarketData3.code, 0); if (Account1.Balance.count > 0) { var vv = Math.floor(Account1.Balance.count/(k-s+1)); if (vv >= 1) Account1.OrderSell(MarketData3.code,vv,0,10); } Account1.SetBalance(MarketData4.code, 0); if (Account1.Balance.count > 0) { var vv = Math.floor(Account1.Balance.count/(k-s+1)); if (vv >= 1) Account1.OrderSell(MarketData4.code,vv,0,10); } } if (s < k) { //매도 미체결 모두 취소 var num = Account1.GetTheNumberOfUnfills(); if (num >= 1) { for (var i = 0; i < num;i++ ) { Account1.SetUnfill(i); if (Account1.Unfill.orderKind == 1 && (Account1.Unfill.code == MarketData1.code || Account1.Unfill.code == MarketData2.code || Account1.Unfill.code == MarketData3.code || Account1.Unfill.code == MarketData4.code)) { Account1.OrderCancel(Account1.Unfill.orderNum); } } } Account1.SetBalance(MarketData1.code, 0); if (Account1.Balance.count > 0) { Account1.OrderSell(MarketData1.code,Account1.Balance.count,0,1); } Account1.SetBalance(MarketData2.code, 0); if (Account1.Balance.count > 0) { Account1.OrderSell(MarketData2.code,Account1.Balance.count,0,1); } Account1.SetBalance(MarketData3.code, 0); if (Account1.Balance.count > 0) { Account1.OrderSell(MarketData3.code,Account1.Balance.count,0,1); } Account1.SetBalance(MarketData4.code, 0); if (Account1.Balance.count > 0) { Account1.OrderSell(MarketData4.code,Account1.Balance.count,0,1); } Main.KillTimer(1); Main.KillTimer(2); } } } } 즐거운 명절되시길 바랍니다. > cs아빠 님이 쓴 글입니다. > 제목 : 매도, 매도식 부탁드립니다. > =======매수======== 1. a,b,c,d종목의 전일종가대비 n%에 m1 수량만큼 매수주문한다.(장전 주문) 2. a,b,c,d종목 현재가가 전일종가의 n%(==매수가) 보다 p% 낮으면 m2 매수주문한다. 3. t1시에 미체결 매수 취소 (영어는 외부변수로 빠지게 해 주세요) =======매도======== 1. t2시부터 미체결 매도 취소 2. 보유종목 호출 3. s회차 매도 시행(최우선) : 매도량은 (호출시 보유량)/(k-s+1) (총 k회 분할매도) ***매도간격은 t3*** ex) 총10회 매도 예정일 때, 1회차 매도시 (호출된 보유량)/(10-1+1) = (보유량)/10 5회차 매도시 (호출된 보유량)/(10-5+1) = (보유량)/6 4. 마지막 회차에서는 (1번,2번) 진행후 잔량 모두 시장가 매도 ==> 1-3번을 (k-1)회차 진행후 마지막회차 시장가 매도 진행(4번 항목) (영어는 외부변수로 빠지게 해 주세요) 부탁드리겠습니다. 감사합니다.