커뮤니티

스크립트 실행시에 오류보고에 에러 발생 코드

프로필 이미지
탱군
2025-05-19 14:20:52.0
174
글번호 226301
답변완료
referenceError: handleError is not defined 와 같은 에러가 지속 발생 됩니다. 원인 파악을 못하겠네요. 스팟 스크립트 적용하고 3초뒤에 발생되네요. --------------------------------------------이하 스팟 코드 var timer5 = 5; //5초 var 매수금 = 100000; var 손절 = 0.95; var 익절 = 1.05; var OrderList = []; var MKList = []; var req; var orderId; // 주문 ID 저장용 전역 변수 var orderNumber; // 주문 번호 저장용 전역 변수 var orderFailurePrice = {}; // 주문 실패 시점의 가격 저장용 객체 var initialPrice = {}; // 초기 주문 가격 저장용 객체 var currentPrice; // 현재가 저장용 변수 function Main_OnStart() { try { Main.MessageLog("--------------------------------------------"); Main.MessageLog("[시작] 스팟 전략 시작"); //1번 타이머, 5초 Main.SetTimer(1, timer5*1000); Main.MessageLog("[타이머] 5초 타이머 설정 완료"); // 오늘 매수한 종목 관리 배열 초기화 MKList = []; Main.MessageLog("[초기화] 매수 종목 관리 배열 초기화 완료"); //스팟 시작시 잔고평가금액 V1 = A1.GetBalanceETCinfo(100); Main.MessageLog("[잔고] 초기 평가금액: " + V1); Main.MessageLog("--------------------------------------------"); } catch (error) { Main.MessageLog("--------------------------------------------"); Main.MessageLog("[에러] 스팟 시작 중 오류 발생: " + error.message); Main.MessageLog("--------------------------------------------"); } } /** * 주문 처리 함수 * @param {string} code - 종목코드 * @param {number} quantity - 주문수량 * @param {string} orderType - 주문타입 ('BUY' or 'SELL') */ function processOrder(code, quantity, orderType) { var localOrderId; // 지역 변수로 주문 ID 선언 try { Main.MessageLog("--------------------------------------------"); Main.MessageLog("[주문] 주문 처리 시작"); Main.MessageLog("- 종목코드: " + code); Main.MessageLog("- 주문수량: " + quantity); Main.MessageLog("- 주문유형: " + orderType); // 시장가 주문으로 진행 (가격 0, 가격구분 1) Main.MessageLog("[주문] 시장가 주문 진행"); if (orderType === 'BUY') { // 매수 시장가 주문 localOrderId = A1.OrderBuy(code, quantity, 0, 1); orderId = localOrderId; // 전역 변수에 할당 Main.MessageLog("[주문] 매수 시장가 주문 완료"); } else { // 매도 시장가 주문 localOrderId = A1.OrderSell(code, quantity, 0, 1); orderId = localOrderId; // 전역 변수에 할당 Main.MessageLog("[주문] 매도 시장가 주문 완료"); } Main.MessageLog("--------------------------------------------"); return localOrderId; } catch (error) { Main.MessageLog("--------------------------------------------"); Main.MessageLog("[에러] 주문 처리 중 오류 발생: " + error.message); Main.MessageLog("--------------------------------------------"); return null; } } /** * 가격 상승률 체크 함수 * @param {string} code - 종목코드 * @returns {boolean} - 가격 상승률이 3% 이상이면 true */ function isPriceIncreased(code) { if (!orderFailurePrice[code]) return false; const currentPrice = MarketData.Ask(1); const priceIncrease = ((currentPrice - orderFailurePrice[code]) / orderFailurePrice[code]) * 100; return priceIncrease >= 3; } /** * 주문 응답 처리 * @param {Object} OrderResponse - 주문 응답 객체 */ function Main_OnOrderResponse(OrderResponse) { try { if (OrderResponse.orderID === orderId) { orderNumber = OrderResponse.orderNum; // 주문 실패 시 시장가로 재시도 if (OrderResponse.orderResult === 'FAIL') { const code = OrderResponse.code; const quantity = OrderResponse.count; const orderType = OrderResponse.orderType; if (orderType === 'BUY') { // 매수 주문 실패 시 시장가로 재시도 A1.OrderBuy(code, quantity, 0, 1); Main.MessageLog(code + " 주식을 시장가로 매수합니다."); } else { // 매도 주문 실패 시 시장가로 재시도 A1.OrderSell(code, quantity, 0, 1); Main.MessageLog(code + " 주식을 시장가로 매도합니다."); } } } } catch (error) { Main.MessageLog("--------------------------------------------"); Main.MessageLog("[에러] 주문 응답 처리 중 오류 발생: " + error.message); Main.MessageLog("--------------------------------------------"); } } function Main_OnTimer(nEventID) { try { 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) { Main.MessageLog("--------------------------------------------"); Main.MessageLog("[타이머] 이벤트 발생 - 현재시간: " + HHMMSS); if (HHMMSS >= 90000 && HHMMSS < 151500) { Main.MessageLog("[검색] 종목 검색 시작"); var searchResult = Main.ReqPowerSearch("power2"); if (searchResult === false) { Main.MessageLog("[에러] 종목 검색 요청 실패"); } else { Main.MessageLog("[검색] 종목 검색 요청 성공"); } } else { Main.MessageLog("[시간] 거래 시간이 아닙니다. (현재: " + HHMMSS + ")"); } Main.MessageLog("--------------------------------------------"); } if (nEventID == 1 && HHMMSS >= 90000 && HHMMSS < 151500) { //계좌보유종수 var num = A1.GetTheNumberOfBalances(); //9시~15시 15분 사이 if (HHMMSS >= 90000 && HHMMSS < 151500) { //보유종목이 1개 이상 if (num >= 1) { //계좌평가금액이 스팟시작시 평가금액대비 5% 이상이면 전종목 전량매도 if (A1.GetBalanceETCinfo(100) >= V1*1.05) { //1번 타이머 종료 Main.KillTimer(1); //계좌리스트의 순서대로 for (var i = 0; i < num; i++) { //잔고를 셋팅 A1.SetBalance(i); //수량이 있고 5%수익이거나 5% 손실이면 시장가 매도 if (A1.Balance.count > 0) { processOrder(A1.Balance.code, A1.Balance.count, 'SELL'); } } } else //아니면 개별종목 5%익절, -5%손절 체크 { //계좌리스트의 순서대로 for (var i = 0; i < num; i++) { //잔고를 셋팅 A1.SetBalance(i); //수량이 있고 5%수익이거나 5% 손실이면 시장가 매도 if (A1.Balance.count > 0 && (A1.Balance.current >= A1.Balance.avgUnitCost * 1.015 || A1.Balance.current <= A1.Balance.avgUnitCost * 0.98)) { processOrder(A1.Balance.code, A1.Balance.count, 'SELL'); } } } } } //15시 15분이후이면 if (HHMMSS >= 151500) { //1번 타이머 종료 Main.KillTimer(1); //계좌리스트의 순서대로 for (var i = 0; i < num; i++) { //잔고를 셋팅 A1.SetBalance(i); //수량이 있고 5%수익이거나 5% 손실이면 시장가 매도 if (A1.Balance.count > 0) { processOrder(A1.Balance.code, A1.Balance.count, 'SELL'); } } } } if (nEventID == 2) { Main.ReqMarketData(OrderList[req]); } } catch (error) { Main.MessageLog("--------------------------------------------"); Main.MessageLog("[에러] 타이머 이벤트 처리 중 오류 발생: " + error.message); Main.MessageLog("--------------------------------------------"); } } function Main_OnRcvItemList(aItemList, nCount) { try { Main.MessageLog("--------------------------------------------"); Main.MessageLog("[검색결과] 수신된 종목 수: " + nCount); Main.KillTimer(1); OrderList = []; if (nCount >= 1) { if (MKList.length == 0) { OrderList = aItemList; Main.MessageLog("[검색결과] 신규 종목 목록 설정 완료"); } else { for (var a = 0; a < nCount; a++) { var Add = true; for (var b = 0; b < MKList.length; b++) { if (aItemList[a] == MKList[b].code) { Add = false; } } if (Add == true && !IsStockInAccount(aItemList[a])) { OrderList.push(aItemList[a]); } } Main.MessageLog("[검색결과] 기존 종목 제외 후 남은 종목 수: " + OrderList.length); } } if (OrderList.length == 0) { Main.MessageLog("[검색결과] 처리할 종목이 없습니다. 5초 후 재시도"); Main.SetTimer(1, timer5*1000); } else { req = 0; Main.MessageLog("[검색결과] 첫 번째 종목 시세 조회 시작: " + OrderList[req]); Main.ReqMarketData(OrderList[req]); } Main.MessageLog("--------------------------------------------"); } catch (error) { Main.MessageLog("--------------------------------------------"); Main.MessageLog("[에러] 종목 목록 처리 중 오류 발생: " + error.message); Main.MessageLog("--------------------------------------------"); Main.SetTimer(1, timer5*1000); // 에러 발생 시 5초 후 재시도 } } function Main_OnRcvMarketData(MarketData) { if (MarketData.code == OrderList[req]) { MKList.push(MarketData); // 계좌에 같은 종목이 있는지 확인 if (!IsStockInAccount(MarketData.code)) { // 계좌에 없는 경우에만 매수 const quantity = Math.floor(매수금/MarketData.Ask(1)); if (quantity > 0) { processOrder(MarketData.code, quantity, 'BUY'); } Main.MessageLog(MarketData.code + " 주식을 매수합니다."); } else { Main.MessageLog( 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 = A1.GetTheNumberOfBalances(); for (var i = 0; i < numberOfBalances; i++) { A1.SetBalance(i); if (stockCode == A1.Balance.code) { return true; // 계좌에 같은 종목이 있으면 true 반환 } } return false; // 계좌에 같은 종목이 없으면 false 반환 }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2025-05-29 16:09:14.0

