답변완료
거래량 순위로 종목검색될 수 있도록 기능 추가/수정 요청합니다.
스팟으로 프로그램 구현하고 있는 중에 "시장검색 > 거래량/거래대금 상위종목"을 사용하려고 테스트 해본 결과 제목과 달리 하위로 보이는 종목들도 검색되고 있었습니다. 그래서 담당자분에게 문의해보니 원래 전종목이 검색되는 것이 맞고 필요시 거래량 순으로 정렬해서 사용하라고 하시더군요.
답변이 전혀 이해되지는 않지만(정렬해서 짤라써야하 한다면 "거래량/거래대금 상위종목"과 같은 조건식은 왜 제공되고 있는건지? 만약 그렇다면 조건식이라고 얘기할 수 있는지도 모르겠습니다), 혹시나 검색결과 이벤트에서 수신한 데이터가 거래량이 높은 순으로 정렬되어있진 않을까 싶어 테스트해보니 거래량 순서와는 전혀 관계없는 것 같고...
스팟, 예스랭귀지의 모든 기능을 알지는 못하지만, 지금까지 다방면으로 테스트해본 결과 거래량 상위 종목을 필터할 수 있는 방법은 없는 것으로 판단됩니다. "시장검색 > 거래량/거래대금 상위종목"을 제목대로 의미있게 사용할 수 있도록 기능 추가 또는 수정을 요청드립니다. 혹시 다른 방법이 있다면 가이드 바랍니다.
[ 거래량 상위 종목 검색이 불가하다고 판단한 이유 ]
1. 키움영웅문의 "상위100종목"과 같이 특정 범위를 제한할 수 있는 옵션도 없고,
2. 스팟 이벤트에서 수신한 검색결과를 보면 소팅도 전혀 안되어 있고,
==> 일단 정렬이라도 되어있어야 관심종목이든 뭐든 연계해서 사용할 수 있을 것 같습니다.
3. 그렇다면 Market Data로 정렬하는 방법을 구현해야하는 것인데,
방금 검색된 569개 종목의 Market Data를 모두 수신하여 정렬하는 것은 현실적으로 불가
==> 한번에 요청할 수 있는 Market Data도 한정되어 있는 것으로 보이고,
569개 Market Data를 수신하여 프로그램 코드로 정렬하더라도 장중 상황은
이미 변경되어있을 것입니다.
[ 희망하는 기능 (스팟에서 구현 시) ]
1. 거래량, 거래대금 상위 X개 종목 필터
2. 1번이 안된다면 "시장검색 > 거래량/거래대금 상위종목" 검색 시 정렬된 결과로 수신
3. 1, 2번 모두 안된다면 트레이더 종목검색에서 설정한 옵션대로 정렬된 결과를 수신
설마 그러시진 않으시겠지만... 종목검색 설정에서 거래량 범위를 정하라와 같은 전혀 공감되지 않는 답변 말고, 말씀드린 사용 목적에 해당되는 적절한 가이드를 요청드립니다.
2018-05-23
3112
글번호 224433
답변완료
종목검색 후 자동매매(2)
안녕하세요.~
저번에 받은 도움으로 종목검색 후 자동매매는 잘 실행되고 있습니다.
다시 한번 감사드립니다.
이번에는 다르게 생각해서 시스템을 구현해 보려고 합니다.
다름이 아니오라,
종목검색은 하지않고, 기존의 관심종목에 있는 종목들로 확장차트를 생성하고,
시스템전략식을 적용하여 매수/매도 신호를 얻어 자동매매를 해보려고 합니다.
즉, 매매할 종목들을 사전에 관심종목에 추가해 놓고,
이 종목들로만 자동매매를 하려고 합니다.
바쁘신 와중에 죄송하지만, 수식을 부탁드립니다.
감사합니다.
===================================
//종목검색 후 자동매매
var ItemList;
var Count;
var ReqCount;
function Main_OnStart()
{
Main.MessageLog("스팟시작");
Main.MessageLog("종목검색시작");
Main.ReqPowerSearch("#파워종목검색명");
}
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],1,CHART_PERIOD_MINUTE,5000,CHART_REQCOUNT_BAR,false,StopSet);
var SystemSet = new SystemInfo("#시스템전략명", 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(50000/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("매도주문");
}
}
}
2018-05-21
2992
글번호 224431