BLOG main image
ddd (50)
CUDA programming (0)
알고리즘 트레이딩 (5)
Cherry Picker 개발 (23)
TSimulator 개발(종료) (11)
IT 노트 (1)
잡동사니 (2)
사진 (4)
일기 (4)
이력서 (0)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
'EasyLanguage'에 해당되는 글 5건
2013. 9. 27. 07:58

Cherry Picker 란?


정의 :

'증권 API 를 이용한 실시간 알고리즘 트레이딩' 및 '과거 틱데이터, 분데이터를 이용한 알고리즘 전략 시뮬레이션'을 수행하기 위해 개발된 라이브러리 (LIB 또는 DLL 형태)


이해하기 쉬운 정의 :

전략 아이디어만 몇 줄의 코드로 작성하면 나머지 모든 귀찮고 복잡한 처리들을 알아서 수행시켜주는 똘똘한 녀석. 여기서 말하는 '나머지' 일들이란...

(1) 증권사에 접속

(2) 전략에서 요구하는 어떠한 데이터든지 수량에 관계없이 실시간으로 자동연결

(3) 전략을 실시간으로 감시하다가 주문조건이 맞으면 자동으로 증권사에 주문

(4) 포지션 관리는 물론 복수의 전략을 포트폴리오로 단위로 묶어서 관리가 가능

(5) 실제 운용뿐 아니라 과거의 성과를 알아보기 위한 가상테스트가 가능

정도...


개발 시작 날짜 :

2011년 2월부터 현재까지


개발 언어 :

첫 반 년은 Java 로 개발하다가 그 후로 C++ 로 전환


기능(2013년 12월 12일 현재) :

* 데이터

    * 증권사 API 에서 제공하는 모든 실시간 정보 이용 가능 (알고리즘 트레이딩 카테고리의 '심볼리스트' 참조)

    * 과거데이터를 이용한 가상거래에서도 모든 데이터를 사용 가능

    * 전략에 사용되는 데이터 형태는 틱, 분, 시간, 일 등 모든 형태로 가공이 가능

* 함수

    * 모든 금융공학 관련 함수 이용 가능

    * 사용자 정의함수 추가 기능

    * 함수 내부에서 과거데이터 참조기능(average(close, 5) 형태)

    * 함수 내부에서 다른 함수의 재귀호출 가능

* 전략

    * 전략이란 전략에 사용되는 정보가 갱신될 때마다 수행되는 부분을 의미(TradeStation 과 동일한 형태)

    * 전략의 기본형태는 데이터 처리 -> 조건분석 -> 진입 or 청산

    * 같은 포트폴리오에 포함된 전략끼리는 포트폴리오 정보를 공유

    * 복수의, 다양한 형태(틱, 분 등)의 데이터를 하나의 전략에서 사용 가능

* 주문

    * 증권사 API 를 통해 복수의 종목을 동시에 주문 가능

    * 과거데이터를 이용한 가상거래시에는 프로그램 내부에서 주문 및 체결을 가정함

    * 포트폴리오 내부의 전략들의 주문이 상쇄되는 주문일 경우 무효처리되도록 감지

* 조회 및 전략 모니터링

    * CUI 형태로 전략 및 포트폴리오 상황 모니터링이 가능

    * CUI 형태로 체결, 미체결, 잔고, 손익결과 조회 가능


사용자 인터페이스 :

아래 5 개의 클래스가 사용자가 취급해야하는 클래스의 전부다.


Symbol : 이 클래스에 데이터를 등록한다.

Strategy : 이 클래스를 파생시킨 후 'run' 함수를 재정의 하면 재정의된 함수는 특정 타이밍마다 수행된다.

SymbolMgr : Symbol 과 Strategy 를 이 클래스에 등록시켜 관리한다.

TFile : 백테스트시 과거데이터 파일의 경로를 이 클래스에 세팅 후, Symbol 에 등록한다.

XingManager : 증권사와 데이터 통신을 담당한다.


