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 반환
}