커뮤니티

P(0900 ATM-4 ~ ATM-13)

프로필 이미지
좌오비우오비
2026-09-04 09:58:04
114
글번호 233493
답변완료

PUT 옵션 매수(행사가별로 매수가격 별도 적용)


1. 전략 세부 내용

- 행사가 그룹 찾기

   등가격(ATM)에서 외가격(OTM)쪽으로 10포인트 떨어진 행사가 부터 총 10개

      ex) 등가격 1000 이면

              990   987.5   985   982.5   980   977.5   975   972.5   970   967.5

           

- 진입 방식: 오전9시에  10개 행사가를 추출하여 프리미엄이 높은 순서대로 가격을 차등화하여 매수(매수1호가) 1계약씩 지정가 주문

  * 진입 지정가 차등: 0.05 (1개) -> 0.04 (2개) -> 0.03 (3개) -> 0.02 (4개)


- 익절 방식: 매수 체결 발생 즉시 행사가별 지정된 목표 익절가로 매도 지정가 주문하기_매수 체결전 매도주문이 나가지 않도록 주의

  * 목표 익절가: 프리미엄 높은 순서대로   10, 9, 8, 7, 6, 5, 4, 3, 2, 1


- endofday : 오후 3시 미결제 잔량을 1차(매도1호가) -> 60초 후 2차(매수1호가)로 나누어 강제 청산

                           청산 이후 재주문은 없음.(진입과 청산 1set)


항상 고맙습니다.


답변 1
프로필 이미지

예스스탁 예스스탁 답변

2026-09-15 09:30:31

안녕하세요 예스스탁입니다. 계좌객체 Account1, 옵션객체 Option1입니다. var BuyTime = 90000; var ExitTime = 150000; var ATMLevel = [4,5,6,7,8,9,10,11,12,13]; var BuyPrice = [0.05,0.04,0.04,0.03,0.03,0.03,0.02,0.02,0.02,0.02]; var Target = [10,9,8,7,6,5,4,3,2,1]; var Vol = 1; var Code = []; var BID = [],SID = []; var BNUM = [],SNUM = []; var FV = []; var B; function Main_OnStart() { var d = new Date(); var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds(); B = 0; //9시 전 if (HHMMSS < BuyTime) { //1초 타이머 셋팅 Main.SetTimer(1,1000); Main.MessageList("BuyTime이전 -> 수행") } else { Main.MessageList("BuyTime이후 -> 수행 안함") } //Main.SetTimer(1,1000); } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds(); if (nEventID == 1) { if (HHMMSS >= BuyTime && HHMMSS < ExitTime) { //매수실행 if (B == 0) { B = 1; for (var i = 0; i < ATMLevel.length; i++) { Code[i] = Option1.GetATMPutRecent(ATMLevel[i]); BID[i] = Account1.OrderBuy(Code[i],Vol,BuyPrice[i],0); FV[i] = 0; Main.MessageList(ATMLevel[i],BID[i],Code[i],Vol,BuyPrice[i]) } } } if (B == 1 && HHMMSS >= ExitTime) { Main.KillTimer(1); B = 2; //Code에 저장된 종목코드 미체결 모두 취소 var UF = Account1.GetTheNumberOfUnfills(); if (UF > 0) { for (var i = UF - 1; i >= 0; i--) { Account1.SetUnfill(i); for (var x = 0; x < Code.length; x++) { if (Account1.Unfill.count > 0 && Account1.Unfill.code == Code[x]) { Account1.OrderCancel(Account1.Unfill.orderNum); break; } } } } //Code에 저장된 종목코드 보유 종목 매도 청산 var F = Account1.GetTheNumberOfBalances(); if (F > 0) { Main.MessageList("보유종목수:",F); for (var i = 0; i < F; i++) { Account1.SetBalance(i) for (var x = 0; x < Code.length; x++) { if (Account1.Balance.count > 0 && Account1.Balance.position == 2 && Account1.Balance.code == Code[x]) { SID[x] = Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, Option1.GetAsk(Account1.Balance.code, 1),0); break; } } } //60초 타이머 Main.SetTimer(2,60000); } } } if (nEventID == 2) { for (var i = 0; i < ATMLevel.length; i++) { //SNUM주문 미체결체크 Account1.SetUnfill(SNUM[i]); //미체결 있으면 if (Account1.Unfill.count > 0) { //매수1호가로 정정 var OP = Option1.GetBid(Account1.Unfill.code, 1) if (OP != Account1.Unfill.price) { Account1.OrderReplacePrice(SNUM[i],OP) } } } } } function Main_OnOrderResponse(OrderResponse) { if (B == 1 && OrderResponse.isNormal == true ) { for (var i = 0; i < ATMLevel.length; i++) { if (OrderResponse.orderID == BID[i]) { BNUM[i] = OrderResponse.orderNum; Main.MessageList("Main_OnOrderResponse",i,OrderResponse.orderID,BNUM[i]); return; } } } if (B == 2 && OrderResponse.isNormal == true ) { for (var i = 0; i < ATMLevel.length; i++) { if (OrderResponse.orderID == SID[i]) { SNUM[i] = OrderResponse.orderNum; Main.MessageList("Main_OnOrderResponse",i,OrderResponse.orderID,SNUM[i]); return; } } } } function Main_OnNotifyFill(NotifyFill) { for (var i = 0; i < ATMLevel.length; i++) { if (NotifyFill.orderNum == BNUM[i] && NotifyFill.orderKind == 2) { FV[i] = FV[i]+1; Main.MessageList("Main_OnNotifyFill",i,FV[i]); if (FV[i] == Vol) { Account1.OrderSell(Code[i],Vol,Target[i],0); Main.MessageList("익절매도",i,Code[i],Target[i]); } } } } 즐거운 하루되세요