예스스탁
예스스탁 답변
2020-04-21 18:17:12
안녕하세요
예스스탁입니다.
아래 내용 참고하셔서 수정보완해 사용하시기 바랍니다.
var 검색주기 = 120;//120초
var ItemList = [],CT = [];
var HHMMSS,req;
function Main_OnStart()
{
CTcnt = 0;
Main.SetTimer(1, 5000);
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 >= 090000 && CT.length < 50)
{
Main.KillTimer(1);
Main.MessageList("종목검색 요청");
Main.ReqPowerSearch("전략1");
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
Main.MessageList("종목검색 완료 nCount : ",nCount);
if (nCount > 0)
{
ItemList = [];
//첫검색일때
if (CT.length == 0)
{
ItemList = aItemList;
}
else //두번쨰 이후(차트가 만들어진 종목을 제외하고 새로운 종목만 집계)
{
for (var i = 0; i < nCount; i++ )
{
var add = true;
for (var x = 0; x < CT.length; x++ )
{
if (aItemList[i] == CT[x].GetCode(1))
{
add = false;
}
}
if (add == true)
{
ItemList.push(aItemList[i]);
}
}
}
Main.MessageList("종목검색 완료 ItemList :",ItemList.length);
//집계된 종목이 1개 이상이면 순차적으로 차트객체 요청
if (ItemList.length > 0 && CT.length < 50)
{
req = 0;
var StopSet = new SystemStopInfo(new StopLoss(4, CALCMETHOD_PERCENT, 0xFFDA93),
new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0),
//new StopProfitTarget(10, CALCMETHOD_PERCENT, 0xFFDA93),
//new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93),
new StopEndOfDay(151500));
var ChartSet = new ReqChartItem(ItemList[req],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet);
var SystemSet = new SystemInfo("10전략1", YL_TYPE_NORMAL, null, null, StopSet);
Main.MessageList("현재차트갯수 : ",CT.length);
Main.MessageList(req,"차트객체요청 : ",ItemList[req]);
Main.ReqChartEx(ChartSet,SystemSet);
}
else
{
if (CT.length < 50)
{
Main.SetTimer(1, 검색주기*1000);//120초
}
}
}
}
function Main_OnRcvChartEx(ChartEx)
{
if (ItemList[req] == ChartEx.GetCode(1))
{
CT[CTcnt] = ChartEx;
Main.MessageList(CTcnt,"차트객체생성 : ",CT[CTcnt].GetCode(1));
CTcnt = CTcnt +1;
req = req + 1;
if (req < ItemList.length && CT.length < 50)
{
var StopSet = new SystemStopInfo(new StopLoss(4, CALCMETHOD_PERCENT, 0xFFDA93),
new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0),
//new StopProfitTarget(10, CALCMETHOD_PERCENT, 0xFFDA93),
//new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93),
new StopEndOfDay(151500));
var ChartSet = new ReqChartItem(ItemList[req],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet);
var SystemSet = new SystemInfo("10전략1", YL_TYPE_NORMAL, null, null, StopSet);
Main.MessageList("현재차트갯수 : ",CT.length);
Main.MessageList(req,"차트객체요청 : ",ItemList[req]);
Main.ReqChartEx(ChartSet,SystemSet);
}
else
{
Main.MessageList("Search1 차트객체요청종료");
//만들어진 차트가 50개 이하이면
if (CT.length < 50)
{
Main.SetTimer(1, 검색주기*1000);//120초
}
}
}
}
//신호발생
function Main_OnRiseSignal(ChartEx, Signal)
{
//신호발생 종목에 대해 잔고셋팅
Account1.SetBalance(Main.GetOrderCode(Signal.code),0);
//매수신호이고 잔고가 없을때만 매수
if (Signal.signalKind == 1 && Account1.Balance.count == 0)
{
Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),0,1);
Main.MessageLog("매수주문");
}
if (Signal.signalKind == 2)
{
//전체미체결주문 갯수
var num = Account1.GetTheNumberOfUnfills();
//전체 미체결수 만큼 루프를 돌면서
for (var i = 0; i < num; i++)
{
//미체결을 하나씩 셋팅하고
Account1.SetUnfill(i);
//미체결종목이 신호종목과 같고 미체결수량이 있으면
if (Account1.Unfill.code == Main.GetOrderCode(Signal.code) && Account1.Unfill.count > 0)
{
Account1.OrderCancel(Account1.Unfill.orderNum);
}
}
//잔고수량만큼만 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,0,1);
Main.MessageLog("매도주문");
}
}
}
즐거운 하루되세요
> 짱짱해야지 님이 쓴 글입니다.
> 제목 : 검색식 새 종목에 대한 매매
> 1. 2분간격으로 사용자 종목검색을 지속적으로 수행
2. 새로 검색된 종목에 대해 차트 생성, 기존 검색된 차트는 유지
3. 종목검색에서 새로 파악된 종목을 종목차트로 시스템 적용
4. 생성된 차트에 시스템 적용
5. 차트 생성이 50개가 되면 새 종목 추가 완료
아래 내용은 다른분이 이전에 질문한 답변입니다.
여기에서 파워종목검색이 2분간격시간에 따라 추가되는 종목에 대한 추가 매수는 어떻게 하면 좋을까요?
var ItemList;
var Count;
var ReqCount;
function Main_OnStart()
{
Main.MessageLog("스팟시작");
Main.MessageLog("종목검색시작");
Main.ReqPowerSearch("전략1");
}
function Main_OnRcvItemList(aItemList, nCount)
{
ItemList = aItemList;
Count = nCount;
Main.SetTimer(1, 1000);
ReqCount = 0;
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
var StopSet = new SystemStopInfo(new StopLoss(4, CALCMETHOD_PERCENT, 0xFFDA93),
new StopTrailing(2, 5, CALCMETHOD_PERCENT, 0),
//new StopProfitTarget(10, CALCMETHOD_PERCENT, 0xFFDA93),
//new StopInactivity(0.5, 6, CALCMETHOD_PERCENT, 0xFFDA93),
new StopEndOfDay(151500));
var ChartSet = new ReqChartItem(ItemList[ReqCount],3,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet);
var SystemSet = new SystemInfo("10전략1", YL_TYPE_NORMAL, null, null, null);
Main.ReqChartEx(ChartSet,SystemSet);
Main.MessageLog("확장차트생성_"+ItemList[ReqCount]);
ReqCount = ReqCount+1;
if (ReqCount == Count)
{
Main.KillTimer(1);
Main.MessageLog("종목검색완료");
}
}
}
//신호발생
function Main_OnRiseSignal(ChartEx, Signal)
{
//신호발생 종목에 대해 잔고셋팅
Account1.SetBalance(Main.GetOrderCode(Signal.code),0);
//매수신호이고 잔고가 없을때만 매수
if (Signal.signalKind == 1 && Account1.Balance.count == 0)
{
Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),0,1);
Main.MessageLog("매수주문");
}
if (Signal.signalKind == 2)
{
//전체미체결주문 갯수
var num = Account1.GetTheNumberOfUnfills();
//전체 미체결수 만큼 루프를 돌면서
for (var i = 0; i < num; i++)
{
//미체결을 하나씩 셋팅하고
Account1.SetUnfill(i);
//미체결종목이 신호종목과 같고 미체결수량이 있으면
if (Account1.Unfill.code == Main.GetOrderCode(Signal.code) && Account1.Unfill.count > 0)
{
Account1.OrderCancel(Account1.Unfill.orderNum);
}
}
//잔고수량만큼만 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,0,1);
Main.MessageLog("매도주문");
}
}
}