85
궐 – chamtime 1, 2, 3( 궐궐 : main+sub) 궐 – 궐 1, 궐 2, 궐 1( 궐궐 -Main) ( 궐궐 : main + sub) 궐 – 1, 2 궐 – 1, 2 궐 – 1, 2 Main+sub 궐 궐 궐궐궐궐 Savejnl, rth, iqr, app_d, prp 궐 궐궐 궐궐궐 궐궐궐 궐궐 – 1, 2 궐궐 – 1, 2 궐궐 궐궐 – 1, 2 궐궐 ( 궐궐 ) – 1, 2, 3, 4 궐궐 – 1, 2 궐궐 – 1, 2, 3, 4 궐궐 ( 궐궐 ) – 1, 2, 3, 4 CTP 12-1 궐 궐궐궐 = 32-2 궐 궐궐 12-2 궐 4궐 16 궐 32-2 궐 Main Savejnl, rth, Sub Savejnl, rt Real 1 Real 2 Test 궐 궐궐 궐궐 궐궐

궐련 – chamtime 1, 2, 3( 백업 : main+sub ) 관통 – 신 1, 신 2, 구 1( 관통 - Main) ( 백업 : main + sub) 초상 – 1, 2 중융 – 1, 2 중강 – 1, 2

  • Upload
    renee

  • View
    35

  • Download
    2

Embed Size (px)

DESCRIPTION

12-1 개 선물사 = 32-2 개 서버. Main+sub 는 한 서버에서 Savejnl , rth , iqr , app_d , prp_d , vcs 가 모두 작동함. 금사닥. 궐련 – chamtime 1, 2, 3( 백업 : main+sub ) 관통 – 신 1, 신 2, 구 1( 관통 - Main) ( 백업 : main + sub) 초상 – 1, 2 중융 – 1, 2 중강 – 1, 2. Main Savejnl , rth , iqr , app_d , prp_d. - PowerPoint PPT Presentation

Citation preview

Page 1: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

궐련 – chamtime 1, 2, 3( 백업 : main+sub)관통 – 신 1, 신 2, 구 1( 관통 -Main) ( 백업 : main + sub)초상 – 1, 2중융 – 1, 2중강 – 1, 2

Main+sub 는 한 서버에서Savejnl, rth, iqr, app_d, prp_d, vcs가 모두 작동함금사닥

중신 – 1, 2중항 – 1, 2

항생

흥업 – 1, 2국제 ( 화원 ) – 1, 2, 3, 4화태 – 1, 2 창원 – 1, 2, 3, 4동증 ( 장강 ) – 1, 2, 3, 4

CTP

12-1 개 선물사 = 32-2 개 서버

12-2 개

4 개

16 개

32-2 개

MainSavejnl, rth, iqr, app_d, prp_d

SubSavejnl, rth, vcs

Real 1 Real 2Test 서버 있는 곳중신화태중항

Page 2: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

궐련 – chamtime 1(8:42, 20:42), 2(8:40, 20:40), 3(8:42, 20:42)( 백업 : main+sub)관통 – 신 1(8:42, 20:42), 신 2(8:40, 20:40), 구 1(8:42, 20:42)( 관통 -Main) ( 백업 : main + sub)초상 – 1, 2중융 – 1(8:42, 20:42), 2(8:40, 20:40)중강 – 1(8:42, 20:42), 2(8:40, 20:40)

금사닥

중신 – 1(8:42, 20:42), 2(8:40, 20:40)중항 – 1(8:42, 20:42), 2(8:40, 20:40)

항생

흥업 – 1(8:25, 20:32), 2(8:20, 20:30) 26 분 , 36 분국제 ( 화원 ) – 1(8:25, 20:32), 2(8:20, 20:30), 3(8:35, 20:42), 4(8:30, 20:40)화태 – 1(8:25, 20:32), 2(8:20, 20:30) 창원 – 1(8:35, 20:32), 2(8:30, 20:30), 3(8:35, 20:42), 4(8:30, 20:40) 43 분동증 ( 장강 ) – 1(8:25, 20:32), 2(8:20, 20:30), 3(8:25, 20:32), 4(8:20, 20:30)

CTP Test 서버 있는 곳중신화태중항

서버 초기화 시간

Page 3: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

선물거래소 선물사( 회원사 ) 투자자들

선물거래소 투자자들Api 벤더

선물사 ( 회원사 )

1. 시세2. 거래주문

요청응답

Trapi

선물 거래소 (sever) 에서 api, tr 을 결정

회사 서버

8 월 14 일

Page 4: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

선물사의 수익= 고객의 구매결제 수수료선물사의 종류1. 특정지역을 거점으로 하는 작은 선물사2. 광범위한 지역을 총체적으로 서비스하는 거대 선물사선물사는 1. Api 에 관심없음 , 돈만 벌으면 됨2. 특정지역을 거점으로 하는 선물사는 api 를 생각할 여력이 없음

항생선물사 ( 회원사 )

CTP 금사닥선물사는 여러 벤더를 선택하여 사용할 수도 있음

tick : quote 서버에서 받은 시세정보

Page 5: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

tickTick(quote 서버에서 온 시세정보 ) 을 시세로 볼 수도 있고전체 그래프를 시세로 볼 수 있음

Page 6: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

선물거래소

선물사벤더프로그램 회사서버 클라이언트 프로그램

내부 ip 외부 ip

투자자

주요 벤더 선물사 개수항생 2 개CTP 4 개

금사닥 6~7 개

파싱 , 해석

Page 7: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

벤더에 따라 우리 서버와 연결 구조가 다름B2B(business to business) 회사 <-> 한 회사가 대표 <-> 여러 개인B2C(business to custom) 회사 <-> 여러 개인

b2b

b2c

회사 서버벤더

벤더

고객들

고객들

인증절차 거침

인증절차 거침

인증절차 없음

Page 8: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

회사 서버의 주요기능1. Tick 정보를 저장2. 예전 정보를 고객들에게 보여주도록 함3. 고객과 선물사 사이에서 주문과 체결의 정보 통로의 역할을 함서버나 고수는 처음 시작시 아무런 정보가 가지고 있지 않아서맨 처음 초기화 작업은 기본이 되는 선물사별 종목의 월물을 가져오는 것부터 시작함그리고 그 가져온 정보를 토대로 저장할 공간을 미리 예측하여 잡아 놓음

Page 9: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

< 금사닥 구조 > B2B

Deltaserver gaoshouOrder서버

push서버

quote서버

벤더Order/ push 서버 고수 프로그램

Quote

Order / push

Order 서버 역할 1. 주문된 정보를 delta 서버에서 order 로 보냄2. 처리상태 (api) 를 delta 서버에 알려줌Push 서버 역할 (delta 서버로 보내는 역할만 함 )1. 처리상태 (api) 를 delta 서버에 알려줌Quote 서버 역할2. 주문 시세에 대한 요청을 delta 서버에서 받음3. 주문 시세에 대한 정보를 delta 서버로 보냄

벤더가 order/push 서버 , quote 서버를 한 개씩 가지고 있음Order 와 push 는 한 서버 안의 각각의 프로세스로 볼 수 있음각각의 포트번호는 다름( 정확한 것은 아님 , 추측임 ) 30 개의 쓰레드로 연결

모든 연결은 항상 연결되어 있음 ( 쓰레드로 연결 )

order서버

Page 10: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

< 금사닥 구조 > B2B

Deltaserver gaoshouOrder서버

push서버

quote서버

벤더Order/ push 서버 고수 프로그램

Quote

Order / push

계좌 로그인 과정 있음계좌로그인 과정 없음

Page 11: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

<CTP 구조 > B2C

Deltaserver

Order서버

push서버

quote서버

벤더Order/ push 서버

고수 프로그램

Quote

금사닥용gaoshou

CTPGCE

모든 연결은 항상 연결되어 있음 ( 쓰레드로 연결 )하지만 빨간색으로 연결된 연결은 필요할 때만 연결빨간색 연결은 서버간 부수적 기능을 위해 연결

Dll 파일금사닥 <-> CTP 변환모듈

Order 서버 , push 서버 , quote 서버역할은 금사닥 구조와 같음Centos 6.x 버전 이상에서 가동가능

Quote Order/push

Page 12: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

< 항생 구조 > B2B

Order서버

push서버

quote서버

벤더Order/ push 서버 고수 프로그램

Quote 금사닥용gaoshou

push

App_d

Deltaserver

HSGCE

변환기App_d <-> HS GCE

프로세스

프로세스 서로 다른 내부 포트끼리네트워크로 연결됨

모든 연결은 항상 연결되어 있음 ( 쓰레드로 연결 )

Order 서버 , push 서버 , quote 서버역할은 금사닥 구조와 같음

Order

App_d 와 gce 간의 30 개의 쓰레드 연결

pushOrder

Page 13: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

