커뮤니티

수식 문의 드립니다.

프로필 이미지
착한이
2025-05-19 17:40:16.0
182
글번호 226299
답변완료
안녕하세요. 수고 많으십니다. 특정날짜에 진입해서 다른 특정날짜에 청산하는 단순전략을 사용하고 있습니다. 그런데 일봉차트에서는 시가(장시작직후)에만 진입하도록 되어 있어서 큰 슬리피지가 발생하는등 불편한 점이 많습니다. 장시작직후 및 1시간후 2시간 후 등으로 분할 매수매도 할 수 있도록 스팟수식 부탁드립니다. (일봉 차트 없이 예스스팟으로만 구성되도록) 특별한 전략은 없고, 날짜만 맞으면 매수매도하는 전략입니다. 예를 들어, 특정 날짜에 A주식을 매도하고 동시에 B주식을 매수하는 전략에서 1. 첫번째 특정날짜 도달시 A 매수(ex. 총예수금의 20%) 2. 두번째 특정날짜 도달시 A 매도하고 동시에 B 매수(예수금 때문에 반드시 매도 먼저 해야 함) 3. 세번째 특정날짜 도달시 B 매도하고 동시에 A 매수 => 특정날짜 도달시마다 반복 4. 특정 시간에 분할 매수매도(EX. 오전 09:00, 10:00, 11:00)기능 (장시작시간이 변경되는 경우가 있으므로 장시작직후, 장시작후 한시간뒤, 두시간뒤로) 5. 매수매도하는 두 종목 모두 1호가잔량이 주문수량보다 2배 이상 많은 경우에만 주문(시장가) (Ex. 매도1호가잔량 > 매수주문수량X2 and 매수1호가잔량 > 매도주문수량X2) 6. 매도주문이 미체결이면 매수주문을 취소하고 있다가 매도체결과 동시에 매수주문 발생 감사합니다.
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2025-05-29 16:02:37.0

