답변완료
조회제한 및 주문호가문의
Q1. 아래 수식이 랜덤하게 조회제한에 걸립니다. 조회수제한인지, 주문제한인지는 모르겠습니다.
계좌에 보유종목이 많을때(20종목+), 일때 spot을 실행하자마자 제한이걸려 멈춰버립니다.
제한이 걸리지 않게 코드수정부탁드립니다.
Q1-2. 계좌내 최대종목수를 20종목이하로 제한하고 싶습니다.
Main.SetTimer(1, 1000*60); //60초 로 제한했음에도 불구하고, 제한에 걸립니다.
Q2. ordersSell로 익절조건을 추가했는데, '호가단위가 맞지 않다'고 나옵니다
아래 코드에 2% 익절조건으로 호가단위를 맞출 방법을 문의드립니다.
profitB == 1.02 //외부입력변수
if(cond == true){
A.OrderSell(A.Balance.code, A.Balance.count, Math.floor(A.Balance.avgUnitCost * profitB/100)*100, 0);
Q3. kosdaq 지수 전일종가가 3일선, 5일선, 10일선 위에 있을때만, orderbuy 조건을 활성화 하고 싶습니다. 확장차트객체를 사용하지 않고서도 가능할까요?
---------------원본 수식코드-------
//1. 시세/파워종목검색에서 임의의 사용자검색조건을 설정한다
//2. 사용자검색조건식을 이용하여 일정시간마다 종목을 검색한다
//3. 기존의 미체결 주문을 취소주문한다
//4. 현재 보유하고 있는 잔고종목이 새로 검색된 종목에 없는 경우 현재가로 청산주문낸다
//5. 검색된 종목들을 차례대로 종목객체 생성한다
//6. 생성된 종목객체가 잔고에 없으면 100,000원씩 매도 1호가에 매수주문한다. (단, 100,000원 이상인 종목은 1주 주문))
//7. 생성되었던 객체를 삭제한다
//8. 일정시간 경과 후 다시 종목검색을 하여 위의 과정을 반복한다
/*
function getHHMMSSS() {
var d = new Date();
HHMMSSS = d.getHours()+":"+ d.getMinutes()+":"+ d.getSeconds(),
SSS = d.getMilliseconds(); // 1/1000초
if(SSS < 10)
SSS = "00" + SSS;
else if (SSS < 100)
SSS = "00" + SSS;
return HHMMSSS + "." + SSS;} */
var gEntryMoney = 1000000, //종목당 매수금액
gaItemList = [], //검색된 종목들을 담은 배열변수
gItemCnt, //종목객체 생성할 종목수
gRegCnt; //종목객체 생성을 요청한 건수
function Main_OnStart()
{
Main.MessageList(getHHMMSSS(), "시작");
//2. 사용자검색조건식을 이용하여 일정시간마다 종목을 검색한다
Main.ReqPowerSearch("#전고점돌파(30)");
Main.SetTimer(1, 1000*60); //60초마다 종목검
}
function Main_OnRcvItemList(aItemList, nCount)
{
//3.기존의 미체결 주문을 취소주문한다
var num = A.GetTheNumberOfUnfills();
for(var i = 0; i < num ; i++){
A.SetUnfillIndex(i);
A.OrderCancel(A.Unfill.orderNum);
//Main.MessageList(getHHMMSSS(), "취소된 미체결주문 종목코드:", A.Unfill.code);
}
//4. 현재 보유하고 있는 잔고종목이 새로 검색된 종목에 없는 경우 현재가로 청산주문낸다
if(nCount >= 1){
gaItemList = aItemList;
Main.MessageList(getHHMMSSS(), "종목검색된 종목수와 종목", nCount, gaItemList);
var num = A.GetTheNumberOfBalances();
for(var i = 0; i < num ; i++){
A.SetBalanceIndex(i);
//Main.MessageList(getHHMMSSS(), "보유잔고 종목", i + 1, A.Balance.code, A.Balance.count);
//검색된 종목과 잔고종목의 종목코드들을 비교하여 같은 종목코드가 있으면 true 아니면 false
var cond = false;
for(var j = 0; j < gaItemList.length; j++){ // for문으로 잔고코드에 번호 부여 0부터 종목수
if(A.Balance.code == gaItemList[j]){
cond = true;
gaItemList.splice(j, 1); //배열변수명.splice(배열에서 삭제할 부분의 처음 인덱스, 삭제할 크기)
break; //break문 : for문이나 while문을 빠져나옴
}
}
//cond이 false이면 매도
if(cond == false){
A.OrderSell(A.Balance.code, A.Balance.count, A.Balance.current, 0);
//Main.MessageList(getHHMMSSS(), "청산주문된 종목코드:", A.Balance.code);
}
if(cond == true){
A.OrderSell(A.Balance.code, A.Balance.count, A.Balance.current , 0);//계좌안에 있으면서, 종목
Main.MessageList (getHHMMSSS (), "[체결잔고 익절 매도주문]", A.Balance. code,"평단가:", A.Balance.avgUnitCost, "매도가격:", Math.floor(A.Balance.avgUnitCost * profitB));
}
}
//5. 검색된 종목들을 차례대로 종목객체 생성한다
gReqCnt = 0;
gItemCnt = gaItemList.length;
if(gItemCnt > 0){
Main.ReqMarketData(gaItemList[gReqCnt], 0, 0);
}
}
}
function Main_OnRcvMarketData(MD)
{
// Main.MessageList(getHHMMSSS(), "종목객체 생성", MD.code, MD.name);
//6. 생성된 종목객체가 잔고에 없으면 1,000,000원씩 매도 1호가에 매수주문한다.(단, 100,000원 이상인 종목은 1주 주문))
var EntryVol;
if(MD.current < gEntryMoney){
EntryVol = Math.floor(gEntryMoney/MD.current);
} else{
EntryVol = 1;
}
A.OrderBuy(MD.code, EntryVol, MD.Ask(1), 0);
//Main.MessageList(getHHMMSSS(), "매수주문 종목과 수량:", MD.code, EntryVol);
//7. 생성되었던 객체를 삭제한다
// Main.MessageList(getHHMMSSS(), "종목객체 삭제:", MD.code);
Main.RemoveMarketData(MD);
gReqCnt++;
if(gReqCnt < gItemCnt){
var TimeLimit = Main.ReqMarketData(gaItemList[gReqCnt], 0, 0);
if(TimeLimit == -1){
Main.SetTimer(2, Main.GetLimitedTime(0) + 100);
}
} else if(gReqCnt == gItemCnt){
Main.MessageList(getHHMMSSS(), "매수주문 종료");
}
}
function Main_OnNotifyFill(NF)
{
Main.MessageList(getHHMMSSS(), "NF:", NF);
}
function Main_OnTimer(nEventID)
{
//8. 일정시간 경과 후 다시 종목검색을 하여 위의 과정을 반복한다
if(nEventID == 1){
Main.MessageList(getHHMMSSS(), "종목검색 재시작");
Main.ReqPowerSearch("#전고점돌파(30)");
}
//조회시잔이 제한된 경우
if(nEventID == 2){
Main.ReqMarketData(gaItemList[gReqCnt], 0, 0);
}
}