예스스탁
예스스탁 답변
2021-05-17 16:44:55
안녕하세요
예스스탁입니다.
1
스팟은 동일이벤트는 한번만 사용해서 해당 이벤트안에 모든 내용을 넣으셔야 합니다.
현재 function Main_OnRcvItemList(aItemList, nCount)이벤트가 2번 사용되어 있습니다.
같은 이벤트가 2번이상 사용되면 수식상 아래쪽만 실행되게 됩니다.
하나로 내용을 합치셔야 합니다.
2
종목객체의 요청이 15초당 60회입니다.
종목객체 제한시간이 적용되면 재요청하는 내용이 없어 아래식에 추가했습니다.
3
현재 수식에서 매도5호가로 매수주문이 집행되게 되어 있습니다.
체결여부는 수식안에서 컨트롤이 되지 않습니다.
시장가등으로 변경해서 주문가격을 높여보실수 밖에 없습니다.
4
var 검색주기 = 60;//60초
var 종목수 = 50;
var 매수금액 = 1000000;
var ItemList = [],MK = [],HH = [];
var HHMMSS,req;
function Main_OnStart()
{
Main.SetTimer(1, 60000);
Main.MessageList("start");
}
function Main_OnTimer(nEventID)
{
var d = new Date();
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//9시 이후에 2분간격으로 종목검색 50종목 이하
if (nEventID == 1 && HHMMSS >= 090100 && MK.length < 종목수)
{
Main.KillTimer(1);
Main.MessageList("종목검색 요청");
Main.ReqPowerSearch("단타A");
}
if (nEventID == 3 )
{
//종료
Main.KillTimer(3);
//다음종목 요청
Main.ReqMarketData(ItemList[req]);
Main.MessageList(req,"종목객체재요청",ItemList[req]);
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
Main.MessageList("종목검색 완료 nCount : ",nCount,MK.length);
Main.MessageList("종목검색 완료 aItemList : ",aItemList);
if (nCount > 0)
{
Main.SendInterests("관심단타A", aItemList, false);
Main.MessageList("관심종목 등록");
}
if (nCount > 0)
{
ItemList = [];
//첫검색일때
if (MK.length == 0)
{
ItemList = aItemList;
}
else //두번쨰 이후(차트가 만들어진 종목을 제외하고 새로운 종목만 집계)
{
for (var i = 0; i < nCount; i++ )
{
var add = true;
for (var x = 0; x < MK.length; x++ )
{
if (aItemList[i] == MK[x].code)
{
add = false;
}
}
if (add == true)
{
ItemList.push(aItemList[i]);
}
}
}
if (ItemList.length > 0 && MK.length < 종목수)
{
req = 0;
Main.MessageList("종목객체요청 : ",ItemList[req]);
Main.ReqMarketData(ItemList[req]);
}
else
{
if (MK.length < 종목수)
{
Main.SetTimer(1, 검색주기*1000);
}
}
}
}
function Main_OnRcvMarketData(MarketData)
{
if (MarketData.code == ItemList[req])
{
Main.MessageList("종목객체생성:",req,MarketData.code);
MK.push(MarketData);
HH.push(MK[req].current);//최고가 초기값은 현재가
Main.MessageList("매수주문:",MarketData.code);
//매도5호가로 매수금액만큼 매수주문
Account1.OrderBuy(MarketData.code,Math.floor(매수금액/MarketData.Ask(5)),MarketData.Ask(5),0);
req = req+1;
if (req < ItemList.length && MK.length < 종목수)
{
Main.MessageList("종목객체요청 : ",ItemList[req]);
var S = Main.ReqMarketData(ItemList[req]);
if (S == -1)
{
//3번타이머 15초 셋팅
Main.SetTimer(3, 15000);
}
}
else
{
Main.MessageList("종목객체생성완료");
if (MK.length < 50)
{
Main.SetTimer(1, 검색주기*1000);
}
}
}
}
function Main_OnUp*ateMarket(sItemCode, lUp*ateID)
{
if (lUp*ateID == 20001)
{
for (var i = 0; i < MK.length; i++)
{
//업데이트된 종목을 찾아
if (MK[i].code == sItemCode && HH[i] > 0)
{
//현재가가 저장된 최고가 보다 크면 최고가를 현재가로 변경
if (MK[i].current > HH[i])
{
HH[i] = MK[i].current;
}
//잔고셋팅
Account1.SetBalance(MK[i].code, 0);
//최고가는 평단가 대비 20이상 크고 현재가가 평단가 대비 15% 이하로 내려오면 매수5호가로 전량 매도
if (HH[i] >= Account1.Balance.avgUnitCost*1.20 &&
MK[i].current <= Account1.Balance.avgUnitCost*1.10)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MK[i].Bid(5),0);
//HH[i]는 -1로 저장하여 이후 감시하지 않게 함
HH[i] = -1;
Main.MessageList("종목객체삭제 : ",S);
var S = Main.RemoveObject(MK[i]);
MK.splice(i,1);
}
}
}
}
}
즐거운 하루되세요
> 다낚아 님이 쓴 글입니다.
> 제목 : 수식 수정 및 질문
>
아래수식을 게시판에서
받아서 모의로 실행하면 안돼는게 있어서 질문드립니다.
1. 관심종목등록이 안되네요.
2. 종목검색중 검색되다가 -1로 시간초과후 멈춤니다.
3. 매수주문은 들어가는데 체결이 안됩니다.
원인이 무엇인지 설명부탁드리며, 수식보완 부탁합니다.
var 검색주기 = 60;//60초
var 종목수 = 50;
var 매수금액 = 1000000;
var ItemList = [],MK = [],HH = [];
var HHMMSS,req;
function Main_OnStart()
{
Main.SetTimer(1, 60000);
Main.MessageList("start");
}
function Main_OnTimer(nEventID)
{
var d = new Date();
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//9시 이후에 2분간격으로 종목검색 50종목 이하
if (nEventID == 1 && HHMMSS >= 090100 && MK.length < 종목수)
{
Main.KillTimer(1);
Main.MessageList("종목검색 요청");
Main.ReqPowerSearch("단타A");
}
}
// 검색종목 관심등록
function Main_OnRcvItemList(aItemList, nCount)
{
if (nCount > 0)
{
Main.SendInterests("관심단타A", aItemList, false);
Main.MessageList("관심종목 등록");
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
Main.MessageList("종목검색 완료 nCount : ",nCount,MK.length);
Main.MessageList("종목검색 완료 aItemList : ",aItemList);
if (nCount > 0)
{
ItemList = [];
//첫검색일때
if (MK.length == 0)
{
ItemList = aItemList;
}
else //두번쨰 이후(차트가 만들어진 종목을 제외하고 새로운 종목만 집계)
{
for (var i = 0; i < nCount; i++ )
{
var add = true;
for (var x = 0; x < MK.length; x++ )
{
if (aItemList[i] == MK[x].code)
{
add = false;
}
}
if (add == true)
{
ItemList.push(aItemList[i]);
}
}
}
if (ItemList.length > 0 && MK.length < 종목수)
{
req = 0;
Main.MessageList("종목객체요청 : ",ItemList[req]);
Main.ReqMarketData(ItemList[req]);
}
else
{
if (MK.length < 종목수)
{
Main.SetTimer(1, 검색주기*1000);
}
}
}
}
function Main_OnRcvMarketData(MarketData)
{
if (MarketData.code == ItemList[req])
{
Main.MessageList("종목객체생성:",req,MarketData.code);
MK.push(MarketData);
HH.push(MK[req].current);//최고가 초기값은 현재가
Main.MessageList("매수주문:",MarketData.code);
//매도5호가로 매수금액만큼 매수주문
Account1.OrderBuy(MarketData.code,Math.floor(매수금액/MarketData.Ask(5)),MarketData.Ask(5),0);
req = req+1;
if (req < ItemList.length && MK.length < 종목수)
{
Main.MessageList("종목객체요청 : ",ItemList[req]);
Main.ReqMarketData(ItemList[req]);
}
else
{
Main.MessageList("종목객체생성완료");
if (MK.length < 50)
{
Main.SetTimer(1, 검색주기*1000);
}
}
}
}
function Main_OnUp*ateMarket(sItemCode, lUp*ateID)
{
if (lUp*ateID == 20001)
{
for (var i = 0; i < MK.length; i++)
{
//업데이트된 종목을 찾아
if (MK[i].code == sItemCode && HH[i] > 0)
{
//현재가가 저장된 최고가 보다 크면 최고가를 현재가로 변경
if (MK[i].current > HH[i])
{
HH[i] = MK[i].current;
}
//잔고셋팅
Account1.SetBalance(MK[i].code, 0);
//최고가는 평단가 대비 20이상 크고 현재가가 평단가 대비 15% 이하로 내려오면 매수5호가로 전량 매도
if (HH[i] >= Account1.Balance.avgUnitCost*1.20 &&
MK[i].current <= Account1.Balance.avgUnitCost*1.10)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MK[i].Bid(5),0);
//HH[i]는 -1로 저장하여 이후 감시하지 않게 함
HH[i] = -1;
Main.MessageList("종목객체삭제 : ",S);
var S = Main.RemoveObject(MK[i]);
MK.splice(i,1);
}
}
}
}
}