커뮤니티

양매도 수식 추가

프로필 이미지
새로운세상
2018-12-13 13:37:38
2859
글번호 224669
답변완료
안녕하세요 양매도 진입 수식에 다음 2가지 방식의 추가수식 부탁드립니다. << 방식1. 전일data 조건 추가 >> 1) 전일 종가기준으로 각행사가별 콜,풋 가격중 동일 행사가의 콜풋 양합의 최저치를 계산 2) 당일 진입봉 시점에서 각행사가별 콜,풋 가격중 동일 행사가의 콜풋 양합의 최저치를 계산 3) 진입수식에 2)값이 1)값보다 작을 때라는 조건 추가 <--- 진입봉 startN '전일 콜풋 동일 행사가의 양합최저치 > 당일 진입시점 콜풋 동일 행사가의 양합최저치' 입니다. << 방식2. 이전봉data 조건 추가 >> 1) 당일 진입봉 이전3개봉 각각의 각행사가별 콜,풋 가격중 동일 행사가의 콜풋 양합의 최저치를 계산한 후, 3개값의 평균을 구함 2) 당일 진입봉 시점에서 각행사가별 콜,풋 가격중 동일 행사가의 콜풋 양합의 최저치를 계산 3) 진입수식에 2)값이 1)값보다 작을 때라는 조건 추가 <--- 진입봉 startN '당일 진입봉이전 3개봉 콜풋 동일 행사가 각각의 양합최저치의 평균 > 당일 진입시점 동일 행사가의 양합최저치' 입니다. ** 마지막으로, 현재 진입후 E1 = 0 에서 청산시 E1 = 1 로 전환되는데 이럴경우 실제로 진입수량이 없음에도 불구하고 청산이 발생하고 있습니다. 1) 진입수량이 완전히 체결된 경우만 청산이 발생하도록 하고 2) 청산수량이 완전히 체결된 후, 조건에 의해서 재진입이 가능하도록 수식 변경 부탁드립니다. 3) 동일계좌에 여러 시스템이 운용되고 있어서, 해당 시스템 수량에 한합니다. ** 글쓰기가 안되서, OnUp*ateMarket, lUp*ateID 로 표시했습니다. 이상입니다. 감사합니다 !! ---------------------------- // YT 'dayindex' 지표 사용 //내부변수지정 var C1,E1; var SellC_code; var SellP_code; //ATM-50~+50까지 옵션종목의 가격과 코드를 담을 배열변수 var CPrice = new Array(101); var CCode = new Array(101); var PPrice = new Array(101); var PCode = new Array(101); //가격 0.00이상~UpLt이하의 옵션중 최고가 콜옵션,풋옵션 저장변수 var MaxCall; var MaxCallCode; var MaxPut; var MaxPutCode; //콜옵션,풋옵션 베팅수량변수 var CVol; var PVol; // 현재가 추적 var Chart1,ChartReq; 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)); ChartReq = false; Main.MessageLog("Start"); } function Main_OnRcvChartEx(ChartEx) { Chart1 = ChartEx; ChartReq = true; } function Main_OnBarAppended(ChartEx, nData) { Main.MessageList("봉완성",ChartEx.GetIndicatorData("dayindex",1,0)); if (ChartEx.GetCode(1) == MarketData1.code) { //startN번째 봉 완성 if (ChartEx.GetIndicatorData("dayindex",1,0) == startN && MarketData1.time < 1500000000) { C1 = Chart1.GetClose(1,1); //UpLt보다 작은 종목의 코드와 가격을 배열에 저장 ---------------------> start for(var i = -50; i <= 50; i++) { if (Option.GetCurrent(0,i) < UpLt && Option.GetCurrent(0,i) > 0) //---> UpLt { CPrice[50+i] = Option.GetCurrent(0,i); CCode[50+i] = Option.GetATMCallRecent(i); } else { CPrice[50+i] = -1; CCode[50+i] = -1; } if (Option.GetCurrent(1,i) < UpLt && Option.GetCurrent(1,i) > 0) //---> UpLt { PPrice[50+i] = Option.GetCurrent(1,i); PCode[50+i] = Option.GetATMPutRecent(i); } else { PPrice[50+i] = -1; PCode[50+i] = -1; } } //저장된 CPrice,PPrice값중 최고값 계산 MaxCall = -1; MaxCallcode = -1; MaxPut = -1; MaxPutcode = -1; for(var A = 0; A <= 100; A++) { if (CPrice[A] > MaxCall) { MaxCall = CPrice[A]; MaxCallcode = CCode[A]; } if (PPrice[A] > MaxPut) { MaxPut = PPrice[A]; MaxPutcode = PCode[A]; } } //-------------------------------------------------------------------> end SellC_code = MaxCallcode; var SellC_price = MaxCall; CVol = Math.floor(SeedMoney/(SellC_price*100000*MultiN)); //---> SeedMoney이내 콜매도 var SellCC_price = Option.GetBidByCode(SellC_code,5); //---> Call 5호가 매도 SellP_code = MaxPutcode; var SellP_price = MaxPut; PVol = Math.floor(SeedMoney/(SellP_price*100000*MultiN)); //---> SeedMoney이내 풋매도 var SellPP_price = Option.GetBidByCode(SellP_code,5); //---> Put 5호가 매도 if (MaxCall > 1 && MaxPut > 1 && MaxCall+MaxPut > 2.5) { Account1.OrderSell(SellC_code, CVol, SellCC_price-0.3, 0); Account1.OrderSell(SellP_code, PVol, SellPP_price-0.3, 0); } Main.MessageList("양매도 진입"); E1 = 0; } //endN번째봉 청산 if (ChartEx.GetIndicatorData("dayindex",1,0) == endN && E1 == 0) { E1 = 1; Main.MessageList("End 청산"); var xC_price = Option.GetAskByCode(SellC_code,5); //---> Call 5호가 청산 Account1.OrderBuy(SellC_code, CVol, xC_price+0.3, 0); var xP_price = Option.GetAskByCode(SellP_code,5); //---> Put 5호가 청산 Account1.OrderBuy(SellP_code, PVol, xP_price+0.3, 0); } } } function Main_OnUp*ateMarket(sItemCode, lUp*ateID) { if (ChartReq == true && Chart1.GetCode(1) == MarketData1.code && lUp*ateID == 20001) { //startN~endN번째봉 가격차 청산 - 현재가 기준 if (Chart1.GetIndicatorData("dayindex",1,0) > startN && Chart1.GetIndicatorData("dayindex",1,0) < endN && Math.abs(MarketData1.current-C1) >= 가격차 && E1 == 0) { E1 = 1; Main.MessageList("가격차 청산"); var xC_price = Option.GetAskByCode(SellC_code,5); //---> Call 5호가 청산 Account1.OrderBuy(SellC_code, CVol, xC_price+0.3, 0); var xP_price = Option.GetAskByCode(SellP_code,5); //---> Put 5호가 청산 Account1.OrderBuy(SellP_code, PVol, xP_price+0.3, 0); } } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2018-12-24 16:46:15

