첨부 이미지
그림1
계좌 객체에서 사용하는 함수, 메써드 등은 spot에서 주문된 것만 관련 정보가 반환되는 것인지요?
예를들면 nh선물 hts에서 주문 체결된 후 잔고, 미체결 등 정보는 spot의 TheNumberOfBalances() 등을 활용해서 잔고 정보를 불러올 때도 있고 불러오지 못할 때도 있습니다. 이유가 무엇인지요?!
계좌번호, 종목, 포지션 등은 잘 불러오는데 잔고 수량(count),단가 등이 0으로 불러오는 경우는 왜 그러는 걸까요?!
spot수식
A1 계좌 객체 설정 완료
function Main_OnStart()
{
var d = new Date();
var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
Main.MessageLog(HHMMDD+":"+"전략 시작");
Main.MessageLog("계좌번호:"+A1.number +", 계좌명:"+A1.name);
OrderCode = Main.GetOrderCode(F1.code); //F1 종목 객체에서 종목코드를 주문용 코드로 변환
Main.MessageLog("단축코드:" + F1.code + "주문용 종목코드:"+OrderCode+", 종목명:"+F1.name +" ,잔존일수:"+F1.remainDay);
//잔고 정보 조회
A1.SetBalanceItem(F1.code, 0); //잔고객체를 사용하기위해 종목 설정
A1.Refresh();//가원장 새로 고침
Main.RefreshAccount(A1.number);//Main에서 A1 계좌번호로 가원장 새로 고침
Bal = A1.GetTheNumberOfBalances(); //잔고 리스트 개수 반환 현재 계좌에 1종목 1개 존재
A1.SetBalanceIndex(0);//잔고 인덱스 0 설정(1종목 1수량 존재하므로)
Main.MessageLog("잔고 리스트 개수:" + Bal);
Main.MessageLog("잔고 code:"+A1.Balance.code);
Main.MessageLog("잔고 포지션(S:1,L:2)):"+ A1.Balance.position);
Main.MessageLog("잔고 count:"+ A1.Balance.count);
Main.MessageLog("잔고 평균단가:"+ A1.Balance.avgUnitCost);
Main.MessageLog("잔고 평가금액:"+ A1.Balance.assessedAmount);
Main.MessageLog("잔고 current:"+ A1.Balance.current);
}
잔고 리스트 개수 : 정상
포지션 : 정상
current : 정상 표시
그러나
A1.Balance.count
A1.Balance.avgUnitCost
A1.Balance.assessedAmount
등은 모두 0으로 표시되는 이유는 무엇인가요?!
감사합니다.
답변 1
예스스탁
예스스탁 답변
2021-06-25 09:12:09
안녕하세요
예스스탁입니다.
1
스팟은 가원장을 사용하는데 가원장은
실제 원장의 복사본이고 이후 들어오는 주문정보나 체결정보로 업데이트해서 실제 원장과 똑같이 동작합니다.
가원장을 사용하는 이유는 실제 원장의 응답속도가 안정성을 위해 그다지 빠르지 않아
프로그램에서 가상의 원장을 만들어 사용하게 됩니다.
2
증권사나 선물사별로 미체결이나 체결정보를 주문이 발생한 프로그램에만 보내주는 경우가 있을 수 있습니다. 실제원장과 가원장이 어긋날 경우가 발생할수 있으므로
필요한 시점에 실제원장과 가원장을 동기화를 수행해 주셔야 합니다.
계좌객체에 실제원장과 가원장을 동기화시키는 함수가 있고 해당 함수가
수식에서 사용한 A1.Refresh()입니다.
3
하지만 원장을 동기화하면 약간의 시간이 필요합니다.
작성하신 내용과 같이 바로 동기화하고 잔고를 셋팅하면
해당값이 동기화중인 상태에서 값을 호출해서 0이 나고게 됩니다.
A1.Refresh()를 요청하면 동기화가 완료된것을 확인하고 다음작업을 수행하게 하셔야 합니다.
Refresh를 실행하면 Refresh가 완료된것은
계좌업데이트이벤트(function Main_OnUp*dateAccount)에서 알수 있습니다.
lUp*dateID가 30000이 리턴됩니다.
또한 다른 주문창이나 잔고창에서 계좌조회할때도 해당 이벤트가 발생하므로
수식내에서 Refresh될때만 동작하게 변수등을 이용해 제어하셔야 합니다.
영문 업데이트가 게시판금칙어라 Up*date와 같이 중간에 *이 추가되어 있습니다.
삭제하시기 바랍니다.
4
var RF;
function Main_OnStart()
{
var d = new Date();
var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
Main.MessageLog(HHMMDD+":"+"전략 시작");
Main.MessageLog("계좌번호:"+A1.number +", 계좌명:"+A1.name);
OrderCode = Main.GetOrderCode(F1.code); //F1 종목 객체에서 종목코드를 주문용 코드로 변환
Main.MessageLog("단축코드:" + F1.code + "주문용 종목코드:"+OrderCode+", 종목명:"+F1.name +" ,잔존일수:"+F1.remainDay);
//잔고 정보 조회
A1.SetBalanceItem(F1.code, 0); //잔고객체를 사용하기위해 종목 설정
A1.Refresh();//가원장 새로 고침
Main.RefreshAccount(A1.number);//Main에서 A1 계좌번호로 가원장 새로 고침
RF = true;
}
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID)
{
if (A1.number == sAccntNum && RF == true && lUp*dateID == 30000)
{
RF = false
Bal = A1.GetTheNumberOfBalances(); //잔고 리스트 개수 반환 현재 계좌에 1종목 1개 존재
A1.SetBalanceIndex(0);//잔고 인덱스 0 설정(1종목 1수량 존재하므로)
Main.MessageLog("잔고 리스트 개수:" + Bal);
Main.MessageLog("잔고 code:"+A1.Balance.code);
Main.MessageLog("잔고 포지션(S:1,L:2)):"+ A1.Balance.position);
Main.MessageLog("잔고 count:"+ A1.Balance.count);
Main.MessageLog("잔고 평균단가:"+ A1.Balance.avgUnitCost);
Main.MessageLog("잔고 평가금액:"+ A1.Balance.assessedAmount);
Main.MessageLog("잔고 current:"+ A1.Balance.current);
}
}
즐거운 하루되세요
> 김상 님이 쓴 글입니다.
> 제목 : Yes Global Spot 에서 계좌 객체에서 잔고 수량 0 인 이유 질의
> 계좌 객체에서 사용하는 함수, 메써드 등은 spot에서 주문된 것만 관련 정보가 반환되는 것인지요?
예를들면 nh선물 hts에서 주문 체결된 후 잔고, 미체결 등 정보는 spot의 TheNumberOfBalances() 등을 활용해서 잔고 정보를 불러올 때도 있고 불러오지 못할 때도 있습니다. 이유가 무엇인지요?!
계좌번호, 종목, 포지션 등은 잘 불러오는데 잔고 수량(count),단가 등이 0으로 불러오는 경우는 왜 그러는 걸까요?!
spot수식
A1 계좌 객체 설정 완료
function Main_OnStart()
{
var d = new Date();
var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
Main.MessageLog(HHMMDD+":"+"전략 시작");
Main.MessageLog("계좌번호:"+A1.number +", 계좌명:"+A1.name);
OrderCode = Main.GetOrderCode(F1.code); //F1 종목 객체에서 종목코드를 주문용 코드로 변환
Main.MessageLog("단축코드:" + F1.code + "주문용 종목코드:"+OrderCode+", 종목명:"+F1.name +" ,잔존일수:"+F1.remainDay);
//잔고 정보 조회
A1.SetBalanceItem(F1.code, 0); //잔고객체를 사용하기위해 종목 설정
A1.Refresh();//가원장 새로 고침
Main.RefreshAccount(A1.number);//Main에서 A1 계좌번호로 가원장 새로 고침
Bal = A1.GetTheNumberOfBalances(); //잔고 리스트 개수 반환 현재 계좌에 1종목 1개 존재
A1.SetBalanceIndex(0);//잔고 인덱스 0 설정(1종목 1수량 존재하므로)
Main.MessageLog("잔고 리스트 개수:" + Bal);
Main.MessageLog("잔고 code:"+A1.Balance.code);
Main.MessageLog("잔고 포지션(S:1,L:2)):"+ A1.Balance.position);
Main.MessageLog("잔고 count:"+ A1.Balance.count);
Main.MessageLog("잔고 평균단가:"+ A1.Balance.avgUnitCost);
Main.MessageLog("잔고 평가금액:"+ A1.Balance.assessedAmount);
Main.MessageLog("잔고 current:"+ A1.Balance.current);
}
잔고 리스트 개수 : 정상
포지션 : 정상
current : 정상 표시
그러나
A1.Balance.count
A1.Balance.avgUnitCost
A1.Balance.assessedAmount
등은 모두 0으로 표시되는 이유는 무엇인가요?!
감사합니다.