회사 내부에서 사용하는 프로세스 간에는 거의 공유메모리로 연결됨

-----------------------------------------------------------------------------------

8 월 15 일

rth

공유메모리( 구조체 )

종목 마스터 파일*.mst

1. quote 서버와 order 서버로 부터 tick( 시세 + 종목 ) 의 정보를 받아 파싱하여 우리 서버 내에서 사용 가능한 형태로 변환하여 공유메모리에 저장 ,마스터 정보를 만듬2. 시스템 내부에서 사용 가능한 형태로 변환하여 내부로 전달3. 시스템 내부로 전달시 db 를 참조하여 선물사의 종목마다 전날에 가장 거래량이 많았던 월물을 연결선물로 표시하고 이 정보를 전달

시세서버로부터 받은 시세정보와Order 서버로부터 받은 마스터정보 ( 종목정보 ) 를 저장하고 있음

고수 프로그램 ( 사용자 프로그램 ) 에서 마스터정보 ( 종목정보 ) 를요청하므로 이 정보가 만들어지게 됨

Page 14: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

VCS 고수 프로그램1. 마스터 정보 ( 종목 정보 ) 파일을 요청

2. SUP 의 마스터 정보 ( 종목 정보 ) 파일을 가지고 와서 고수프로그램으로 반환

sup

공유메모리( 구조체 )

종목 마스터 파일

Page 15: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

연결선물 ( 가상종목 ) – 1. 월물 8888 – 어제 전일 미결제 약정 개수가 가장 큰 것2. 월물 9999 - 어제 ( 과거 ) 거래되었던 정보 , 사용자들은 이 정보를 통해 종목의 흐름과예측을 하는데 사용함예 ) 금 1308 (2013 년 8 월 금 월물 ) 금 9999 <- 어제 금에 대한 거래가 가장 활발한 했던 때의 정보를 나타냄 9999( 월물의 연결선물에 해당하는 번호 )Order 서버에서는 현재의 상황만 보내줌rth 는 모든 선물사의 종목에 대한 tick 정보를 받음Tick = order 서버에서 종목 정보 + quote 서버에서 시세정보지금까지 받은 데이터를 db 에서 분석하여(db 에 지금까지 모든 시스템 내부 형식으로 변환된 tick 정보가 저장되어 있음 )선물사의 종목별로 어제 가장 거래량이 활발한 월물을 알아냄찾아낸 월물 = 연결선물

Page 16: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

Crontab 의 마지막 작업 (db 프로시저 )월물 8888 을 만듬월물 8888 ( 전일 미결제 약정 개수가 가장 큰 것 )

월물 8888 의 특징 1. 역전을 허용 x 어제 월물 8888 = ag1308 오늘 월물 8888 = ag1309 내일 월물 8888 = ag1308(x)2. 갭차이를 없애줌 ( 끊어지지 않고 이어져 보이게 함 ) 이전의 db 내용을 갭차이만큼 + 거나 –를 해서 정보가 이어져 보이게 함

갭차이갭차이를 없애 이어보이도록 함

Page 17: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

Order/pushserver

rth

Quoteserver

공유메모리( 구조체 )

종목 마스터 파일

*.mst

마스터 정보( 종목정보 )

시세 ( 호가포함 )( 종목 마스터 파일에 연결선물과 관련된 정보 없음 )

1.

rth 가 종목 마스터 파일은공유메모리를 참조하여 만듬

Page 18: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

Order/pushserver

rth

Quoteserver

공유메모리( 구조체 )

종목 마스터 파일

*.mst

마스터 정보( 종목정보 )

시세 ( 호가포함 )( 구조체 안에 연결선물이라는 변수가 존재하지는 않음 )

rth 실행순서① 종목 마스터 정보 받음 ( 필요한 때만 연결 ) 1) 마스터 정보 요청 ( 인증 절차 거침 ) 1. 6018 모든 선물사에 대한 종목을 요청 2. 6017 모든 선물사의 종목에 대한 상세정보 요청 2) 마스터 정보 받음 ( 인증을 통과했을 때 )② 시세를 요청 1) 종목 시세 정보 요청 ( 인증 절차 거침 ) 2) 종목이 없어질 때까지 order 서버는 시세를 계속 보냄 ( 인증을 통과했을 때 )

Page 19: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

Order/pushserver

rth

Quoteserver

공유메모리( 구조체 )

종목 마스터 파일

*.mst

마스터 정보( 종목정보 )

시세 ( 호가포함 )( 구조체 안에 연결선물이라는 변수가 존재하지는 않음 )

3. 받은 마스터 정보를 내부적으로 사용할 수 있는 형태로 변환4. 연결선물 9999, 8888 에 대한 정보를 생성해냄5. 멀티캐스트로 정보를 보냄 ( 시세정보는 계속 멀티캐스트를 보내지만 마스터정보와 연결선물 정보는 시작 시 한번만 보냄 )

Page 20: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

선물 시장개인은 예탁금과 선물을 buy 하거나 sell 한 종목에 대한 위치를 가지고 있음선물은 원래 어떤 상품 (쌀 , 곡식 등 ) 의 값이 변동폭이 클 때 그 위험을 줄이기 위해서 미리 날짜와 가격을 정해놓는데서 시작을 했습니다 . 예를 들면 , 올해는 쌀값이 폭등할 것 같아서 미리 얼마에 사겠다고값을 정해놓는 것이죠 . 이 가격은 쌀을 미래 시점에 판매할 사람과 미래 시점에 팔사람이 정합니다 . 현재 증권시장에서의 선물은 쉽게 생각해서 쌀대신 코스피 200 이라고 보시면 됩니다 .다만 , 실제로 거래되는 물건은 없고 코스피 200 지수가 더 오를 것 같다 , 내릴것 같다라고 생각해서 미리 사놓는 식으로 이해하시면 좋을 겁니다 . 다만 여기서 매수계약자는 코스피 200 이 오를것을 , 매도계약자는 코스피 200 이 미래에하락할 것을 예측하는 것이죠 .즉 , 매수계약자와 매도계약자간에 돈을 걸고 코스피지수 맞추기 게임을 하는 것입니다 .그렇기 때문에 형식만 있을뿐 실제로 거래되는 물건이나 주식은 없습니다 . 계약만 있죠 . 그리고 선물은 매일 정산됩니다 . 따라서 예로 오늘 매수한 선물이 10 포인트가 올랐다고 한다면 ,그만큼의 차익이 제 계좌로 당일날 들어옵니다 . 반대로 오늘 매도한 사람의 계좌에서는 그만큼 돈이 나가죠 .그 다음날도 오르거나 떨어진 포인트만큼 계산이 되어서 매수자와 매도자간 현금이 정산됩니다 .그리고 자신이 원할때 파실 수 있습니다 . 계속 안파시면 3 개월에 한번씩 돌아오는 만기일에 만기가 됩니다 . 결론적으로 , 선물은 주가가 떨어질거 같다고 생각하는 사람과 오를거 같다고 생각하는 사람이계약을 맺는 것입니다 . 이때 오르는 쪽에 건사람들 롱 포지션 ( 매수포지션 ), 떨어지는 쪽에 건사람을 숏포지션 ( 매도포지션 ) 이라고 합니다 .

Page 21: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

시세 정보의 분류tick – 실제 종목 정보 (order 서버에서 옴 ) + 시세의 정보 (quote 서버에서 옴 )분 – tick 의 정보를 1 분 동안 모으고 그 정보들을 분석해서 만들어진 정보 일주월

월물 ( 만기일이 있음 )

금의 1 월달 시세금의 2 월달 시세금의 3 월달 시세 …

만기일 이전에는 sell, buy 를 한 것을 close 를 하여서 종목의 위치를 개인의 예탁금 ( 개인마다 선물 시장에 참여하기 위해 가지게 되는 선물 시장 내의 화폐 ) 으로 바꿀 수 있음만기일을 넘어가면 1. Close 하여 종목의 위치를 개인의 예탁금으로 바꿈2. Buy 한 것을 실제로 선물 거래소에서 예전에 체결한 물품을 받음 sell 한 것을 실제로 선물 거래소로 물건을 가지고 오면 체결금액을 받음

Page 22: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

dwt

sup

iqr

dmw

rth 에서 받은 tick 정보 ( 실시간 정보 ) 를 db 에 저장

tick 정보를 1 분 기준으로 만듬그 정보를 공유메모리에 저장고가 (1 분 동안 가장 높은 시세 ), 저가 (1 분 동안 가장 낮은 시세 ),종가 (1 분이 끝났을 때의 시세 ), 시가 (1 분이 시작했을 때의 시세 )가 만들어짐

1. 고수 ( 여러 고객 ) 프로그램이 tick 의 정보 요청2. 고객이 요청한 정보들을 저장하고 있음 (배열이용 )3. rth 에서 받은 정보 (tik) 를 고객이 요청한 정보와 비교 고객이 요청한 정보에 해당되면 정보를 요청한 고수프로그램으로 정보 (tick) 를 보냄

