Search
📝

예제23. 특정종목 가격감시 분할매수 [리뉴얼]

1.
전략내용
특정시간 이후 일정 시간간격으로 일정수량을 매수하는데 전일 종가는 감시가격 아래였지만 현재가가 지정한 감시가격 이상일 때만 매수주문을 집행하며 목표수량만큼 주문할 때까지 반복합니다. 아래 예제에서 감시가격은 전일기준 20일 최저가+(20일 고저폭)*38.2%입니다.
2.
스크립트 객체화면 설정
계좌객체를 추가한 후 속성에서 객체명은 Account1으로 지정하고 계좌번호로 지정합니다.
3.
스팟수식
var 매수종목코드 = "005930" var 주문시작시간 = 90000; var 주문간격 = 60;//초 var 목표수량 = 1000; var 단위수량 = 100; var 주문가격 = 0; //0: 현재가, 1이상:매도호가, -1이하 매수호가 var TF = 주문간격*1000; var 감시가격 = 0; var step,MK; var TotalOrderVol = 0; var TimerCount = 0; var Exchange = 1; //시세주문 거래소 - 1:시세(통합)/주문(SOR,스마트), 2: 시세(KRX)/주문(KRX) , 4 시세(NXT)/주문(NXT) function Main_OnStart() { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); step = 0; if (HHMMSS < 주문시작시간) { step = 1; TotalOrderVol = 0; TimerCount = 0; //종목객체 요청시 일봉데이터 20개 동시 요청 Main.ReqMarketData({code : 매수종목코드, exchangeKind:Exchange, dayCount:20} ); Main.MessageList(HHMMSS,"|매수주문종목 종목객체 요청",매수종목코드); Main.SetTimer(1, 1000); } else { step = -1; Main.MessageList(HHMMSS,"|주문시작시간 셋팅확인 : 주문시작시간이 현재시간 이전입니다. 주문시작시간:",주문시작시간); } } function Main_OnRcvMarketData(MarketData) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (step == 1 && MarketData.code == 매수종목코드) { step = 2; Main.MessageList(HHMMSS,"|매수주문종목 종목객체 수신",MarketData.code,MarketData.exchangeKind); MK = MarketData; if (MK.GetPrevCount() >= 20) { var HH = 0; var LL = 0; for (var i = 1; i <= 20 ; i++) { if (HH == 0 || (HH > 0 && MK.GetPrevHigh(i) > HH)) { HH = MK.GetPrevHigh(i); } if (LL == 0 || (LL > 0 && MK.GetPrevLow(i) < LL)) { LL = MK.GetPrevLow(i); } } 감시가격 = LL+(HH-LL)*0.382; Main.MessageList(HHMMSS,"|감시가격 : 최저가+고저폭의 38.2%",감시가격); } else { Main.MessageList(HHMMSS,"|일봉 데이터부족 ->감시해제,타이머 종료"); Main.KillTimer(1); } } } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); if (step >= 2 && HHMMSS >= 주문시작시간) { if (step == 2) { Main.SetTimer(1, TF); step = 3; } TimerCount = TimerCount + 1; var CP = MK.current; var OP = MK.current; if (주문가격 > 0) { for (var i = Math.abs(주문가격); i >= 1; i-- ) { if ( MK.Ask(i) > 0) { OP = MK.Ask(i); break; } } } if (주문가격 < 0) { for (var i = Math.abs(주문가격); i >= 1; i-- ) { if ( MK.Bid(i) > 0) { OP = MK.Bid(i); break; } } } Main.MessageList(HHMMSS,"|",TimerCount,"차 타이머동작:현재가",CP,"|감시가격:",감시가격); if (CP >= 감시가격 && MK.GetPrevClose(1) < 감시가격) { Main.MessageList(HHMMSS,"|가격조건 OK"); var diff = (목표수량-TotalOrderVol); var vol = Math.min(diff,단위수량); Account1.OrderBuy({exchangeKind:Exchange, code:MK.code, count:vol, orderPrice:OP, priceKind:0}); TotalOrderVol = TotalOrderVol + vol; Main.MessageList(HHMMSS,"|분할매수주문실행:주문가격",OP,"|주문수량:",vol,"|누적주문수량",TotalOrderVol); if (TotalOrderVol >= 목표수량) { Main.KillTimer(1); Main.MessageList(HHMMSS,"|목표수량 도달:","|누적주문수량",TotalOrderVol,"|목표수량",목표수량); Main.MessageList(HHMMSS,"|타이머 종료"); } } else { Main.MessageList(HHMMSS,"|가격조건X"); } } }
JavaScript
복사