안녕하세요 예스스탁입니다. 올려주신 수식을 실행해 보았지만 해당 오류가 발생하지 않습니다. referenceError는 현재 범위에서 존재하지 않거나 초기화되지 않은 변수를 참조했을 때 발생하는데 올리신 수식에 해당 이름의 변수나 객체가 없습니다. 02-3453-1060으로 전화주시기 바랍니다. 즐거운 하루되세요 > 탱군 님이 쓴 글입니다. > 제목 : 스크립트 실행시에 오류보고에 에러 발생 코드 > referenceError: handleError is not defined 와 같은 에러가 지속 발생 됩니다. 원인 파악을 못하겠네요. 스팟 스크립트 적용하고 3초뒤에 발생되네요. --------------------------------------------이하 스팟 코드 var timer5 = 5; //5초 var 매수금 = 100000; var 손절 = 0.95; var 익절 = 1.05; var OrderList = []; var MKList = []; var req; var orderId; // 주문 ID 저장용 전역 변수 var orderNumber; // 주문 번호 저장용 전역 변수 var orderFailurePrice = {}; // 주문 실패 시점의 가격 저장용 객체 var initialPrice = {}; // 초기 주문 가격 저장용 객체 var currentPrice; // 현재가 저장용 변수 function Main_OnStart() { try { Main.MessageLog("--------------------------------------------"); Main.MessageLog("[시작] 스팟 전략 시작"); //1번 타이머, 5초 Main.SetTimer(1, timer5*1000); Main.MessageLog("[타이머] 5초 타이머 설정 완료"); // 오늘 매수한 종목 관리 배열 초기화 MKList = []; Main.MessageLog("[초기화] 매수 종목 관리 배열 초기화 완료"); //스팟 시작시 잔고평가금액 V1 = A1.GetBalanceETCinfo(100); Main.MessageLog("[잔고] 초기 평가금액: " + V1); Main.MessageLog("--------------------------------------------"); } catch (error) { Main.MessageLog("--------------------------------------------"); Main.MessageLog("[에러] 스팟 시작 중 오류 발생: " + error.message); Main.MessageLog("--------------------------------------------"); } } /** * 주문 처리 함수 * @param {string} code - 종목코드 * @param {number} quantity - 주문수량 * @param {string} orderType - 주문타입 ('BUY' or 'SELL') */ function processOrder(code, quantity, orderType) { var localOrderId; // 지역 변수로 주문 ID 선언 try { Main.MessageLog("--------------------------------------------"); Main.MessageLog("[주문] 주문 처리 시작"); Main.MessageLog("- 종목코드: " + code); Main.MessageLog("- 주문수량: " + quantity); Main.MessageLog("- 주문유형: " + orderType); // 시장가 주문으로 진행 (가격 0, 가격구분 1) Main.MessageLog("[주문] 시장가 주문 진행"); if (orderType === 'BUY') { // 매수 시장가 주문 localOrderId = A1.OrderBuy(code, quantity, 0, 1); orderId = localOrderId; // 전역 변수에 할당 Main.MessageLog("[주문] 매수 시장가 주문 완료"); } else { // 매도 시장가 주문 localOrderId = A1.OrderSell(code, quantity, 0, 1); orderId = localOrderId; // 전역 변수에 할당 Main.MessageLog("[주문] 매도 시장가 주문 완료"); } Main.MessageLog("--------------------------------------------"); return localOrderId; } catch (error) { Main.MessageLog("--------------------------------------------"); Main.MessageLog("[에러] 주문 처리 중 오류 발생: " + error.message); Main.MessageLog("--------------------------------------------"); return null; } } /** * 가격 상승률 체크 함수 * @param {string} code - 종목코드 * @returns {boolean} - 가격 상승률이 3% 이상이면 true */ function isPriceIncreased(code) { if (!orderFailurePrice[code]) return false; const currentPrice = MarketData.Ask(1); const priceIncrease = ((currentPrice - orderFailurePrice[code]) / orderFailurePrice[code]) * 100; return priceIncrease >= 3; } /** * 주문 응답 처리 * @param {Object} OrderResponse - 주문 응답 객체 */ function Main_OnOrderResponse(OrderResponse) { try { if (OrderResponse.orderID === orderId) { orderNumber = OrderResponse.orderNum; // 주문 실패 시 시장가로 재시도 if (OrderResponse.orderResult === 'FAIL') { const code = OrderResponse.code; const quantity = OrderResponse.count; const orderType = OrderResponse.orderType; if (orderType === 'BUY') { // 매수 주문 실패 시 시장가로 재시도 A1.OrderBuy(code, quantity, 0, 1); Main.MessageLog(code + " 주식을 시장가로 매수합니다."); } else { // 매도 주문 실패 시 시장가로 재시도 A1.OrderSell(code, quantity, 0, 1); Main.MessageLog(code + " 주식을 시장가로 매도합니다."); } } } } catch (error) { Main.MessageLog("--------------------------------------------"); Main.MessageLog("[에러] 주문 응답 처리 중 오류 발생: " + error.message); Main.MessageLog("--------------------------------------------"); } } function Main_OnTimer(nEventID) { try { 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) { Main.MessageLog("--------------------------------------------"); Main.MessageLog("[타이머] 이벤트 발생 - 현재시간: " + HHMMSS); if (HHMMSS >= 90000 && HHMMSS < 151500) { Main.MessageLog("[검색] 종목 검색 시작"); var searchResult = Main.ReqPowerSearch("power2"); if (searchResult === false) { Main.MessageLog("[에러] 종목 검색 요청 실패"); } else { Main.MessageLog("[검색] 종목 검색 요청 성공"); } } else { Main.MessageLog("[시간] 거래 시간이 아닙니다. (현재: " + HHMMSS + ")"); } Main.MessageLog("--------------------------------------------"); } if (nEventID == 1 && HHMMSS >= 90000 && HHMMSS < 151500) { //계좌보유종수 var num = A1.GetTheNumberOfBalances(); //9시~15시 15분 사이 if (HHMMSS >= 90000 && HHMMSS < 151500) { //보유종목이 1개 이상 if (num >= 1) { //계좌평가금액이 스팟시작시 평가금액대비 5% 이상이면 전종목 전량매도 if (A1.GetBalanceETCinfo(100) >= V1*1.05) { //1번 타이머 종료 Main.KillTimer(1); //계좌리스트의 순서대로 for (var i = 0; i < num; i++) { //잔고를 셋팅 A1.SetBalance(i); //수량이 있고 5%수익이거나 5% 손실이면 시장가 매도 if (A1.Balance.count > 0) { processOrder(A1.Balance.code, A1.Balance.count, 'SELL'); } } } else //아니면 개별종목 5%익절, -5%손절 체크 { //계좌리스트의 순서대로 for (var i = 0; i < num; i++) { //잔고를 셋팅 A1.SetBalance(i); //수량이 있고 5%수익이거나 5% 손실이면 시장가 매도 if (A1.Balance.count > 0 && (A1.Balance.current >= A1.Balance.avgUnitCost * 1.015 || A1.Balance.current <= A1.Balance.avgUnitCost * 0.98)) { processOrder(A1.Balance.code, A1.Balance.count, 'SELL'); } } } } } //15시 15분이후이면 if (HHMMSS >= 151500) { //1번 타이머 종료 Main.KillTimer(1); //계좌리스트의 순서대로 for (var i = 0; i < num; i++) { //잔고를 셋팅 A1.SetBalance(i); //수량이 있고 5%수익이거나 5% 손실이면 시장가 매도 if (A1.Balance.count > 0) { processOrder(A1.Balance.code, A1.Balance.count, 'SELL'); } } } } if (nEventID == 2) { Main.ReqMarketData(OrderList[req]); } } catch (error) { Main.MessageLog("--------------------------------------------"); Main.MessageLog("[에러] 타이머 이벤트 처리 중 오류 발생: " + error.message); Main.MessageLog("--------------------------------------------"); } } function Main_OnRcvItemList(aItemList, nCount) { try { Main.MessageLog("--------------------------------------------"); Main.MessageLog("[검색결과] 수신된 종목 수: " + nCount); Main.KillTimer(1); OrderList = []; if (nCount >= 1) { if (MKList.length == 0) { OrderList = aItemList; Main.MessageLog("[검색결과] 신규 종목 목록 설정 완료"); } else { for (var a = 0; a < nCount; a++) { var Add = true; for (var b = 0; b < MKList.length; b++) { if (aItemList[a] == MKList[b].code) { Add = false; } } if (Add == true && !IsStockInAccount(aItemList[a])) { OrderList.push(aItemList[a]); } } Main.MessageLog("[검색결과] 기존 종목 제외 후 남은 종목 수: " + OrderList.length); } } if (OrderList.length == 0) { Main.MessageLog("[검색결과] 처리할 종목이 없습니다. 5초 후 재시도"); Main.SetTimer(1, timer5*1000); } else { req = 0; Main.MessageLog("[검색결과] 첫 번째 종목 시세 조회 시작: " + OrderList[req]); Main.ReqMarketData(OrderList[req]); } Main.MessageLog("--------------------------------------------"); } catch (error) { Main.MessageLog("--------------------------------------------"); Main.MessageLog("[에러] 종목 목록 처리 중 오류 발생: " + error.message); Main.MessageLog("--------------------------------------------"); Main.SetTimer(1, timer5*1000); // 에러 발생 시 5초 후 재시도 } } function Main_OnRcvMarketData(MarketData) { if (MarketData.code == OrderList[req]) { MKList.push(MarketData); // 계좌에 같은 종목이 있는지 확인 if (!IsStockInAccount(MarketData.code)) { // 계좌에 없는 경우에만 매수 const quantity = Math.floor(매수금/MarketData.Ask(1)); if (quantity > 0) { processOrder(MarketData.code, quantity, 'BUY'); } Main.MessageLog(MarketData.code + " 주식을 매수합니다."); } else { Main.MessageLog( 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 = A1.GetTheNumberOfBalances(); for (var i = 0; i < numberOfBalances; i++) { A1.SetBalance(i); if (stockCode == A1.Balance.code) { return true; // 계좌에 같은 종목이 있으면 true 반환 } } return false; // 계좌에 같은 종목이 없으면 false 반환 }