rth 의 공유메모리 , 마스터 정보에 연결선물을 포함하여자신만의 공유메모리에 tick( 시세 + 마스터 정보 )+ 연결 선물을 저장 ,자신만의 마스터 정보파일을 만들어 마스터 정보 + 연결 선물을 저장

Sup 의 역할 모든 선물사의 종목별 월물들에 대한 최신 정보를 shared memory 에 저장 및 유지

Page 23: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

rth

dwt

sup

iqr

dmw

멀티캐스팅으로 여러 프로세스에 Tick 정보 ( 시세 )+ 마스터 정보 + 연결선물정보를 보냄마스터 정보와 연결 선물정보는 프로세스 시작시 한번만 보냄시세는 계속 받는 대로 바로 보냄

Page 24: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

rth

공유메모리( 구조체 )

종목 마스터 파일*.mst

dwt

sup

iqr

dmw

공유메모리( 구조체 )

종목 마스터 파일

*.mst

DB

전체 구조 고수 프로그램

Page 25: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

rth

공유메모리( 구조체 )

종목 마스터 파일*.mst

sup

공유메모리( 구조체 )

종목 마스터 파일

*.mst

rth 에서 나온 공유메모리 ( 구조체 ) 와 종목 마스터 파일 안에 연결선물이라는 변수가 존재하지는 않음Sup 등 내부 시스템 프로세스로 정보를 전달할 때 DB 의 예전 정보를 참고하여 선물사의 종목별로 어제 거래량이 가장 많았던월물을 찾아내어 연결선물이라고 표시하고내부 시스템에 전달

sup 에서 나온 공유메모리 ( 구조체 ) 와 종목 마스터 파일 안에 연결선물이라는 변수가 존재

Page 26: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

선물 : 미래의 것buy : 위로 가야 이익

sell : 아래로 가야 이익

이익손해

손해이익

이익 = 미래의 가격 – 현재의 가격

이익 = 현재의 가격 – 미래의 가격

판매자 : 3000 원구입자 : 4000 원위와 같이 된다면 3000 원이 판매가 되는 체결이 이루어짐

Page 27: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

행위1. 투기 : 가격차이로 돈 벌음2. 해징 : 현물 가격의 손실을 선물 시장의 선물로 메워 손실이 없도록 함예 )

2011 2012 2013

5 54

6개당 가격

년도

2013 년의 물건의 가격에 구애 받지 않기 위해 현재의 가격으로 물건을 팔고5 * 100 개 = 500 원그 돈에 해당하는 500 원어치를 지금 선물시장에서 선물을 buy 로 100 개를 체결만약 2013 년 가격이 6 원이 되었다면현물로는 500( 현재 2012 년 가격 ) – 600(2013 년 가격 ) = -100선물로는 600(2013 년 가격 ) – 500( 현재 2012 년 가격 ) = +100총 순이익 = +100 + -100 = 0

선물을 buy 로 100 개를 체결하고 2013 년 가격이 4 원이 되었다면현물로는 500( 현재 2012 년 가격 ) – 400(2013 년 가격 ) = +100선물로는 400(2013 년 가격 ) – 500( 현재 2012 년 가격 ) = -100총 순이익 = +100 + -100 = 0

Page 28: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

물건을 사기 위해 선물증거금대금 ( 원금의 몇 퍼센트 ) 를 주면 실제 산 것처럼 됨나머지 돈은 나중에 주면 됨

상해 거래소 증거금 비율 현재가 최소변동단위 가격 선물증거금대금cu 5% 5000 5 25000현재가 *

최소변동단위

1250가격 * 거래소 증거금 비율

강제 청산 : 기본자금이 음수가 되지 않도록 함

Page 29: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

시스템이 시작하면 1. rth 가 종목에 대한 정보를 요청2. 받은 종목에 대한 정보를 토대로 shared memory 의 공간을 할당준비3. 받은 종목과 시세 정보를 shared memory 와 db 에 저장주의점 : 초기화를 위한 종목정보는 처음 한번만 받게 되고 그 다음 부터는 시세정보만 받음

shared memory

FUT_MST

FUT_REAL(tick)

선물사 종목 월물 시세은 1308

금 1308 100

금 9999 100

연결선물 ( 금 9999)= 금 1308

rth sup시스템 내부에서 사용 가능한 형태로 변환된 연결선물과 tick 정보를 전달

받은 tick 정보를 tick 정보에 해당되는 곳에 덮어써서 최신의 정보가 저장되어 있도록 함

시간 \ 월물 금1308

금1309

am1 시 13초 100 90

am1 시 14초 110 95

FUT_QUOTE

Page 30: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

과거(iqs)

현재 미래(iqr)

사용자가 요청한 시간에 rth 에서 받은 tick 정보(iqr 이 rth 에서 받은 tick 정보를 고수 프로그램에 보내줌 )

고수 시세 그래프

스냅샷사용자가 요청한 시간 이후의rth 에서 받은 tick 정보(sup 의 shared memory 에 저장된tick 내용 )

Page 31: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

고수

고수 프로그램의 주요기능1. Tick 정보를 보여줌 ( 과거 및 현재와 계속 받고 있는 tick 정보 )2. 주문요청과 주문의 체결여부의 확인

iqr siq Shared mem-ory

iqs diq db

oms

App_d Prp_d

Order

push

ip 는 같으나서로 포트 다름

Tick 관련

주문관련Order 서버는 보내고 받기 둘다 함1. 주문2. 주문 응답 1) 주문이 선물사의 서버에 도착했음을 알림

Push 서버는 보내기만 함체결에 대한 결과를 응답연결은 계속 유지됨

스냅샷 ( 계속 업데이트된 최신정보 ) 요청

과거의 데이터 요청

Page 32: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

고수 vcs 종목 마스터

최신버전프로그램정보

Sup 의 종목 마스터 파일

vcs1. 고수의 버전 체크2. 종목 마스터 정보 가져오기

1. 고수의 버전 체크최신 정보로 업데이트

Page 33: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

고수 vcs 종목 마스터

최신버전프로그램정보

Sup 의 종목 마스터 파일

2. 종목 마스터 정보 가져오기고수 프로그램의 기본 정보 ( 선물사의 종목의 월물 ) 을 가져와 그래프를 그릴 준비를 함

Page 34: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

Order

push

savejnl_d

quote

rth 처럼 가공 x그대로 저장

rth_replay 예전 정보를 다시 찾거나 보고 싶을 때jnl 파일을 참조하여 예전 정보를 알아봄

*.jnl 파일

Page 35: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

모니터클라이언트 sms smp

smp : 모든 프로세스가 죽었는지 살았는지 확인함

Mon_srv 프로세스 ( 모니터 클라이언트 ) <-> sms <-> smpLog : 모든 프로세스의 로그파일 저장됨 프로세스명과 프로세스의 상태 (<i>, <w>, <e>) 를 저장함 예 ) rth <i>

클라이언트 oms ECS ECD db

클라이언트의 접속과 로그아웃의 정보를DB 에 저장

iqr

Page 36: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

DB

Sharedmemory

ddp하루의 장이 끝나고 이 프로세스가 동작함Shared 메모리의 선물사 – 종목 – 월물별 1 분 데이터 (dmw 에 의해 생성 ) 를이용하여 분 , 일 , 주 , 월 데이터 생성하여 db 에 저장

Page 37: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

고수 1. 버전체크2. 로그인 3. 그래프의 기본 정보 ( 선물사의 종목의 월물 ) 받기 – 서버에 정보가 저장되어 있어야 함4. 주문 , 체결서버1. 정보 저장 공간 준비 ( 정보 저장표의 속성이 결정됨 ) – 선물사의 종목의 월물 정보 받음 order 서버에서 종목마스터 정보를 받음 2. 서버로부터 받은 정보 (tick) 를 저장3. 장 끝날 때 db 에 월 , 주 , 일 , 분의 정보를 저장4. 종목 , Tick 정보 저장5. Replay6. 모니터링

서버에서 받은 실제 정보서버에서 받은 실제 정보를 내부에 맞게 변환된 정보

Page 38: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

메인 sub

메인과 sub 는디렉토리 구조 같음

메인 sub

real test

고수 프로그램

선물사 서버

내부 네트워크로 연결

선물사 서버 – 회사 서버 – 고수 프로그램 연결

몇몇 서버는 1, 2 번 real, 3, 4 번 백업 (1, 2 번과 같은 실제 사용되는 선물사 서버와 연결됨 ) – 백업서버도 초기화 확인해야 함보통 서버는 1, 2 번 real, 3, 4 번 test – test 는 굳이 안해도 됨

임의의 다른 곳과 연결됨

서버 종류 1) real, 2) backup(sub), 3) test

Page 39: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

고수 프로그램

Order서버

