최근 게시판에 예스스팟 관련한 댓글을 몇 번 달았더니 예스스팟을 활용해서 현물시스템을 구현하는 방법에 대한 메일을 받았읍니다. 전화로 나름 열심히 설명드렸지만 도저히 이해가 되질 않는다고 하셔서 끝내 코딩까지 만들어서 메일로 보내드리게 되었읍니다. 이왕 시간들여가며 만든 내용이니 혹시 관심있으신 분들은 참조하시라는 의미에서 그 분께 메일로 보냈던 내용을 약간 수정하여 이 곳에 올립니다.
1.YesSpot을 활용한 현물 시스템트레이딩의 개요
원래 현물을 대상으로 하는 완벽한 시스템트레이딩이라고 한다면 일단 거래소와 코스닥의 모든 종목을 실시간으로 watching하고 있다가 조건에 맞는 종목이 등장하면 자동적으로 진입하여 청산 조건이 나올 때까지 보유하다가 수익청산이나 Stop청산이 가능해야 할 것 입니다.
일견 어렵지 않을 것 같아 보이지만 일반적인 선물/옵션 시스템과 달리 구현하는데 많은 어려움이 발생합니다. 기술적으로 가장 어려운 것은 거래소와 코스닥의 1,000개가 넘는 종목을 실시간으로 데이터를 받고 처리해야된다는 점이 아닐까 생각합니다. 그래서 많은 분들이 현물시스템 트레이딩을 설계하실 때 Full Automation보다는 트레이더의 수동조작이 포함되는 Semi Automation방식을 선호하시는 것 같읍니다. 제게 메일을 주셨던 분이 원하는 방식도 위의 Semi형태였기에 예스트레이더 4.0 버젼부터 포함되어 있는 예스스팟을 활용하여 현물시스템을 구현하는 예제를 설명해 보도록 하겠읍니다. 제가 사용하려고 만든 것도 아니고 급하게 만들다 보니 좀 어설픈 것이 사실이지만 예스스팟의 또 다른 활용 예가 되지 않을까 하여 이 곳에 올리기로 하였읍니다.
(1) 종목검색
우선 장 중에 리얼로 모든 종목의 시세변동을 watching하는 것은 예스트레이더로는 불가능합니다. 직접 시도를 한 적은 없지만 API를 통해서도 구현은 쉽지 않아 보입니다. 따라서 이 부분은 예스트레이더의 기능 중에 하나인 종목검색기능을 활용해서 수동으로 해결하는 것으로 하였읍니다.
예스트레이더의 종목검색기능의 한계는 실시간으로 자동으로 종목검색이 되지 않는다는 점입니다. 따라서 사용자가 직접 검색버튼을 눌러야만 검색이 가능합니다. 메일을 주신 뿐께서는 아침 장 시작 전에 전일의 일봉을 기준으로 매매하려고 하는 종목을 검색하여 그것에 시스템을 적용하신다고 하셔서 아쉽지만 이 방법을 사용하게 된 것 입니다.
(2)관심종목 등록
다음으로는 위에서와 같이 검색된 종목을 관심종목에 직접 등록해 주셔야 합니다. 다만 다음에서 설명할 YesSpot에서의 확장챠트가 최대한 5개까지만 사용이 가능하므로 위의 종목검색에서 검색된 종목 중 가장 확실한 종목을 최대 5개까지만 등록하셔야 합니다. 여기까지가 사용자가 장 시작 전 수동으로 해주어야 하는 단계입니다.
(3)확장챠트의 활용
예스스팟에서는 확장챠트라는 기능이 있는데 이것을 활용하면 앞의 단계 이외의 모든 것을 자동화할 수 있읍니다.
확장챠트란 실제로 예스트레이더에 챠트를 띄우는 것이 아니라 가상의 챠트를 메모리에 띄우는 것으로 최대 5종목의 가상챠트를 띄울 수 있읍니다. 위의 관심종목에 5개이하의 종목을 올려만 놓으시면 예스스팟을 통하여 자동으로 원하는 종목의 챠트가 가상의 공간에 charting됩니다.
이 개념을 저한테 질문하신 분한테 설명을 해도 이해를 잘못하셔서 결국 제가 직접 다 만들어서 드리는 해프닝(?)이 발생하였는데, 쉽게 설명하면 다음과 같읍니다.(참고로 더 이상 메일 보내셔도 시스템을 직접 만들어서 보내드리는 일은 안하겠읍니다. 실력없는 저한테는 시간적으로도 그렇고 능력범위 밖입니다.)
가령 5종목을 watching하려고 실제 챠트를 띄우게 되면 매일 종목이 바뀌어지는 문제로 매일 아침에 새롭게 챠트를 생성한 후 에 거기에 각각 시스템을 적용시켜야 하는 번거로움이 발생합니다.
확장챠트를 활용하시면 이러한 과정이 자동화되어 종목검색 후 관심종목에 옮겨논 종목에 대해서 컴퓨터가 알아서 챠트를 띄우고 거기에 맞는 시스템을 가상의 공간에 적용시켜줍니다.
각 과정을 나눠서 세밀하게 보도록 하겠읍니다.
2. 종목검색 및 관심종목 등록
(1) 예스랭귀지 Editor에 가셔서 "종목검색" 부분에 검색식을 작성하시면 됩니다. 참고로 "검색"부분에 작성하시면 안됩니다.
(2)검색식은 본인이 매매하고 픈 현물종목의 조건들을 coding해주시면 되는데 대부분 강한 종목은 돌파형 로직으로 작성하시면 되고, 메일 보내 주신 분은 강했던 종목이 조정을 보이는 것을 조건으로 하셨읍니다.
(3)검색식이 작성되면 아래 그림과 같이 화면번호 "3202 파워종목검색"화면에서 해당종목들을 검색하실 수 있읍니다
검색이 끝난 후에 "종목내보내기"을 눌러 주시면 해당종목들을 관심종목으로 바로 보낼 수 있읍니다. 관심종목군의 이름을 "현물Sys"로 정했다면 "3201화면"의 관심종목 Tab에서 해당 종목이 등록되는 것을 보실 수 있읍니다.
여기서 가장 중요한 것은 많은 종목이 관심종목에 올라가지만 확장챠트는 최대 5개까지만 지원되므로 매매하려고 하시는 종목을 관심종목의 맨위부터 순서대로 배치하셔야 한다는 점입니다. Drag&Drop방식으로 5개를 배치하시면 됩니다. 해당되지 않는 종목을 관심종목에서 삭제하실 필요는 없읍니다. 그냥 맨 위 부터 5종목만이 적용된다는 뜻입니다.
3. 시스템 식의 작성
(1) 검색된 종목을 트레이딩하기 위한 시스템식을 역시 Editor에서 작성하시면 됩니다.
(2)세밀한 제어를 위해서는 분봉로직으로 짜시는게 편해 보입니다.
(3)진입과 청산에서 분할진입과 분할청산이 요구되는 경우가 많은 것 같은데 이 부분은 예스랭귀지 메뉴얼을 참고 하셔서 정확히 코딩하셔야 합니다. 분할진입과 분할청산은 좀 헛갈리는 부분이 많고 onclose방식과 atstop방식의 코딩이 다르므로 정확하게 코딩하셔야 합니다.
4. YesSpot로직 작성
(1) 이제 자동매매를 위하여 YesSpot을 활용하여 관심종목에 있는 종목에 대하여 확장챠트를 띄우고 각각의 시스템을 적용하도록 하여야 합니다.
(2) 해당코딩은 다음과 같읍니다.
코딩내용을 요약하면
1) 관심종목에 있는 종목들을 찾아내어
2) 가상의 확장챠트를 띄운 후 미리 작성된 시스템을 적용시킨 후에
3)가상챠트에서 매매신호가 발생하면 그에 따라 매매가 이뤄지도록 한다.
관심그룹명과 시스템명은 외부변수로 뽑아서 사용된 것이며. 만약 코딩내에 직접입력하기 위해서는 string변수이므로 " "를 써서 해당부분에 넣으셔도 됩니다.
////////////////////////////////////////////////////////////////////////////////////////
var JongmokNum ;
var JongmokCode = new Array(10);
var ChartSet = new Array(10);
var SystemSet = new Array(10);
function Main_OnStart()
{ //스팟 전략이 시작되면 우선 관심종목에 포함된 종목의 수를 리턴받도록 합니다..
JongmokNum = Main.GetItemCountOfInterest(관심그룹명);
// 확장챠트의 생성과 적용될 시스템의 세부 설정
var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT,
1, // 거래수량
123456789, // 자산
1, // 단위수량
0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료
0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지
PYRAMIDING_ENTRY, // 피라미딩 설정여부
1000, // 최대진입수량
20); // 최대진입횟수
// 확장 챠트는 최대 5개까지만 가능하므로 아래와 같이 경우를 나눠서 코딩해 주어야 합니다.
if ( JongmokNum <= 5)
{
for (var i = 0; i < JongmokNum ; i++)
{
JongmokCode[i]= Main.GetItemCodeInInterest(관심그룹명, i);
ChartSet[i] = new ReqChartItem(JongmokCode[i], 5, CHART_PERIOD_MINUTE, 5000,CHART_REQCOUNT_BAR,false, false);
SystemSet[i] = new SystemInfo(시스템명,YL_TYPE_NORMAL,null,TradeSet,null);
Main.ReqChartEx(ChartSet[i],SystemSet[i]);
}
}
else
{
for (var i = 0; i < 5 ; i++)
{
JongmokCode[i]= Main.GetItemCodeInInterest(관심그룹명, i);
ChartSet[i] = new ReqChartItem(JongmokCode[i], 5, CHART_PERIOD_MINUTE, 5000,CHART_REQCOUNT_BAR, false, false);
SystemSet[i] = new SystemInfo(시스템명,YL_TYPE_NORMAL,null,TradeSet,null);
Main.ReqChartEx(ChartSet[i],SystemSet[i]);
}
}
}
//확장챠트에서 발생한 신호에 의해 주문을 넣는 단계
function Main_OnRiseSignal(ChartEx, Signal)
{
//buy신호 발생
if (Signal.signalKind == 1)
{ // 매수주문
Account1.OrderBuy(Signal.code, Signal.count , Signal.price, 0);
}
//Exitlong신호 발생
if (Signal.signalKind == 2)
{
// 매도주문
Account1.OrderSell(Signal.code, Signal.count , Signal.price, 0);
}
}
######################################################################################################################
이 모든 것이 끝나시면 장 개시 전이나 혹은 장 중이라도 수동으로 종목을 검색하셔서 관심종목에 등록만 시키시면 나머지는 정해진 로직에 의하여 매매가 이뤄지는 Semi 현물 시스템을 구현할 수 있읍니다.
아직 예스트레이더가 현물 쪽 시스템트레이딩의 지원이 많이 약한데, 예스스탁 측에서 만약 종목검색과 관심종목 등록단계를 자동화할 수 있도록 YesSpot에 해당 Object를 추가만 해 준다면 그때에는 상당히 강력한 Tool이 되지 않을까 생각해 봅니다.
혹시 예스스탁 관계자가 이 글을 보신다면 현물 시스템트레이딩에 필요한 객체추가를 고려해 주실 것을 부탁드립니다.
쓰고 나니 굉장히 장황한 글이 되었는데 '예스스팟을 활용하여 이런 것이 가능할 수도 있구나' 정도로 받아들여 주시면 고맙겠읍니다.
1.YesSpot을 활용한 현물 시스템트레이딩의 개요
원래 현물을 대상으로 하는 완벽한 시스템트레이딩이라고 한다면 일단 거래소와 코스닥의 모든 종목을 실시간으로 watching하고 있다가 조건에 맞는 종목이 등장하면 자동적으로 진입하여 청산 조건이 나올 때까지 보유하다가 수익청산이나 Stop청산이 가능해야 할 것 입니다.
일견 어렵지 않을 것 같아 보이지만 일반적인 선물/옵션 시스템과 달리 구현하는데 많은 어려움이 발생합니다. 기술적으로 가장 어려운 것은 거래소와 코스닥의 1,000개가 넘는 종목을 실시간으로 데이터를 받고 처리해야된다는 점이 아닐까 생각합니다. 그래서 많은 분들이 현물시스템 트레이딩을 설계하실 때 Full Automation보다는 트레이더의 수동조작이 포함되는 Semi Automation방식을 선호하시는 것 같읍니다. 제게 메일을 주셨던 분이 원하는 방식도 위의 Semi형태였기에 예스트레이더 4.0 버젼부터 포함되어 있는 예스스팟을 활용하여 현물시스템을 구현하는 예제를 설명해 보도록 하겠읍니다. 제가 사용하려고 만든 것도 아니고 급하게 만들다 보니 좀 어설픈 것이 사실이지만 예스스팟의 또 다른 활용 예가 되지 않을까 하여 이 곳에 올리기로 하였읍니다.
(1) 종목검색
우선 장 중에 리얼로 모든 종목의 시세변동을 watching하는 것은 예스트레이더로는 불가능합니다. 직접 시도를 한 적은 없지만 API를 통해서도 구현은 쉽지 않아 보입니다. 따라서 이 부분은 예스트레이더의 기능 중에 하나인 종목검색기능을 활용해서 수동으로 해결하는 것으로 하였읍니다.
예스트레이더의 종목검색기능의 한계는 실시간으로 자동으로 종목검색이 되지 않는다는 점입니다. 따라서 사용자가 직접 검색버튼을 눌러야만 검색이 가능합니다. 메일을 주신 뿐께서는 아침 장 시작 전에 전일의 일봉을 기준으로 매매하려고 하는 종목을 검색하여 그것에 시스템을 적용하신다고 하셔서 아쉽지만 이 방법을 사용하게 된 것 입니다.
(2)관심종목 등록
다음으로는 위에서와 같이 검색된 종목을 관심종목에 직접 등록해 주셔야 합니다. 다만 다음에서 설명할 YesSpot에서의 확장챠트가 최대한 5개까지만 사용이 가능하므로 위의 종목검색에서 검색된 종목 중 가장 확실한 종목을 최대 5개까지만 등록하셔야 합니다. 여기까지가 사용자가 장 시작 전 수동으로 해주어야 하는 단계입니다.
(3)확장챠트의 활용
예스스팟에서는 확장챠트라는 기능이 있는데 이것을 활용하면 앞의 단계 이외의 모든 것을 자동화할 수 있읍니다.
확장챠트란 실제로 예스트레이더에 챠트를 띄우는 것이 아니라 가상의 챠트를 메모리에 띄우는 것으로 최대 5종목의 가상챠트를 띄울 수 있읍니다. 위의 관심종목에 5개이하의 종목을 올려만 놓으시면 예스스팟을 통하여 자동으로 원하는 종목의 챠트가 가상의 공간에 charting됩니다.
이 개념을 저한테 질문하신 분한테 설명을 해도 이해를 잘못하셔서 결국 제가 직접 다 만들어서 드리는 해프닝(?)이 발생하였는데, 쉽게 설명하면 다음과 같읍니다.(참고로 더 이상 메일 보내셔도 시스템을 직접 만들어서 보내드리는 일은 안하겠읍니다. 실력없는 저한테는 시간적으로도 그렇고 능력범위 밖입니다.)
가령 5종목을 watching하려고 실제 챠트를 띄우게 되면 매일 종목이 바뀌어지는 문제로 매일 아침에 새롭게 챠트를 생성한 후 에 거기에 각각 시스템을 적용시켜야 하는 번거로움이 발생합니다.
확장챠트를 활용하시면 이러한 과정이 자동화되어 종목검색 후 관심종목에 옮겨논 종목에 대해서 컴퓨터가 알아서 챠트를 띄우고 거기에 맞는 시스템을 가상의 공간에 적용시켜줍니다.
각 과정을 나눠서 세밀하게 보도록 하겠읍니다.
2. 종목검색 및 관심종목 등록
(1) 예스랭귀지 Editor에 가셔서 "종목검색" 부분에 검색식을 작성하시면 됩니다. 참고로 "검색"부분에 작성하시면 안됩니다.
(2)검색식은 본인이 매매하고 픈 현물종목의 조건들을 coding해주시면 되는데 대부분 강한 종목은 돌파형 로직으로 작성하시면 되고, 메일 보내 주신 분은 강했던 종목이 조정을 보이는 것을 조건으로 하셨읍니다.
(3)검색식이 작성되면 아래 그림과 같이 화면번호 "3202 파워종목검색"화면에서 해당종목들을 검색하실 수 있읍니다
검색이 끝난 후에 "종목내보내기"을 눌러 주시면 해당종목들을 관심종목으로 바로 보낼 수 있읍니다. 관심종목군의 이름을 "현물Sys"로 정했다면 "3201화면"의 관심종목 Tab에서 해당 종목이 등록되는 것을 보실 수 있읍니다.
여기서 가장 중요한 것은 많은 종목이 관심종목에 올라가지만 확장챠트는 최대 5개까지만 지원되므로 매매하려고 하시는 종목을 관심종목의 맨위부터 순서대로 배치하셔야 한다는 점입니다. Drag&Drop방식으로 5개를 배치하시면 됩니다. 해당되지 않는 종목을 관심종목에서 삭제하실 필요는 없읍니다. 그냥 맨 위 부터 5종목만이 적용된다는 뜻입니다.
3. 시스템 식의 작성
(1) 검색된 종목을 트레이딩하기 위한 시스템식을 역시 Editor에서 작성하시면 됩니다.
(2)세밀한 제어를 위해서는 분봉로직으로 짜시는게 편해 보입니다.
(3)진입과 청산에서 분할진입과 분할청산이 요구되는 경우가 많은 것 같은데 이 부분은 예스랭귀지 메뉴얼을 참고 하셔서 정확히 코딩하셔야 합니다. 분할진입과 분할청산은 좀 헛갈리는 부분이 많고 onclose방식과 atstop방식의 코딩이 다르므로 정확하게 코딩하셔야 합니다.
4. YesSpot로직 작성
(1) 이제 자동매매를 위하여 YesSpot을 활용하여 관심종목에 있는 종목에 대하여 확장챠트를 띄우고 각각의 시스템을 적용하도록 하여야 합니다.
(2) 해당코딩은 다음과 같읍니다.
코딩내용을 요약하면
1) 관심종목에 있는 종목들을 찾아내어
2) 가상의 확장챠트를 띄운 후 미리 작성된 시스템을 적용시킨 후에
3)가상챠트에서 매매신호가 발생하면 그에 따라 매매가 이뤄지도록 한다.
관심그룹명과 시스템명은 외부변수로 뽑아서 사용된 것이며. 만약 코딩내에 직접입력하기 위해서는 string변수이므로 " "를 써서 해당부분에 넣으셔도 됩니다.
////////////////////////////////////////////////////////////////////////////////////////
var JongmokNum ;
var JongmokCode = new Array(10);
var ChartSet = new Array(10);
var SystemSet = new Array(10);
function Main_OnStart()
{ //스팟 전략이 시작되면 우선 관심종목에 포함된 종목의 수를 리턴받도록 합니다..
JongmokNum = Main.GetItemCountOfInterest(관심그룹명);
// 확장챠트의 생성과 적용될 시스템의 세부 설정
var TradeSet = new SystemTradeInfo(TRADE_FIXCOUNT,
1, // 거래수량
123456789, // 자산
1, // 단위수량
0, 0, CALCMETHOD_PERCENT, // 진입/청산 수수료
0, 0, CALCMETHOD_POINT, // 진입/청산 슬리피지
PYRAMIDING_ENTRY, // 피라미딩 설정여부
1000, // 최대진입수량
20); // 최대진입횟수
// 확장 챠트는 최대 5개까지만 가능하므로 아래와 같이 경우를 나눠서 코딩해 주어야 합니다.
if ( JongmokNum <= 5)
{
for (var i = 0; i < JongmokNum ; i++)
{
JongmokCode[i]= Main.GetItemCodeInInterest(관심그룹명, i);
ChartSet[i] = new ReqChartItem(JongmokCode[i], 5, CHART_PERIOD_MINUTE, 5000,CHART_REQCOUNT_BAR,false, false);
SystemSet[i] = new SystemInfo(시스템명,YL_TYPE_NORMAL,null,TradeSet,null);
Main.ReqChartEx(ChartSet[i],SystemSet[i]);
}
}
else
{
for (var i = 0; i < 5 ; i++)
{
JongmokCode[i]= Main.GetItemCodeInInterest(관심그룹명, i);
ChartSet[i] = new ReqChartItem(JongmokCode[i], 5, CHART_PERIOD_MINUTE, 5000,CHART_REQCOUNT_BAR, false, false);
SystemSet[i] = new SystemInfo(시스템명,YL_TYPE_NORMAL,null,TradeSet,null);
Main.ReqChartEx(ChartSet[i],SystemSet[i]);
}
}
}
//확장챠트에서 발생한 신호에 의해 주문을 넣는 단계
function Main_OnRiseSignal(ChartEx, Signal)
{
//buy신호 발생
if (Signal.signalKind == 1)
{ // 매수주문
Account1.OrderBuy(Signal.code, Signal.count , Signal.price, 0);
}
//Exitlong신호 발생
if (Signal.signalKind == 2)
{
// 매도주문
Account1.OrderSell(Signal.code, Signal.count , Signal.price, 0);
}
}
######################################################################################################################
이 모든 것이 끝나시면 장 개시 전이나 혹은 장 중이라도 수동으로 종목을 검색하셔서 관심종목에 등록만 시키시면 나머지는 정해진 로직에 의하여 매매가 이뤄지는 Semi 현물 시스템을 구현할 수 있읍니다.
아직 예스트레이더가 현물 쪽 시스템트레이딩의 지원이 많이 약한데, 예스스탁 측에서 만약 종목검색과 관심종목 등록단계를 자동화할 수 있도록 YesSpot에 해당 Object를 추가만 해 준다면 그때에는 상당히 강력한 Tool이 되지 않을까 생각해 봅니다.
혹시 예스스탁 관계자가 이 글을 보신다면 현물 시스템트레이딩에 필요한 객체추가를 고려해 주실 것을 부탁드립니다.
쓰고 나니 굉장히 장황한 글이 되었는데 '예스스팟을 활용하여 이런 것이 가능할 수도 있구나' 정도로 받아들여 주시면 고맙겠읍니다.
e 트레이드의 경우 코스피와 코스닥 모든 종목 실시간 객체 이용을 만류하고 최대 200개 정도만 하라고 합니다. 그러나 서버에 부하를 일으키는 주된 원인은 이렇게 이용하는 거보다 프로그래밍과 설계 미숙으로 인한 쿼리 호출 남발이죠. 전 종목 실시간 호가 이벤트 수신도 해 봤지만 잘 됐습니다. 중요한 건 이벤트 수신 이후 루프와 연산 제어입니다. 간혹 이 부분을 매끄럽게 처리하지 못 하여 부하를 키우는 분들이 계신 듯합니다.
참고로 예스트레이더나 영웅문의 종목 검색 기능은 클라이언트가 하는 게 아니고 서버가 하는 건데요. 이론적으로는 서버가 하는 게 더 정확해야 하지만 제가 보기엔 서버 부하나 필터링으로 인해 정확하지 않았습니다. 후자를 의심합니다. 많은 사용자들의 실시간 종목 검색 연산을 서버가 다 수행하는 건 기대하기 힘들죠.
영웅문은 예스트레이더와 달리 실시간으로 종목 검색이 이뤄지는 대신 자동 주문까진 되지 않습니다.