블로그를 만든 이유


이 블로그는 제가 현재 개발하고 있는 Cherry Picker 라는 트레이딩 및 분석툴의 개발과정과 Cherry Picker 를 이용한 시장분석 및 트레이딩 성과 등을 포스팅하므로서 저와 같이 시스템 트레이딩 및 트레이딩툴 개발에 관심이 있는분들과 정보를 공유하는 목적을 가지고 있습니다.


블로그 메뉴 소개


* 알고리즘 트레이딩 -> Cherry Picker 를 이용한 알고리즘 트레이딩 및 분석 예제

    * 전략구현 프로세스 -> 빠른 전략 구현을 위한 전략구현 프레임(전략 구현 가이드)

    * 심볼 리스트 -> 현재 Cherry Picker 에서 전략 구현 시 사용 가능한 심볼 정보

    * (1) 알고리즘 트레이딩 전략 1

    * (2) 알고리즘 트레이딩 전략 2

    * (3) ...

* Cherry Picker 란? -> Cherry Picker 에 대한 설명

    * Cherry Picker 소개 -> Cherry Picker 및 블로그에 대한 소개

    * Cherry Picker 샘플 -> Cherry Picker 의 사용 예

* Cherry Picker 개발 -> Cherry Picker 개발 정보

    * 일정 -> Cherry Picker 의 개발 일정

    * 개발노트 -> Cherry Picker 개발에 관련된 내용

* TSimulator 개발 -> Cherry Picker 이전명칭으로 그에 대한 개발 정보 (업데이트 종료)

    * TSimulator 소개 -> TSimulator 에 대한 설명

    * 일정 -> TSimulator 의 개발 일정 (업데이트 종료)

    * 개발노트 -> TSimulator 개발에 관련된 내용 (업데이트 종료)

* 전략 시스템 성과 -> TradeStation 및 Cherry Picker 를 이용하여 테스트한 실제 운용전략 성과

    * 전략 pool -> 수익여부와 관계없이 백테스트한 모든 전략들의 특징과 성과를 모아뒀다.

    * 실거래를 위한 성과기준 -> 전략 pool 에서 실거래 가능한 전략을 추출하기 위한 성과기준

    * 실거래 전략 xxx -> 실거래를 위한 성과기준을 통과한 전략들의 상세 성과를 보고

    * 실거래 전략 포트폴리오 -> 실거래 전략들로 구성된 포트폴리오의 성과

* 일기 -> 가끔 생각하는 이야기들

* 잡동사니 -> 개인적인 관심사

    * 기타 -> 기타정보

2013. 9. 14. 15:11

주의깊게 읽었던 책 중 하나인 'Way of the TURTLE(한국제목 : 터틀의 방식)' 에 'E-ratio(Edge-Ratio)' 에 대한 소개가 있다. E-ratio 란 특정 진입이 우위성이 있는지 여부를 판단하는데 사용된다고 하는데 꽤 쓸만한 전략검증도구라 생각되어 테스트를 해봤다.

먼저 E-ratio 가 무엇인지 어떻게 구하는지 간단히 설명하겠다. (책에서 인용했다)


 


 

책을 보고 직접 그려본 그림인데 위 상황은 특정 시점에 매수진입을 한 상태이다. 매수진입 이후 일정기간이 경과할때까지의 

 

    (A) 최저가격과 진입가격의 차이가 MAE(Miniimum Favorable Excursion)

    (B) 최고가격과 진입가격의 차이가 MFE(Maximum Favorable Excursion)

 

이다. (매도의 경우 반대) 이 MFE, MAE 를 가지고 다음을 통해 E-ratio 를 구할 수 있다.

 

1. MAE 와 MFE 를 ATR 로 나눈다. (변동성을 반영하고 데이터를 정규화시킬 수 있다.)

2. 1에서 구한 값을 MAE, MFE 별로 합산하고 빈도수로 나누면,

    가격 변동성이 반영된 평균 MAE, MFE 가 구해진다.

