#증권정보홈페이지를 만들어보자(2)

#증권정보홈페이지를 만들어보자(2)

 

1. OS구축

1.1 CentOS 6.6 설치

1.2 파티션정의

---------------------500기가 기준----------------------------------------------

swap(2,048)  -> 10,000
/boot(100)   ->  2,000(첫번째 파티션으로 만듦, 체크)
/(3,072)     -> 12,000
/usr(8,192)  -> 70,000
/usr2(90,000)-> 90,000
/var(4,096)  -> 12,000
/tmp(4,096)  -> 12,000
/data(70,000)-> 70,000
/home(2,000) ->  2,000
/web(나머지 부분을 할당, 체크)

---------------------500기가 기준----------------------------------------------

 

1.3. Group,User 생성

 

2.  네트웍설정
3.  TELNET설정
4.  FTP설정
5.  한글깨짐설정
6.  시간동기화
7.  gcc설치
8.  MySQL설치
9.  JDK설치
10. TOMCAT & APACHE설치

 

11. 백엔드설정(서버)

12. 프론트엔드설정(웹)

 

 

#1Minute 체결 데이타 저장과 생성

#1Minute 체결 데이타 저장과 생성

 

1. 1Minute체결데이타를 MySQL에 저장하는것으로 한다.

2. 저장하는 항목은 

{"date":1455710400,"high":0.00978987,"low":0.0089,"open":0.009716,"close":0.00933999,"volume":2860.36726244,"quoteVolume":307623.36565991,"weightedAverage":0.00929827}

 

2.1 date는 UnixTimestamp를 이용

2.2 high는 고가(메모리에 저장되어진 kse.high 이용)

2.3 low는 저가(메모리에 저장되어진 kse.low 이용)

2.4 open은 시가(메모리에 저장되어진 kse.open 이용)

2.5 close는 현재가(메모리에 저장되어진 kse.hyun 이용)

2.6 volume은 현재 체결량(메모리에 저장되어진 kse.hyunvol 이용)

2.7 quoteVolume은 누적된 체결량(메모리에 저장되어진 kse.vol 이용)

2.8 weightedAverage은 가중평균가(CLOSE 종목마감데이타, close.weight_avg -> kse.weight_avg이용)

2.9 종목마감데이타의 close.weight_avg는 실시간으로 수신된다. 종목시세처리시에 비교해서 close.weight_avg -> kse.weight_avg반영한다.

 

 

3. 저장이벤트시간

3.1 KRX지수는 2초혹은 10초간격으로 다양하게 산출되어서 수신되어진다.

3.2 장시작 지수의 시간이 "PREJJJ"가 오면 전체종목에 대해서 위의 항목을 저장한다.(SEQ:0)

     - systme(BEFOREMINSISESHELL)

3.3 HHMMSS/100*100=HHMMSS(1분)이면, 전체종목에 대해서 위의 항목을 저장한다.(SEQ:HHMMSS로 판단)

     - system(MINSISESHELL)

3.4 장마감 지수의 시간이 "JUNJJJ"가 오면 전체종목에 대해서 위의 항목을 저장한다.(SEQ:99999)

     - system(CLOSEMINSISESHELL)

 

4. 1Minute 체결 데이타 생성

     - 체결데이타의 생성시간은 사용자가 정의하면 된다.

     - 보통 Cron으로 1분에 한번(?)

4.1 전체종목을 읽어서 각 종목별로 파일이름을 생성후에 데이타를 JSON형식의 TXT파일로 저장한다.

4.2 예를들어, 삼성전자라면, KR7005930003.json 이다.

 

5. 저장디렉토리 구조

