svn st | grep '^?' | sed 's/^? *//' | xargs svn add
2018년 1월 23일 화요일
2018년 1월 22일 월요일
MariaDB (Windows) 설치
Database 구축을 하려고 생각한 것은 AI Trading 이라는 거창한 목표를 한번 해보고 싶어서 시작하게 되었음. MySQL 을 처음 사용하였는데 혹시 배포를 하게 될 때 제약이 있어서 MariaDB 가 더 자유롭다는 말에 혹해서 시작!!
그럼 설치를 시작해 볼까요~
제가 사용할 운영체제 : Windows 2016 Server 64bit. R2
MariaDB 를 다운로드 하자.
https://downloads.mariadb.org/
Download 10.2.12 Stable Now! 초록색 버튼을 눌르면 운영체제에 맞게 패키지를 다운로드 할 수 있는 화면으로 넘어 갈 수 있다. (18년 1월 기준)
아래 처럼 원하는 옵션을 오른쪽에서 선택해 주면 편리하게 다운로드할 패키지를 보여준다. msi로 다운로드
다운로드 하기 위해서 서식에 맞게 정보를 입력해 주자.
또는 오른쪽에 No thanks, just take me to the download... 를 이용하여 다운로드만 진행 해도 된다.
MS SQL 을 사용하는 유저라면 TCP port 를 충돌이 나지 않도록 변경해야 합니다.
설치가 완료 되었습니다.
다음 시간에는 DB를 만드는 작업을 해보겠습니다.
2017년 5월 23일 화요일
SVN Error Database Locked 가 발생 하였을 때
1. Client 쪽 이슈이기 때문에 아래 와 같이 우선 처리 해 보고 안되면
db 테스트를 해야 함.
- TSVNCache.exe 를 작업관리자에서 실행을 중지 한다.
- SVN Clean up 동작을 수행한다.
이것 만으로도 전 실행이 되었습니다.
db 테스트를 해야 함.
- TSVNCache.exe 를 작업관리자에서 실행을 중지 한다.
- SVN Clean up 동작을 수행한다.
이것 만으로도 전 실행이 되었습니다.
2017년 4월 28일 금요일
실시간 차트에 보조지표(이평선) 추가하기
저번에 만들어 놓은 실시간 차트에 이평선 보조 지표를 추가하도록 하겠습니다.
5분의 20이평 선을 추가
하기 위해서 전에 사용하였던 PriceEntityObject 에 사용하기 위한 해당 날짜의 이평선 값을 추가 합니다.
1.
TR 데이터를 수신할 때 이평선을 계산하고 이평선
차트를 생성
2.
실시간 데이터가 수신될 때 마다 업데이트
A.
기존 이평선 값을 업데이트 하는 경우
B.
새로운 캔들이 추가되면서 새로운 이평선을 추가해야 되는 경우
위 단계를 통해서 지표 작업을 진행해 보도록 할게요.
일단 20일 이평선 이므로 20개
이하가 있는 과거 데이터에 대해서는 계산하지 않고 0으로 설정하도록 합니다.
1번 2A 2B 함수 를
아래와 같이 만듭니다.
void update_20이평선_add()
{
Series avr_20 = real_chart.Series.FindByName("avr_20"); //현재 차트에 20이평선이 그려져 있다면 그 정보를 우선 가져온다.
if (avr_20 == null)
return;
double avr_sum;
avr_sum = 0.0;
//i번째 부터 20개의 데이터의 합을 구한다.
for (int j = 0; j <
20; j++)
{
avr_sum +=
m_real_data_list[j].close;
}
m_real_data_list[0].avr_20 =
avr_sum / 20; //i 번째에 20개를 계산하여 업데이트 한다.
//설정된 X 0번째에 값을 추가 한다.
avr_20.Points.AddXY(real_chart.Series["f_price"].Points[0].XValue,
m_real_data_list[0].avr_20);
}
void update_20이평선_update()
{
//최신 20 이평선만 재계산하면 된다.
if (m_real_data_list.Count > 0)
{
Series avr_20 = real_chart.Series.FindByName("avr_20"); //현재 차트에 20이평선이 그려져 있다면 그 정보를 우선 가져온다.
if (avr_20 == null)
return;
double avr_sum;
avr_sum = 0.0;
//i번째 부터 20개의 데이터의 합을 구한다.
for (int j = 0; j <
20; j++)
{
avr_sum +=
m_real_data_list[j].close;
}
m_real_data_list[0].avr_20 =
avr_sum / 20; //i 번째에 20개를 계산하여 업데이트 한다.
//현재 최신 값을 수정한다.
avr_20.Points[0].SetValueY(m_real_data_list[0].avr_20);
}
}
void update_20이평선_create()
{
if (m_real_data_list.Count > 0)
{
Series avr_20 = real_chart.Series.FindByName("avr_20"); //현재 차트에 20이평선이 그려져 있다면 그 정보를 우선 가져온다.
if (avr_20 == null)
avr_20 =
real_chart.Series.Add("avr_20"); //없다면 새로 추가를 한다.
avr_20.ChartType = SeriesChartType.Line; //이평선은 선형태 그래프 임.
avr_20.Color = Color.Green; //색상은 초록색
avr_20.Points.Clear(); //기존의 이평선 값을 초기화 한다.
//과거 마지막 20개는 20개 데이터가 없기 때문에 이평선데이터를 만들수 없다.
for (int i = 0; i <
m_real_data_list.Count-20; i++)
{
double avr_sum;
avr_sum = 0.0;
//i번째 부터 20개의 데이터의 합을 구한다.
for (int j = 0; j <
20; j++)
{
avr_sum +=
m_real_data_list[i + j].close;
}
m_real_data_list[i].avr_20
= avr_sum / 20; //i 번째에 20개를 계산하여 업데이트 한다.
//입력되는 x단위는 캔들데이터가 가지고 있는 날짜시간 값과 동일해야 한다.
avr_20.Points.AddXY(real_chart.Series["f_price"].Points[i].XValue,
m_real_data_list[i].avr_20);
}
}
}
추가를 아래 위치에 하나씩 해줍니다.
TR 데이터를 수신할 때
실시간 데이터를 수신할 때 기존 캔들 데이터가 업데이트 된것이면 이평선도 업데이트를
신규 캔들이 만들어 지면 이평선도 같이 추가를 해서 만들어 주는 add 함수를
만들어 주면됩니다.
결과 화면
2017년 4월 8일 토요일
키움 OPEN API 실시간차트 만들기(2)
조회 요청을 한 데이터를 수신하기 위해서는 수신할 데이터를 위한 데이터 구조 클래스를 하나 추가 합니다.
프로젝트를 오른쪽 버튼을 눌러서 새항목을 선택 후 PriceObject 를 클래스로 만들어서 추가 버튼을 누릅니다.
위와 같은 클래스를 하나 만듭니다.
이후 form 에 멤버 변수를 하나 정의하고 생성자 함수에서 초기화를 합니다.
(만약 프로그램에 미숙하신 분이시라면 멤버 변수나 생성자라는 용어는 C# 프로그래밍 서적을 하나 보시는게 좋습니다
쉽게 저 m_real_data_list 는 위의 날짜, 시가, 고가, 저가, 종가를 저장할수 있는 공간이고 LIST 라는 표현으로 PriceEntityObject 를 여러게 저장할 수 있다는 의미 입니다.
이 변수에 데이터를 저장하기 위해서는 form1() 함수내에서 아래와 같이 초기화를 하여야 합니다.)
이후 아까 추가 하였던 TrData 함수에 아래와 같이 요청 이름과 동일한 응답이 들어 온다면 (sRQName == "과거데이터조회") -> Request Name 이 라는 의미 입니다.
현재 존재하는 m_real_data_list 의 데이터를 모두 삭제하고, 들어온 데이터의 갯수만큼 PriceEntityObject 를 만들어서
다시 추가해줍니다. 저기서 중요한 것은 키움 뿐 아니라 다른 여러 증권사 API 에서 가격 데이터를 응답해 줄때
이전 가격 데이터 대비 하락 시 -(음수) 값으로 준다는 것입니다. 우리는 이것을 항상 양수로 판단해야 되기 때문에 음수이면 -1 을 곱하여 양수로 만들어서 넣어 줍니다.
그리고 실시간 데이터가 들어 오면 처리해야 될 부분을 아래와 같이 추가해줍니다.
수신이 되면 여기서 해야 될 일은 들어온 실시간 데이터를 기존 캔들에 업데이트 해줄 것이냐 아니면 새로운 캔들에 업데이트 해줄 것이냐 입니다.
시간을 비교하기 위해 아래 함수를 추가 합니다.
OPENAPI 를 통해 전달되는 TR 데이터의 시간 형식은 년(4자리)월(2자리)일(2자리)시(2)분(2)초(2) 로 되어 있습니다.
반면 실시간으로 전달되는 데이터는 년 월 일이 빠진 일(2자리)시(2)분(2)초(2) 로 들어 오기 때문에 오늘 날짜를 구하여 앞에 붙여줍니다. 그리고 아래와 같이 date 와 현재 설정된 시간간격(5분) 과 비교하여 해당 시간 안에 있다면 true 를 자신의 캔들의 허용시간이 아니라면 false 를 리턴합니다.
실시간 데이터가 들어 오는 OnReceiveRealData 함수에 아래와 같이 코딩을 추가 합니다.
TR데이터가 비어있다면 실시간 데이터를 처리하지 않으며
실시간 현재 가격을 저장한다음, TR데이터의 마지막 데이터와 같은 캔들 시간데에 존재한다면 현재 가격이 고가나 저가보다 난거나 높은지 비교하고 고,저, 종가를 업데이트 합니다. 시가는 항상 처음에 한번 캔들이 생성될 때만 업데이트 되기 때문에 새로운 가격이 생성될 때 그 실시간 가격의 체결시간이 아닌 현재 선택된 분봉 기준으로 시간을 재계산하여
만들어 줍니다.
이제 차트에 데이터를 그려 볼까요
디자인화면에서 차트를 선택하고 Name 속성을 real_chart 로 변경합니다.
그리고 생성자 함수 Form1() 에 아래와 같이 속성들을 초기화 합니다. 상승일때 빨간색, 하락일 때 파란색,
그리고 맨위에 아래와 같이 한줄을 추가해야 에러가 나지 않습니다.
using System.Windows.Forms.DataVisualization.Charting;
코드에서 나오는 real_chart_AxisViewChanged 를 추가하기 위해서 디자인 창에서 차트를 선택한다음 속성에서 번개 아이콘을 선택하고 아래의 AxisViewChanged 를 더블 클릭합니다. 이 함수는 차트에서 마우스로 확대 축소를 하기 위한 기능을 위해 사용됩니다.
확대 축소를 위해서는 아래 와 같은 코드를 추가 합니다.이제 차트를 그리기 위해서 TR 데이터가 처리된후 차트를 한번 생성해 줍니다.
아래와 같이 마지막에 real_chart_data_create() 함수를 추가 하고
아래와 같이 데이터를 차트에 입력 합니다.여기까지 하고 실행을 해보면 마우스로 드래그 확대를 해서 보면
이런식으로 데이터가 캔들처럼 보입니다.
하지만 실시간 데이터 처리가 되지 않았기 때문에 실시간 데이터가 들어 올때 차트에 반영될 수 있도록 처리를 추가 해야 됩니다.
위는 현재 캔들에 가격을 업데이트하는 것이고 아래는 새로운 캔들 데이터를 추가하는 코드 입니다.
이렇게 하고 장운영시간에 실행을 해보면 실시간으로 데이터가 변경되는 차트를 확인 할수 있습니다.~~
키움 OPEN API 실시간차트 만들기(1)
선물옵션의 연속 선물 + 최근 월물을 위한 실시간 캔들 차트를 만들기 위한 샘플을 만들어 보겠습니다.
생각해 보니 아래와 같은 사항을 고려해야 겠네요.
- 우선 로그인을 합니다.
- 조회 버튼을 누르면 현재 시간 이전의 5분 가격 데이터를 가져옵니다. (TR 데이터 요청)
- 실시간 데이터 요청을 합니다.
- 실시간 데이터가 들어 올 때 (장중 시간 판단) 와 아닐 때를 구분합니다.
- 데이터가 들어올 때 현재 캔들과 같은 시간대의 캔들인지 아닌지를 구분하여 같을 때는 현재 마지막 캔들의 데이터를 업데이트 하고, 아니라면 새로운 캔들을 추가 합니다.
- 차트에 데이터를 추가하고 차트 설정을 하여 그리기를 합니다.
우선 Visual Studio 2018 에서 Visual C# 아래와 같이 프로젝트를 생성합니다
도구상자 에서 KHOpenAPI Control 을 마우스 왼쪽 버튼으로 선택하여 드래그 하여 대화상자 위에 끌어 옵니다.
블로그의 첫강좌 OPEN API 를 이용한 프로그램 만들기를 참고 하세요.
이방식으로 버튼 1개와 차트 를 화면에 등록합니다.
버튼은 "조회 시작" 이라고 등록을 하였습니다.
그럼 Form1.cs 파일에 아래오 같이 함수들이 추가 되어집니다.
전 강좌에서 설명한 것 처럼 EventConnect 는 로그인 결과에 대한 이벤트를 수신하는 함수 이고
RealData 는 말그대로 실시간 시세를 받아 오는 함수
TrData 는 요청한 데이터가 수신되는 함수 입니다.
이번 강좌에서 키움 API 를 사용하는 부분은 크게 3가지 입니다.
- 로그인을 하고 확인하기
- 현재 시간을 기준으로 이전데이터를 가져오기
- 실시간 데이터를 수신하기
폼 디자인 화면에서 조회 버튼을 더블 클릭하면 코드에 함수 하나 추가 됩니다. 그곳에 로그인 함수를 구현합니다.
-> 로그인을 요청하는 함수 입니다. 키움 로그인 창이 뜨고 정상적으로 로그인이 되면 아래의 EventConnect 에 e.nErrCode 값이 0으로 넘어오게 됩니다.이후 GetConnectState() 값이 1이면 정상 접속된 것이므로 이때 연결 선물 5분 데이터를 요청합니다.
과거데이터조회 -> 는 임의로 정한 요청 이름입니다. 수신할 때 구분하기 위한 요청 이름
opt50029 은 제가 가져오려는 연결 선물 5분 데이터를 주기 위한 키움에서 제공하는 TR 요청 번호 입니다.
KOAStudio 를 열어서 보면 아래와 같이 선물 옵션 분차트 요청시 사용하는 이름입니다. 사용방법은 오른쪽에서 나온 것처럼쓰게 되어 있고 이것을 코드에 복사하여
입력값 1에는 종목 번호 -> 연결 선물 종목코드가 10100000 입니다.
입력값 2 는 시간 단위로 우리는 여기서 5분 기준 데이터를 보낼 것이므로 5를 입력합니다.
이후 CommoRqData 에서 RQName 은 임의의 요청 이름 즉 과거 데이터 조회가 되고
요청 이름, 3번째인자는 일단 0입니다. 그리고 화면번호 5003 은 임의로 설정한 값입니다.
KOA Studio 에서 안쓰는 화면 번호값 4자리를 입력하면 됩니다.
저같은 경우 TR요청은 5000 번대, 실시간은 6000 번대를 이용하여 사용합니다.
이런식으로 6001은 임의로 등록한 화면이름, 두번째 인자는 요청하는 데이터 우리는 최근월 즉 17년 6월 선물 데이터이므로 종목번호 101M6000 입니다. 해당 선물시세이므로 이종목의 실시간 데이터중 우리가 사용할 데이터는
체결시간과 현재가 이므로 10:20 두가지 데이터를 위와 같이 입력합니다. 추가로 더 받고 싶다면 : 을 입력하고 계속 문자열로 입력하면 됩니다.
마지막은 "0" 으로 설정하면 됩니다.
피드 구독하기:
글 (Atom)

