3. 가격 변동성이 반영된 평균 MFE 를 가격 변동성이 반영된 평균 MAE 로 나눈값이

    'E-ratio' 이다.

 

E-ratio 가 크면 평균 MFE 가 평균 MAE 보다 높으므로 진입 후 가격이 유리한 방향으로 평균적으로 많이 진행된다는 해석이 가능하다.


E-ratio 분석에는 전략구현 프로세스 version 1 을 적용하겠다.


=== 전략구현 프로세스 version 1 ===


1. 전략을 구현할 때 필요한 데이터(symbol)는 무엇인가?

  • KOSPI200 선물

2. 필요한 데이터 중 실시간으로 변하는 데이터와 그렇지 않은 데이터는 무엇인가?

  • 실시간으로 변하는 데이터

        Symbol Data 1 : KOSPI200 선물

  • 실시간으로 변하지 않는 데이터

        없음

3. 전략에서 사용될 symbol 은 분봉인가 틱봉인가?


    Minute Bar


4. 전략에서 사용될 symbol 의 time interval 은?


    Symbol Data 1 : KOSPI200 선물 (5 Minute Bar)


5. 첫 전략루프를 수행할 때 필요한 과거봉 개수는?

 

    50 개


6. 최근 몇 개까지의 과거봉을 참조할 수 있나?


    300 개


=== Strategy Flow ===


1. 장 시작 후 바로 전략을 수행시킬 것인가? 일정하거나 상황에 따라 다른 term 을 두고 수행시킬 것인가?


    09:51:00 부터


2. 장 종료시까지 전략을 수행시킬 것인가? 일정하거나 상황에 따라 다르게 전략을 중지시킬 것인가?


    15:00:00 까지


3. 거래대상은 무엇인가?

 

    Symbol Data 1


4. 거래계약수는 몇 개인가?


    1개


5. 매수(매도) 준비신호는?

 

    없음


6. 매수(매도) 신호는?


    a. 무작위 종가 진입

    b. Bollinger 밴드를 상향돌파하면 종가 매수, 하향돌파하면 종가 매도

 

7. 환매도(환매수) 신호는?


    E-ratio 측정기간이 지나면 바로 청산




이 포스팅에서 분석해볼 내용은 다음과 같다.

 

1. 매수 또는 매도진입을 random 하게 수행할 경우 이론적으로는 모든 기간데 대해 E-ratio 가 1 이 나       와야한다. 이 가정이 맞는지 확인해볼 것이다.

2. 특정 전략의 E-ratio 를 기간별로 구하고 분석을 해본다.


먼저 무작위 매수 또는 매도진입이 MAE, MFE 기간에 관계없이 E-ratio 가 1 이 나오는지를 검증해볼 것이다. 

테스트 기간은 2004년 8월 2일부터 2009년 6월 30일까지로 약 5년이며 데이터는 KOSPI200 선물가격이다.


전략코드는 다음과 같다.



    



OHLC 가격이 모두 같은 지점이 있을 경우에는 ATR 이 0 이 나올 수 있으므로 (특히 side break 같이 시장이 멈춰있을 때, 분봉은 계속 OHLC 가 모두 같게 기록된다.) 그런 케이스는 누락시키는 조치를 했다. ATR 의 길이는 MAE, MFE 를 구하는 기간과 같게 했다.


봉 1 개부터 10 개까지의 MAE, MFE 구간을 구한 뒤 E-ratio 를 구해보니 다음과 같은 결과가 나왔다.



( X 축 : MAE,MFE 측정기간, Y 축 : E-ratio )


위 그림을 보면 무작위로 들어간 매도 또는 매수진입은 거의 일정하게 1.0 부근의 E-ratio 가 나온다는것을 알 수 있고, 평균은 0.99 로 무작위 진입전략의 진입 우위성은 없다고 판단할 수 있다. (E-ratio 가 1.0 을 넘는다고 볼 수 없으므로...)



