메뉴 건너뛰기

추천 글

조회 수 7507 추천 수 6 댓글 11
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
최근 게시판에 예스스팟 관련한 댓글을 몇 번 달았더니 예스스팟을 활용해서 현물시스템을 구현하는 방법에 대한 메일을 받았읍니다. 전화로 나름 열심히 설명드렸지만 도저히 이해가 되질 않는다고 하셔서 끝내 코딩까지 만들어서 메일로 보내드리게 되었읍니다. 이왕 시간들여가며 만든 내용이니 혹시 관심있으신 분들은 참조하시라는 의미에서 그 분께 메일로 보냈던 내용을 약간 수정하여 이 곳에 올립니다.



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 파워종목검색"화면에서 해당종목들을 검색하실 수 있읍니다

PaWoJongMokGeomSaek_00000.jpg


검색이 끝난 후에 "종목내보내기"을 눌러 주시면 해당종목들을 관심종목으로 바로 보낼 수 있읍니다. 관심종목군의 이름을 "현물Sys"로 정했다면 "3201화면"의 관심종목 Tab에서 해당 종목이 등록되는 것을 보실 수 있읍니다.

JongMokNaeBoNaeGi.jpg



GwanSimJongMok.jpg



여기서 가장 중요한 것은 많은 종목이 관심종목에 올라가지만 확장챠트는 최대 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이 되지 않을까 생각해 봅니다.

혹시 예스스탁 관계자가 이 글을 보신다면 현물 시스템트레이딩에 필요한 객체추가를 고려해 주실 것을 부탁드립니다.

