답변완료
야간옵션
아래수식은국내 옵션 주간 거래수식입니다. - 수식 내용 084500에 15분간 변동성 체크하고 090000 거래시작 익절,손절,151500에 endofday 작동 야간거래에 사용할 수 있도록 수정바랍니다. 1. 첫번째 요청수식 오후6시에 15분간 변동성 체크하고 오후6시15분 거래시작 익절,손절, 새벽2시 endofday 작동 2. 두번째 요청수식 오후10시에 15분간 변동성 체크하고 오후10시15분 거래시작 익절,손절, 새벽5시 endofday 작동항상 고맙습니다.*********************************************************************************************************************************var ID1, ID2, num1, num2;var Entry, CallCode, PutCode;var Xv1, Xv2;var HasExited; // 청산 후 재진입을 방지하는 변수var VolatilityCheckPassed; // 변동성 필터 확인 변수var InitialSum, FinalSum; // 양합 체크용 변수var a, b; // 양합var FilterTimePassed; // 필터 시간이 지났는지 여부var HasSoldCall = false; // 콜 옵션 매도 여부var HasSoldPut = false; // 풋 옵션 매도 여부function Main_OnStart() { Main.MessageList("Start"); Main.SetTimer(1, 5000); // 기존 타이머 설정 (5초 간격) Main.SetTimer(2, 1000); // 청산을 위한 타이머 설정 (1초 간격) Main.SetTimer(3, 1000); // 변동성 필터용 타이머 설정 (1초 간격) Entry = 0; // 초기 Entry 값 설정 HasExited = false; // 초기 재진입 가능 상태 VolatilityCheckPassed = false; // 변동성 필터 초기화 InitialSum = null; // 초기 양합값 초기화 FinalSum = null; // 최종 양합값 초기화 a = null; // a양합 초기화 b = null; // b양합 초기화 FilterTimePassed = false; // 필터 시간이 지났는지 여부}function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds(); if (nEventID == 3) { // 변동성 필터 확인 타이머 설정 if (HHMMSS == 084500) { // 084500 양합값 기록 a = Option1.GetCurrent(0, 0) + Option1.GetCurrent(1, 0); } else if (HHMMSS == 085959) { // 085959 양합값 기록 b = Option1.GetCurrent(0, 0) + Option1.GetCurrent(1, 0); if (a !== null && b !== null) { // 양합 차이 계산 var sumDifference = a - b; // 변동성 high 시장으로 판단 if (sumDifference >= 999) { Main.MessageList("Market volatility is low. Skipping trading."); VolatilityCheckPassed = true; // 변동성 필터 통과 } } } // 필터 시간이 지났는지 체크 if (HHMMSS >= 090000) { // 09시 00분부터 거래 가능 FilterTimePassed = true; } } if (nEventID == 1 && !HasExited) { // 재진입 방지 조건 추가 if (HHMMSS >= 084500 && HHMMSS < 150000) { // 0845부터 1500까지 if (FilterTimePassed) { var callPrice = Option1.GetCurrent(0, 0); var putPrice = Option1.GetCurrent(1, 0); var sum = callPrice + putPrice; var diff = Math.abs(callPrice - putPrice); // 진입 조건 if (Entry == 0 && sum <= 999 && diff <= 2.00 && !VolatilityCheckPassed) { Entry = sum; CallCode = Option1.GetATMCallRecent(0); PutCode = Option1.GetATMPutRecent(0); ID1 = Account1.OrderBuy(CallCode, 1, Option1.GetAsk(CallCode, 5), 0); ID2 = Account1.OrderBuy(PutCode, 1, Option1.GetAsk(PutCode, 5), 0); Xv1 = 1; Xv2 = 1; // 진입 성공 시 메시지 Main.MessageList("Trade entry successful. Market volatility is high. Trading ON."); } } if (Entry > 0 && HHMMSS < 151500 && (Option1.GetCurrent(CallCode)+Option1.GetCurrent(PutCode) >= Entry+999) || (Option1.GetCurrent(CallCode)+Option1.GetCurrent(PutCode) <= Entry-1.00)) { // 청산 로직 if (Xv1 > 0 && !HasSoldCall) { Account1.SetUnfill(num1); if (Account1.Unfill.count > 0) { Xv1 = Xv1 - Account1.Unfill.count; Account1.OrderCancel(num1); } Account1.OrderSell(CallCode, Xv1, Option1.GetBid(CallCode, 5), 0); HasSoldCall = true; // 콜 옵션 매도 완료 Main.MessageList("Call option sold."); } if (Xv2 > 0 && !HasSoldPut) { Account1.SetUnfill(num2); if (Account1.Unfill.count > 0) { Xv2 = Xv2 - Account1.Unfill.count; Account1.OrderCancel(num2); } Account1.OrderSell(PutCode, Xv2, Option1.GetBid(PutCode, 5), 0); HasSoldPut = true; // 풋 옵션 매도 완료 Main.MessageList("Put option sold."); } // Entry = 0; // 필요한 경우에만 주석 해제 Main.KillTimer(1); } } } // 1515에 청산 로직 추가 if (Entry > 0 && HHMMSS >= 151500) { Main.MessageList("Clearing orders"); if (Xv1 > 0 && !HasSoldCall) { Account1.SetUnfill(num1); if (Account1.Unfill.count > 0) { Xv1 = Xv1 - Account1.Unfill.count; Account1.OrderCancel(num1); } Account1.OrderSell(CallCode, Xv1, Option1.GetBid(CallCode, 5), 0); HasSoldCall = true; // 콜 옵션 매도 완료 Main.MessageList("Call option sold."); } if (Xv2 > 0 && !HasSoldPut) { Account1.SetUnfill(num2); if (Account1.Unfill.count > 0) { Xv2 = Xv2 - Account1.Unfill.count; Account1.OrderCancel(num2); } Account1.OrderSell(PutCode, Xv2, Option1.GetBid(PutCode, 5), 0); HasSoldPut = true; // 풋 옵션 매도 완료 Main.MessageList("Put option sold."); } Main.KillTimer(1); }}function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == ID1) { num1 = OrderResponse.orderNum; } if (OrderResponse.orderID == ID2) { num2 = OrderResponse.orderNum; }}
답변완료
수식 부탁드립니다.
스팟문의는 예스스팟 Q&A에 올려 주시기 바랍니다.스팟은 기본적으로 저희가 완성식을 작성해 드리지는 않습니다.질문 올리신면 가이드식으로 답변드리며 답변받으시는데 시간이 좀 걸리실 수 있습니다.안녕하세요. 이 수식어에 분할 매수 수식어가 필요합니다. 부탁드립니다.보유종목 중 마이너스에 매수하기1차매수후- 신규종목2차매수- -3%3차매수- -5%4차매수- -8%+3% 전량익절보유종목중 2.3.4차에 도달하지 않았더라도 +3% 익절시 전량 매도var timer5 = 2; // 2초var 매수금 = 500000;var OrderList = [];var MKList = [];var req;function Main_OnStart(){Main.SetTimer(1, timer5*1000);MKList =[];}function Main_OnTimer(nEventID){var d = new Date();YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();if (nEventID == 1 && HHMMSS > 090300 && HHMMSS < 151500){ Main.ReqPowerSearch("test");}if (nEventID == 2){ Main.ReqMarketData(OrderList[req]);}}function Main_OnRcvItemList(altemList, nCount){Main.KillTimer(1);OrderList = [];if (nCount >= 1){ if (MKList.length == 0) { OrderList = altemList; } else { for (var a = 0; a < nCount; a++) { var Add = true; for (var b = 0; b < MKList.length; b++) { if (altemList[a] == MKList[b].code) { Add = false; } } if (Add == true && !IsStockInAccount(altemList[a])) { OrderList.push(altemList[a]); } } }}if (OrderList.length == 0){Main.SetTimer(1, timer5*1000);}else{req = 0;Main.ReqMarketData(OrderList[req]);}}function Main_OnRcvMarketData(MarketData){if (MarketData.code == OrderList[req]){MKList.push(MarketData); if (!IsStockInAccount(MarketData.code)) { //Account1.OrderBuy(MarketData.code,1,0,2); // Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(1)),0,1); Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(5)),MarketData.Ask(5),0); Main.MessageList(MarketData.code + " 주식을 매수합니다.");} else {Main.MessageList( MarketData.code + " 주식은 이미 계좌에 있으므로 매수하지 않습니다.");}req = req+1;if (req < OrderList.length){var aa = Main.ReqMarketData(OrderList[req]);if (aa == -1){Main.SetTimer(2, 15000);}}else{Main.SetTimer(1, timer5*1000);}}}function IsStockInAccount(stockCode) {var numberOfBalances = Account1.GetTheNumberOfBalances();for (var i = 0; i < numberOfBalances; i++) {Account1.SetBalance(i);if (stockCode == Account1.Balance.code) {return true; }}return false; }
2025-12-31
124
글번호 229512