( X 축 : MAE, MFE 발생횟수, Y 축 : 누적된 MAE,MFE )


위 그림은 무작위 진입전략의 MAE 와 MFE 를 ATR 로 나누어 표준화 한 값들의 누적그래프다. 하나의 선이라고 볼 수 있을 정도로 MAE 와 MFE 는 거의 같은 각도로 상향해가는 것처럼 보인다. 두 선이 정확하게 일치하면

E-ratio 는 정확히 1.0 이 나올것이고 만약 E-ratio 가 1.0 이상이라면 MFE 선이 상향될 것임을 알 수 있다.



Normalized MAE 평균 : 1.89

Normalized MFE 평균 : 1.83

( X 축 : MAE, MFE 발생횟수, Y 축 : MAE 또는 MFE )


위 그림은 표준화된 MAE 또는 MFE 의 분포를 점으로 찍은 그림이다. 눈으로 판단하기에는 무리가 있으나 육안으로는 차이가 없어보이며 각 평균이 1.89, 1.83 으로 거의 같게 나오므로 역시 무작위 진입전략은 진입우위가 존재하지 않는다고 볼 수 있다.



다음은 이동평균선을 이용한 전략을 간단하게 만들어봤다. 진입 부분의 코드는 다음과 같다.




필터없이 3 이동평균이 5 이동평균을 상향돌파하면 매수, 하향돌파하면 매도를 하는 전략이다. 코드만 봐도 성과는 나쁠거라는 느낌이 팍팍 든다...;


무작위 진입전략과 같은 분석을 해봣다.



( X 축 : MAE,MFE 측정기간, Y 축 : E-ratio )


예상대로 1.0 을 밑도는 E-ratio 값이 듬성듬성 보인다. 평균은 0.95 로 1.0 보다 낮다. 필터없는 이동평균전략은 진입 우위성이 없을 뿐더러 오히려 떨어지는 결과가 나온다.


( X 축 : MAE, MFE 발생횟수, Y 축 : 누적된 MAE,MFE )


누적된 표준 MAE, MFE 그래프를 보면 파란선인 표준 MAE 가 빨간선인 표준 MFE 를 시간이 지날수록 상회한다. 이 그래프역시 진입 우위성이 떨어지는 전략이라는걸 뒷받침한다.


Normalized MAE 평균 : 1.91

Normalized MFE 평균 : 1.78

( X 축 : MAE, MFE 발생횟수, Y 축 : MAE 또는 MFE )


분포그림은 양쪽이 비슷해보이나 평균값은 차이가 있음을 말해주고있다.



마지막으로 필터를 추가한 이동평균 전략의 E-ratio 를 알아보기로 하자.


진입전략코드는 다음과 같다.



세 개의 이동평균을 이용하며 Fast(3), Med(5), Slow(10) 이동평균이 정배열이 되는순간 매수, 역배열이 되는순간 매도를 하는 전략이다. Med 와 Slow 의 배열상태가 필터역할을 한다. 이 전략 역시 수익성 면에서는 큰 성과는 없어보이지만 필터가 있으므로 없을 때보다는 많은 노이즈가 걸러질 것이다.


그럼 분석결과를 보자. 꽤 의미있는 결과가 나왔다.



( X 축 : MAE,MFE 측정기간, Y 축 : E-ratio )


그림만 봐도 1.0 을 상회하는걸 알 수 있다. 평균 E-ratio 는 1.08 로 진입 우위성이 확실히 존재한다는걸 알 수 있다. 필터를 추가함으로서 진입 우위성에 큰 향상이 있다는게 밝혀졌다.


( X 축 : MAE, MFE 발생횟수, Y 축 : 누적된 MAE,MFE )


빨간선인 표준 MFE 의 누적값은 파란선인 표준 MAE 의 누적값을 시간이 갈 수록 상회하므로 진입 우위성이 있다고 판단된다.