쓰고 나니 굉장히 장황한 글이 되었는데 '예스스팟을 활용하여 이런 것이 가능할 수도 있구나' 정도로 받아들여 주시면 고맙겠읍니다.


  • ?
    陽地 2014.07.04 19:15
    api를 이용하면 코스피와 코스닥 모든 종목 조건 감시하는 거 간단합니다. 실시간 객체 연결하고 검색 로직만 구현해 놓으면 한 종목이든 2천 종목이든 루프만 돌리면 되니까 문제될 거 없습니다. 제가 e 트레이드 꺼로 체결 데이터 테스트해 보니 키움증권 영웅문의 실시간 감시 기능보다 더 정밀하게 잡아냈습니다. com으로 했는데도 부하 별로 크지 않고요. 지금은 dll로 바꾸고 있습니다. 모든 종목을 한 번 걸러 1,500개 종목 실시간 감시 자동 실제 매매 현재 하고 있습니다.
    e 트레이드의 경우 코스피와 코스닥 모든 종목 실시간 객체 이용을 만류하고 최대 200개 정도만 하라고 합니다. 그러나 서버에 부하를 일으키는 주된 원인은 이렇게 이용하는 거보다 프로그래밍과 설계 미숙으로 인한 쿼리 호출 남발이죠. 전 종목 실시간 호가 이벤트 수신도 해 봤지만 잘 됐습니다. 중요한 건 이벤트 수신 이후 루프와 연산 제어입니다. 간혹 이 부분을 매끄럽게 처리하지 못 하여 부하를 키우는 분들이 계신 듯합니다.
    참고로 예스트레이더나 영웅문의 종목 검색 기능은 클라이언트가 하는 게 아니고 서버가 하는 건데요. 이론적으로는 서버가 하는 게 더 정확해야 하지만 제가 보기엔 서버 부하나 필터링으로 인해 정확하지 않았습니다. 후자를 의심합니다. 많은 사용자들의 실시간 종목 검색 연산을 서버가 다 수행하는 건 기대하기 힘들죠.
    영웅문은 예스트레이더와 달리 실시간으로 종목 검색이 이뤄지는 대신 자동 주문까진 되지 않습니다.
  • ?
    spec 2014.07.04 19:24
    양지님// 네. 조언 감사합니다.  솔직히 말씀드리면 개인적으로 한 번도 현물시스템에 대해서 고민을 해보거나 실제 운영해 본 경험이 전혀 없읍니다.  현물 전종목에 대하여 그 많은 데이터를 받는 것이 하드웨어적으로 엄청난 부하를 일으킬 수 있을 것 같다는 생각만 하고 있었는데 새로운 것을 배웠읍니다.  제게 질문 주신 분도 예스랭귀지 정도만 겨우 다룰 줄 아시는 초심자분이어서 그냥 제가 아는 범위에서만 예스트레이더라는 Tool에 한정해서 답변드렸던 것인데 많이 부족한 글이었던 것 같읍니다.
  • ?
    cordable 2014.07.04 19:37
    좋은 글 감사합니다. 많은 도움이 되었어요.
  • ?
    陽地 2014.07.04 19:50
    염려하시는 거처럼 부담스러운 작업은 아닙니다. 일단 증권회사 서버가 제공하는 실시간 데이터 자체가 빈도 필터링된 것이라서 한국거래소에서 발생하는 모든 이벤트를 송신하지 않습니다. 따라서 아무리 시장에서 난리가 난다 한들 송수신 부하가 무한정 커질 수는 없고요. 뻑이나도 한국거래소랑 증권회사 서버가 뻑이 나지 서버-클라이언트 송수신에서 문제가 생기지는 않습니다. 클라이언트가 받아서 연산을 하는 것도 요새 게임이나 4g 넘는 영화보는 거의 1/100 수준이나 될까요. 물론 이런 거야 상당 부분은 그래픽 카드가 수행하지만 ... 옵션의 경우 종목들이 적긴 하지만 클라이언트로 iv 한 번 구하는데 보통 루프 수 만 번씩 돕니다. 이 짓을 각 종목의 가격이 변할 때마다, 심지어는 매 체결 발생이나 매 호가 변경 시마다 해도 그다지 문제되지 않습니다.
  • ?
    spec 2014.07.08 19:22
    오늘 YesSpot Studio를 열어보다가 새로운 것을 발견했읍니다.  위의 글에서  종목검색과 관심종목등록이라는 수동단계를 자동화할 수 있도록  객체를 추가해 달라는 말씀을 예스스탁 측에 드렸는데 그것이 추가되어 있었읍니다. 분명히 위의 스팟코딩을 만들 때는 보지 못했던 것 같은데 오늘 보니 object에 추가 되어있었읍니다.

    ReqPowerSearch(사용자검색식이름)  이라는 형식으로 자동적으로 검색이 가능할 것 같고
    SendInterest(관심그룹명, 종목코드의 배열식, true)라는 형태로 관심종목등록이 자동으로 가능할 것 같읍니다.

    위의 새로운 객체를 Timer와 연동하면  API에서 처럼 리얼은 아니라고 하더라도 1분에 한 번씩  종목검색하여 관심종목항목을 자동적으로 업데이트 시킬 수 있을 것이라고 생각합니다.  참고 바랍니다.

  • ?
    다이엇푸 2014.07.09 08:28
    챠트 객체가 5개밖에 않된다는 점 아쉽네요
  • ?
    듀공 2014.07.23 13:35
    현재 스팟에서 확창차트는 최대 25개 까지 만들어 사용하실수 있습니다.
    (100개까지 늘릴 계획입니다)

    ReqPowerSearch로 검색식을 스팟식안에서 수행할수 있습니다.
    ReqPowerSearch("사용자검색조건")
    함수안에 이름을 지정해야 하는데 해당 이름은 종목검색식의 이름이 아니고
    파워종목검색화면에서 사용자조건검색으로 지정한 이름입니다.

    사용자검색조건은
    조건리스트에 종목검색식 추가하신후에 주기등 설정을 모두 하고
    조건저장을 클릭하셔서 이름지정하고 저장하시면 됩니다.
    저장하면 Spec님이 첨부하신 그림에서 AAA라는 이름과 같이 저장됩니다.
  • ?
    듀공 2014.07.23 14:25
    스팟시작할때 종목검색을 하고
    종목검색이 완료가 되면 리스트에서 맨위부터 25개 종목에 대해 차트를
    만들고 시스템을 적용하면 아래식

    ///////////////////////////////////////////////////////////////////////
    //스팟 시작할때 파워종목검색의 사용자검색조건 실행
    function Main_OnStart()
    {
                Main.ReqPowerSearch("AAA");//사용자검색조건명 지정
    }


    //종목검색 완료(aItemList : 종목리스트), (nCount : 종목수)
    function Main_OnRcvItemList(aItemList, nCount)
    {
                // 확장챠트의 생성과 적용될 시스템의 세부 설정
                var TradeSet =  new SystemTradeInfo(TRADE_FIXCOUNT,
                                                                                                                                                                            1,// 거래수량
                                                                                                                                                                            123456789,                  // 자산
                                                            1,                              // 단위수량
                                                            0, 0, CALCMETHOD_PERCENT,      // 진입/청산 수수료
                                                            0, 0, CALCMETHOD_POINT,            // 진입/청산 슬리피지
                                                            PYRAMIDING_ENTRY,                              // 피라미딩 설정여부
                                                            1000,                                          // 최대진입수량
                                                            20);                                          // 최대진입횟수
          

                //확장 챠트는 최대 25개까지만 가능
                for (var i = 0; i < Math.min(nCount,25); i++)
                {  
                            //생성할 차트 셋팅
                            var ChartSet = new ReqChartItem(aItemList[i], 5, CHART_PERIOD_MINUTE, 5000,CHART_REQCOUNT_BAR,false, false);
                            //차트에 적용할 시스템명 및 설정
                            var SystemSet  = new SystemInfo(시스템명,YL_TYPE_NORMAL,null,TradeSet,null);
                            Main.ReqChartEx(ChartSet,SystemSet);
                }  
    }

    //확장챠트에서 발생한 신호에 의해 주문을 넣는 단계
    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);
                }
    }






    //######################################################################################################################
  • ?
    spec 2014.07.23 17:49
    듀공님//  업데이트 감사합니다.
  • ?
    제로니모1 2014.11.05 22:05
    좋은 글 감사합니다.
  • ?
    니주구리 2014.11.25 15:32
    감사합니다.

