커뮤니티

옵션 양매도

프로필 이미지
새로운세상
2018-10-24 10:17:37
3180
글번호 224626
답변완료
안녕하세요 다음 수식 부탁드립니다. YT 시스템수식 없이, SPOT으로 옵션 양매도를 하려고 합니다. 단, SPOT의 진입 청산 시점은 YT 주데이타에 의하여 결정됩니다. 1) YT 연결선물 1분봉 기준으로, startN번째 봉이 완성되는 시점에서 (예를들어 5번째봉) 2) startN봉째 기준으로 해당시점의 연결선물 가격에 가장 근접한 콜풋 행사가 선택 --> 콜 풋 동일 행사가 3) 여기서 정해진 행사가 양합의 가격이 PP 이하일 때 (예를들어 양합가격이 8.00 이하일 때) 4) 해당 행사가의 콜풋 각각 최대 200 만원이하로 '5호가-0.1' 매도 (매도금액 변수처리 요망) 5) 1)에 의해 매일 1회 양매도 진입 6) 1분봉기준 endN봉째 봉이 완성되면 '5호가+0.1' 전량청산 (예를들어 장개시후 60번째봉) 7) 옵션 월물 변경시 자동 변경 startN, endN, PP, 매도금액 등은 모두 변수처리 부탁드립니다. ## 만약 가능하다면 다음 내용을 위의 수식에 추가 부탁드립니다 ## endN봉-1봉 이전에, 연결선물 startN봉의 가격과 현재 완성봉의 가격차가 XX point 이상일 경우 전량 '5호가+0.1' 청산 ---> 즉, 완성봉기준으로 endN봉 한봉전까지 진입봉 종가와 현재 완성봉 종가의 가격차가 XX point 이상이면 그 시점에서 청산하고, 그렇지 않으면 endN봉에서 청산 이상입니다. 감사합니다 !!
답변 3
프로필 이미지

예스스탁 예스스탁 답변

2018-10-24 10:26:33