Normalized MAE 평균 : 1.80

Normalized MFE 평균 : 1.91

( X 축 : MAE, MFE 발생횟수, Y 축 : MAE 또는 MFE )


분포그래프로는 차이점이 잘 보이지 않는다(괜히 넣었나;;;). 하지만 평균을 보면 MFE 가 높으므로 진입우위성이 있다고 판단할 수 있다.




결론


E-ratio 는 진입우위성을 판단하는 지표다. E-ratio 가 1.0 을 기준으로 높으면 진입우위성 존재, 낮으면 진입우위성이 없다고 판단한다. 무작위 진입전략은 E-ratio 가 0.99 로 나와 기대와 같은 결과를 내줬고, 성과가 떨어질 것으로 예상되는 이동평균전략은 E-ratio 가 0.95 로 역시 진입우위성이 없었으며, 필터를 추가함으로서 좀 더 개선된 전략인 이동평균전략은 E-ratio 가 1.08 로 진입우위성이 존재함을 확인했다.


추가정보로 MAE, MFE 측정기간이 끝날 때 청산하는 로직을 추가했을 때의 수익결과는 다음과 같다.


무작위 전략                        : 62,425,000   원 손실

이동평균 전략                     : 106,525,000 원 손실

필터가 추가된 이동평균 전략 : 35,500,000   원 수익


이로서 E-ratio 를 이용한 진입우위성 판단분석을 마치겠다.

2013. 5. 24. 00:17

TS 의 easy language 를 사용하여 전략을 짤 때 시장가로 주문하는경우를 제외하고 stop 이나 limit 으로

주문할 경우 주문가를 코드상에 입력하게 되어있다. 보통 다음 세 가지 방식 중 한 가지로 주문가를 입력할 것이다.


1. symbol 정보를 사용한 주문가격

    ex. buy next bar close stop, buy next bar close stop + 1 ...


2. 변수를 사용한 주문가격

    ex. buy to cover next bar sExitPrice stop, ...


3. 함수의 리턴값을 바로 주문가격으로 사용

    ex. sell short next bar average( close, 10 ) stop, ...


1 번의 경우 예외없이 입력한 가격 그대로 주문가격이 된다. close 가 250.25 면 250.25 로 주문가격이 되는것이다. 그렇다면 2, 3 번의 경우는 어떨까? 250.25 가 아닌 250.26 또는 250.2488 이런식이라면? 


인터넷을 찾아봤을 때 명료한 설명이 없어 본인이 가정하고 테스트한 로직을 끄적여보겠다. 100% 정확하지는 않지만 테스트케이스 양은 상당하니 어느정도는 믿어볼만 하다.


처음 TS 내부로직 분석을 시작할 즈음에는 다음과 같이 결론을 내렸었다. (KOSPI200 선물을 기준으로 삼았다)


=== 입력가 -> 주문가 변환 로직 (구버전) ===


1. stop 주문의 경우

    * buy 주문은 입력가격과 같은가격의 호가 또는 입력가격보다 큰 가격 중 가장 가까운 호가

    * sell 주문은 입력가격과 같은가격의 호가 또는 입력가격보다 작은 가격 중 가장 가까운 호가

2. limit 주문의 경우

    * buy 주문은 입력가격과 같은 가격의 호가 또는 입력가격보다 작은 가격 중 가장 가까운 호가

    * sell 주문은 입력가격과 같은 가격의 호가 또는 입력가격보다 큰 가격 중 가장 가까운 호가


예를 들면 buy stop 을 하는데 입력가격이 250.26 라 가정하면 250.26 은 호가단위가 아니므로 250.26 보다 큰 가격 중 가장 가까운 호가가 주문가가 되는것이다. 그러면 주문가는 250.30 이 되겠다.


