커뮤니티

자동매매 수식 부탁합니다.

프로필 이미지
초록이
2026-09-16 17:58:53
131
글번호 233669
답변완료

코스피 선물지수

아침 8시52분 선물가격 =A, 8시53분25초 선물가격=B 라 하면,

1) A > B 면, 8시54분에 풋옵션 매수

2) A < B면, 8시54분에 콜옵션 매수

3) A = B면, 매수 안함.

4) 당일 8시59분20초에 전량 매도(청산)

5) 프리미엄 1.00에 가장 가까운 걸로 매수하되, 옵션 만기일이 7일이하로 남은건 배제.

6) 매수금액 한도 = 500만원

7) 모든 매매는 시장가로


이상입니다.

답변 1
프로필 이미지

예스스탁 예스스탁 답변

2026-09-23 17:08:38

안녕하세요 예스스탁입니다. 스팟은 식작성 가이드입니다. 수식 내용 숙지하시고 모의투자등으로 테스트하고 사용하시기 바랍니다. 스크립트 객체 설정 종목객체 추가 -> 속성에서 객체명 MarketData1, 종목은 KP200 연결선물로 지정 옵션객체 추가 -> 속성에서 객체명 Option1, KP200옵션지정 계좌객체 추가 -> 속성에서 객체명 Account1, 주문낼 계좌번호 지정 var A기준시간 = 85200; var B기준시간 = 85325; var 매수시간 = 85400; var 청산시간 = 85920; var 매수금 = 5000000; var T,A,B,BID,NUM,VV,FV; function Main_OnStart() { var d = new Date(); var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds(); Main.MessageList(HHMMSS,"|Start - 옵션잔존일:",Option1.GetRemainDays(0, 0)); T = 0; if (Option1.GetRemainDays(0, 0) > 7 ) { if (HHMMSS < A기준시간) { Main.SetTimer(1, 1000); T = 1; } else { T = -1; Main.MessageList("A기준시간 이후 -> 시간지정확인필요"); } } else { T = -1; Main.MessageList(HHMMSS,"|잔존일 7일이하 거래안함"); } } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds(); if (T == 1 && HHMMSS >= A기준시간) { T = 2; A = MarketData1.current; Main.MessageList(HHMMSS,"|A값:",A); } if (T == 2 && HHMMSS >= B기준시간) { T = 3; B = MarketData1.current; Main.MessageList(HHMMSS,"|B값:",B); } if (T == 3 && HHMMSS >= 매수시간) { T = 4; if (A > B) { Main.MessageList(HHMMSS,"|A값이 B값보다 큼"); var diff; var Code = ""; for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++) { if (Code == "" || (Code != "" && Math.abs(Option1.GetCurrent(0,i)- 1.0) < diff)) { Code = Option1.GetATMCallRecent(i); diff = Math.abs(Option1.GetCurrent(0,i)- 1.0); } } if (Code != "") { VV = Math.floor(매수금/(Option1.GetCurrent(Code)*250000)); if (VV > 0) { BID = Account1.OrderBuy(Code, VV, 0,1); FV = 0; Main.MessageList(HHMMSS,"|매수:",Code); } else { Main.MessageList(HHMMSS,"|금액부족" -> 실행중지"); T = 5; } } else { Main.MessageList(HHMMSS,"|종목없음"); Main.KillTimer(1); T = 5; } } else if (A < B) { Main.MessageList(HHMMSS,"|A값이 B값보다 작음"); var diff; var Code = ""; for (var i = -Option1.uppersATM; i <= Option1.lowersATM; i++) { if (Code == "" || (Code != "" && Math.abs(Option1.GetCurrent(1,i)- 1.0) < diff)) { Code = Option1.GetATMPutRecent(i); diff = Math.abs(Option1.GetCurrent(1,i)- 1.0); } } if (Code != "") { VV = Math.floor(매수금/(Option1.GetCurrent(Code)*250000)); if (VV > 0) { BID = Account1.OrderBuy(Code, VV, 0,1); FV = 0; Main.MessageList(HHMMSS,"|매수:",Code); } else { Main.MessageList(HHMMSS,"|금액부족" -> 실행중지"); T = 5; } } else { Main.MessageList(HHMMSS,"|종목없음"); Main.KillTimer(1); T = 5; } } else { T = 5; Main.MessageList(HHMMSS,"|A값과 B값이 같음 : 매수안함"); Main.KillTimer(1); } } if (T == 4 && HHMMSS >= 청산시간) { T = 5; Main.KillTimer(1); if (FV < VV) { Account1.SetUnfill(NUM); if (Account1.Unfill.count > 0) { Account1.OrderCancel(NUM); } } if (FV > 0) { Account1.OrderSell(Code, FV, 0, 1); } else { Main.MessageList(HHMMSS,"|매수진입 체결수량없음 -> 청산주문안함"); } } } function Main_OnOrderResponse(OrderResponse) { var d = new Date(); var HHMMSS = d.getHours()*10000 + d.getMinutes()*100 + d.getSeconds(); if (OrderResponse.orderID == BID) { if (OrderResponse.isNormal == true) { NUM = OrderResponse.orderNum; } else { Main.MessageList(HHMMSS,"|진입주문오류 --> 실행중지"); Main.KillTimer(1); T = 5; } } } function Main_OnNotifyFill(NotifyFill) { if (NotifyFill.orderNum == NUM) { FV = FV + NotifyFill.fillCount; } } 즐거운 하루되세요