안녕하세요 예스스탁입니다. 아래식 참고하시기 바랍니다. var List = ["005930","000660"]; //주문 낼 종목코드 var ndate = [20250527,20250529,20250528]; //주문일 var ntime = [145100,145200,154400]; //주문시간 var 주문금액 = 1000000; //1회 매수시 주문금액 var D,Bcode,Scode,HHMMSS,HHMMSS1; var Svol, Bvol,Order; function Main_OnStart() { var d = new Date(); var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //스팟 시작시 오늘이 주문일인지 체크 if (ndate.length > 0) { D = -1; for (var i = 0; i < ndate.length; i++) { //오늘날짜와 ndate배열을 비교해 같은 날이면 if (YYYYMMDD == ndate[i]) { //날짜가 홀수 배열방인지 짝수 배열방인지 구분 D = i%2; //짝수(0,2,4,...)이면 매수종목은 List[0],매도종목은 List[1] //홀수(1,3,5,...)이면 매수종목은 List[1],매수종목은 List[1] if (D == 0) { Bcode = List[0]; Scode = List[1]; } else { Bcode = List[1]; Scode = List[0]; } } } //D가 0이상이면(오늘이 주문일 맞음) if (D >= 0) { Main.MessageList("매수종목객체요청:",Main.GetOrderCode(Bcode)); Main.ReqMarketData(Main.GetOrderCode(Bcode)); } else { Main.MessageList(YYYYMMDD,"주문일 아님"); } } else { Main.MessageList("지정된 주문일이 없음:",ndate.length); } } function Main_OnRcvMarketData(MarketData) { if (Main.GetOrderCode(Bcode) == MarketData.code) { B = MarketData; Main.MessageList("매수종목객체생성완료:",B.name); Main.MessageList("매도종목객체요청:",Main.GetOrderCode(Scode)); Main.ReqMarketData(Main.GetOrderCode(Scode)); } if (Main.GetOrderCode(Scode) == MarketData.code) { S = MarketData; Main.MessageList("매도종목객체생성완료:",S.name); Svol = 0; //매도종목 보유수량이 있으면 Account1.SetBalance(S.code,0); if (Account1.Balance.count > 0) { //1회 매수수량 계산 Svol = Math.ceil(Account1.Balance.count/ntime.length); Main.MessageList("매도종목 보유:",Svol); } Main.SetTimer(1, 2000) } } function Main_OnTimer(nEventID) { var d = new Date(); HHMMSS1 = HHMMSS; HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //매수시간 체크 for (i = 0; i < ntime.length; i++) { if (HHMMSS >= ntime[i] && HHMMSS1 < ntime[i]) { Order = 0; if (Svol > 0) { Account1.SetBalance(S.code,0); if (Account1.Balance.count > 0) { Svol = Math.min(Svol,Account1.Balance.count); } Order = -1; } else Order = 1; Main.MessageList("주문시간:",Order); } //매도종목 보유수량이 있으면 매도주문을 먼저 실행하고 이후 전량 체결시 매수주 if (Order == -1) { //매수1호가잔량 > 매도주문수량X2 if (S.BidAmount(1) >= Svol*2) { SID = Account1.OrderSell(S.code,Svol,0,1); Order = 0; } } //매도종목 보유수량이 없으면 매수주문 바로 실행 if (Order == 1) { var Bvol = Math.floor(주문금액/B.Ask(1)); //매도1호가잔량 > 매수주문수량X2 if (B.AskAmount(1) >= Bvol*2) { Account1.OrderBuy(B.code,Bvol,0,1); Order = 0; } } } } //주문응답 수신 function Main_OnOrderResponse(OrderResponse) { //매도주문 주문응답 수신되면 주문번호 저장 if (OrderResponse.orderID == SID) { SNUM = OrderResponse.orderNum; } } //체결응답 수신 function Main_OnNotifyFill(NotifyFill) { //매도주문에 대한 체결응답이 들어오면 if (NotifyFill.orderNum == SNUM) { //헤당 주문번호 미체결 셋팅하고 Account1.SetUnfill(SNUM); //미체결이 없으면(전량체결)) if (Account1.Unfill.count == 0) { var Bvol = Math.floor(주문금액/B.Ask(1)); //매도1호가잔량 > 매수주문수량X2 if (B.AskAmount(1) >= Bvol*2) { Account1.OrderBuy(B.code,Bvol,0,1); } } } } 즐거운 하루되세요 > 착한이 님이 쓴 글입니다. > 제목 : 수식 문의 드립니다. > 안녕하세요. 수고 많으십니다. 특정날짜에 진입해서 다른 특정날짜에 청산하는 단순전략을 사용하고 있습니다. 그런데 일봉차트에서는 시가(장시작직후)에만 진입하도록 되어 있어서 큰 슬리피지가 발생하는등 불편한 점이 많습니다. 장시작직후 및 1시간후 2시간 후 등으로 분할 매수매도 할 수 있도록 스팟수식 부탁드립니다. (일봉 차트 없이 예스스팟으로만 구성되도록) 특별한 전략은 없고, 날짜만 맞으면 매수매도하는 전략입니다. 예를 들어, 특정 날짜에 A주식을 매도하고 동시에 B주식을 매수하는 전략에서 1. 첫번째 특정날짜 도달시 A 매수(ex. 총예수금의 20%) 2. 두번째 특정날짜 도달시 A 매도하고 동시에 B 매수(예수금 때문에 반드시 매도 먼저 해야 함) 3. 세번째 특정날짜 도달시 B 매도하고 동시에 A 매수 => 특정날짜 도달시마다 반복 4. 특정 시간에 분할 매수매도(EX. 오전 09:00, 10:00, 11:00)기능 (장시작시간이 변경되는 경우가 있으므로 장시작직후, 장시작후 한시간뒤, 두시간뒤로) 5. 매수매도하는 두 종목 모두 1호가잔량이 주문수량보다 2배 이상 많은 경우에만 주문(시장가) (Ex. 매도1호가잔량 > 매수주문수량X2 and 매수1호가잔량 > 매도주문수량X2) 6. 매도주문이 미체결이면 매수주문을 취소하고 있다가 매도체결과 동시에 매수주문 발생 감사합니다.