예스스탁
예스스탁 답변
2019-10-18 10:43:28
안녕하세요
예스스탁입니다.
종목검색은 한번에 하나만 가능합니다.
그러므로 종목검색 후 완료되면 다음을 요청하게 하셔야 하고.
종목검색이 완료된 후에 동일종목을 제외한 리스트를 별도 코딩해서 만드셔야 합니다.
차트객체의 삭제는 시간이 조금 소모되므로 루프문으로 한번에 다수를 삭제하면
오류가 발생할 수 있습니다. 타이머를 이용해 시간간격을 두고 삭제하게 코딩하셔야 합니다. 아래수식에서는 0.5초 간격으로 삭제합니다.
예스스팟의 저희쪽에서 가이드 정도의 수식만 작성해 드립니다.
아래 수식의 내용을 참고하셔서 수정보완해 사용하시기 바랍니다.
var LIST;
var CT = [];
var HHMMSS,HHMMSS,Search,Step,CC;
var T1 = 100000;
var T2 = 103800;
function Main_OnStart()
{
Main.MessageList("Start");
Main.SetTimer(1, 1000);
Step = 0;
}
function Main_OnTimer(nEventID)
{
var d = new Date();
HHMMSS1 = HHMMSS;
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (nEventID == 1)
{
if (Step == 0 && HHMMSS >= T1 /*&& HHMMSS1 < T1*/)
{
Step = 1;
Search = 0;
LIST = [];
Main.MessageList("사용자검색조건1");
Main.ReqPowerSearch("사용자검색조건1");
}
if (Step == 1 && HHMMSS >= T2 && HHMMSS1 < T2)
{
Step = 2;
if (CT.length > 0)
{
Main.MessageList("Step :", Step," 차트삭제시작");
Main.SetTimer(2, 500);
}
else
{
Main.MessageList("사용자검색조건4");
Main.ReqPowerSearch("사용자검색조건1");
}
}
}
if (nEventID == 2)
{
Main.KillTimer(2);
var index = CT.length - 1;
var num = Account1.GetTheNumberOfUnfills();
var BuyUnFill = false;
for (var x = 0; x < num; x++)
{
Account1.SetUnfill(x);
if (CT[index].GetCode(1) == Account1.Unfill.code && Account1.Unfill.orderKind == 2)
{
BuyUnFill = true;
}
}
Account1.SetBalance(CT[index].GetCode(1), 0);
Main.MessageList("종목",CT[index].GetCode(1)," 보유수량:",Account1.Balance.count," 매수미체결 : ",BuyUnFill);
if (Account1.Balance.count == 0 || BuyUnFill == false)
{
Main.MessageList("차트삭제",CT[index].GetCode(1));
Main.RemoveObject(CT[index]);
CT.splice(index,1);
}
else
{
Main.MessageList("차트유지",CT[index].GetCode(1));
}
if (index > 0)
{
Main.SetTimer(2, 500);
}
else
{
LIST = [];
Search = 0;
Main.MessageList("차트객체삭제완료");
Main.MessageList("사용자검색조건4");
Main.ReqPowerSearch("사용자검색조건4");
}
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
Search = Search+1;
Main.MessageList(Search,nCount);
if (aItemList.length > 0)
{
if (Search == 1)
{
LIST = aItemList;
}
if (Search >= 2)
{
for (var i = 0; i < aItemList.length; i++)
{
Add = true;
for (var x = 0; x < LIST.length; x++)
{
if (aItemList[i] == LIST[x])
{
Add = false;
}
}
if (Add == true)
{
LIST.push(aItemList[i]);
}
}
}
}
if (Search == 1)
{
Main.ReqPowerSearch("사용자검색조건2");
}
if (Search == 2)
{
Main.ReqPowerSearch("사용자검색조건3");
}
if (Search == 3)
{
if (CT.length > 0)
{
for (var i = LIST.length-1; i >= 0; i--)
{
Add = true;
for (var x = 0; x < CT.length; x++)
{
if (LIST[i] == CT[x].GetCode(1))
{
Add = false;
LIST.splice(i,1);
}
}
}
}
Main.MessageList("LIST: ",LIST.length);
if (LIST.length > 0)
{
Main.MessageList("차트객체생성시작");
req = 0;
CC = CT.length;
Main.MessageList("ReqChartEx: ",LIST[req]);
var ChartSet = new ReqChartItem(LIST[req],5,CHART_PERIOD_MINUTE,300,CHART_REQCOUNT_BAR,false,false);
var SystemSet = new SystemInfo("시스템이름", YL_TYPE_NORMAL, null, null, null);
//차트객체 요청
Main.ReqChartEx(ChartSet,SystemSet);
}
}
}
//차트객체 생성완료
function Main_OnRcvChartEx(ChartEx)
{
//req배열에 차트객체 저장
CT[CC+req] = ChartEx;
Main.MessageList(req,CT[req].GetCode(1));
//요청횟수 1 증가
req = req+1;
//요청횟수가 검색된 종목수 보다 작으면
//다음종목 요청
if (req < LIST.length)
{
Main.MessageList("ReqChartEx: ",LIST[req]);
//차트설정, 시스템 설정
var ChartSet = new ReqChartItem(LIST[req],5,CHART_PERIOD_MINUTE,300,CHART_REQCOUNT_BAR,false,false);
var SystemSet = new SystemInfo("시스템이름", YL_TYPE_NORMAL, null, null, null);
//차트객체 요청
Main.ReqChartEx(ChartSet,SystemSet);
}
else //요청횟수가 검색된 종목수 이상이면 모두 요청했으므로 끝
{
Main.MessageList("차트객체 생성끝",LIST.length, CT.length);
}
}
function Main_OnRiseSignal(ChartEx, Signal)
{
//Buy
if (Signal.signalKind == 1)
{
Account1.OrderBuy(ChartEx.GetCode(1), Signal.count,0,1);
}
//exitlong
if (Signal.signalKind == 2)
{
//해당종목 매수미체결이 있으면 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
Account1.SetUnfill(i);
if (Account1.Unfill.code == ChartEx.GetCode(1) && Account1.Unfill.orderKind == 2)
{
Account1.OrderCancel(Account1.Unfill.orderNum);
}
}
//해당종목 보유잔고가 있으면 모두 매도
Account1.SetBalance(ChartEx.GetCode(1), 0);
if (Account1.Balance.count > 0)
{
Account1.OrderSell(ChartEx.GetCode(1), Signal.count,0,1);
}
}
}
즐거운 하루되세요
> 순두부남 님이 쓴 글입니다.
> 제목 : 다중 종목검색
> 안녕하세요.
스팟으로 실전매매 경험이 없고 공부하고 있습니다.
종목검색 하나 실행하면 5~10초(그때그때 다름) 걸리는데
스팟식으로 종목검색식 여러개를 순서대로 검색할 수 있는지요?
만약 가능하다면 다음과 같은 동작을 구현하고 싶습니다.
가이드 수식 부탁드립니다.
감사합니다.
■ 동작순서
1. 타이머지정(9시부터 1시간 간격)
2. 타이머 동작(9시)
☞ 사용자종목검색1~3 검색
☞ 검색된 종목 모두 차트객체생성(중복제거)
☞ 전체 차트객체 매수신호 대기
☞ 매수신호 발생시 주문
3. 타이머 동작(10시)
☞ 사용자종목검색1~3 재검색
☞ 검색된 종목 다음과 같이 판단하여 차트객체생성
- 이미 생성된 차트객체와 동일한 종목은 차트객체 유지
- 기존에 없던 종목은 차트객체 생성
- 9시에 검색된 종목이 10시에 검색된 종목에 없으면 차트객체 삭제
- 새로 검색된 종목에 없어졌더라도 이미 주문이 들어간 종목은 차트객체 유지
(계좌확인으로 해야하는지??)
☞ 전체 차트객체 매수신호 대기
☞ 매수신호 발생시 주문