List of Articles
번호 제목 글쓴이 날짜 조회 수
» YesSpot을 활용한 현물 시스템트레이딩 활용예제 11 file spec 2014.07.04 7507
140 우리나라 파생상품 제도 및 주변환경 변화 연보(???) 10 애니헬프 2014.06.04 3162
139 총호가건수cone, 총호가잔량 cone, 그리고 전략활용 (1/3) 1 file 제이(); 2014.01.08 3413
138 총호가건수cone, 총호가잔량 cone, 그리고 전략활용 (2/3) file 제이(); 2014.01.07 2148
137 총호가건수cone, 총호가잔량 cone, 그리고 전략활용 (3/3) 7 file 제이(); 2014.01.07 2827
136 포트폴리오에 꼭 포함되어야 할 시스템들. 6 푸른산 2013.09.13 6434
135 A Survey of Behavioral Finance 널널남아 2012.06.21 365
134 헤지펀드전략관련된 최근 학계논문추세 7 h1park 2011.12.20 4264
133 TS EasyLanguage 코딩시에 성능(속도)를 높일 수 있는 방법 (FOSPIA) 정은희 2011.12.09 2594
132 '기타 (법인)', 누구십니까? 3 널널남아 2011.11.21 846
131 [뉴스 클립] Special Knowledge <364> 국내 주요 주가지수들 설리 2011.10.13 1917
130 트위터에 기반한 헷지펀드 2 널널남아 2011.09.21 554
129 주가 예측에 관한 논문 두 편 2 널널남아 2011.09.19 924
128 시장을 압축하다 1~6 (모래알님 블로그) 15 정은희 2011.07.29 5952
127 세계의 상위100개 헤지펀드 [2011년 2월] (Bloomberg markets report) 널널남아 2011.07.28 355
126 Algo trading (Quant Congress USA 2011) (dolppi 님 블로그) 1 널널남아 2011.07.25 610
125 한국형 헤지펀드, 어디까지 준비되었나 (우리투자증권 Derivatives Weekly) 2 널널남아 2011.07.21 341
124 중국 CSI 300 선물 탐방 보고서 (우리투자증권 Derivatives Weekly) 널널남아 2011.07.11 322
123 외국인 종가 대량 매수의 의미 (대신경제연구소) 7 정은희 2011.07.08 5242
122 인간 VS 기계 - 알고리즘 혁명 (smallake님 블로그 '그대안의 작은 호수') 널널남아 2011.06.28 3715
Board Pagination Prev 1 2 3 4 5 6 7 8 Next
/ 8
위로