목차
개요
Account는 시뮬레이션 계좌 하나를 나타내는 객체입니다.
현재는 주식 종목만을 대상으로 하므로 파생상품이나 제3시장 계좌 등을 별도 구분하지 않습니다. 기본 계좌는 시뮬레이션 시작 시 자동으로 생성되며, IQAccount.getDefaultAccount()로 가져올 수 있습니다. 필요하다면 IQAccount.addAccount()를 통해 여러 계좌를 추가 생성할 수 있습니다.
// 기본 계좌 가져오기
var acc = IQAccount.getDefaultAccount();
logger.debug('계좌번호: ' + acc.accountNum);
logger.debug('현금잔고: ' + IQUtil.getNumberWithCommas(acc.cash.toFixed(0)));
JavaScript
복사
1. 속성 (Properties)
속성은 함수 호출 없이 직접 접근하는 읽기 전용 값입니다.
accountNum
계좌번호. 기본 계좌는 시스템이 내부적으로 부여합니다.
logger.debug(IQAccount.getDefaultAccount().accountNum);
JavaScript
복사
accountName
계좌 이름.
logger.debug(IQAccount.getDefaultAccount().accountName);
JavaScript
복사
cash
현재 현금 잔고.
매수 시 차감되고, 매도 시 증가합니다. 수수료·거래세도 이 잔고에서 처리됩니다.
var acc = IQAccount.getDefaultAccount();
logger.debug('현금잔고: ' + IQUtil.getNumberWithCommas(acc.cash.toFixed(0)));
JavaScript
복사
aum
시뮬레이션 시작 시 설정된 초기 예수금 (AUM, Assets Under Management).
시뮬레이션 진행 중 cash는 매매에 따라 변동하지만, aum은 초깃값을 그대로 유지합니다.
var acc = IQAccount.getDefaultAccount();
logger.debug('초기 예수금: ' + IQUtil.getNumberWithCommas(acc.aum.toFixed(0)));
JavaScript
복사
2. buy(code, quantity) — 매수
계좌에 종목을 매수 주문합니다.
IQEnvironment.simulationMethod 설정에 따라 당일 종가 또는 다음 거래일 시가·평균가로 체결됩니다.
파라미터
파라미터 | 타입 | 설명 |
code | string | [한국] A로 시작하는 6자리 종목코드. 예) A005930 [미국] 종목 Symbol. 예) AAPL |
quantity | number | 매수 수량 (주) |
반환값
없음.
주의사항
• 현금 잔고(cash)가 부족하면 매수 주문이 실행되지 않습니다.
• 분산투자 목적의 여러 종목 매매는 Basket 객체 사용을 권장합니다.
Sample
var acc = IQAccount.getDefaultAccount();
acc.buy('A005930', 10); // 삼성전자 10주 매수
JavaScript
복사
3. sell(code, quantity) — 매도
계좌에 종목을 매도 주문합니다.
IQEnvironment.simulationMethod 설정에 따라 당일 종가 또는 다음 거래일 시가·평균가로 체결됩니다.
파라미터
파라미터 | 타입 | 설명 |
code | string | [한국] A로 시작하는 6자리 종목코드. 예) A005930 [미국] 종목 Symbol. 예) AAPL |
quantity | number | 매도 수량 (주) |
반환값
없음.
주의사항
• 보유 수량을 초과하는 수량으로 매도 주문을 낼 수 없습니다.
Sample
var acc = IQAccount.getDefaultAccount();
acc.sell('A005930', 5); // 삼성전자 5주 매도
JavaScript
복사
4. getTotalEquity() — 계좌 평가액
현금 잔고와 보유 종목의 평가액을 합산하여 계좌 총 평가액을 반환합니다.
파라미터
없음.
반환값
number — 현금 잔고 + 보유 종목 시가 평가액의 합계
Sample
var acc = IQAccount.getDefaultAccount();
logger.debug('계좌 총 평가액: ' + IQUtil.getNumberWithCommas(acc.getTotalEquity().toFixed(0)));
JavaScript
복사
5. getEggs() — 보유 잔고 조회
계좌에 보유 중인 종목 잔고 목록을 반환합니다.
파라미터
없음.
반환값
보유 종목이 없으면 빈 배열([])을 반환합니다.
Sample
var acc = IQAccount.getDefaultAccount();
var eggs = acc.getEggs();
for (var i = 0; i < eggs.length; i++) {
var egg = eggs[i];
logger.debug(i + '번째 보유종목 — 코드: ' + egg.code
+ ', 수량: ' + egg.quantity
+ ', 평균매수가: ' + IQUtil.getNumberWithCommas(egg.mean.toFixed(0)));
}
JavaScript
복사
6. Egg 객체
getEggs()가 반환하는 배열의 개별 원소입니다. 보유 종목 한 건을 나타냅니다.
속성 | 타입 | 설명 |
code | string | 종목 코드 (한국: A로 시작하는 6자리, 미국: Symbol) |
quantity | number | 보유 수량 (주) |
mean | number | 평균 매수 가격 (원/달러) |
var eggs = IQAccount.getDefaultAccount().getEggs();
for (var i = 0; i < eggs.length; i++) {
var egg = eggs[i];
var stock = IQStock.getStock(egg.code);
if (stock != null) {
var currentPrice = stock.getClose();
var gainRate = (currentPrice - egg.mean) / egg.mean * 100;
logger.debug(stock.name
+ ' | 수량: ' + egg.quantity
+ ' | 평균가: ' + IQUtil.getNumberWithCommas(egg.mean.toFixed(0))
+ ' | 현재가: ' + IQUtil.getNumberWithCommas(currentPrice.toFixed(0))
+ ' | 수익률: ' + gainRate.toFixed(2) + '%');
}
}
JavaScript
복사
7. 활용 패턴
패턴 1: 단순 매수/매도
특정 종목을 직접 매수·매도하는 가장 기본적인 패턴입니다.
var acc = IQAccount.getDefaultAccount();
function onDayClose(now) {
var sse = IQStock.getStock('A005930'); // 삼성전자
if (sse == null) return;
// 단순 조건 매수: 현재가가 20일 이동평균 위에 있을 때
if (sse.getClose() > sse.getMA(20) && acc.cash > sse.getClose() * 10) {
acc.buy('A005930', 10);
}
// 단순 조건 매도: 현재가가 20일 이동평균 아래로 내려왔을 때
if (sse.getClose() < sse.getMA(20)) {
acc.sell('A005930', 10);
}
}
JavaScript
복사
패턴 2: 현금 비중 기반 매수 수량 계산
현금의 일정 비율만 투자하도록 수량을 계산합니다.
주의: 수수료·거래세를 고려해 cash의 100%를 매수에 사용하면 잔고 부족이 발생할 수 있습니다. 항상 5% 이상의 현금을 확보하도록 비중을 설계하세요.
var acc = IQAccount.getDefaultAccount();
function calcBuyQuantity(stock, weightRatio) {
var budget = acc.cash * weightRatio; // 현금의 weightRatio 비율만큼 예산 할당
var price = stock.getClose();
if (price <= 0) return 0;
return Math.floor(budget / price); // 매수 가능 수량 (소수점 버림)
}
function onDayClose(now) {
var sse = IQStock.getStock('A005930');
if (sse == null || !sse.isListed()) return;
var qty = calcBuyQuantity(sse, 0.3); // 현금의 30%만큼 매수
if (qty > 0) {
acc.buy('A005930', qty);
logger.debug('삼성전자 매수: ' + qty + '주');
}
}
JavaScript
복사
패턴 3: 보유 잔고 기반 전량 매도
보유 중인 모든 종목을 순회하며 조건에 따라 전량 매도합니다.
var acc = IQAccount.getDefaultAccount();
function onDayClose(now) {
var eggs = acc.getEggs();
for (var i = 0; i < eggs.length; i++) {
var egg = eggs[i];
var stock = IQStock.getStock(egg.code);
if (stock == null) continue;
// 보유 종목이 20일 이동평균 아래이면 전량 매도
if (stock.getClose() < stock.getMA(20)) {
acc.sell(egg.code, egg.quantity);
logger.debug(stock.name + ' 전량 매도: ' + egg.quantity + '주');
}
}
}
JavaScript
복사
패턴 4: 수익률 추적
계좌 전체의 누적 수익률을 계산합니다.
var acc = IQAccount.getDefaultAccount();
function onDayClose(now) {
var totalEquity = acc.getTotalEquity();
var totalReturn = (totalEquity / acc.aum - 1) * 100;
logger.debug('총 평가액: ' + IQUtil.getNumberWithCommas(totalEquity.toFixed(0))
+ ' | 누적수익률: ' + totalReturn.toFixed(2) + '%');
}
JavaScript
복사
오류 처리 규칙
상황 | 동작 |
현금 부족 시 buy() 호출 | 매수 주문 미실행 (잔고 변화 없음) |
보유 수량 초과 시 sell() 호출 | 매도 주문 미실행 |
보유 종목 없을 때 getEggs() | 빈 배열 [] 반환 |