이런 로직을 CherryPicker 에 반영시키고나서 한동안은 별 탈이 없었는데, 테스트케이스를 늘리는 과정에서 TS 주문가격과 달라지는 문제가 터져버렸다. buy stop 에서 입력가는 250.00045 였는데 위 로직대로라면 주문가는 250.05 여야하는데 실제로는 250.00 이 주문가격이 돼버린 것이다. 약간의 테스트 끝에 마지막으로 반영시킨 로직은 다음과 같고 이 로직은 현재까지 별 다른 문제를 보이지 않고 있다.


=== 입력가 -> 주문가 변환 로직 (신버전) ===


1. stop 주문의 경우

    * buy 주문은 입력가격에서 0.0005 를 차감한 후에 앞서 설명한 로직을 따름

    * sell 주문은 입력가격에서 0.0005 를 더한 후에 앞서 설명한 로직을 따름

2. limit 주문의 경우

    * buy 주문은 입력가격에서 0.0005 를 더한 후에 앞서 설명한 로직을 따름

    * sell 주문은 입력가격에서 0.0005 를 차감한 후에 앞서 설명한 로직을 따


구버전의 로직과의 차이는 0.0005 를 더하거나 빼주는것 밖에 없다. 의외로 간단하지만 약간의 트릭을 써야한다. 

CherryPicker 에 반영된 코드를 몇 줄 가져와보면 다음과 같다.


ex ) buy stop 일 때,입력가격을 인자로 받는 함수인 firUp 의 구현


double fitUp( double aPrice )

{

    double sDnPrice = (float)aPrice - 0.0005f;

    int        sIntPrice = (int)( sDnPrice * 100.00 );

    int        sTemp    = sIntPrice / 5;


    return (double)( ( sTemp * 5 ) + 5 ) / 100.00;

}


보다시피 0.0005 를 빼주거나 더해주는 작업을 할 때는 float 타입으로 변환시켜 약간 부정확한(?) 연산을 해야만한다. TS 개발자의 의도를 알 수는 없지만 저렇게 해야만 TS 와 같은 결과를 낳을 수 있다.

TS 는 7 버전부터 데이터를 double 타입으로 다루기 시작했는데 전부 배제시키지는 않은 모양이다.


buy stop 의 예제를 그림으로 알기쉽게 표현하면 다음과 같다. (그림을 넣을 필요는 없지만 태블렛 노트북을 산 의미를 부여하기 위해 몇 컷 넣어본다..;;)





2012. 9. 10. 13:36

TS 의 기능은 많다 그것도 아주 많이.. 그 많은 기능들을 하나하나 개인이 벤치마킹하기에는 좀 부담스러운건 사실이다. 하지만 대부분 일반적인 시스템 거래에서는 쓰이지 않으며 또 쓰인다 한들 현재 진행중인 프로젝트의 기능 테스트만 제대로 구축한 상태라면 1. 기능 추가, 2. 전체 기능 테스트 수행 <-- 이거면 끝이다.


현재 프로젝트를 진행하면서 굵직굵직한 기능들을 추가하면서 완전한 TS 또는 그 이상의 기능에 도전해왔다.

지금까지의 TSimulator 는 멀티 심볼 기능을 지원했지만, 1분봉만 사용할 수 있는 제한적 기능이었다.

하지만 이 기능만으로 TS 의 주문 알고리즘과 함수 알고리즘을 테스트 하기에는 무리가 없었다.


하지만 주문 알고리즘, 함수 알고리즘은 끝낸 시점에서 남은 작업은 복수의 time frame 을 심볼에 등록할 수 있게 만드는 일이다. 이 작업이 끝나면 남은 굵직한 작업은 다음과 같다.


1. 전략의 결과 분석 툴

2. 실시간 데이터와의 접목


1번의 전략의 결과 분석 툴은 시간문제일 뿐 어려운 작업은 없다. 여기서 중요한건 TS 에서 제공하는 결과 분석 툴 이상의, 다양한 툴을 앞으로 개발해 나가는 것이다.