5.1 data/kse/*.json - 거래소종목

5.2 data/kosdaq/*.json - 코스닥종목

5.3 data/konex/*.json - 코넥스종목

5.4 data/future/*.json - K200지수 선물종목

5.5 data/option/*.json - K200지수 옵션종목

5.6 data/ksejisu/*.json - 거래소지수

5.7 data/kosdaqjisu/*.json - 코스닥지수

 

 

 

 

//DateTime -> UnixTimestamp -> DateTime 변환

//DateTime -> UnixTimestamp -> DateTime 변환

 

#include<stdio.h>

#include<time.h>

 

int GetUnixTimeT(int year, int month, int day, int hour, int minute, int second)

{

  struct tm t = {0};

 

  t.tm_year = year - 1900;

  t.tm_mon = month - 1;

  t.tm_mday = day;

  t.tm_hour = hour;

  t.tm_min = minute;

  t.tm_sec = second;

 

  return(mktime(&t));

}

int main(int argc, char *argv[])

{

  time_t t = time(NULL);

  struct tm tm = *localtime(&t);

 

  int ____year = tm.tm_year + 1900;

  int ____month = tm.tm_mon = month + 1;

  int ____day = tm.tm_mday;

  int ____hour = tm.tm_hour;

  int ____minute = tm.tm_min;

  int ____second = tm.tm_sec;

 

  printf("DateTime(1):[%d-%d-%d %d:%d:%d]\n", ____year,

    ____month, ____day, ____hour, ____minute, ____second);

 

  time_t baseTime = GetUnixTimeT(____year,

            ____month, ____day, ____hour, ____minute, ____second);

 

  printf("UnixTimestamp:[%ld]\n", baseTime);

 

  struct tm *tmmm = (struct tm *)localtime(&baseTime);

 

  ____year = tmmm->tm_year + 1900;

  ____month = tmmm->tm_mon = month + 1;

  ____day = tmmm->tm_mday;

  ____hour = tmmm->tm_hour;

  ____minute = tmmm->tm_min;

  ____second = tmmm->tm_sec;

 

  printf("DateTime(2):[%d-%d-%d %d:%d:%d]\n", ____year,

    ____month, ____day, ____hour, ____minute, ____second);

 

  return(0);

}

 

 

 

 

  

#JavaScript Candle Chart

 

 

candle.html
0.00MB

 

 

exporting.js
0.02MB

 

 

highstock.js
0.37MB

 

[{"date":1455699200,"high":0.00971537,"low":0.00971537,"open":0.00971537,"close":0.00971537,"volume":0,"quoteVolume":0,"weightedAverage":0.00971537},{"date":1455710400,"high":0.00978987,"low":0.0089,"open":0.009716,"close":0.00933999,"volume":2860.36726244,"quoteVolume":307623.36565991,"weightedAverage":0.00929827},{"date":1455724800,"high":0.0103898,"low":0.00930001,"open":0.00933999,"close":0.0094,"volume":2919.83796807,"quoteVolume":298145.85276802,"weightedAverage":0.00979332},{"date":1455739200,"high":0.00950994,"low":0.00825017,"open":0.00934037,"close":0.0090876,"volume":6306.93897676,"quoteVolume":714651.82207307,"weightedAverage":0.00882519},{"date":1455753600,"high":0.00909248,"low":0.008,"open":0.0090876,"close":0.00858202,"volume":4576.61493894,"quoteVolume":543271.63733905,"weightedAverage":0.00842417},{"date":1455768000,"high":0.00895382,"low":0.00845001,"open":0.0085575,"close":0.00872019,"volume":1281.31473149,"quoteVolume":148522.05236394,"weightedAverage":0.0086271},{"date":1455782400,"high":0.0122,"low":0.00872019,"open":0.00872019,"close":0.01030435,"volume":10032.78128347,"quoteVolume":976189.97115582,"weightedAverage":0.01027748}]

 

 

위의 date는 유닉스타임입니다.

유닉스타임을 날짜로 변환(Unix timestamp to DateTime)하면

 

1. 유닉스 타임
1455699200
 
2. KST(한국표준시)
유닉스 타임 변환후 변환날짜
2016-02-17 17:53:20
20160217175320

3. KST
2016. 2. 17. 오후 5:53:20

 

닷넷 프레임워크(.NET Framework, 이전 이름: 닷넷)는 마이크로소프트에서 개발한 윈도우 프로그램 개발 및 실행 환경이다. 네트워크 작업, 인터페이스 등의 많은 작업을 캡슐화하였고, 공통 언어 런타임(Common Language Runtime)(CLR)이라는 이름의 가상 머신 위에서 작동한다.

 

 

 

 

Windows10에는 기본적으로 Microsoft.NET\Framework 디렉토리가 설정되어 있다.(예를 들어, c# compiler,,,,,)

#FTP server/client standard tcp program

 

fss_client.c
0.00MB
fss_server.c
0.00MB

 

 

NOT fork

NOT thread

NOT select

STANDARD tcp OK

 

 

비고) 클라이언트소스에 <sys/sendfile.h>에 선언되어진 sendfile 이라는 함수가 유용하게 사용된다.

#거래소 & Koscom 정보분배 Tcp데이타 수신및 처리

 

1. 수신받는 쪽이 서버입니다.

    1.1 거래소 & Koscom은 데이타를 송신하는 역할을 합니다.

    1.2 Ack데이타가 없다.(무조건 수신만 받는 서버의 역할을 담당합니다.) 

    1.2.1 다른 서버&클라이언트 구조와 다르게, Ack데이타가 존재하지 않으므로 수신하는 서버의 하드웨어 스펙과
    수신프로그램의 성능이 중요합니다.

    1.2.2 송신프로그램에서 1000 Record 라는 데이타를 주었는데, 수신프로그램에서

    1000 Record 데이타를 수신 못한다면 수신서버는 제 역할을 못한다고 할수 있습니다.

    1.3 수신서버에서 데이타를 못받게된다면, 송신서버(거래소 & Koscom 정보분배)에서는
    Error를 결과값으로 받게됩니다.

    1.4 Error를 결과값으로 받게되면, 송신서버(거래소 & Koscom 정보분배)담당자는
    연락을 취하는경우가 보통입니다.

    1.5 간략하게 정리하자면, 송신서버(거래소 & Koscom 정보분배)에서는 send라는 함수만 사용하고

    1.6 수신서버에서는 recv함수만 사용하면 되는것입니다.

 

2. 수신받는 데이타가 하나의 레코드가 아닐수 있습니다.

    2.1 최소 1개 레코드에서 n개의 레코드가 될수 있습니다.(호가여러개, 혹은 호가와 체결이 결합되어진 여러개)

    2.2 물론 레코드와 레코드를 분리하는 방법은 수신패킷 내부에 포함되어 있습니다.

 

3. 레코드와 레코드 사이의 구별하는 패킷분리 인자가 보통 3개 존재합니다.

    3.1 0xff, 0x0d, 0x0a 3개의 char변수를 기반으로 분리합니다.

 

4. 레코드한개를 분리해서 처리하도록 합니다.

    4.1 여러개의 레코드에서 한개의 레코드를 추출해서, 처리를 합니다.

        4.1.1 호가 레코드, 1종목 처리

        4.1.2 체결 레코드, 1종목 처리

    4.2 추출한 레코드를 수신프로그램에서 동시에 처리하는것은 바람직 하지 않습니다.

        4.2.1 주로 Queue를 통해서 전송해서 Queue를 읽어들이는 처리프로그램을 따로 작성해야 합니다.

    4.3 Queue통해서 읽어들인 레코드는 주식로직을 통해서 처리합니다.

    4.4 주식로직에 대한 부분은 너무 방대하므로 여기서는 SKIP합니다.

    4.5 수신구조체가 필요합니다.

    4.6 처리구조체가 필요합니다.(수신된 데이타를 전부 보관하는건 비효율적이라고 생각합니다.)

    4.6.1 화면에서 필요한 데이타를 기획해서, 처리구조체를 정의하면 됩니다.

 

5. 처리되어진 데이타는 저장소에 보관합니다.(대량의 데이타이고 빠른 조회를 위해서 메모리 기반으로 많이 저장소를 선택합니다.)

    5.1 Shared Memory가 될수 있습니다.

    5.2 DataBase가 될수 있습니다.

    5.3 File가 될수 있습니다.

 

6. 저장되어진 데이타를 조합해서, 클라이언트로 보내주면,거래소 & Koscom 정보분배 Tcp데이타를 외부에서 볼수 있습니다.

    6.1 Web
    (Request & Response <-> Web Server <-> Was(Tomcat) <-> JNI <-> Jni FrameWork <-> Memory In Server)

    6.2 HTS

    6.3 MTS

 

7. 업무볼륨

    7.1 1-5번까지의 부분은 서버의 역할중에서 10%정도 볼륨이며

    7.2 5-6번까지의 부분이 나머지 90%의 역할을 담당합니다.

 

 

더욱 궁금한부분은 xterm92@naver.com으로 연락부탁드립니다.

 

#Compile

gcc -I/usr/local/jdk1.7.0_79/include -I/usr/local/jdk1.7.0_79/include/linux -I/usr2/sinfo/src/include -I/usr/local/mysql/include -I./../jni_include  -fPIC -g -c -Wall SiseLibJong.c

 

gcc -I/usr/local/jdk1.7.0_79/include -I/usr/local/jdk1.7.0_79/include/linux -I/usr2/sinfo/src/include -I/usr/local/mysql/include -I./../jni_include  -fPIC -g -c -Wall ShmOpJong.c

 

 

#Link(so)

#gcc -shared -fPIC -o libShmJong.so SiseLibJong.so ShmOpJong.so

../util/Common.o /usr2/sinfo/src/util/MEMORY.o /usr2/sinfo/src/util/IPC.o /usr2/sinfo/src/util/STRLIB.o /usr2/sinfo/src/util/FUNC.o -lm -lpthread -lnsl

 

#Link(exe)

#gcc -o exeShmJong SiseLibJong.so ShmOpJong.so

../util/Common.o /usr2/sinfo/src/util/MEMORY.o /usr2/sinfo/src/util/IPC.o /usr2/sinfo/src/util/STRLIB.o /usr2/sinfo/src/util/FUNC.o -lm

-lpthread -lnsl

 

 

 

 

Makefile
0.00MB

+ Recent posts