안녕하세요 예스스탁입니다. 아래 내용 참고하셔서 수정보완해 사용하시기 바랍니다. 1분봉 기준 당일 봉번호를 알아야 하므로 dayindex라는 이름의 지표를 준비해 주셔야 합니다. plot1(dayindex); 스크립트 객체설정 계좌객체 --> 객체명 Account1 옵션객체 --> 객체명 Option1 종목객체 --> 객체명 MarketData1, 연결선물로 지정 외부변수 --> 변수명 startN, 초기값 5 지정후 데이터형은 숫자 외부변수 --> 변수명 endN, 초기값 60 지정후 데이터형은 숫자 외부변수 --> 변수명 양합기준, 초기값 6 지정후 데이터형은 숫자 외부변수 --> 변수명 매도금액, 초기값 2000000 지정후 데이터형은 숫자 외부변수 --> 변수명 가격차, 초기값 0.5 지정후 데이터형은 숫자 수식 내용입니다. var Call,Put,FC,C1; function Main_OnStart() { //차트설정 MarketData1종목 1분봉 1개 var SetChart = new ReqChartItem(MarketData1.code, 1, CHART_PERIOD_MINUTE,500,CHART_REQCOUNT_BAR,false, false); //지표설정 (dayindex라는 이름의 지표적용) var SetInd = new IndicatorInfo("dayindex"); //차트생성 Main.ReqChartEx(SetChart,null,new Array(SetInd)); Main.MessageList("Start"); } //봉완성 function Main_OnBarAppended(ChartEx, nData) { Main.MessageList("봉완성1",ChartEx.GetIndicatorData("dayindex",1,0),ChartEx.GetCode(1),MarketData1.code); if (ChartEx.GetCode(1) == MarketData1.code) { //startN번째 봉 완성 if (ChartEx.GetIndicatorData("dayindex",1,0) == startN ) { C1 = ChartEx.GetClose(1,1); Main.MessageList("진입"); minv = 999999999; Call = ""; Put = ""; FC = MarketData1.current; for(var i = -Option1.lowersATM ; i <= Option1.uppersATM ; i++) { var sum = Option1.GetCurrent(0, i)+Option1.GetCurrent(1, -i); if (sum == minv) { if (Math.abs(Option1.GetExercisePrice(0,i)-FC) < diff) { minv = sum; Call = Option1.GetATMCallRecent(i,0); Put = Option1.GetATMPutRecent(-i,0); diff = Math.abs(Option1.GetExercisePrice(0,i)-FC); } } if (sum < minv) { minv = sum; Call = Option1.GetATMCallRecent(i,0); Put = Option1.GetATMPutRecent(-i,0); diff = Math.abs(Option1.GetExercisePrice(0,i)-FC); } } if (minv <= 양합기준) { var CV = Math.floor(매도금액/(Option1.GetBid(Call, 5)*250000)); var PV = Math.floor(매도금액/(Option1.GetBid(Put, 5)*250000)); Account1.OrderSell(Call, CV, Option1.GetBid(Call, 5),0); Account1.OrderSell(Put, PV, Option1.GetBid(Put, 5),0); } } //startN ~ endN번째 봉 완성 if (ChartEx.GetIndicatorData("dayindex",1,0) > startN && ChartEx.GetIndicatorData("dayindex",1,0) < endN && Math.abs(ChartEx.GetClose(1,1)-C1) >= 가격차) { Main.MessageList("가격차청산"); var num = Account1.GetTheNumberOfUnfills(); for(var i = 0; i < num ; i++) { //Call,Put 매도주문 미체결 모두 취소 Account1.SetUnfill(i); if (Account1.Unfill.code == Call && Account1.Unfill.orderKind == 1) { Account1.OrderCancel(Account1.Unfill.orderNum) } if (Account1.Unfill.code == Put && Account1.Unfill.orderKind == 1) { Account1.OrderCancel(Account1.Unfill.orderNum) } } //잔고셋팅해 매도포지션 있으면 전량 청산 Account1.SetBalance(Call,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Option1.GetAsk(Account1.Balance.code, 5),0); } Account1.SetBalance(Put,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Option1.GetAsk(Account1.Balance.code, 5),0); } } //endN번째 봉 완성 if (ChartEx.GetIndicatorData("dayindex",1,0) == endN ) { Main.MessageList("endN청산"); var num = Account1.GetTheNumberOfUnfills(); for(var i = 0; i < num ; i++) { //Call,Put 매도주문 미체결 모두 취소 Account1.SetUnfill(i); if (Account1.Unfill.code == Call && Account1.Unfill.orderKind == 1) { Account1.OrderCancel(Account1.Unfill.orderNum) } if (Account1.Unfill.code == Put && Account1.Unfill.orderKind == 1) { Account1.OrderCancel(Account1.Unfill.orderNum) } } //잔고셋팅해 매도포지션 있으면 전량 청산 Account1.SetBalance(Call,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Option1.GetAsk(Account1.Balance.code, 5),0); } Account1.SetBalance(Put,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Option1.GetAsk(Account1.Balance.code, 5),0); } } } } 즐거운 하루되세요 > 새로운세상 님이 쓴 글입니다. > 제목 : 옵션 양매도 > 안녕하세요 다음 수식 부탁드립니다. YT 시스템수식 없이, SPOT으로 옵션 양매도를 하려고 합니다. 단, SPOT의 진입 청산 시점은 YT 주데이타에 의하여 결정됩니다. 1) YT 연결선물 1분봉 기준으로, startN번째 봉이 완성되는 시점에서 (예를들어 5번째봉) 2) startN봉째 기준으로 해당시점의 연결선물 가격에 가장 근접한 콜풋 행사가 선택 --> 콜 풋 동일 행사가 3) 여기서 정해진 행사가 양합의 가격이 PP 이하일 때 (예를들어 양합가격이 8.00 이하일 때) 4) 해당 행사가의 콜풋 각각 최대 200 만원이하로 '5호가-0.1' 매도 (매도금액 변수처리 요망) 5) 1)에 의해 매일 1회 양매도 진입 6) 1분봉기준 endN봉째 봉이 완성되면 '5호가+0.1' 전량청산 (예를들어 장개시후 60번째봉) 7) 옵션 월물 변경시 자동 변경 startN, endN, PP, 매도금액 등은 모두 변수처리 부탁드립니다. ## 만약 가능하다면 다음 내용을 위의 수식에 추가 부탁드립니다 ## endN봉-1봉 이전에, 연결선물 startN봉의 가격과 현재 완성봉의 가격차가 XX point 이상일 경우 전량 '5호가+0.1' 청산 ---> 즉, 완성봉기준으로 endN봉 한봉전까지 진입봉 종가와 현재 완성봉 종가의 가격차가 XX point 이상이면 그 시점에서 청산하고, 그렇지 않으면 endN봉에서 청산 이상입니다. 감사합니다 !!
프로필 이미지

새로운세상

2018-10-24 14:30:33

안녕하세요~ 바쁘신데 수식 작성해주셔서 감사합니다. 번거로우시겠지만 수식에서 일부 수정이 필요합니다. 청산시 해당 시스템과 상관없이 잔고에 있는 수량 모두를 청산하게 되는데, 이부분을 해당 시스템의 진입한 수량만큼만 청산하도록 부탁드립니다. (다른 시스템의 잔고까지 청산 ---> endN이전 청산시 해당 시스템 진입한 수량만 청산, endN 청산 없음 ---> endN 청산시 해당 시스템 진입한 수량만 청산) 제가 계속 수정해봤는데, 잘 안되네요. 감사합니다. > 예스스탁 님이 쓴 글입니다. > 제목 : Re : 옵션 양매도 > 안녕하세요 예스스탁입니다. 아래 내용 참고하셔서 수정보완해 사용하시기 바랍니다. 1분봉 기준 당일 봉번호를 알아야 하므로 dayindex라는 이름의 지표를 준비해 주셔야 합니다. plot1(dayindex); 스크립트 객체설정 계좌객체 --> 객체명 Account1 옵션객체 --> 객체명 Option1 종목객체 --> 객체명 MarketData1, 연결선물로 지정 외부변수 --> 변수명 startN, 초기값 5 지정후 데이터형은 숫자 외부변수 --> 변수명 endN, 초기값 60 지정후 데이터형은 숫자 외부변수 --> 변수명 양합기준, 초기값 6 지정후 데이터형은 숫자 외부변수 --> 변수명 매도금액, 초기값 2000000 지정후 데이터형은 숫자 외부변수 --> 변수명 가격차, 초기값 0.5 지정후 데이터형은 숫자 수식 내용입니다. var Call,Put,FC,C1; function Main_OnStart() { //차트설정 MarketData1종목 1분봉 1개 var SetChart = new ReqChartItem(MarketData1.code, 1, CHART_PERIOD_MINUTE,500,CHART_REQCOUNT_BAR,false, false); //지표설정 (dayindex라는 이름의 지표적용) var SetInd = new IndicatorInfo("dayindex"); //차트생성 Main.ReqChartEx(SetChart,null,new Array(SetInd)); Main.MessageList("Start"); } //봉완성 function Main_OnBarAppended(ChartEx, nData) { Main.MessageList("봉완성1",ChartEx.GetIndicatorData("dayindex",1,0),ChartEx.GetCode(1),MarketData1.code); if (ChartEx.GetCode(1) == MarketData1.code) { //startN번째 봉 완성 if (ChartEx.GetIndicatorData("dayindex",1,0) == startN ) { C1 = ChartEx.GetClose(1,1); Main.MessageList("진입"); minv = 999999999; Call = ""; Put = ""; FC = MarketData1.current; for(var i = -Option1.lowersATM ; i <= Option1.uppersATM ; i++) { var sum = Option1.GetCurrent(0, i)+Option1.GetCurrent(1, -i); if (sum == minv) { if (Math.abs(Option1.GetExercisePrice(0,i)-FC) < diff) { minv = sum; Call = Option1.GetATMCallRecent(i,0); Put = Option1.GetATMPutRecent(-i,0); diff = Math.abs(Option1.GetExercisePrice(0,i)-FC); } } if (sum < minv) { minv = sum; Call = Option1.GetATMCallRecent(i,0); Put = Option1.GetATMPutRecent(-i,0); diff = Math.abs(Option1.GetExercisePrice(0,i)-FC); } } if (minv <= 양합기준) { var CV = Math.floor(매도금액/(Option1.GetBid(Call, 5)*250000)); var PV = Math.floor(매도금액/(Option1.GetBid(Put, 5)*250000)); Account1.OrderSell(Call, CV, Option1.GetBid(Call, 5),0); Account1.OrderSell(Put, PV, Option1.GetBid(Put, 5),0); } } //startN ~ endN번째 봉 완성 if (ChartEx.GetIndicatorData("dayindex",1,0) > startN && ChartEx.GetIndicatorData("dayindex",1,0) < endN && Math.abs(ChartEx.GetClose(1,1)-C1) >= 가격차) { Main.MessageList("가격차청산"); var num = Account1.GetTheNumberOfUnfills(); for(var i = 0; i < num ; i++) { //Call,Put 매도주문 미체결 모두 취소 Account1.SetUnfill(i); if (Account1.Unfill.code == Call && Account1.Unfill.orderKind == 1) { Account1.OrderCancel(Account1.Unfill.orderNum) } if (Account1.Unfill.code == Put && Account1.Unfill.orderKind == 1) { Account1.OrderCancel(Account1.Unfill.orderNum) } } //잔고셋팅해 매도포지션 있으면 전량 청산 Account1.SetBalance(Call,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Option1.GetAsk(Account1.Balance.code, 5),0); } Account1.SetBalance(Put,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Option1.GetAsk(Account1.Balance.code, 5),0); } } //endN번째 봉 완성 if (ChartEx.GetIndicatorData("dayindex",1,0) == endN ) { Main.MessageList("endN청산"); var num = Account1.GetTheNumberOfUnfills(); for(var i = 0; i < num ; i++) { //Call,Put 매도주문 미체결 모두 취소 Account1.SetUnfill(i); if (Account1.Unfill.code == Call && Account1.Unfill.orderKind == 1) { Account1.OrderCancel(Account1.Unfill.orderNum) } if (Account1.Unfill.code == Put && Account1.Unfill.orderKind == 1) { Account1.OrderCancel(Account1.Unfill.orderNum) } } //잔고셋팅해 매도포지션 있으면 전량 청산 Account1.SetBalance(Call,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Option1.GetAsk(Account1.Balance.code, 5),0); } Account1.SetBalance(Put,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Option1.GetAsk(Account1.Balance.code, 5),0); } } } } 즐거운 하루되세요 > 새로운세상 님이 쓴 글입니다. > 제목 : 옵션 양매도 > 안녕하세요 다음 수식 부탁드립니다. YT 시스템수식 없이, SPOT으로 옵션 양매도를 하려고 합니다. 단, SPOT의 진입 청산 시점은 YT 주데이타에 의하여 결정됩니다. 1) YT 연결선물 1분봉 기준으로, startN번째 봉이 완성되는 시점에서 (예를들어 5번째봉) 2) startN봉째 기준으로 해당시점의 연결선물 가격에 가장 근접한 콜풋 행사가 선택 --> 콜 풋 동일 행사가 3) 여기서 정해진 행사가 양합의 가격이 PP 이하일 때 (예를들어 양합가격이 8.00 이하일 때) 4) 해당 행사가의 콜풋 각각 최대 200 만원이하로 '5호가-0.1' 매도 (매도금액 변수처리 요망) 5) 1)에 의해 매일 1회 양매도 진입 6) 1분봉기준 endN봉째 봉이 완성되면 '5호가+0.1' 전량청산 (예를들어 장개시후 60번째봉) 7) 옵션 월물 변경시 자동 변경 startN, endN, PP, 매도금액 등은 모두 변수처리 부탁드립니다. ## 만약 가능하다면 다음 내용을 위의 수식에 추가 부탁드립니다 ## endN봉-1봉 이전에, 연결선물 startN봉의 가격과 현재 완성봉의 가격차가 XX point 이상일 경우 전량 '5호가+0.1' 청산 ---> 즉, 완성봉기준으로 endN봉 한봉전까지 진입봉 종가와 현재 완성봉 종가의 가격차가 XX point 이상이면 그 시점에서 청산하고, 그렇지 않으면 endN봉에서 청산 이상입니다. 감사합니다 !!
프로필 이미지

예스스탁 예스스탁 답변

2018-10-24 14:55:57

안녕하세요 예스스탁입니다. 체결수량으로 청산되게 수정했습니다. var Call,Put,FC,C1,CFV,PFV,CID,PID,Cnum,Pnum; function Main_OnStart() { //차트설정 MarketData1종목 1분봉 1개 var SetChart = new ReqChartItem(MarketData1.code, 1, CHART_PERIOD_MINUTE,500,CHART_REQCOUNT_BAR,false, false); //지표설정 (dayindex라는 이름의 지표적용) var SetInd = new IndicatorInfo("dayindex"); //차트생성 Main.ReqChartEx(SetChart,null,new Array(SetInd)); Main.MessageList("Start"); } //봉완성 function Main_OnBarAppended(ChartEx, nData) { Main.MessageList("봉완성1",ChartEx.GetIndicatorData("dayindex",1,0),ChartEx.GetCode(1),MarketData1.code); if (ChartEx.GetCode(1) == MarketData1.code) { //startN번째 봉 완성 if (ChartEx.GetIndicatorData("dayindex",1,0) == startN ) { C1 = ChartEx.GetClose(1,1); Main.MessageList("진입"); minv = 999999999; Call = ""; Put = ""; FC = MarketData1.current; for(var i = -Option1.lowersATM ; i <= Option1.uppersATM ; i++) { var sum = Option1.GetCurrent(0, i)+Option1.GetCurrent(1, -i); if (sum == minv) { if (Math.abs(Option1.GetExercisePrice(0,i)-FC) < diff) { minv = sum; Call = Option1.GetATMCallRecent(i,0); Put = Option1.GetATMPutRecent(-i,0); diff = Math.abs(Option1.GetExercisePrice(0,i)-FC); } } if (sum < minv) { minv = sum; Call = Option1.GetATMCallRecent(i,0); Put = Option1.GetATMPutRecent(-i,0); diff = Math.abs(Option1.GetExercisePrice(0,i)-FC); } } if (minv <= 양합기준) { var CV = Math.floor(매도금액/(Option1.GetBid(Call, 5)*250000)); var PV = Math.floor(매도금액/(Option1.GetBid(Put, 5)*250000)); CFV = 0; PFV = 0; CID = Account1.OrderSell(Call, CV, Option1.GetBid(Call, 5),0); PID = Account1.OrderSell(Put, PV, Option1.GetBid(Put, 5),0); } } //startN ~ endN번째 봉 완성 if (ChartEx.GetIndicatorData("dayindex",1,0) > startN && ChartEx.GetIndicatorData("dayindex",1,0) < endN && Math.abs(ChartEx.GetClose(1,1)-C1) >= 가격차) { Main.MessageList("가격차청산"); var num = Account1.GetTheNumberOfUnfills(); for(var i = 0; i < num ; i++) { //Call,Put 매도주문 미체결 모두 취소 Account1.SetUnfill(i); if (Account1.Unfill.code == Call && Account1.Unfill.orderKind == 1) { Account1.OrderCancel(Account1.Unfill.orderNum) } if (Account1.Unfill.code == Put && Account1.Unfill.orderKind == 1) { Account1.OrderCancel(Account1.Unfill.orderNum) } } //잔고셋팅해 매도포지션 있으면 전량 청산 Account1.SetBalance(Call,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Option1.GetAsk(Account1.Balance.code, 5),0); } Account1.SetBalance(Put,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Option1.GetAsk(Account1.Balance.code, 5),0); } } //endN번째 봉 완성 if (ChartEx.GetIndicatorData("dayindex",1,0) == endN ) { Main.MessageList("endN청산"); var num = Account1.GetTheNumberOfUnfills(); for(var i = 0; i < num ; i++) { //Call,Put 매도주문 미체결 모두 취소 Account1.SetUnfill(i); if (Account1.Unfill.code == Call && Account1.Unfill.orderKind == 1) { Account1.OrderCancel(Account1.Unfill.orderNum) } if (Account1.Unfill.code == Put && Account1.Unfill.orderKind == 1) { Account1.OrderCancel(Account1.Unfill.orderNum) } } //잔고셋팅해 매도포지션 있으면 전량 청산 Account1.SetBalance(Call,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1 && CFV > 0) { Account1.OrderBuy(Account1.Balance.code,CFV,Option1.GetAsk(Account1.Balance.code, 5),0); } Account1.SetBalance(Put,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1 && PFV > 0) { Account1.OrderBuy(Account1.Balance.code,PFV,Option1.GetAsk(Account1.Balance.code, 5),0); } } } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == CID) { Cnum = OrderResponse.orderNum; } if (OrderResponse.orderID == PID) { Pnum = OrderResponse.orderNum; } } function Main_OnNotifyFill(NotifyFill) { if (NotifyFill.orderNum == Cnum) { CFV = CFV+NotifyFill.fillCount; } if (NotifyFill.orderNum == Pnum) { PFV = PFV+NotifyFill.fillCount; } } 즐거운 하루되세요 > 새로운세상 님이 쓴 글입니다. > 제목 : Re : Re : 옵션 양매도 > 안녕하세요~ 바쁘신데 수식 작성해주셔서 감사합니다. 번거로우시겠지만 수식에서 일부 수정이 필요합니다. 청산시 해당 시스템과 상관없이 잔고에 있는 수량 모두를 청산하게 되는데, 이부분을 해당 시스템의 진입한 수량만큼만 청산하도록 부탁드립니다. (다른 시스템의 잔고까지 청산 ---> endN이전 청산시 해당 시스템 진입한 수량만 청산, endN 청산 없음 ---> endN 청산시 해당 시스템 진입한 수량만 청산) 제가 계속 수정해봤는데, 잘 안되네요. 감사합니다. > 예스스탁 님이 쓴 글입니다. > 제목 : Re : 옵션 양매도 > 안녕하세요 예스스탁입니다. 아래 내용 참고하셔서 수정보완해 사용하시기 바랍니다. 1분봉 기준 당일 봉번호를 알아야 하므로 dayindex라는 이름의 지표를 준비해 주셔야 합니다. plot1(dayindex); 스크립트 객체설정 계좌객체 --> 객체명 Account1 옵션객체 --> 객체명 Option1 종목객체 --> 객체명 MarketData1, 연결선물로 지정 외부변수 --> 변수명 startN, 초기값 5 지정후 데이터형은 숫자 외부변수 --> 변수명 endN, 초기값 60 지정후 데이터형은 숫자 외부변수 --> 변수명 양합기준, 초기값 6 지정후 데이터형은 숫자 외부변수 --> 변수명 매도금액, 초기값 2000000 지정후 데이터형은 숫자 외부변수 --> 변수명 가격차, 초기값 0.5 지정후 데이터형은 숫자 수식 내용입니다. var Call,Put,FC,C1; function Main_OnStart() { //차트설정 MarketData1종목 1분봉 1개 var SetChart = new ReqChartItem(MarketData1.code, 1, CHART_PERIOD_MINUTE,500,CHART_REQCOUNT_BAR,false, false); //지표설정 (dayindex라는 이름의 지표적용) var SetInd = new IndicatorInfo("dayindex"); //차트생성 Main.ReqChartEx(SetChart,null,new Array(SetInd)); Main.MessageList("Start"); } //봉완성 function Main_OnBarAppended(ChartEx, nData) { Main.MessageList("봉완성1",ChartEx.GetIndicatorData("dayindex",1,0),ChartEx.GetCode(1),MarketData1.code); if (ChartEx.GetCode(1) == MarketData1.code) { //startN번째 봉 완성 if (ChartEx.GetIndicatorData("dayindex",1,0) == startN ) { C1 = ChartEx.GetClose(1,1); Main.MessageList("진입"); minv = 999999999; Call = ""; Put = ""; FC = MarketData1.current; for(var i = -Option1.lowersATM ; i <= Option1.uppersATM ; i++) { var sum = Option1.GetCurrent(0, i)+Option1.GetCurrent(1, -i); if (sum == minv) { if (Math.abs(Option1.GetExercisePrice(0,i)-FC) < diff) { minv = sum; Call = Option1.GetATMCallRecent(i,0); Put = Option1.GetATMPutRecent(-i,0); diff = Math.abs(Option1.GetExercisePrice(0,i)-FC); } } if (sum < minv) { minv = sum; Call = Option1.GetATMCallRecent(i,0); Put = Option1.GetATMPutRecent(-i,0); diff = Math.abs(Option1.GetExercisePrice(0,i)-FC); } } if (minv <= 양합기준) { var CV = Math.floor(매도금액/(Option1.GetBid(Call, 5)*250000)); var PV = Math.floor(매도금액/(Option1.GetBid(Put, 5)*250000)); Account1.OrderSell(Call, CV, Option1.GetBid(Call, 5),0); Account1.OrderSell(Put, PV, Option1.GetBid(Put, 5),0); } } //startN ~ endN번째 봉 완성 if (ChartEx.GetIndicatorData("dayindex",1,0) > startN && ChartEx.GetIndicatorData("dayindex",1,0) < endN && Math.abs(ChartEx.GetClose(1,1)-C1) >= 가격차) { Main.MessageList("가격차청산"); var num = Account1.GetTheNumberOfUnfills(); for(var i = 0; i < num ; i++) { //Call,Put 매도주문 미체결 모두 취소 Account1.SetUnfill(i); if (Account1.Unfill.code == Call && Account1.Unfill.orderKind == 1) { Account1.OrderCancel(Account1.Unfill.orderNum) } if (Account1.Unfill.code == Put && Account1.Unfill.orderKind == 1) { Account1.OrderCancel(Account1.Unfill.orderNum) } } //잔고셋팅해 매도포지션 있으면 전량 청산 Account1.SetBalance(Call,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Option1.GetAsk(Account1.Balance.code, 5),0); } Account1.SetBalance(Put,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Option1.GetAsk(Account1.Balance.code, 5),0); } } //endN번째 봉 완성 if (ChartEx.GetIndicatorData("dayindex",1,0) == endN ) { Main.MessageList("endN청산"); var num = Account1.GetTheNumberOfUnfills(); for(var i = 0; i < num ; i++) { //Call,Put 매도주문 미체결 모두 취소 Account1.SetUnfill(i); if (Account1.Unfill.code == Call && Account1.Unfill.orderKind == 1) { Account1.OrderCancel(Account1.Unfill.orderNum) } if (Account1.Unfill.code == Put && Account1.Unfill.orderKind == 1) { Account1.OrderCancel(Account1.Unfill.orderNum) } } //잔고셋팅해 매도포지션 있으면 전량 청산 Account1.SetBalance(Call,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Option1.GetAsk(Account1.Balance.code, 5),0); } Account1.SetBalance(Put,0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Option1.GetAsk(Account1.Balance.code, 5),0); } } } } 즐거운 하루되세요 > 새로운세상 님이 쓴 글입니다. > 제목 : 옵션 양매도 > 안녕하세요 다음 수식 부탁드립니다. YT 시스템수식 없이, SPOT으로 옵션 양매도를 하려고 합니다. 단, SPOT의 진입 청산 시점은 YT 주데이타에 의하여 결정됩니다. 1) YT 연결선물 1분봉 기준으로, startN번째 봉이 완성되는 시점에서 (예를들어 5번째봉) 2) startN봉째 기준으로 해당시점의 연결선물 가격에 가장 근접한 콜풋 행사가 선택 --> 콜 풋 동일 행사가 3) 여기서 정해진 행사가 양합의 가격이 PP 이하일 때 (예를들어 양합가격이 8.00 이하일 때) 4) 해당 행사가의 콜풋 각각 최대 200 만원이하로 '5호가-0.1' 매도 (매도금액 변수처리 요망) 5) 1)에 의해 매일 1회 양매도 진입 6) 1분봉기준 endN봉째 봉이 완성되면 '5호가+0.1' 전량청산 (예를들어 장개시후 60번째봉) 7) 옵션 월물 변경시 자동 변경 startN, endN, PP, 매도금액 등은 모두 변수처리 부탁드립니다. ## 만약 가능하다면 다음 내용을 위의 수식에 추가 부탁드립니다 ## endN봉-1봉 이전에, 연결선물 startN봉의 가격과 현재 완성봉의 가격차가 XX point 이상일 경우 전량 '5호가+0.1' 청산 ---> 즉, 완성봉기준으로 endN봉 한봉전까지 진입봉 종가와 현재 완성봉 종가의 가격차가 XX point 이상이면 그 시점에서 청산하고, 그렇지 않으면 endN봉에서 청산 이상입니다. 감사합니다 !!