using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
namespace Auto_Stock
{
public partial class MainForm : Form
{
private string LoginName;
private string LoginId;
private string accFileName = "stock_db.accdb";
private string dbPasswd = "admin";
public MainForm()
{
InitializeComponent();
/*
OleDbConnection conn = new OleDbConnection();
OleDbCommand connCmd = new OleDbCommand();
Console.WriteLine("mainform start");
try
{
Console.WriteLine("db access start");
conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + this.accFileName + ";Mode=ReadWrite;Jet OLEDB:Database Password=" + this.dbPasswd;
conn.Open();
connCmd.Connection = conn;
connCmd.CommandText = "INSERT INTO favorite(usr_id) VALUES(@usr_id)";
connCmd.Parameters.Add(new OleDbParameter("@usr_id", "test"));
connCmd.ExecuteNonQuery(); // 입력
connCmd.CommandText = "SELECT * FROM favorite";
OleDbDataReader oleData = connCmd.ExecuteReader(CommandBehavior.CloseConnection);
while (oleData.Read())
{
Console.WriteLine(oleData["userId"].ToString());
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
conn.Close();
}
*/
}
private void database_proc(string sql, Dictionary<string, string> param)
{
OleDbConnection conn = new OleDbConnection();
OleDbCommand connCmd = new OleDbCommand();
try
{
conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + accFileName + ";Mode=ReadWrite;Jet OLEDB:Database Password=" + dbPasswd;
conn.Open();
connCmd.Connection = conn;
//connCmd.CommandText = "INSERT INTO favorite(usr_id) VALUES(@usr_id)";
connCmd.CommandText = sql;
foreach (KeyValuePair<string, string> row in param)
{
//connCmd.Parameters.Add(new OleDbParameter("@usr_id", "test"));
connCmd.Parameters.Add(new OleDbParameter(row.Key, row.Value));
}
connCmd.ExecuteNonQuery(); // 입력
}
catch (Exception ex)
{
Console.WriteLine("Exception 에러발생 : " + ex.Message);
}
finally
{
conn.Close();
}
}
private Dictionary<int, Dictionary<string, string>> database_select(string sql, Dictionary<int, string> columns)
{
OleDbConnection conn = new OleDbConnection();
OleDbCommand connCmd = new OleDbCommand();
Dictionary<int, Dictionary<string, string>> list = new Dictionary<int, Dictionary<string, string>>();
try
{
Console.WriteLine("select start");
conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + this.accFileName + ";Mode=ReadWrite;Jet OLEDB:Database Password=" + this.dbPasswd;
conn.Open();
connCmd.Connection = conn;
//connCmd.CommandText = "SELECT * FROM favorite";
connCmd.CommandText = sql;
OleDbDataReader oleData = connCmd.ExecuteReader(CommandBehavior.CloseConnection);
int i = 0;
while (oleData.Read())
{
//Console.WriteLine("usr_id = " + oleData["usr_id"].ToString());
Dictionary<string, string> list_row = new Dictionary<string, string>();
foreach(KeyValuePair<int, string> row in columns)
{
string column = row.Value;
list_row[column] = oleData[column].ToString();
}
list[i++] = list_row;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
conn.Close();
}
return list;
}
//로그인 버튼 클릭
private void ButtonLogin_Click(object sender, EventArgs e)
{
if(LoginName != null)
{
MessageBox.Show("이미 로그인 하셨습니다.");
return;
}
long Result;
Result = axKHOpenAPI1.CommConnect();
if (Result != 0)
{
Console.WriteLine("로그인창 열기 실패!");
}
else
{
Console.WriteLine("로그인창 열기 성공!");
}
}
//로그인 후 개인정보 가져오기
private void axKHOpenAPI1_OnEventConnect(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnEventConnectEvent e)
{
Console.WriteLine("개인정보 가져오기 성공!");
string UserName = axKHOpenAPI1.GetLoginInfo("USER_NAME");
string UserId = axKHOpenAPI1.GetLoginInfo("USER_ID");
ButtonLogin.Text = UserName + "(" + axKHOpenAPI1.GetLoginInfo("USER_ID") + ")";
LoginName = UserName;
LoginId = UserId;
}
//전체종목리스트에서 주식 row를 클릭하면 실행
private void listBoxStock_SelectedIndexChanged(object sender, EventArgs e)
{
}
//종목리스트 불러오기
bool IsListCall = false;
bool 전체종목리스트_초기체크 = true;
private void ButtonListCall_Click(object sender, EventArgs e)
{
if (LoginName == null)
{
MessageBox.Show("로그인이 필요합니다.");
}
else
{
if(IsListCall == true)
{
//MessageBox.Show("이미 호출된 상태입니다.");
//return;
}
Dictionary<string, string> favorite_list = listVIew1_select();
//Console.WriteLine(favorite_list);
IsListCall = true;
전체종목리스트_초기체크 = true;
listView1.Items.Clear();
ListViewStock.Items.Clear();
ListViewStock.CheckBoxes = true; // 항목옆에 확인란을 표시할지 여부를 선택합니다.
//ListViewStock.Click += new EventHandler(ListViewCheckClick);
//ListViewStock.OwnerDraw = true;
//GetCodeListByMarket 메소드는 메소드의 인자로 시장 구분 코드를 문자열로 넘겨주면 메소드의 리턴 값으로 해당 시장에 속해 있는 종목들의 종목 코드 목록을 리턴
//sMarket – 0:장내, 3:ELW, 4:뮤추얼펀드, 5:신주인수권, 6:리츠, 8:ETF, 9:하이일드펀드, 10:코스닥, 30:제3시장
Console.WriteLine("종목 불러오기 시작");
string[] marketList = { "0", "10" };
int InCnt = 0;
int OutCnt = 0;
int i = 0;
foreach (string MNumber in marketList)
{
string result = axKHOpenAPI1.GetCodeListByMarket(MNumber);
string[] stockList = result.Split(';');
if (MNumber == "0")
{
InCnt = stockList.Count();
}
else
{
OutCnt = stockList.Count();
}
int listView1_cnt = 0;
foreach (string code in stockList)
{
if (code != "")
{
string StockName = axKHOpenAPI1.GetMasterCodeName(code);
//전체종목리스트 ListView row 만들자
ListViewItem item = new ListViewItem("", 0);
item.Checked = false; // 체크박스는 일단 false
if (favorite_list.ContainsKey(code))
{
item.Checked = true;
listView1_add(listView1_cnt.ToString(), code, favorite_list[code]); //관심종목추가
listView1_cnt++;
}
else
{
item.Checked = false;
}
//SubItem
item.SubItems.Add(i.ToString());
item.SubItems.Add(StockName);
item.SubItems.Add(code);
ListViewStock.Items.Add(item);
i++;
}
}
}
전체종목리스트_초기체크 = false;
//axKHOpenAPI1.SetInputValue("종목코드", 000030.ToString());
//axKHOpenAPI1.CommRqData("000030_주식기본정보", "opt10001", 0, "0101");
//axKHOpenAPI1.SetRealReg("0120", "000030", "9001;302;10;11;25;12;13", "1"); // 000030 종목을 실시간 추가등록
axKHOpenAPI1.SetRealReg("0120", "000030", "20;15", "1");
}
}
//ListView의 이벤트는 [디자인]창에서 속성모드에서 function 명을 추가해서 사용하자.
//[전체종목리스트] 체크박스 클릭시 발생
private void ListViewStock_ItemChecked(object sender, ItemCheckedEventArgs e)
{
//Console.WriteLine("ListViewStock_ItemChecked");
//Console.WriteLine(e.Item.Checked); //true or false
if(전체종목리스트_초기체크 == false) //초기로딩시에는 실행이 되면 안됨!
{
//Console.WriteLine(e.Item.SubItems.Count); //라인의 컬럼개수(4개)
//Console.WriteLine(e.Item.Index); //라인 row index 번호
//Console.WriteLine(e.Item.SubItems[2].Text); //유한양행
if (e.Item.Checked == true)
{
string sql = "INSERT INTO favorite(usr_id, stock_code, stock_name) VALUES(@usr_id, @stock_code, @stock_name)";
Dictionary<string, string> param = new Dictionary<string, string>();
param["@usr_id"] = LoginId;
param["@stock_code"] = e.Item.SubItems[3].Text; //000060
param["@stock_name"] = e.Item.SubItems[2].Text; //하이트진로
database_proc(sql, param);
}
else
{
string sql = "DELETE FROM favorite WHERE usr_id = @usr_id AND stock_code = @stock_code";
Dictionary<string, string> param = new Dictionary<string, string>();
param["@usr_id"] = LoginId;
param["@stock_code"] = e.Item.SubItems[3].Text; //000060
database_proc(sql, param);
}
listView1_loading();
}
}
private Dictionary<string, string> listVIew1_select()
{
Dictionary<int, string> columns = new Dictionary<int, string>();
int ci = 0;
columns[ci++] = "stock_code";
columns[ci++] = "stock_name";
Dictionary<int, Dictionary<string, string>> list = database_select("SELECT * FROM favorite WHERE usr_id = '" + LoginId + "'", columns);
Dictionary<string, string> favorite_list = new Dictionary<string, string>();
foreach (KeyValuePair<int, Dictionary<string, string>> row in list)
{
Console.WriteLine(row.Value["stock_code"] + " => " + row.Value["stock_name"]);
favorite_list[row.Value["stock_code"]] = row.Value["stock_name"];
}
return favorite_list;
}
private void listView1_loading()
{
listView1.Items.Clear();
Dictionary<string, string> favorite_list = listVIew1_select();
int i = 0;
foreach (KeyValuePair<string, string> row in favorite_list)
{
string number = i.ToString();
listView1_add(number, row.Key, row.Value);
i++;
}
}
//관심종목 추가
private void listView1_add(string number, string code, string codeString)
{
ListViewItem item2 = new ListViewItem(number, 0);
item2.SubItems.Add(code);
item2.SubItems.Add(codeString);
listView1.Items.Add(item2);
}
//실시간 시세 이벤트라는데 뭔지 잘 몰겠다.
//이게 보니깐 주기적으로 호출이 된다... 아마도 특정초단위로 알아서 호출되는 건가보다...
private void axKHOpenAPI1_OnReceiveRealData(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveRealDataEvent e)
{
//Console.WriteLine("sRealKey : " + e.sRealKey);
//Console.WriteLine("sRealType : " + e.sRealType);
//Console.WriteLine("sRealData : " + e.sRealData);
//e.sRealKey = 종목코드
//e.sRealType = 리얼타입 (주식시세, 주식체결 등)
//e.sRealData = 실시간 데이터 전문
if (e.sRealType == "주식체결")
{
Console.WriteLine("===============================================================");
Console.WriteLine("현재가" + axKHOpenAPI1.GetCommRealData(e.sRealKey, 10)); // 현재가
Console.WriteLine("체결시간" + axKHOpenAPI1.GetCommRealData(e.sRealKey, 20)); // 체결시간
Console.WriteLine("체결량" + axKHOpenAPI1.GetCommRealData(e.sRealKey, 15)); // 체결량
//Console.WriteLine("누적거래량" + axKHOpenAPI1.GetCommRealData(e.sRealKey, 13)); // 누적거래량
//Console.WriteLine("체결강도" + axKHOpenAPI1.GetCommRealData(e.sRealKey, 228)); // 체결강도
}
}
}
}
댓글 추가