push서버

quote서버

Order/ push 서버

main sub

ip : 10.0.0.41 ip : 10.0.0.42

rth rth

app_dprp_d

vcs

oms

vcs

app_dprp_doms

Main 서버과 sub 서버의 관계

종목 마스터 파일

Page 40: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

Main 서버run_restart_rth.shrth_d, savejnl_d 실행$HOME/tools/checkMstFileForIQR.shMain 서버의 mst 파일 확인 , App_d, prp_d, iqr 를 실행Sub 서버 /home/delta/tools/checkMstFile_vcs.shSub 서버의 mst 파일 확인 , sub 서버의 vcs 실행Sub 서버run_restart_rth.shRth_d, Savejnl_d 실행

Main 서버run.shsmp, sms, ecd, siq, sup, diq, dwt, dmw, app_d, prp_d, ecs, rth_d, savejnl, mts 실행$HOME/tools/checkMstFile.shMain 서버의 mst 파일 확인 , oms, iqr, iqs

Sub 서버 /home/delta/tools/checkMstFile_vcs.shsub 서버의 mst 파일 확인 , sub 서버의 vcs 실행Sub 서버run.shSmp, ecd, siq, sup, diq, dwt, dmw, ecs, rth_d, savejnl_d, iqr, iqsoms, app_d, prp_d 를 뺀 나머지 프로세스가 실행

Page 41: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

main 서버vcs 가동 xiqr, iqs – main 서버 프로세스를 기반나머지는 기본적으로 동작하고 있음sub 서버app_d, prp_d, oms 가동 xiqr, iqs – sub 서버 프로세스도 돌아가고 있음 ( 고수 프로그램과 선물사 서버에는 연결되진 않음 )나머지는 기본적으로 동작하고 있음rth 는 멀티캐스팅을 하지 않음

Page 42: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

후속 세팅useradd delta

/home/delta

Folder 구조1. bin – lib 안의 내부 파일 = 외부 라이브러리 ( 선물사에 접속하기 위한 api 들 (library))2. Data – Backup_dump - db_dump - Shm_dump - Ver – o – stage - comm - sys3. ini4. jnl5. log6. mon__sh7. mst8. tools

Page 43: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

Bin 폴더서버 프로세스 실행 파일들 , lib 파일 안의 라이브러리들라이브러리가 이상하면 선물사로 접속이 되지 않음Data 폴더1. Backup_dump 폴더 : 공유메모리의 내용을 나중을 위해 주기적으로 시간이름으로 압축하여 기록해 놓음 백업 스케쥴러로 백그라운드로 처리하여 저장2. db_dump 폴더 : db 백업 , 복구 관련파일3. Shm_dump 폴더 : 공유 메모리 (sup 에 붙은 ) 수동 백업 or 복구공유 메모리 dump, 복구의 기본 설정 폴더 = shm_dump4. Ver 폴더 - 0(숫자 ) 폴더 - stage폴더 ( 시스템 전략과 관련된 폴더 ) - comm 폴더 ( 고수 실행파일 ) : vcs 에서 필요한 고수 최신 버전 파일 - sys : sup 가 만든 종목마스터 파일 저장

ini 폴더서브 프로세스가 참조할 설정파일 ( 초기화 작업 )

jnl 폴더Zip 파일 <– savejnl 프로세스의 작업결과물Zip 파일 안의 구성 요소1. Batch.jnl <- 종목마스터 정보2. Futures.jnl <- 시세 정보

Page 44: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

log 폴더프로세스에 대한 상태를 log 파일로 저장저녁장 초기화때압축되지 않은 log 파일을 날짜이름으로 압축하여 저장mon_sh폴더 ( 공부해 볼 것 )서버에서 사용하는 자동 유틸리티 파일들mst 폴더/home/mst/ 안의 마스터파일들 (rth 가 만든 파일 )/data/ver/comm/sys/ 안의 마스터 파일들 (sup 가 만든 파일 )

tools 폴더 ( 공부해 볼 것 )서버 manage 할 때 스크립트 파일이 모여 있음

Page 45: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

Crontab = 장 초기화 작업 ( 아침 , 저녁 )

Crontab –l, -e

System.ini -> 공용설정파일 ( 여러 프로세스가 참조하는 파일 ) 연결할 ip, 포트설정% 참조금사닥 quote 서버는 ip 가 필요없음 , 포트번호만 써도 됨내부적으로 api 가 ip 를 잡아서 처리해 줌

Page 46: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

1 [GLOBAL] 2 COMM VERSION = 29 3 LOG MESSAGE QUEUE = 5901 4 5 LISTEN IF = 116.228.33.236 // 외부주소 6 7 LOG MULTICAST IP = 229.5.0.1 10 11 APP IP = 10.0.0.41 # oms <-> app 12 APP PORT = 10111 15 PRP PORT = 10112 16 17 ECS TO SRV QUEUE = 5022 # ECS -> SRV 18 SVR TO ECS QUEUE = 5021 # SRV -> ECS 19 20 TOTAL ECD = 2 21 ECD_IP_000 = 10.0.0.41 22 ECD_PORT_000 = 29110 23 ECD_IP_001 = 10.0.0.42 24 ECD_PORT_001 = 29110 25 26 # 테스트 환경 //real, test 를 구분하여 다르게 쓸 것 27 SECURITIES D IP = 61.144.235.5 # prp_d <-> order request server of D sec. 28 SECURITIES D PORT = 6620 # 17990 29 SECURITIES D IP PUSH = 61.144.235.5 # prp_d <-> contract server of D sec. 30 SECURITIES D PORT PUSH = 6622 # 17992 31 SECURITIES D IP QUOTE = 61.144.235.5 # rth_d <-> realtime data server of D sec. 32 SECURITIES D PORT QUOTE = 20618 33 34 # 야간장 테스트용 실서버 환경 36 # SECURITIES D PORT = 7922 # 17990 37 # SECURITIES D IP PUSH = 172.19.2.4 # prp_d <-> contract server of D sec. 38 # SECURITIES D PORT PUSH = 7924 # 17992

main sub

내부 ip 와 포트로 연결

process

process

한 서버 안에서 프로세스끼리 같은 ip 의 포트로 연결

/home/delta/ini/system.ini

Page 47: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

39 # SECURITIES D IP QUOTE = 10.19.2.107 # rth_d <-> realtime data server of D sec. 40 # SECURITIES D PORT QUOTE = 20518 41 42 D_FUNCLIST = d_funclist.ini 43 44 ID = 19000143 // 연결할 때 필요한 암호와 패스워드 45 PASS = 293261 46 47 # 야간장 테스트용 실계좌 48 # ID = 0190000231 49 # PASS = 261515 50 51 MYSQL IP = 10.0.0.41 52 MYSQL DATABASE = deltaworld # Database Name 53 MYSQL USER ID = delta # TODO : Fill Encrypted Text : user id 54 MYSQL PASSWORD = delta_db # TODO : Fill Encrypted Text : user Password 55 56 [DIRECTORY] 57 INI FILE DIR = ini 58 LOG FILE DIR = log 59 TRC FILE DIR = log 60 JNL FILE DIR = jnl 61 DATA FILE DIR = data 62 EXEC FILE DIR = bin 63 VER FILE DIR = data/ver 64 COMM DIR = comm 65 MASTER FILE DIR = mst 66 CLIENT SYS DIR = sys 67 SHM DUMP FILE DIR = data/shm_dump 68 MIN DIR = min # 분데이터 저장 경로 /ho me/delta/min 69 MIN INDEX DIR = index # 분데이터 인덱스 /ho me/delta/min/db1/index 70 MIN DATA DIR = data # 분데이터 내용 /ho me/delta/min/db1/data 71 MIN SAVE DIR INDEX = db3 # INDEX 분데이터 저장될 파티션 /ho me/delta/min/db3 72 MIN SAVE DIR KOSPI = db2 # KOSPI 분데이터 저장될 파티션 /ho me/delta/min/db2 73 MIN SAVE DIR KOSDAQ = db1 # KOSDAQ 분데이터 저장될 파티션 /ho me/delta/min/db1 74 MIN SAVE DIR FUTURES = db3 # FUTURES 분데이터 저장될 파티션 /ho me/delta/min/db3 75 MIN SAVE DIR OPTIONS = db3 # OPTIONS 분데이터 저장될 파티션 /ho me/delta/min/db3 76 MIN SAVE DIR SOPTIONS = db3 # SOPTIONS 분데이터 저장될 파티션 /ho me/delta/min/db3

Page 48: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

