Search
📝

예제22. 특정보유종목 가격감시 분할매도

1.
전략내용
보유한 특정종목을 일정간격으로 가격조건이 충족하면 분할로 매도하는 식입니다. 특정시간 이후 일정 시간간격으로 일정수량을 매도하는데 전일 종가는 감시가격 위였지만 현재가가 지정한 감시가격 이하일 때만 매도주문을 집행하며 목표수량만큼 주문할 때까지 반복합니다. 아래 예제에서 감시가격은 전일기준 20일 최고가-(20일 고저폭)*38.2%입니다.
2.
스크립트 객체화면 설정
계좌객체를 추가한 후 속성에서 객체명은 Account1으로 지정하고 계좌번호로 지정합니다.
3.
스팟수식
var 매도종목코드 = "005930" var 주문시작시간 = 93000; var 목표수량 = 1000; var 단위수량 = 100; var 주문가격 = 0; //0: 현재가, 1이상:매도호가, -1이하 매수호가 var 주문간격 = 60; //초 var 감시가격; var step,MK; var TF = 주문간격*1000; var TotalOrderVol = 0;; var TimerCount = 0; function Main_OnStart() { var d = new Date(); HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); step = 0; Account1.SetBalance(매도종목코드,0); if (HHMMSS < 주문시작시간 && Account1.Balance.count >= 목표수량) { step = 1; TotalOrderVol = 0; TimerCount = 0; //종목객체 요청시 일봉데이터 20개 동시 요청 Main.ReqMarketData(매도종목코드,20); Main.MessageList(HHMMSS,"|매도주문종목 종목객체 요청",매도종목코드); Main.SetTimer(1, 1000); } else { step = -1; if (HHMMSS >= 주문시작시간) { Main.MessageList(HHMMSS,"|주문시작시간 셋팅확인 : 주문시작시간이 현재시간 이전입니다. 주문시작시간:",주문시작시간); } if (Account1.Balance.count < 목표수량) { Main.MessageList(HHMMSS,"|보유수량확인 : 목표수량이 보유수량보다 많습니다.:",Account1.Balance.count); } } } 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); } } 감시가격 = HH-(HH-LL)*0.382; Main.MessageList(HHMMSS,"|감시가격 : 20일 고저폭의 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.OrderSell(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
복사