Search
📝

예제21. 특정종목 가격감시 분할매수

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