77 MIN SAVE DIR STAR = db3 # STAR 분데이터 저장될 파티션 /ho me/delta/min/db3 78 MIN SAVE DIR SYN = db3 # SYN 분데이터 저장될 파티션 /ho me/delta/min/db3 79 MIN SAVE DIR INF = db3 # INF 분데이터 저장될 파티션 /ho me/delta/min/db3 80 MIN SAVE DIR VOL = db3 # VOL 분데이터 저장될 파티션 /ho me/delta/min/db3 81 MIN SAVE DIR MV = db3 # MV 분데이터 저장될 파티션 /ho me/delta/min/db3 82 83 [INI FILE] 84 ASPINIT = aspinit.ini 85 SERVERSELF = serverself.ini 86 SERVERLIST = serverlist.ini 87 MARKETINFO = marketinfo.ini 88 HOLIDAY = holiday.ini 89 MEMBER = sec_codes.ini 90 KOSPI200 = kospi200.ini 91 MIN = mininfo.ini 92 APP_D = app_d.ini 93 BAT_D = bat_d.ini 94 DDP = ddp.ini 95 DIQ = diq.ini 96 DMW = dmw.ini 97 DWT = dwt.ini 98 ECD = ecd.ini 99 ECS = ecs.ini100 FDS = fds.ini101 IQR = iqr.ini102 MSS = mss.ini103 MTS = mts.ini104 OMS = oms.ini105 PRP_D = prp_d.ini106 RTH_D = rth_d.ini107 SIQ = siq.ini108 SUP = sup.ini109 VCS = vcs.ini110 IQR_DIQLIST = iqr_diqlist.ini111 EXCHANGE_CODE_INFO = exchange_code_info.ini112 113 #*- EOF ----------------------------------------------------------------------*

Page 49: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

전일 pm 9:00 ~ am 2:30

오늘 am 9:00 ~ pm 3:00

전일 야간장에 대해 서버에 기록되는 날짜 : 23 일전일의 실제 날짜 : 22 일

오늘의 실제 날짜 : 23 일

전일 pm 9:00 ~ am 2:30 + 오늘 am 9:00 ~ pm 3:00= 하루로 봄야간장 쉬는 날 1. 공휴일 전 야간장2. 만기일 저녁 야간장 ( 만기일은 선물사마다 다르게 됨 )

22 23 24 25 2623, 24, 25 일이 추석 휴일이라면22 일의 야간장은 쉬게 됨26 일은 26 일 am 9:00 부터 장이 시작하게 됨22 23 24 25 2622 일이 만기일이라면22 일의 야간장은 쉬게 됨23 일은 23 일 am 9:00 부터 장이 시작하게 됨

22 23 24 25 2623 일 – 토요일 ,24 일 – 일요일25 일의 장시작은 22 일의 야간장부터 시작임

월물은 만기일이 되면 없어짐

Page 50: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

A B C G상해 대련 정주 금융지수선물 ( 상해 )

주가지수주식 거래소

가 나대표150

대표150잘 나가는 종목

대표지수 300

선물사

agau

각각의 특별한 상품으로 서로 각각 다름

A, B, C am 9:00 ~ pm 3:00휴식am 10:15 ~ am 10:30am 11:30 ~ pm 1:30

Gam 9:15 ~ pm 3:15휴식am 11:30 ~ pm 1:00

각각 장시간

Page 51: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

초기화 시간1. 전일 pm 8:30 (A 의 ag, au 만 초기화 ) – main 초기화2. 오늘 am 8:30 (A 의 ag, au 만 제외한 나머지 다 초기화 ) – sub 초기화

A B C G상해 대련 정주 금융지수선물 ( 상해 )

선물사

agau

% 유의점장이 운영되지 않는 시간에는 선물사의 서버는 꺼지게 됨

Page 52: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

Crontab

42 20 * * 1-5 /home/delta/tools/runChk.sh /home/delta/run.sh SysTem > /dev/null 2>&1

파란색 글씨 – parameter( 매개변수 )분 시 일 월 요일 / 실행할 파일 경로요일은 0 ~ 7 까지 가능 0, 7 = 일요일0 = 일요일 , 1 = 월요일 , 2 = 화요일 , 3 = 수요일 , 4 = 목요일 , 5 = 금요일 , 6 = 토요일 , 7 = 일요일runChk.sh: 오늘이 휴일인지 검사 (휴일이면 뒤의 파라미터를 무시하고 처리 or 초기화 )run.sh: main 초기화 프로세스 ( 장 전체 초기화 pm 9:00 전에 )run_restart_rth: sub 초기화 프로세스 (A, B, C, G am 9:00 초기화 )

Page 53: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

run.sh(야간장 )

1. Kill.sh – 모든 프로세스 종료2. backup_log.sh - 로그파일 (tar) 을 생성 ~/log 폴더에 tar압축파일로 되어 있지 않는 정보를 묶어서 현재날짜 이름으로 tar압축파일을 만듬3. remove.sh – ipcrm –M ( 공유메모리 초기화 ) ipcrm –q (큐 초기화 )4. resetUserConn.sh 고수 클라이언트 프로그램이 서버에 접속한 기록을 ECS, ECD 프로세스를 통해 DB 에 남기게 되는데 고수 클라이언트가 접속하면 1, 접속이 끊어지면 0 으로 표시하게 됨 %kill명령어로 프로세스를 종료하여 프로세스에 접속된 모든 고수 클라이언트들이 끊어 졌음에도 불구하고 접속된 것처럼 db 의 속성값이 1 로 남아있는 현상이 있음 그러므로 update 쿼리문으로 모든 고수 클라이언트가 끊어졌음을 나타내기 위해 db 의 클라이언트 연결과 관련된 속성을 모두 0 으로 표시5. 종료된 모든 프로세스는 & 로 백그라운드로 실행시킴6. aspinit N - 영업일 설정 (& 로 실행하지 않음 , 필요한 일만 하고 끝나기 때문에 ) D : 보통 (낮시간 ) 장의 시간으로 영업일을 설정 N : 야간 (밤시간 ) 장의 시간으로 영업일을 설정7. setActive 0 2 – 뒤의 녹색 2 개의 숫자 매개변수에 따라 서버의 역할이 달라짐 1) main 서버의 rth 는 내부 프로세스 뿐 아니라 sub 서버의 프로세스로 정보를 멀티캐스팅 함 2) sub 서버의 rth 는 멀티캐스팅 하지 않음

Page 54: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

run.sh

8. checkMstFile.sh - *.mst 가 완전히 초기화되어 만들어지고 이 mst 파일을 참조하는 프로세스가 실행되도록 함 이유 : 백그라운드로 쓰기 때문에 프로세스는 우리가 원하는 순서대로 실행되지 않음 , *.mst 를 다 만들기 전에 이 mst 파일을 참조하는 프로세스가 정보를 가져갈 수도 있기 때문에 마지막에 main 서버에서 sub 서버의 cvs 프로세스를 실행하도록 함 이유 :? Main 서버의 rth 에서의 멀티캐스팅을 받은 정보로 mst 파일을 만들고 그 정보를 cvs 가 참조하도록 하기 위해서

Page 55: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

rth

프로세스프로세스

rth

프로세스프로세스

Main 서버의 rth 는 자기 서버내부의 프로세스와 sub 서버의 프로세스에게 멀티 캐스팅하게 됨Sub 서버의 rth 는 멀티 캐스팅하지 않음Main 서버의 rth 로부터 정보를 받기 위해서는 sub 서버의 프로세스들이 동작 중이여야 함그러므로 장초기화 작업을 sub 서버가 먼저 하고 그 다음으로 main 서버가 하게 됨

Main 서버 Sub 서버

Page 56: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

Sub1. Ps –ef | grep deltaVcs 프로세스 확인2. ./Savejnl &

3. Shmview sp Mst 확인

main1. Ps –ef | grep deltaMst 확인프로세스 종료2. ./Savejnl &

3. Shmview sp Mst 확인

ctp

Sub1. Ps –ef | grep deltaVcs 확인2. rth_d.log( 초기 quote 와 연결시 문제 )1) Quote 서버 연결 확인Quote Server Connection is OK

Main1. Ps –ef | grep deltaMst 확인프로세스 종료2. rth_d.log1) Quote 서버 연결 확인

항생

야간 초기화 작업

Sub 서버에서 Savejnl 실행이 제대로 안될 때 많음 , 확인할 것

Page 57: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

금사닥 중용부터 시작중융 초기화 작업 끝의 의미 ( 이 이후시간에는 mon_srv 에 초기화작업으로 인해 에러 없음 )1. mon_srv 실행 ( 궐련 chamtime3 서버에서 실행 ) mon_srv 는 검사해야 할 서버들의 등록정보 (ini/svr_info.info) 를 참조함2. Tail –f mon_srv.log<E> 로그확인 ( 이 시점이후로는 rth.log 에서 <E> 를 확인할 필요없음

Sub1. Ps –ef | grep deltaVcs 프로세스 확인2. Shmview sp A 거래소의 Mst 확인

main1. Ps –ef | grep deltaMst 확인 프로세스 종료2. Shmview sp A 거래소의 Mst 확인

금사닥 rth_d.log( 초기 quote 연결을 확인 할 수 없음 )

항생Sub1. Shmview 확인 Main

1. Shmview 확인CTP

sub1. rth_d (quote 와의 연결에 도중에 끊어짐 )1) Quote 연결확인로그 파일이 없음 ??