2번의 실시간 데이터와의 접목... 이거 역시 시간문제인데, 하나의 문제점이 있다면 TS 에서의 실시간 거래 결과와 또 비교를 해봐야 하는데, 과거 데이터야 이미 어마어마한 테스트 자료가 있지만 실시간 처리가 잘 되는지는 매일매일 신경을 써줘야하는 부분이다. 하지만.. 이것도 밀어붙이면 다 해결될 일... 


각설하고.. 결과적으로는 멀티 심볼 적용 작업이 완료되었다. 이제부터 당분간은 테스트 케이스를 늘려나가는 작업에 들어갈 것 같다. 이 작업이 참 재미있는게, TSimulator 결과 TS 의 그것과 일치하면 일치하는대로 좋지만 뭔가 허전하다. 회사 팀장님이 새로 개발중인 프로그램에서 버그가 많이 나오면 호신호라고 말씀하신게 심히 공감이 간다. 너무 일이 잘 진행이 되면 불안한 기분이랄까.. 무튼 그렇게 완성도를 높혀가는게 정석이라고 여겨진다.


이전에 포스팅 한 글 중에 CEP 엔진을 이용한 시스템 트레이딩 개발을 시작하려고 한다는 글이 있을것이다. 그런데 TSilmulator 에서 작은 버그들이 계속 터지면서 그동안 나름 바빴서 아직 시작을 못했다..^^;; 당분간 테스트 케이스를 늘려가면서 천천히 시작해야할것 같다.. 시기는.. .9월 말쯤부터...?

2012. 3. 16. 10:58
TS 의 함수의 많은 부분이 기술적 분석 치표를 그리는데 필요한 값을 구하는 함수이다. (ADX, RSI, DMI 등)
이 함수들을 포함한 많은 TS 의 기본함수들은 일반적인 프로그램에서 구현하는 함수와는 조금 다른 특성을 가지고 있다.

"historical value"

무슨 말이냐 하면 예를 들어 설명하자. aaa() 라는 함수가 있다. 이 함수의 구현은 다음과 같다. 

////////////////////////////////////////////////////////////////////////////
Vars: a(0), b(0);

a = 0;
b = 0;

if (CurrentBar = 1) then begin
    b = 10;
    aaa = b;
end
else
    // a 에 필요에 의한 임의의 값을 대입
    b = a + b[1]; // 'b[1]' 은 이 함수의 1기 전의 b 의 값, 그러니까 현재 9시 10분이면 9시 9분에 돌린 b 의 값
    aaa = b;
end;
////////////////////////////////////////////////////////////////////////////

대충 이렇다. 변수 a 는 전혀 중요하지 않으니 변수 b 에만 주목하자. 이 함수가 정상적으로 동작하기 위해서는 TS 에서는 1기 전의 b 의 값, 그러니까 b[1] 의 값을 어디엔가 가지고 있어야한다.  초보자들은 저 코드를 보면 도대체 어디에 그 값을 가지고 있지? 라고 생각이 든다. TS 에서 사용하는 EasyLanguage 는 너무 고수준 언어라서 그런 잡다한건(중요하지만) 다 내부적으로 처리할것이다. 그래서 필자는 c++ 로 TS 함수를 구현할 때, 함수 내부에서 static map 을 사용하여 관리한다.

이거 말고도 TS 코드에 나타나 있지 않은 비밀들이 많다. 가장 큰 비밀은 바로 저런 과거값을 사용하는 함수들은 전략 코드에서 실제 사용이 되던 되지 않던 무조건 수행된다는 점.. 이건 다음에 기회가 되면 적어보도록 하겠다..  필자같은 초보 코더들은 이런 로직을 알아내는게 꽤 큰 난관이다. TS 함수 로직을 열심히 print 찍어가면서 알아내면서 큰 난관을 5개 정도 만났는데 지금은 어느정도 안정화가 된거 같아 전략 개발에만 신경쓸 수 있는날이 머지 않은거 같다.. 끝! 
prev"" #1 next