안녕하세요 예스스탁입니다. 1 // YT 'dayindex' 지표 사용 //내부변수지정 var C1,E1; var SellC_code; var SellP_code; //ATM-50~+50까지 옵션종목의 가격과 코드를 담을 배열변수 var CPrice = new Array(101); var CCode = new Array(101); var PPrice = new Array(101); var PCode = new Array(101); //가격 0.00이상~UpLt이하의 옵션중 최고가 콜옵션,풋옵션 저장변수 var MaxCall; var MaxCallCode; var MaxPut; var MaxPutCode; //콜옵션,풋옵션 베팅수량변수 var CVol; var PVol; // 현재가 추적 var Chart1,ChartReq; var Sid1,Sid2,Snum1,Snum2; var Xid1,Xid2,Xnum1,Xnum2; 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)); ChartReq = false; Main.MessageLog("Start"); } function Main_OnRcvChartEx(ChartEx) { Chart1 = ChartEx; ChartReq = true; } function Main_OnBarAppended(ChartEx, nData) { Main.MessageList("봉완성",ChartEx.GetIndicatorData("dayindex",1,0)); if (ChartEx.GetCode(1) == MarketData1.code) { //startN번째 봉 완성 if (ChartEx.GetIndicatorData("dayindex",1,0) == startN && MarketData1.time < 1500000000) { C1 = Chart1.GetClose(1,1); //기준가 양합 최저계산 var LowSumBP = 99999999999; var LowSumCC = 99999999999; for(var i = -Option.lowersATM ; i <= Option.uppersATM ; i++) { if (Option1.GetBasePrice(0,i) + Option.GetBasePrice(1,i) < LowSumBP) { LowSumBP = Option.GetBasePrice(0,i) + Option.GetBasePrice(1,i); } if (Option.GetCurrent(0,i) + Option.GetCurrent(1,i) < LowSumCC) { LowSumCC = Option.GetCurrent(0,i) + Option.GetCurrent(1,i); } } //UpLt보다 작은 종목의 코드와 가격을 배열에 저장 ---------------------> start for(var i = -50; i <= 50; i++) { if (Option.GetCurrent(0,i) < UpLt && Option.GetCurrent(0,i) > 0) //---> UpLt { CPrice[50+i] = Option.GetCurrent(0,i); CCode[50+i] = Option.GetATMCallRecent(i); } else { CPrice[50+i] = -1; CCode[50+i] = -1; } if (Option.GetCurrent(1,i) < UpLt && Option.GetCurrent(1,i) > 0) //---> UpLt { PPrice[50+i] = Option.GetCurrent(1,i); PCode[50+i] = Option.GetATMPutRecent(i); } else { PPrice[50+i] = -1; PCode[50+i] = -1; } } //저장된 CPrice,PPrice값중 최고값 계산 MaxCall = -1; MaxCallcode = -1; MaxPut = -1; MaxPutcode = -1; for(var A = 0; A <= 100; A++) { if (CPrice[A] > MaxCall) { MaxCall = CPrice[A]; MaxCallcode = CCode[A]; } if (PPrice[A] > MaxPut) { MaxPut = PPrice[A]; MaxPutcode = PCode[A]; } } //-------------------------------------------------------------------> end SellC_code = MaxCallcode; var SellC_price = MaxCall; CVol = Math.floor(SeedMoney/(SellC_price*100000*MultiN)); //---> SeedMoney이내 콜매도 var SellCC_price = Option.GetBidByCode(SellC_code,5); //---> Call 5호가 매도 SellP_code = MaxPutcode; var SellP_price = MaxPut; PVol = Math.floor(SeedMoney/(SellP_price*100000*MultiN)); //---> SeedMoney이내 풋매도 var SellPP_price = Option.GetBidByCode(SellP_code,5); //---> Put 5호가 매도 var aa = 0; Account1.SetUnfill(Xnum1); if (Account1.Unfill.count == 0) { aa = aa+1; } Account1.SetUnfill(Xnum2); if (Account1.Unfill.count == 0) { aa = aa+1; } if (MaxCall > 1 && MaxPut > 1 && MaxCall+MaxPut > 2.5 && LowSumCC < LowSumBP && LowSumCC < 99999999999 && LowSumBP < 99999999999 && aa == 2) { Main.MessageList("양매도 진입"); E1 = 0; Sid1 = Account1.OrderSell(SellC_code, CVol, SellCC_price-0.3, 0); Sid2 = Account1.OrderSell(SellP_code, PVol, SellPP_price-0.3, 0); } } //endN번째봉 청산 if (ChartEx.GetIndicatorData("dayindex",1,0) == endN && E1 == 0) { E1 = 1; Main.MessageList("End 청산"); Account1.SetUnfill(Snum1); if (Account1.Unfill.count > 0) { var N1 = Account1.Unfill.count; Account1.OrderCancel(Snum1) } Account1.SetUnfill(Snum2); if (Account1.Unfill.count > 0) { var N2 = Account1.Unfill.count; Account1.OrderCancel(Snum2) } Account1.SetBalance(SellC_code, 0); if (Account1.Balance.count >= N1) { var xC_price = Option.GetAskByCode(SellC_code,5); //---> Call 5호가 청산 Xid1 = Account1.OrderBuy(SellC_code, CVol-N1, xC_price+0.3, 0); } Account1.SetBalance(SellP_code, 0); if (Account1.Balance.count >= N2) { var xP_price = Option.GetAskByCode(SellP_code,5); //---> Put 5호가 청산 Xid2 = Account1.OrderBuy(SellP_code, PVol, xP_price+0.3, 0); } } } } function Main_OnUp*ateMarket(sItemCode, lUp*ateID) { if (ChartReq == true && Chart1.GetCode(1) == MarketData1.code && lUp*ateID == 20001) { //startN~endN번째봉 가격차 청산 - 현재가 기준 if (Chart1.GetIndicatorData("dayindex",1,0) > startN && Chart1.GetIndicatorData("dayindex",1,0) < endN && Math.abs(MarketData1.current-C1) >= 가격차 && E1 == 0) { E1 = 1; Main.MessageList("가격차 청산"); Account1.SetUnfill(Snum1); if (Account1.Unfill.count > 0) { var N1 = Account1.Unfill.count; Account1.OrderCancel(Snum1) } Account1.SetUnfill(Snum2); if (Account1.Unfill.count > 0) { var N2 = Account1.Unfill.count; Account1.OrderCancel(Snum2) } Account1.SetBalance(SellC_code, 0); if (Account1.Balance.count >= N1) { var xC_price = Option.GetAskByCode(SellC_code,5); //---> Call 5호가 청산 Xid1 = Account1.OrderBuy(SellC_code, CVol-N1, xC_price+0.3, 0); } Account1.SetBalance(SellP_code, 0); if (Account1.Balance.count >= N2) { var xP_price = Option.GetAskByCode(SellP_code,5); //---> Put 5호가 청산 Xid2 = Account1.OrderBuy(SellP_code, PVol-N2, xP_price+0.3, 0); } } } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == Sid1) { Snum1 = OrderResponse.orderNum; } if (OrderResponse.orderID == Sid2) { Snum2 = OrderResponse.orderNum; } if (OrderResponse.orderID == Xid1) { Xnum1 = OrderResponse.orderNum; } if (OrderResponse.orderID == Xid2) { Xnum2 = OrderResponse.orderNum; } } 2 // YT 'dayindex' 지표 사용 //내부변수지정 var C1,E1; var SellC_code; var SellP_code; //ATM-50~+50까지 옵션종목의 가격과 코드를 담을 배열변수 var CPrice = new Array(101); var CCode = new Array(101); var PPrice = new Array(101); var PCode = new Array(101); //가격 0.00이상~UpLt이하의 옵션중 최고가 콜옵션,풋옵션 저장변수 var MaxCall; var MaxCallCode; var MaxPut; var MaxPutCode; //콜옵션,풋옵션 베팅수량변수 var CVol; var PVol; // 현재가 추적 var Chart1,ChartReq; var Sid1,Sid2,Snum1,Snum2; var Xid1,Xid2,Xnum1,Xnum2; var LowSumCC = 99999999999,LowSumCC1 = 99999999999,LowSumCC2 =99999999999,LowSumCC3=99999999999; 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)); ChartReq = false; Main.MessageLog("Start"); } function Main_OnRcvChartEx(ChartEx) { Chart1 = ChartEx; ChartReq = true; } function Main_OnBarAppended(ChartEx, nData) { Main.MessageList("봉완성",ChartEx.GetIndicatorData("dayindex",1,0)); if (ChartEx.GetCode(1) == MarketData1.code) { LowSumCC3 = LowSumCC2; LowSumCC2 = LowSumCC1; LowSumCC1 = LowSumCC; LowSumCC = 99999999999; for(var i = -Option.lowersATM ; i <= Option.uppersATM ; i++) { if (Option.GetCurrent(0,i) + Option.GetCurrent(1,i) < LowSumCC) { LowSumCC = Option.GetCurrent(0,i) + Option.GetCurrent(1,i); } } //startN번째 봉 완성 if (ChartEx.GetIndicatorData("dayindex",1,0) == startN && MarketData1.time < 1500000000) { C1 = Chart1.GetClose(1,1); //UpLt보다 작은 종목의 코드와 가격을 배열에 저장 ---------------------> start for(var i = -50; i <= 50; i++) { if (Option.GetCurrent(0,i) < UpLt && Option.GetCurrent(0,i) > 0) //---> UpLt { CPrice[50+i] = Option.GetCurrent(0,i); CCode[50+i] = Option.GetATMCallRecent(i); } else { CPrice[50+i] = -1; CCode[50+i] = -1; } if (Option.GetCurrent(1,i) < UpLt && Option.GetCurrent(1,i) > 0) //---> UpLt { PPrice[50+i] = Option.GetCurrent(1,i); PCode[50+i] = Option.GetATMPutRecent(i); } else { PPrice[50+i] = -1; PCode[50+i] = -1; } } //저장된 CPrice,PPrice값중 최고값 계산 MaxCall = -1; MaxCallcode = -1; MaxPut = -1; MaxPutcode = -1; for(var A = 0; A <= 100; A++) { if (CPrice[A] > MaxCall) { MaxCall = CPrice[A]; MaxCallcode = CCode[A]; } if (PPrice[A] > MaxPut) { MaxPut = PPrice[A]; MaxPutcode = PCode[A]; } } //-------------------------------------------------------------------> end SellC_code = MaxCallcode; var SellC_price = MaxCall; CVol = Math.floor(SeedMoney/(SellC_price*100000*MultiN)); //---> SeedMoney이내 콜매도 var SellCC_price = Option.GetBidByCode(SellC_code,5); //---> Call 5호가 매도 SellP_code = MaxPutcode; var SellP_price = MaxPut; PVol = Math.floor(SeedMoney/(SellP_price*100000*MultiN)); //---> SeedMoney이내 풋매도 var SellPP_price = Option.GetBidByCode(SellP_code,5); //---> Put 5호가 매도 var aa = 0; Account1.SetUnfill(Xnum1); if (Account1.Unfill.count == 0) { aa = aa+1; } Account1.SetUnfill(Xnum2); if (Account1.Unfill.count == 0) { aa = aa+1; } if (MaxCall > 1 && MaxPut > 1 && MaxCall+MaxPut > 2.5 && LowSumCC < (LowSumCC1+LowSumCC2+LowSumCC3)/3 && LowSumCC3 < 99999999999 && aa == 2) { Main.MessageList("양매도 진입"); E1 = 0; Sid1 = Account1.OrderSell(SellC_code, CVol, SellCC_price-0.3, 0); Sid2 = Account1.OrderSell(SellP_code, PVol, SellPP_price-0.3, 0); } } //endN번째봉 청산 if (ChartEx.GetIndicatorData("dayindex",1,0) == endN && E1 == 0) { E1 = 1; Main.MessageList("End 청산"); Account1.SetUnfill(Snum1); if (Account1.Unfill.count > 0) { var N1 = Account1.Unfill.count; Account1.OrderCancel(Snum1) } Account1.SetUnfill(Snum2); if (Account1.Unfill.count > 0) { var N2 = Account1.Unfill.count; Account1.OrderCancel(Snum2) } Account1.SetBalance(SellC_code, 0); if (Account1.Balance.count >= N1) { var xC_price = Option.GetAskByCode(SellC_code,5); //---> Call 5호가 청산 Xid1 = Account1.OrderBuy(SellC_code, CVol-N1, xC_price+0.3, 0); } Account1.SetBalance(SellP_code, 0); if (Account1.Balance.count >= N2) { var xP_price = Option.GetAskByCode(SellP_code,5); //---> Put 5호가 청산 Xid2 = Account1.OrderBuy(SellP_code, PVol, xP_price+0.3, 0); } } } } function Main_OnUp*ateMarket(sItemCode, lUp*ateID) { if (ChartReq == true && Chart1.GetCode(1) == MarketData1.code && lUp*ateID == 20001) { //startN~endN번째봉 가격차 청산 - 현재가 기준 if (Chart1.GetIndicatorData("dayindex",1,0) > startN && Chart1.GetIndicatorData("dayindex",1,0) < endN && Math.abs(MarketData1.current-C1) >= 가격차 && E1 == 0) { E1 = 1; Main.MessageList("가격차 청산"); Account1.SetUnfill(Snum1); if (Account1.Unfill.count > 0) { var N1 = Account1.Unfill.count; Account1.OrderCancel(Snum1) } Account1.SetUnfill(Snum2); if (Account1.Unfill.count > 0) { var N2 = Account1.Unfill.count; Account1.OrderCancel(Snum2) } Account1.SetBalance(SellC_code, 0); if (Account1.Balance.count >= N1) { var xC_price = Option.GetAskByCode(SellC_code,5); //---> Call 5호가 청산 Xid1 = Account1.OrderBuy(SellC_code, CVol-N1, xC_price+0.3, 0); } Account1.SetBalance(SellP_code, 0); if (Account1.Balance.count >= N2) { var xP_price = Option.GetAskByCode(SellP_code,5); //---> Put 5호가 청산 Xid2 = Account1.OrderBuy(SellP_code, PVol-N2, xP_price+0.3, 0); } } } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == Sid1) { Snum1 = OrderResponse.orderNum; } if (OrderResponse.orderID == Sid2) { Snum2 = OrderResponse.orderNum; } if (OrderResponse.orderID == Xid1) { Xnum1 = OrderResponse.orderNum; } if (OrderResponse.orderID == Xid2) { Xnum2 = OrderResponse.orderNum; } } 즐거운 하루되세요 > 새로운세상 님이 쓴 글입니다. > 제목 : 양매도 수식 추가 > 안녕하세요 양매도 진입 수식에 다음 2가지 방식의 추가수식 부탁드립니다. << 방식1. 전일data 조건 추가 >> 1) 전일 종가기준으로 각행사가별 콜,풋 가격중 동일 행사가의 콜풋 양합의 최저치를 계산 2) 당일 진입봉 시점에서 각행사가별 콜,풋 가격중 동일 행사가의 콜풋 양합의 최저치를 계산 3) 진입수식에 2)값이 1)값보다 작을 때라는 조건 추가 <--- 진입봉 startN '전일 콜풋 동일 행사가의 양합최저치 > 당일 진입시점 콜풋 동일 행사가의 양합최저치' 입니다. << 방식2. 이전봉data 조건 추가 >> 1) 당일 진입봉 이전3개봉 각각의 각행사가별 콜,풋 가격중 동일 행사가의 콜풋 양합의 최저치를 계산한 후, 3개값의 평균을 구함 2) 당일 진입봉 시점에서 각행사가별 콜,풋 가격중 동일 행사가의 콜풋 양합의 최저치를 계산 3) 진입수식에 2)값이 1)값보다 작을 때라는 조건 추가 <--- 진입봉 startN '당일 진입봉이전 3개봉 콜풋 동일 행사가 각각의 양합최저치의 평균 > 당일 진입시점 동일 행사가의 양합최저치' 입니다. ** 마지막으로, 현재 진입후 E1 = 0 에서 청산시 E1 = 1 로 전환되는데 이럴경우 실제로 진입수량이 없음에도 불구하고 청산이 발생하고 있습니다. 1) 진입수량이 완전히 체결된 경우만 청산이 발생하도록 하고 2) 청산수량이 완전히 체결된 후, 조건에 의해서 재진입이 가능하도록 수식 변경 부탁드립니다. 3) 동일계좌에 여러 시스템이 운용되고 있어서, 해당 시스템 수량에 한합니다. ** 글쓰기가 안되서, OnUp*ateMarket, lUp*ateID 로 표시했습니다. 이상입니다. 감사합니다 !! ---------------------------- // YT 'dayindex' 지표 사용 //내부변수지정 var C1,E1; var SellC_code; var SellP_code; //ATM-50~+50까지 옵션종목의 가격과 코드를 담을 배열변수 var CPrice = new Array(101); var CCode = new Array(101); var PPrice = new Array(101); var PCode = new Array(101); //가격 0.00이상~UpLt이하의 옵션중 최고가 콜옵션,풋옵션 저장변수 var MaxCall; var MaxCallCode; var MaxPut; var MaxPutCode; //콜옵션,풋옵션 베팅수량변수 var CVol; var PVol; // 현재가 추적 var Chart1,ChartReq; 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)); ChartReq = false; Main.MessageLog("Start"); } function Main_OnRcvChartEx(ChartEx) { Chart1 = ChartEx; ChartReq = true; } function Main_OnBarAppended(ChartEx, nData) { Main.MessageList("봉완성",ChartEx.GetIndicatorData("dayindex",1,0)); if (ChartEx.GetCode(1) == MarketData1.code) { //startN번째 봉 완성 if (ChartEx.GetIndicatorData("dayindex",1,0) == startN && MarketData1.time < 1500000000) { C1 = Chart1.GetClose(1,1); //UpLt보다 작은 종목의 코드와 가격을 배열에 저장 ---------------------> start for(var i = -50; i <= 50; i++) { if (Option.GetCurrent(0,i) < UpLt && Option.GetCurrent(0,i) > 0) //---> UpLt { CPrice[50+i] = Option.GetCurrent(0,i); CCode[50+i] = Option.GetATMCallRecent(i); } else { CPrice[50+i] = -1; CCode[50+i] = -1; } if (Option.GetCurrent(1,i) < UpLt && Option.GetCurrent(1,i) > 0) //---> UpLt { PPrice[50+i] = Option.GetCurrent(1,i); PCode[50+i] = Option.GetATMPutRecent(i); } else { PPrice[50+i] = -1; PCode[50+i] = -1; } } //저장된 CPrice,PPrice값중 최고값 계산 MaxCall = -1; MaxCallcode = -1; MaxPut = -1; MaxPutcode = -1; for(var A = 0; A <= 100; A++) { if (CPrice[A] > MaxCall) { MaxCall = CPrice[A]; MaxCallcode = CCode[A]; } if (PPrice[A] > MaxPut) { MaxPut = PPrice[A]; MaxPutcode = PCode[A]; } } //-------------------------------------------------------------------> end SellC_code = MaxCallcode; var SellC_price = MaxCall; CVol = Math.floor(SeedMoney/(SellC_price*100000*MultiN)); //---> SeedMoney이내 콜매도 var SellCC_price = Option.GetBidByCode(SellC_code,5); //---> Call 5호가 매도 SellP_code = MaxPutcode; var SellP_price = MaxPut; PVol = Math.floor(SeedMoney/(SellP_price*100000*MultiN)); //---> SeedMoney이내 풋매도 var SellPP_price = Option.GetBidByCode(SellP_code,5); //---> Put 5호가 매도 if (MaxCall > 1 && MaxPut > 1 && MaxCall+MaxPut > 2.5) { Account1.OrderSell(SellC_code, CVol, SellCC_price-0.3, 0); Account1.OrderSell(SellP_code, PVol, SellPP_price-0.3, 0); } Main.MessageList("양매도 진입"); E1 = 0; } //endN번째봉 청산 if (ChartEx.GetIndicatorData("dayindex",1,0) == endN && E1 == 0) { E1 = 1; Main.MessageList("End 청산"); var xC_price = Option.GetAskByCode(SellC_code,5); //---> Call 5호가 청산 Account1.OrderBuy(SellC_code, CVol, xC_price+0.3, 0); var xP_price = Option.GetAskByCode(SellP_code,5); //---> Put 5호가 청산 Account1.OrderBuy(SellP_code, PVol, xP_price+0.3, 0); } } } function Main_OnUp*ateMarket(sItemCode, lUp*ateID) { if (ChartReq == true && Chart1.GetCode(1) == MarketData1.code && lUp*ateID == 20001) { //startN~endN번째봉 가격차 청산 - 현재가 기준 if (Chart1.GetIndicatorData("dayindex",1,0) > startN && Chart1.GetIndicatorData("dayindex",1,0) < endN && Math.abs(MarketData1.current-C1) >= 가격차 && E1 == 0) { E1 = 1; Main.MessageList("가격차 청산"); var xC_price = Option.GetAskByCode(SellC_code,5); //---> Call 5호가 청산 Account1.OrderBuy(SellC_code, CVol, xC_price+0.3, 0); var xP_price = Option.GetAskByCode(SellP_code,5); //---> Put 5호가 청산 Account1.OrderBuy(SellP_code, PVol, xP_price+0.3, 0); } } }