main1. rth_d 1) Quote 연결확인

Page 58: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

항생 , ctp 는 고수 <-> 선물사를 연결할 때 ip, port 등으로 연결을 하고어떤 요청을 하면 그 요청에 대한 응답을 받아서 연결과 응답에 대한 확인이 가능금사닥은 고수 <-> 선물사를 연결할 때 port 만 필요함어떤 요청을 하면 그 요청에 대한 응답을 받을 수 없음연결과 응답에 대한 확인이 불가능그러므로 금사닥에서는 quote 서버와의 연결 상태를 rth.log 파일에서 확인 할 수 없다단지 고수 클라이언트를 동작시켜 시세를 이상없이 받는 것을 봄으로써 연결이 되어있다라고 생각할 뿐이다

Page 59: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

Run.sh 와 Run__restart_rth.sh 다른 점야간에는 금사닥 api 은 특정 종목 (a 선물거래소 ) 의 정보를 줌나머지 api 는 모든 정보를 줌아침에는 모든 선물사 api 가 모든 종목의 정보를 줌Run__restart_rth.sh공유메모리 초기화 작업이 없음

Page 60: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

초기화시 고려해야 할 것ctp - 한 계정에 6 곳에서만 사용가능하므로 계속 접속을 시도해야함1. 고수 프로그램에서 1) 월물의 상세정보가 오는지 확인 (ctrl + /) 2) 동시호가타임 ( 장 시작시 들어오는 틱이 보이는지 확인 ) 3) 선물 거래소의 틱 오는지 확인 -> 봉이 오는지 확인 4) 이전 데이터가 잘 보이는지 확인 (iqs)

2. 서버에서 (야간장 ) 1) log 파일을 확인하여 모든 프로세스가 잘 돌아가는지 확인 (ctp -> 항생 -> 금사닥 ) main 서버는 oms iqr iqs 가 동작하면 프로세스 준비완료 sub 서버의 cvs 가 돌아간다면 해당 선물사의 연결서버 (real, backup) 는 이상이 없는 것 (ps -ef | grep delta) 2) CTP쪽 선물사에 연결된 서버의 jnl 프로세스가 가끔씩 죽어있음 , 재 시작해주어야 함 특히 , 창원 선물사는 연결이 잘 안되어 jnl 을 반복실행 할 것 ( 제대로 동작했을 때 나타나는 이벤트내용을 로그파일보고 숙지할 것 ) 3) 항생의 선물사에 연결된 main 서버의 rth_h2.log 파일을 검사하여 마지막 줄에 quote server connction ok 가 있는지 확 인 할 것 ( 시세서버가 제대로 연결되었는지 확인하기 위한 작업 ) 4) 공유 메모리 ( 종목정보 ) 가 있는지 확인 (shmview sp) - 1.price 의 A ~ C, G 의 code list 확인 주의점 : 금사닥만 a 거래소를 확인 , 나머지 (ctp, 항상 ) 은 a,b,c,g 거래소를 다 확인해야 함 c 거래소의 짝수월은 월물이 원래 없기에 값이 0 으로 나옴 거래량이 거의 없는 것은 값이 0 으로 나옴 4) 모니터링 - 프로세스의 상태확인 ( 금사닥의 중융의 점검이 끝난 후 ) 1] /bin/mon_svr 을 실행 ( 실제 프로세스를 검사하는 게 아니라 프로세스가 만든 로그파일에서 <E> 가 있는 부분만 가져오는 것 ) 2] tail -f mon_svr.log 을 실행 <E> 가 나오는 부분을 찾으면 실제 해당 선물사에 연결된 서버의 로그파일 확인하기 6) ctp 의 main 서버들의 rth_d.log 파일에 quote 서버와의 연결이 끊긴 에러가 없었는지 확인 (ctp 초기화시작 ( 초기화시 프로세스가 시작된 시간 )<->mon.srv 점검시작 (mon.srv 모니터링 프로세스 시작시간 ) 초기화시 quote 서버가 연결됨 이후에 quote 서버와의 연결이 끊긴 에러 <E> 가 없었는지 확인 둘 작업 시작 사이의 시간에 시세서버와의 연결 에러가 발생할 수 있으니 다시 확인 ) 이유 : 예전에 중간에 quote 서버의 연결이 끊어진 적이 있었음 7) 고수 프로그램으로 그래프가 잘 나오는지 확인 ( 동시호가타임 ) 첫 틱이 들어오면 시세서버와 우리서버가 연결이 잘 된 것임% 우리 서버에서 금사닥의 rth.log 파일을 통해서 quote 서버와의 연결을 확인 할 수 없음

Page 61: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

서버의 초기화 확인작업 (야간장 – run.sh)1) 모든 프로세스가 잘 돌아가는지 확인 ( 동작 시간을 볼 것 ), 선물사의 sub 서버의 vcs 가 돌아간다면 이상이 없는 것 (ps -ef | grep delta) % 주의 checkMstFile.sh, checkMstFileForIQR.sh 에서 vcs 를 실행시키는 프로세스를 & 으로 작동시키므로 에러가 나타나도 멈추지 않고 그냥 지나감2) 고수 프로그램의 그래프를 잘 보이는지 확인 1> 공유 메모리 ( 종목정보 ) 가 있는지 확인 (shmview ap) - 1.price 의 A ~ C, G 의 code list 확인 주의점 : 금사닥만 a 거래소를 확인 , 나머지 (ctp, 항상 ) 은 a,b,c,g 거래소를 다 확인해야 함 c 거래소의 짝수월은 월물이 원래 없기에 값이 0 으로 나옴 거래량이 거의 없는 것은 값이 0 으로 나옴 % 시세가 모두 0 으로 나타난다면 금사닥 서버에 연락 or rth 재시작 2> CTP쪽 선물사에 연결된 서버의 jnl 프로세스가 가끔씩 죽어있음 , 재시작 해주어야 함 특히 , 창원 선물사는 연결이 잘 안되어 jnl 을 반복실행 할 것 3> 항생의 rth_h2.log 파일을 검사하여 마지막줄에 connction ok 가 있는지 확인 할 것 ( 시세 서버가 연결이 잘 되었는지 확인하고 위해서 ) 4> 모니터링 - 프로세스의 상태확인 ( 마지막인 금사닥의 중융의 점검이 끝난 후 ) 1] /bin/mon_svr 을 실행 ( 금사닥 궐련 chamtime3 번 서버에서 실행 ) 오류 및 연결이 살아있는지 여부에 대한 heart beat 의 정보가 화면에 보여짐 mon_srv 는 검사해야 할 서버들의 등록정보 (ini/svr_info.info) 를 참조함 2] tail -f mon_svr.log 을 실행 ( 에러 부분만 화면에 나타남 ) <E> 가 나오는 부분을 찾아서 확인하기 ( 화면에 나타나는 에러 메세지가 서버의 처리 흐름 중 어디에 와 있는지 생각할 수 있어야 함 ) 5> ctp 의 rth_d.log 파일에 에러가 없었는지 확인 (Quote 서버와의 연결이 끊어졌는지 확인하는 것 )3) 고수 프로그램으로 그래프가 잘 나오는지 확인 ( 동시호가타임 ) 첫 tick 이 들어오면 시세서버와 우리서버가 연결이 잘 된 것임

Page 62: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

5> ctp 의 rth_d.log 파일에 에러가 없었는지 확인을 하는 이유중요한 에러는 계속 에러를 발생시킴중요하지 않은 에러는 계속 에러를 발생시키지 않음Quote 서버와의 연결이 끊어졌다는 에러 ( 정보를 요청했는데 그 요청에 대한 정보가 오지 않는 현상 )는 한번만 발생 연결이 끊어 졌다는 것을 바로 알 수 있는 방법은 없음 , 정보가 오지 않다는 것을 통해서 Quote서버와의 연결이 끊어졌다고 유추할 뿐임요청한 정보를 받지 못했다고 하는 것은 중요하지 않은 에러임그러므로 여러 번 정보를 보내지 않고 한번만 에러가 났다고 로그에 기록이유 : 서버에게 어떤 요청을 했을 때 서버에서의 정보 전달이 오지 않는 다는 것은 서버가 문제가 없어도 요청 받은 정보를 바로 주지 않고 나중에 주는 일이 많이 하기 때문에요청한 정보가 오지 않는다고 해서 그러므로 mon.srv 구동시작 이전에 발생한 Quote 서버와의 연결이 끊어졌다는 현상은 mon.srv구동 이후에는 알 수 가 없음

Page 63: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

금사닥 -> rth_d -> rth_d.logCTP -> rth_c -> rth_c.log항생 -> rth_h2 -> rth_h2.log

야간장금사닥 : A 거래소의 ag, au 만 종목 상세 정보를 보내줌 A 의 나머지 종목 ,B,C,G - 종목 상세 정보를 안 보내줌 CTP, 항생 : A, B, C, G 선물거래소의 종목별 상세를 보내줌

Page 64: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

OrderServer rth

sup 공유메모리

종목 마스터파일

QuoteServer

종목 마스터의 생성과정1. rth 가 Quote 서버와의 연결을 요청 및 Quote 서버 연결 수락 후 연결됨 (Quote Connection ok)2. rth 가 order 서버와의 연결을 요청 및 order 의 연결 수락 후 연결됨2. rth 가 order 서버에게 6018tr( 거래소의 종목리스트 ) 를 요청 – 보내는 데이터에 거래소명을 적어 보냄3. Order 서버가 rth 로 해당 거래소의 모든 종목리스트를 보내줌4. Rth 가 order 서버에게 6017tr( 각 종목별 상세정보 ) 를 요청 – 보내는 데이터에 거래소 , 종목코드를 적어 보냄5. Order 서버가 rth 로 해당 거래소의 종목코드 상세정보를 보냄

멀티캐스팅

Page 65: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

6. rth 는 연결정보 (9999, 8888) + 시세 (tick) + 거래소의 종목리스트 + 각 종목별 상세정보를 멀티캐스팅으로 sup 에게 보냄 ( 시세만 quote 서버에서 받아서 보내고 나머지는 order 서버에서 받아 프로세스 시작시 다른 프로세스로 멀티캐스팅 함 )7. Rth 는 연결정보를 제외한 시세 + 거래소의 종목리스트를 공유메모리에 저장8. Rth 는 공유메모리를 토대로 종목마스터파일을 만듬7. Sup 는 그것을 받아서 공유메모리에 저장함 ( 공유메모리의 수정시간이 업데이트 됨 )8. Sup 는 공유메모리를 토대로 종목마스터파일 (*.mst) 을 만듬종목 마스터 파일을 고수가 읽을 수 있는 형태로 변환된 파일임

Page 66: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

문제 해결하기문제[1] 종목 마스터의 정보를 받지 못함Ps –ef | grep delta 를 확인 해보니$HOME/tools/checkMstFile.sh 프로세스나 $HOME/tools/checkMstFileForIQR.sh 가 돌아가고 있다면어떻게 해결하는가 ?

1. 금사닥 서버에 연락2. rth 를 재시작 (order 서버에서 받은 종목 정보를 sup 프로세스에게 다시 보내줌 )

종목 마스터 정보 (ver/comm/sys) 를 만드는 금사닥의 tick, rth, sup 을 검사 해보아야 함

Page 67: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

문제 확인상황 1 ( 금사닥 )장시작 전에 shmview 에 들어가 price data 를 보니 가격이 모두 0 이거나 월물에 대한 정보 ( 상세정보 ) 가 없음- Order 서버의 정보를 받는 과정중 이상한 것초기화 점검 후 월물의 체결 정보가 오지 않는다면 - Quote 서버의 정보를 받는 과정중 이상한 것종목 마스터 파일이 어제로 생성된 채로 그대로 있을 때1. 월물과 월물에 대한 어제 정상가격을 order 서버로부터 받음 (order 서버로부터 mst 까지의 과정을 생각 )2. sup 의 mst 파일이 있는지 확인해야 함 , 오늘의 최근 시간에 생성 , 수정 되어 있는지 확인 1) 생성한 날짜 (ls -l) 가 어제고 수정된 것 (stat “ 파일이름” ) 도 어제라면 아래항목으로 이동3. Sup 가 문제가 있는지 확인 ( 실제 sup 가 문제인 경우는 거의 없음 ) 1) sup.log 파일을 봐서 멀티 캐스팅을 rth 로부터 받은 기록이 있는지 확인 이 과정에서 받은 기록이 있으면 sup 의 문제로 sup 를 재 시작함 ( 이런 일은 없었음 ) 받은 기록이 없으면 아래 항목으로 감4. rth -> sup 로 오는 과정 (멀티 캐스팅 ) 이 문제가 있었는지 확인 1) rth.log 파일을 봐서 멀티 캐스팅을 sup 에게 보냈는지 확인 이 과정에서 sup 에게 보냈으면 멀티 캐스팅이 가는 도중의 문제이므로 rth 를 재시작 ( 종목 마스터 정보는 장 초기화 때에 한번만 보냄 , rth 를 다시 실행 (NOMC옵션을 붙임 ) 시켜 order 서버로 부터 종목 마스터 정보를 다시 보내도록 함 ) 2) 멀티 캐스팅을 sup 에게 보낸 기록이 없다면 아래항목으로 감5. rth 가 order 서버에게 6017 ( 요청정보 + 거래소 , 종목코드 ) 를 보내고 6017 응답정보를 받았는지 어떤 정보를 받았는지 log 파일을 확인 N/988 이라는 응답정보를 받았으면 order 서버가 이상한 것임6. rth 가 order 서버에게 6018 ( 요청정보 + 거래소 ) 를 보내고 6018 응답정보를 받았는지 어떤 정보를 받았는지 log 파일을 확인 6 번에서 이상이 있을 경우는 거의 없음7. rth 가 시세서버와의 연결 (connection) 이 잘 되었는지 확인

Page 68: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

상황 2 (ctp, 항생 , 금사닥 )문제 : diq 프로세스가 죽은 상황1. Diq 실행 파일 실행하기2. iqs. log 확인 1) DIQConnectThread::ConnDIQ OK, IP=10.0.0.41, Port=29100 2) IQR Service DIQIncomingThread Create Complete! 3) IQR Service DIQOutgoingThread Create Complete! 4)diq 와 연결 에러메세지 <E>20130916:09154137:[iqs:5162]:RecvDIQ::recv() Error errno=0 <I>20130916:09154137:[iqs:5162]:CloseDIQ::IP=10.0.0.41, Port=29100 diq 실행후 나타나는 메세지 <I>20130916:09154137:[iqs:5162]:DIQConnectThread::ConnDIQ OK, IP=10.0.0.42, Port=29100

3. diq.log 1) SearchDBThread(DB 데이터를 찾아서 IQS 로 보냄 ) : 8 개 확인 (0~7) ----- DIQ Service SearchDBThread Create Complete!. nIndex = 0, nMyPos = 0 -----4. dsc –l 명령어로 확인5. dsc –s 0 on (diq position 0 를 on 으로 )6. dsc –c 0 (diq position 0(*) 을 main diq 를 선택 )7. 아래와 같은 모습인지 확인

localhost:~/log>dsc -l Total DIQ List Count = 2Position -- IpAddr Port bStat -------0 10.0.0.41 29100 ON * (main 서버 )1 10.0.0.42 29100 ON (sub 서버 )

Iqs diq db

Page 69: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

상황 3 (ctp, 항생 , 금사닥 )문제 : Iqr 가 죽음 – ps명령어로 봤을 때log 정보를 보니 multicast 포트오류가 나타남풀이 : Iqr, iqs 및 여러 프로세스는 서버와 클라이언트 역할 둘 다 함그러므로 서버와 클라이언트 역할을 둘 다 하다가 서로 포트가 충돌이 생길 수 있음Multicast 를 받으려는 포트와 어떤 프로세스의 포트번호가 같아서 충돌이 일어남 ( 에러 )

충돌이 생기는 포트 확인은 같은 선물사의 다른 sub 서버 or main 서버의 iqr.log 파일을 확인하여 포트 번호를 알아냄 (multicast 를 받는 모든 프로세스는 같은 포트번호를 사용 )

충돌 나는 포트를 사용하는 프로세스를 죽이고 다시 실행하여 다른 포트를 사용하도록 함netstat -nap | grep 포트번호Kill -9 pid( 위의 포트번호를 가진 프로세스 )죽인 프로세스에 해당되는 실행파일을 다시 실행시킴Iqr 재 시작

Page 70: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

상황 4Volume decrease 현상해결법 : rth.d 재시작에러 메시지<E>20130924:08405673:[rth_d:20243]:RealUpdate::Invalid Data! Vol-ume decrease 1189 -> 0, nTime : 71638, cExchangeCode : G, szCon-tractCode : TF1406

누적 거래량은 계속 증가하게 됨보통 누적거래량이 3 부터 시작하여 1 씩 증가한다고 한다면갑자기 이상하게 누적거래량이 1000 이라는 정보가 오고 나서원래대로 3, 4, 5 ~ 이런 식으로 온다면3, 4, 5, 이 정보는 1000 보다 적은 정보라는 판단이 서므로 누적 거래량이 3, 4, 5 인 정보는 받아 들여지지 않고 삭제가 됨새로 누적 거래량을 초기화 하기 위해 rth.d 를 재시작

누적거래량00.5

11.5

22.5

33.5

~

Page 71: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

상황 5TR 의 설정된 구분자 개수가 안 맞으면 오류해결법 : d_punc.ini 이 파일을 알맞은 구분자의 개수로 수정 후 rth 를 재시작d_punc.ini 이라는 파일에tr 의 설정된 구분자 개수가 저장되어 있음rth 는 이 파일을 참조하여 받은 정보를 내부에서 사용되는 방식으로 변환구분자의 개수가 설정된 것보다 받은 정보가 1. 더 많은 구분자를 가지면 예상했던 것보다 많은 구분자의 정보를 받았다고 오류를 표시2. 더 적은 구분자를 가지면 예상했던 것만큼 구분자를 받을 때까지 기다림

Page 72: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

상황 6Rth_d.log 파일 확인 중 Quote Connection OK! 문장이 없고 나머지 내부적인 동작은 제대로 이루어짐1. Kill -9 rth_d 프로세스번호2. ./rth NOMC & 로 재실행Quote 의 연결만 새로 하고 연결종목과 종목마스터정보를 multicast 를 하지 않기 위해서 NOMC 옵션을 붙임모든 프로세스가 다 정상으로 돌아가고 있고 고수 프로그램 사용자들이 IQR 에 연결되어 있음NOMC 옵션을 안 주면 Iqr 은 rth 에서 종목마스터에 대한 멀티캐스팅 정보를 받고 이것을 고수 프로그램 사용자들에게전달 그러면 갑자기 고수 프로그램은 이상한 정보를 받아 화면이 이상하게 됨(f5 로 리플레시하면 다시 원래 기능을 찾아감 )그러므로 iqr 에 고수 프로그램 사용자들이 붙어있는 상태에서는 NOMC 를 붙여서 해야 이 상황이 발생하지 않음Nomc옵션을 안 붙이고 싶으면 iqr 를 종료하여 모든 고수 프로그램 연결을 끊은 다음rth 를 NOMC 옵션없이 재시작함 이때 iqr 에는 어떠한 고수 프로그램도 연결되어 있지 않아야 함연결되어 있는 고수 프로그램은 잘못된 정보를 받아 화면이 이상해짐

고수

rth

iqr시세정보 Iqr 은 rth 에서 현재 받은 시세정보를 바로 고수에게 보냄종목마스터의 정보를 시세정보로 착각하여 보낼 수 있음

rth 가 iqr 보다 먼저 실행되어야 함

Page 73: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

상황 7Tr6018 에 대해서 1003 오류

Page 74: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

rth.log 확인 사항1. Mst 파일 만듬 (success) - a, b, c, g 선물거래소의 mst 파일 Symbol Master File Create(A) : Success (SaveFuture sSub Success!)2. subscribeMarket(success) – rth 가 order 서버에게 종목 구독 요청 확인3. onrepsubMarketData(success) – order 서버의 응답 ( 그 종목을 줄게 )

rth.log 의 흐름1. Quote 와의 연결2. 거래소 정보 요청 및 응답3. 종목 정보 요청 및 응답4. 마스터 파일 생성5. 시세구독 요청 및 응답

Shmview spSp 를 붙이면 sup 의 shared memory 를 보는 것Sp 를 안 붙이면 rth 의 shared memory 를 보는 것우리는 rth 의 shared memory 를 봐야 하므로 shmview sp 를 이용함

Page 75: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

CTP sub main 30 분 32분금사닥 , 항생 sub main 40 분 42 분CTP 화원

Main 서버에서 app_d, prp_d, oms_d 실행 x(GCE 가 있으므로 )

Sub 서버에서 Savejnl 실행이 제대로 안될 때 많음 , 확인할 것run.sh 의 프로세스 실행 순서는프로세스끼리 연동될 때 서버와 클라이언트 관계를 고려하여 순서가 정해짐

모니터링 툴 – 프로세스가 죽어있으면 계속 에러를 기록 시세 서버 연결 끊어진 것은 한번만 에러 기록

Page 76: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

항생Run.sh1. hsgce 실행2. app_d, prp_d 실행

hsgce -> app_d -> prp_d

서버 특이사항금사닥order push

app_d prp_d

oms

쓰레드 30 개

여러 고객 주문을 처리하기 위해 30 개

Page 77: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

app_d log 파일에서app_d service Thread -> 30 개sendall - 요청에 대한 정보readall - 응답에 대한 정보Order 서버 <-> app_d 간의 메시지sendall 6011( 아이디 , 패스워드 : order 서버 로그인 )readall 6011(order 서버 로그인에 대한 응답 )

Sendall 6031(heart beat 요청 = 연결을 유지하기 위해 주기적으로 데이터 보냄 )Readall 6031(heart beat 에 대한 응답 )

Sendall 6021( 주문에 대한 요청 )Readall 6021( 주문에 대한 응답 )

고수 – oms – app_d -> order 서버 ( 요청 ) app_d <- order 서버 ( 응답 ) <- 의 의미 (1. 접수가 되었음 또는 2. 체결 ) oms – prp_d <- push 고수는 8008 정보를 받으면 체결이 된 것으로 생각

Page 78: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

동시 호가 타임8:55 분 ~ 8:59 분까지 미리 주문에 대한 정보를 받음8:59 분 ~ 9:00 분은 주문을 받지 않음

뉴스의 영향과 오늘의 주문을 미리 받기 때문에 어제 종가와 오늘의 시가가 차이 ( 갭차이 ) 를 보이게 됨

Page 79: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

남화 (ctp)

CTP

가상 계좌시스템

GCE

서버( 금사닥 )

100만원

20 만원 20 만원 20 만원 20 만원20 만원

우리가 만들 것

가상계좌

금사닥패킷으로 통신CTP콜백함수로 통신

우리 서버와 고수는금사닥 밖에 모름GCE 를 통해서 다른 API 로 변환

Page 80: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

고수

금사닥회사서버 CTP회사서버항생회사서버

선물사 선물사

주문 , 실시간 시세정보

주문과 시세정보의 통로가 같음주문 , 실시간 시세정보 둘 다 서버에서 받아 처리 주문과 시세정보의 통로가 다름주문은 gce 를 통해서 , 시세정보는 서버를 통해서 처리

주문 , 실시간 시세정보

주문정보

실시간 시세정보CTPgce

주문정보

실시간 시세정보

Page 81: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

고수

Real 회사서버 백업 회사서버

Real선물사 서버

시세주문

시세주문시세

주문

시세주문

금사닥 , 항생구조Real 과 test 의 명확히 구분됨

백업 서버 접속 ip가지는 고수

test선물사 서버

Test회사 서버

시세주문

시세주문test 서버 접속 ip가지는 고수

Real 회사 서버가 동작을 안 할 때 백업회사 서버로 전환하여 사용

한 컴퓨터 서버에Push 서버 , order 서버Quote 서버 공존 ( 추정됨 )

Page 82: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

고수

Real 회사서버 백업 회사서버

Real선물사 서버

시세 주문

시세 주문 시세 주문

시세 주문백업 서버 접속 ip가지는 고수

test선물사 서버

Test회사 서버

시세주문

시세 주문test 서버 접속 ip가지는 고수

Real 회사 서버가 동작을 안 할 때 백업회사 서버로 전환하여 사용 Ctp 구조주문은 test 와 백업이 구분이 됨시세는 real 이던지 test 이던지둘 다 real 선물사 서버의 시세정보를 받음

TestCTPgce

백업CTPgce

RealCTPgce

한 컴퓨터 서버에Push 서버 , order 서버Quote 서버 공존 ( 추정됨 )

Page 83: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

외부 모니터링 서버

sms sms sms sms

sms sms sms sms

sms sms sms sms

sms sms sms sms

13 개 선물사 서버sms 동작 원리

Page 84: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

Mon_svr 에 대한 설정 파일 (검사할 서버의 ip 주소가 들어 있음 )Ini/svr_info.info

궐련 3 번 서버에서 실행할 것참고 mon_svr 은 32bit 운영체제에서만 실행 가능 CTP 는 64bit 운영체제에서만 실행 가능

Page 85: 궐련  –  chamtime  1, 2, 3( 백업  :  main+sub ) 관통  –  신 1,  신 2,  구 1( 관통 - Main) ( 백업 : main + sub) 초상  – 1, 2 중융 – 1, 2 중강 – 1, 2

야간장에 종목이 추가되면 해야 될 것1. ini/contractcode_nightlist.ini( 모든 서버에 이 파일이 다 있음 ) 추가되는 야간장 종목을 파일에 추가 총 수량 , 종목의 정보를 추가2. mininfo.ini(야간장의 시작 , 끝 시간을 설정 ) 분봉에 대한 세션관련 파일임 거래소마다의 세션타임 ( 장시간 ) 변경 NM MARKET START TIME NM MARKET CLOSE TIME