Showing
4 changed files
with
148 additions
and
74 deletions
... | @@ -6,7 +6,7 @@ from pandas import * | ... | @@ -6,7 +6,7 @@ from pandas import * |
6 | from Logger import * | 6 | from Logger import * |
7 | import cf | 7 | import cf |
8 | 8 | ||
9 | -class Simulator_Func: | 9 | +class Simulator_Api: |
10 | def __init__(self,simul_num,op,db_name): | 10 | def __init__(self,simul_num,op,db_name): |
11 | self.simul_num=int(simul_num) | 11 | self.simul_num=int(simul_num) |
12 | 12 | ||
... | @@ -231,18 +231,18 @@ class Simulator_Func: | ... | @@ -231,18 +231,18 @@ class Simulator_Func: |
231 | index=a_balance['id']) | 231 | index=a_balance['id']) |
232 | 232 | ||
233 | # transaction table 생성 | 233 | # transaction table 생성 |
234 | - def init_df_transaction(self): | 234 | + def init_df_all_stocks(self): |
235 | - trs={'id':[]} | 235 | + all_stocks={'id':[]} |
236 | - self.df_transaction=DataFrame(trs, | 236 | + self.df_all_stocks=DataFrame(all_stocks, |
237 | - columns=['id', 'order_num', 'code', 'code_name', 'rate', 'purchase_rate', | 237 | + columns=['id', 'order_num', 'code', 'code_name', 'rate', 'purchase_rate', |
238 | - 'purchase_price','present_price', 'valuation_price','valuation_profit', | 238 | + 'purchase_price','present_price', 'valuation_price','valuation_profit', |
239 | - 'holding_amount', 'buy_date', 'item_total_purchase','chegyul_check', | 239 | + 'holding_amount', 'buy_date', 'item_total_purchase','chegyul_check', |
240 | - 'invest_unit','sell_date', 'sell_price', 'sell_rate', | 240 | + 'invest_unit','sell_date', 'sell_price', 'sell_rate', |
241 | - 'yes_close', 'close', 'd1_diff_rate', 'd1_diff', | 241 | + 'yes_close','d1_diff_rate', 'd1_diff', |
242 | - 'open', 'high','low','volume', | 242 | + 'open', 'close','high','low','volume', |
243 | - 'clo5', 'clo10', 'clo20', 'clo60','clo120', | 243 | + 'clo5', 'clo10', 'clo20', 'clo60','clo120', |
244 | - "clo5_diff_rate", "clo10_diff_rate","clo20_diff_rate", | 244 | + "clo5_diff_rate", "clo10_diff_rate","clo20_diff_rate", |
245 | - "clo60_diff_rate", "clo120_diff_rate"]) | 245 | + "clo60_diff_rate", "clo120_diff_rate"]) |
246 | 246 | ||
247 | # account_balance(잔고 데이터)에 저장된 가장 최근의 날짜를 가져오는 함수 | 247 | # account_balance(잔고 데이터)에 저장된 가장 최근의 날짜를 가져오는 함수 |
248 | def get_last_date_account_balance(self): | 248 | def get_last_date_account_balance(self): |
... | @@ -1217,4 +1217,4 @@ class Simulator_Func: | ... | @@ -1217,4 +1217,4 @@ class Simulator_Func: |
1217 | "clo60_diff_rate", "clo120_diff_rate", | 1217 | "clo60_diff_rate", "clo120_diff_rate", |
1218 | 'yes_clo5', 'yes_clo10', 'yes_clo20', 'yes_clo60','yes_clo120', | 1218 | 'yes_clo5', 'yes_clo10', 'yes_clo20', 'yes_clo60','yes_clo120', |
1219 | 'vol5', 'vol10', 'vol20', 'vol60', 'vol120']) | 1219 | 'vol5', 'vol10', 'vol20', 'vol60', 'vol120']) |
1220 | - return df_daily_buy_list | 1220 | + return df_daily_buy_list |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
... | @@ -39,24 +39,27 @@ class Open_Api(QAxWidget): | ... | @@ -39,24 +39,27 @@ class Open_Api(QAxWidget): |
39 | # 변수 설정 | 39 | # 변수 설정 |
40 | self.set_variable() | 40 | self.set_variable() |
41 | 41 | ||
42 | - self.sf=Simulator_Func(self.simul_num,"real",self.db_name) | 42 | + self.sf=Simulator_Api(self.simul_num,"real",self.db_name) |
43 | logger.debug("알고리즘 번호 : %s",self.simul_api.simul_num) | 43 | logger.debug("알고리즘 번호 : %s",self.simul_api.simul_num) |
44 | logger.debug("매수 알고리즘 번호 : %s",self.simul_api.buy_algorithm) | 44 | logger.debug("매수 알고리즘 번호 : %s",self.simul_api.buy_algorithm) |
45 | logger.debug("매도 알고리즘 번호 : %s",self.simul_api.sell_algorithm) | 45 | logger.debug("매도 알고리즘 번호 : %s",self.simul_api.sell_algorithm) |
46 | 46 | ||
47 | # 시뮬레이션 데이터베이스에 setting_data 테이블이 존재하지 않는다면 생성 | 47 | # 시뮬레이션 데이터베이스에 setting_data 테이블이 존재하지 않는다면 생성 |
48 | - if not self.simul_api.is_table_exist(self.db_name,"setting_data"): | 48 | + if not self.sf.is_simul_table_exist(self.db_name,"setting_data"): |
49 | self.init_setting_data() | 49 | self.init_setting_data() |
50 | 50 | ||
51 | + # invest unit 설정 | ||
51 | self.set_simul_variable() | 52 | self.set_simul_variable() |
52 | self.ohlcv=defaultdict(list) | 53 | self.ohlcv=defaultdict(list) |
53 | 54 | ||
54 | # 날짜 설정 | 55 | # 날짜 설정 |
56 | + # -* date_setting | ||
55 | def set_date(self): | 57 | def set_date(self): |
56 | self.today=datetime.datetime.today().strftime("%Y%m%d") | 58 | self.today=datetime.datetime.today().strftime("%Y%m%d") |
57 | self.today_time=datetime.datetime.today().strftime("%Y%m%d%H%M") | 59 | self.today_time=datetime.datetime.today().strftime("%Y%m%d%H%M") |
58 | 60 | ||
59 | # 키움 open_api 를 사용하기 위한 ocx controller 생성 | 61 | # 키움 open_api 를 사용하기 위한 ocx controller 생성 |
62 | + # -* create_open_api_instance | ||
60 | def _create_instance(self): | 63 | def _create_instance(self): |
61 | try: | 64 | try: |
62 | self.setControl("KHOPENAPI.KHOpenAPICtrl.1") | 65 | self.setControl("KHOPENAPI.KHOpenAPICtrl.1") |
... | @@ -92,9 +95,10 @@ class Open_Api(QAxWidget): | ... | @@ -92,9 +95,10 @@ class Open_Api(QAxWidget): |
92 | 95 | ||
93 | # 사용자의 계좌정보 저장 및 출력 | 96 | # 사용자의 계좌정보 저장 및 출력 |
94 | def get_account_info(self): | 97 | def get_account_info(self): |
98 | + logger.debug("-* get_account_info 함수 *-") | ||
95 | account_no=self.get_login_info("ACCNO") | 99 | account_no=self.get_login_info("ACCNO") |
96 | self.account_no=account_no.split(";")[0] | 100 | self.account_no=account_no.split(";")[0] |
97 | - logger.debug(self.account_no) | 101 | + logger.debug("계좌번호 : ", self.account_no) |
98 | 102 | ||
99 | # 원하는 사용자 정보 반환 | 103 | # 원하는 사용자 정보 반환 |
100 | # param : tag - ACCNO - 보유계좌리스트 | 104 | # param : tag - ACCNO - 보유계좌리스트 |
... | @@ -371,18 +375,19 @@ class Open_Api(QAxWidget): | ... | @@ -371,18 +375,19 @@ class Open_Api(QAxWidget): |
371 | # 변수 설정 | 375 | # 변수 설정 |
372 | # 실전투자인지 모의투자인지 여부를 확인하고 그에 해당하는 데이터베이스를 생성하는 함수 | 376 | # 실전투자인지 모의투자인지 여부를 확인하고 그에 해당하는 데이터베이스를 생성하는 함수 |
373 | def set_variable(self): | 377 | def set_variable(self): |
378 | + logger.debug("-* set variable 함수 *-") | ||
374 | self.cf=cf | 379 | self.cf=cf |
375 | self.get_today_buy_list_code=0 | 380 | self.get_today_buy_list_code=0 |
376 | self.reset_opw00018_output() | 381 | self.reset_opw00018_output() |
377 | 382 | ||
378 | if self.account_no==self.cf.real_account_no: | 383 | if self.account_no==self.cf.real_account_no: |
379 | - logger.debug("실전투자") | 384 | + logger.debug("실전투자 - 계좌번호 : ",self.account_no) |
380 | self.simul_num=self.cf.real_num | 385 | self.simul_num=self.cf.real_num |
381 | self.set_database(cf.real_bot_name) | 386 | self.set_database(cf.real_bot_name) |
382 | self.mod_gubun=100 # 실전투자와 모의투자를 구분하는 변수 | 387 | self.mod_gubun=100 # 실전투자와 모의투자를 구분하는 변수 |
383 | 388 | ||
384 | elif self.account_no==self.cf.test_account_no: | 389 | elif self.account_no==self.cf.test_account_no: |
385 | - logger.debug("모의투자") | 390 | + logger.debug("모의투자 - 계좌번호 : ",self.account_no) |
386 | self.simul_num=self.cf.test_num | 391 | self.simul_num=self.cf.test_num |
387 | self.set_database(cf.test_bot_name) | 392 | self.set_database(cf.test_bot_name) |
388 | self.mod_gubun=1 | 393 | self.mod_gubun=1 |
... | @@ -395,6 +400,7 @@ class Open_Api(QAxWidget): | ... | @@ -395,6 +400,7 @@ class Open_Api(QAxWidget): |
395 | self.py_gubun=False | 400 | self.py_gubun=False |
396 | 401 | ||
397 | # 데이터베이스 생성 및 엔진 설정 | 402 | # 데이터베이스 생성 및 엔진 설정 |
403 | + # -* db_name_setting | ||
398 | def set_database(self,db_name): | 404 | def set_database(self,db_name): |
399 | self.db_name=db_name | 405 | self.db_name=db_name |
400 | conn=pymysql.connect( | 406 | conn=pymysql.connect( |
... | @@ -402,8 +408,10 @@ class Open_Api(QAxWidget): | ... | @@ -402,8 +408,10 @@ class Open_Api(QAxWidget): |
402 | port=int(cf.db_port), | 408 | port=int(cf.db_port), |
403 | user=cf.db_id, | 409 | user=cf.db_id, |
404 | password=cf.db_pw, | 410 | password=cf.db_pw, |
405 | - charset='utf8mb4' | 411 | + charset='utf8mb4', |
412 | + cursorclass=pymysql.cursors.DictCursor | ||
406 | ) | 413 | ) |
414 | + | ||
407 | cursor=conn.cursor() | 415 | cursor=conn.cursor() |
408 | if not self.is_database_exist(cursor): | 416 | if not self.is_database_exist(cursor): |
409 | self.create_database(cursor) | 417 | self.create_database(cursor) |
... | @@ -422,22 +430,23 @@ class Open_Api(QAxWidget): | ... | @@ -422,22 +430,23 @@ class Open_Api(QAxWidget): |
422 | self.engine_daily_buy_list = create_engine("mysql+pymysql://" + cf.db_id + ":" + cf.db_pw + "@" + cf.db_ip + ":" | 430 | self.engine_daily_buy_list = create_engine("mysql+pymysql://" + cf.db_id + ":" + cf.db_pw + "@" + cf.db_ip + ":" |
423 | + cf.db_port + "/daily_buy_list",encoding='utf-8') | 431 | + cf.db_port + "/daily_buy_list",encoding='utf-8') |
424 | 432 | ||
425 | - # Bot Database가 존재하는지 확인하는 함수 | 433 | + # bot database가 존재하는지 확인하는 함수 |
426 | def is_database_exist(self,cursor): | 434 | def is_database_exist(self,cursor): |
427 | - query="select 1 from information_schema.schemata where schema_name='{}'" | 435 | + query=f"select 1 from information_schema.schemata where schema_name='{self.db_name}'" |
428 | - result=cursor.execute(query.format(self.db_name)) | 436 | + result=cursor.execute(query) |
429 | if result: | 437 | if result: |
430 | return True | 438 | return True |
431 | else: | 439 | else: |
432 | return False | 440 | return False |
433 | 441 | ||
434 | - # Bot Database를 생성하는 함수 | 442 | + # bot database를 생성하는 함수 |
435 | def create_database(self,cursor): | 443 | def create_database(self,cursor): |
436 | - query="create database {}" | 444 | + query=f"create database {self.db_name}" |
437 | - cursor.execute(query.format(self.db_name)) | 445 | + cursor.execute(query) |
438 | 446 | ||
439 | # daily_craw(종목의 날짜별 데이터), daily_buy_list(날짜별 종목 데이터), min_craw(종목의 분별 데이터) 가 존재하는지 확인하는 함수 | 447 | # daily_craw(종목의 날짜별 데이터), daily_buy_list(날짜별 종목 데이터), min_craw(종목의 분별 데이터) 가 존재하는지 확인하는 함수 |
440 | # 존재하지 않는다면 새로 생성 | 448 | # 존재하지 않는다면 새로 생성 |
449 | + # -* basic_db_check | ||
441 | def create_basic_database(self,cursor): | 450 | def create_basic_database(self,cursor): |
442 | check_list = ['daily_craw', 'daily_buy_list', 'min_craw'] | 451 | check_list = ['daily_craw', 'daily_buy_list', 'min_craw'] |
443 | query = "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA" | 452 | query = "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA" |
... | @@ -449,25 +458,26 @@ class Open_Api(QAxWidget): | ... | @@ -449,25 +458,26 @@ class Open_Api(QAxWidget): |
449 | for check_name in check_list: | 458 | for check_name in check_list: |
450 | if check_name not in db_list: | 459 | if check_name not in db_list: |
451 | has_created = True | 460 | has_created = True |
452 | - logger.debug(check_name,"데이터베이스 생성...") | 461 | + logger.debug(f"{check_name} 데이터베이스 생성...") |
453 | - create_db_sql = create_db_query.format(check_name) | 462 | + cursor.execute(create_db_query.format(check_name)) |
454 | - cursor.execute(create_db_sql) | ||
455 | 463 | ||
456 | if has_created and self.engine_bot.has_table('setting_data'): | 464 | if has_created and self.engine_bot.has_table('setting_data'): |
457 | self.engine_bot.execute("UPDATE setting_data SET code_update = '0';") | 465 | self.engine_bot.execute("UPDATE setting_data SET code_update = '0';") |
458 | 466 | ||
459 | # setting_data 테이블 생성 및 초기화하는 함수 | 467 | # setting_data 테이블 생성 및 초기화하는 함수 |
460 | def init_setting_data(self): | 468 | def init_setting_data(self): |
469 | + logger.debug("-* init_setting_data 함수 *-") | ||
470 | + | ||
461 | df_setting_data_temp = {'limit_money': [], 'invest_unit': [], 'max_invest_unit': [], | 471 | df_setting_data_temp = {'limit_money': [], 'invest_unit': [], 'max_invest_unit': [], |
462 | 'min_invest_unit': [],'set_invest_unit': [], 'code_update': [], | 472 | 'min_invest_unit': [],'set_invest_unit': [], 'code_update': [], |
463 | - 'today_buy_stop': [],'account_balance_db_check': [], 'possessed_item': [], | 473 | + 'today_buy_stop': [],'jango_data_db_check': [], 'possessed_item': [], |
464 | 'today_profit': [],'final_chegyul_check': [],'db_to_buy_list': [], 'today_buy_list': [], | 474 | 'today_profit': [],'final_chegyul_check': [],'db_to_buy_list': [], 'today_buy_list': [], |
465 | 'daily_crawler': [],'daily_buy_list': []} | 475 | 'daily_crawler': [],'daily_buy_list': []} |
466 | 476 | ||
467 | df_setting_data = DataFrame(df_setting_data_temp, | 477 | df_setting_data = DataFrame(df_setting_data_temp, |
468 | columns=['limit_money', 'invest_unit', 'max_invest_unit','min_invest_unit', | 478 | columns=['limit_money', 'invest_unit', 'max_invest_unit','min_invest_unit', |
469 | 'set_invest_unit', 'code_update', 'today_buy_stop', | 479 | 'set_invest_unit', 'code_update', 'today_buy_stop', |
470 | - 'account_balance_db_check', 'possessed_item', 'today_profit', | 480 | + 'jango_data_db_check', 'possessed_item', 'today_profit', |
471 | 'final_chegyul_check','db_to_buy_list', 'today_buy_list', 'daily_crawler', | 481 | 'final_chegyul_check','db_to_buy_list', 'today_buy_list', 'daily_crawler', |
472 | 'daily_buy_list']) | 482 | 'daily_buy_list']) |
473 | 483 | ||
... | @@ -480,7 +490,7 @@ class Open_Api(QAxWidget): | ... | @@ -480,7 +490,7 @@ class Open_Api(QAxWidget): |
480 | 490 | ||
481 | df_setting_data.loc[0, 'code_update'] = str(0) # setting_data의 데이터를 업데이트 한 날짜 | 491 | df_setting_data.loc[0, 'code_update'] = str(0) # setting_data의 데이터를 업데이트 한 날짜 |
482 | df_setting_data.loc[0, 'today_buy_stop'] = str(0) # 당일 구매 종료 설정 시간 | 492 | df_setting_data.loc[0, 'today_buy_stop'] = str(0) # 당일 구매 종료 설정 시간 |
483 | - df_setting_data.loc[0, 'account_balance_db_check'] = str(0) # 잔고데이터 DB 업데이트 날짜 | 493 | + df_setting_data.loc[0, 'jango_data_db_check'] = str(0) # 잔고데이터 DB 업데이트 날짜 |
484 | df_setting_data.loc[0, 'possessed_item'] = str(0) # 보유종목 DB 업데이트 날짜 | 494 | df_setting_data.loc[0, 'possessed_item'] = str(0) # 보유종목 DB 업데이트 날짜 |
485 | df_setting_data.loc[0, 'today_profit'] = str(0) # 당일 수익 | 495 | df_setting_data.loc[0, 'today_profit'] = str(0) # 당일 수익 |
486 | 496 | ||
... | @@ -495,16 +505,17 @@ class Open_Api(QAxWidget): | ... | @@ -495,16 +505,17 @@ class Open_Api(QAxWidget): |
495 | 505 | ||
496 | # simulator_fun 에서 설정한 변수를 가져오는 함수 | 506 | # simulator_fun 에서 설정한 변수를 가져오는 함수 |
497 | def set_simul_variable(self): | 507 | def set_simul_variable(self): |
508 | + logger.debug("-* set simul variable 함수 *-") | ||
498 | # daily_buy_list에 저장된 가장 최신 날짜 | 509 | # daily_buy_list에 저장된 가장 최신 날짜 |
499 | self.date_rows_yesterday=self.sf.get_recent_daily_buy_list_date() | 510 | self.date_rows_yesterday=self.sf.get_recent_daily_buy_list_date() |
500 | 511 | ||
501 | - # AutoBot 데이터베이스에 transaction 테이블이 존재하지 않을 경우 | 512 | + # AutoBot 데이터베이스에 all_stock 테이블이 존재하지 않을 경우 테이블 생성 및 초기화 |
502 | - # 테이블 생성 및 초기화 | 513 | + # all_stock : 모든 주식 거래 내역을 저장하는 테이블 |
503 | - if not self.sf.is_simul_table_exist(self.db_name,"transaction"): | 514 | + if not self.sf.is_simul_table_exist(self.db_name,"all_stocks"): |
504 | - logger.debug("transaction 테이블을 생성합니다") | 515 | + logger.debug("all_stocks 테이블을 생성합니다") |
516 | + # 테이블 생성 후 초기화 | ||
505 | self.invest_unit=0 | 517 | self.invest_unit=0 |
506 | self.db_to_transaction(0,0,0,0,0) | 518 | self.db_to_transaction(0,0,0,0,0) |
507 | - # 테이블 생성 후 초기화 | ||
508 | self.delete_transaction_item("0") | 519 | self.delete_transaction_item("0") |
509 | 520 | ||
510 | # setting_data에 invest_unit값이 없다면 설정 | 521 | # setting_data에 invest_unit값이 없다면 설정 |
... | @@ -515,11 +526,11 @@ class Open_Api(QAxWidget): | ... | @@ -515,11 +526,11 @@ class Open_Api(QAxWidget): |
515 | self.invest_unit=self.get_invest_unit() | 526 | self.invest_unit=self.get_invest_unit() |
516 | self.sf.invest_unit=self.invest_unit | 527 | self.sf.invest_unit=self.invest_unit |
517 | 528 | ||
518 | - # transaction(거래 내역) 테이블 생성 | 529 | + # all_stock(거래 내역) 테이블 생성 |
519 | - def db_to_transaction(self,order_num,code,chegyul_check,purchase_price,rate): | 530 | + def db_to_all_stocks(self,order_num,code,chegyul_check,purchase_price,rate): |
531 | + logger.debug("-* db_to_all_stocks function *-") | ||
520 | self.date_setting() | 532 | self.date_setting() |
521 | - # 거래내역 DataFrame 생성 | 533 | + self.sf.init_df_all_stocks() # all_stocks 테이블 데이터프레임 생성 |
522 | - self.sf.init_df_transaction() | ||
523 | 534 | ||
524 | # dataframe에 값 할당 | 535 | # dataframe에 값 할당 |
525 | self.sf.df_transaction.loc[0, 'order_num'] = order_num # 주문번호 | 536 | self.sf.df_transaction.loc[0, 'order_num'] = order_num # 주문번호 |
... | @@ -632,38 +643,36 @@ class Open_Api(QAxWidget): | ... | @@ -632,38 +643,36 @@ class Open_Api(QAxWidget): |
632 | self.comm_rq_data("opw00018_req","opw00018",2,"2000") | 643 | self.comm_rq_data("opw00018_req","opw00018",2,"2000") |
633 | 644 | ||
634 | # open_api를 통해 보유한 종목을 가져오는 함수 | 645 | # open_api를 통해 보유한 종목을 가져오는 함수 |
635 | - # 가져온 정보를 posses_item이라는 테이블에 저장 | 646 | + # 가져온 정보를 possesd_item이라는 테이블에 저장 |
636 | - def get_posses_item(self): | 647 | + def db_to_possessd_item(self): |
637 | item_count=len(self.opw00018_output['multi']) | 648 | item_count=len(self.opw00018_output['multi']) |
638 | - posses_item_data={'date':[],'code':[],'code_name':[],'holding_amount':[],'purchase_price':[], | 649 | + possesd_item_data={'date':[],'code':[],'code_name':[],'holding_amount':[],'purchase_price':[], |
639 | 'present_price':[],'valuation_profit':[],'rate':[],'item_total_purchase':[]} | 650 | 'present_price':[],'valuation_profit':[],'rate':[],'item_total_purchase':[]} |
640 | 651 | ||
641 | - posses_item=DataFrame(posses_item_data, | 652 | + possesd_item=DataFrame(possesd_item_data, |
642 | columns=['date','code','code_name','holding_amount','purchase_price', | 653 | columns=['date','code','code_name','holding_amount','purchase_price', |
643 | 'present_price','valuation_profit','rate','item_total_purchase']) | 654 | 'present_price','valuation_profit','rate','item_total_purchase']) |
644 | 655 | ||
645 | for i in range(item_count): | 656 | for i in range(item_count): |
646 | item=self.opw00018_output['multi'][i] | 657 | item=self.opw00018_output['multi'][i] |
647 | 658 | ||
648 | - posses_item.loc[i,'date']=self.today | 659 | + possesd_item.loc[i,'date']=self.today |
649 | - posses_item.loc[i,'code']=item[7] | 660 | + possesd_item.loc[i,'code']=item[7] |
650 | - posses_item.loc[i,'code_name']=item[0] | 661 | + possesd_item.loc[i,'code_name']=item[0] |
651 | - posses_item.loc[i,'holding_amount']=int(item[1]) | 662 | + possesd_item.loc[i,'holding_amount']=int(item[1]) |
652 | - posses_item.loc[i,'purchase_price']=int(item[2]) | 663 | + possesd_item.loc[i,'purchase_price']=int(item[2]) |
653 | - posses_item.loc[i,'present_price']=int(item[3]) | 664 | + possesd_item.loc[i,'present_price']=int(item[3]) |
654 | - posses_item.loc[i,'valuation_profit']=int(item[4]) | 665 | + possesd_item.loc[i,'valuation_profit']=int(item[4]) |
655 | - posses_item.loc[i,'rate']=float(item[5]) | 666 | + possesd_item.loc[i,'rate']=float(item[5]) |
656 | - posses_item.loc[i,'item_total_purchase']=int(item[6]) | 667 | + possesd_item.loc[i,'item_total_purchase']=int(item[6]) |
657 | - | 668 | + |
658 | - posses_item.to_sql("posses_item",self.engine_bot,if_exists='replace') | 669 | + possesd_item.to_sql("possesd_item",self.engine_bot,if_exists='replace') |
659 | self.contract_sync() | 670 | self.contract_sync() |
660 | 671 | ||
661 | - # 현재 소유하고 있는 종목에 대해 transaction_history 테이블을 업데이트 | 672 | + # 현재 소유하고 있는 종목에 대해 transaction 테이블을 업데이트 |
662 | - def contract_sync(self): | 673 | + def chegyul_sync(self): |
663 | - query="select code,code_name,rate from posses_item p" \ | 674 | + query="select code,code_name,rate from possessed_item " \ |
664 | - "where p.code not in (select a.code from transaction_history a" \ | 675 | + "where code not in (select code from transaction where sell_date='0' group by code) group by code" |
665 | - "where a.sell_date='0' group by a.code)" \ | ||
666 | - "group by p.code" | ||
667 | result=self.engine_bot.execute(query).fetchall() | 676 | result=self.engine_bot.execute(query).fetchall() |
668 | 677 | ||
669 | for item in result: | 678 | for item in result: |
... | @@ -672,18 +681,18 @@ class Open_Api(QAxWidget): | ... | @@ -672,18 +681,18 @@ class Open_Api(QAxWidget): |
672 | self.set_input_value("계좌번호",self.account_no) | 681 | self.set_input_value("계좌번호",self.account_no) |
673 | self.comm_rq_data("opt10076_req","opt10076",0,"0350") | 682 | self.comm_rq_data("opt10076_req","opt10076",0,"0350") |
674 | 683 | ||
675 | - if self.not_contract['주문구분']=="+매수": | 684 | + if self._data['주문구분']=='+매수': |
676 | - if self.not_contract['미체결수량']==0: | 685 | + if self._data['미체결수량']==0: |
677 | - contract_check=0 | 686 | + chegyul_check=0 |
678 | else: | 687 | else: |
679 | - contract_check=1 | 688 | + chegyul_check=1 |
680 | - elif self.not_contract['주문구분']=='': | 689 | + elif self._data['주문구분']=='': |
681 | - self.create_transaction_history(self.today,item.code,0,0,item.rate) | 690 | + self.db_to_transaction(self.today,item.code,0,0,item.rate) |
682 | continue | 691 | continue |
683 | else: | 692 | else: |
684 | continue | 693 | continue |
685 | 694 | ||
686 | - self.create_transaction_history(self.not_contract['주문번호'],item.code,contract_check,self.not_contract['체결가'],item.rate) | 695 | + self.db_to_transaction(self.not_contract['주문번호'],item.code,contract_check,self.not_contract['체결가'],item.rate) |
687 | 696 | ||
688 | # posses_item 테이블을 업데이트 했을 경우 setting data 테이블에 업데이트 한 날짜를 표시 | 697 | # posses_item 테이블을 업데이트 했을 경우 setting data 테이블에 업데이트 한 날짜를 표시 |
689 | def setting_data_posses_stock(self): | 698 | def setting_data_posses_stock(self): |
... | @@ -736,8 +745,9 @@ class Open_Api(QAxWidget): | ... | @@ -736,8 +745,9 @@ class Open_Api(QAxWidget): |
736 | else: | 745 | else: |
737 | return str(0) | 746 | return str(0) |
738 | 747 | ||
739 | - def check_contract(self): | 748 | + # 체결이 완료되었는지 확인하고 transaction(거래내역) 테이블을 업데이트하는 함수 |
740 | - query="select code from transaction_history where contract_check='1' and (sell date='0' or sell_date='')" | 749 | + def check_chegyul(self): |
750 | + query="select code from transaction where chegyul_check='1'" | ||
741 | rows=self.engine_bot.execute(query).fetchall() | 751 | rows=self.engine_bot.execute(query).fetchall() |
742 | 752 | ||
743 | for r in rows: | 753 | for r in rows: |
... | @@ -746,18 +756,30 @@ class Open_Api(QAxWidget): | ... | @@ -746,18 +756,30 @@ class Open_Api(QAxWidget): |
746 | self.set_input_value("계좌번호",self.account_no) | 756 | self.set_input_value("계좌번호",self.account_no) |
747 | self.comm_rq_data("opt10076_req","opt10076",0,"0350") | 757 | self.comm_rq_data("opt10076_req","opt10076",0,"0350") |
748 | 758 | ||
749 | - query="update transaction_history set contract_check='0' where code='{}' and sell_date='0'" | 759 | + query=f"update transaction set chegyul_check='0' where code='{r.code}' and sell_data='0' " \ |
760 | + f"order by buy_date desc limit 1" | ||
750 | # 거래가 완료된 항목은 주문번호가 존재하지 않음 | 761 | # 거래가 완료된 항목은 주문번호가 존재하지 않음 |
751 | # 거래가 완료된 항목에 대해서 contract_check항목을 '0'으로 업데이트 | 762 | # 거래가 완료된 항목에 대해서 contract_check항목을 '0'으로 업데이트 |
752 | if not self.not_contract['주문번호']: | 763 | if not self.not_contract['주문번호']: |
753 | - self.engine_bot.execute(query.format(r.code)) | 764 | + self.engine_bot.execute(query) |
754 | # 미체결 수량이 없을 경우 contract_check항목을 '0'으로 업데이트 | 765 | # 미체결 수량이 없을 경우 contract_check항목을 '0'으로 업데이트 |
755 | elif self.not_contract['미체결수량']==0: | 766 | elif self.not_contract['미체결수량']==0: |
756 | logger.debug("미체결 항목이 없습니다") | 767 | logger.debug("미체결 항목이 없습니다") |
757 | - self.engine_bot.execute(query.format(r.code)) | 768 | + self.engine_bot.execute(query) |
758 | else: | 769 | else: |
759 | logger.debug("미체결 종목이 존재합니다") | 770 | logger.debug("미체결 종목이 존재합니다") |
760 | 771 | ||
772 | + # 매도했을 경우 possessed_item(보유종목) 테이블에서 항목을 삭제 | ||
773 | + def delete_possessed_item(self,code): | ||
774 | + query=f"delete from possessed_item where code={code}" | ||
775 | + self.engine_bot.execute(query) | ||
776 | + | ||
777 | + # 매도한 후 transaction 테이블 업데이트 | ||
778 | + def check_sell_final(self,code): | ||
779 | + query=f"update transaction chegyul_check='0', sell_date='{self.today_time}' " \ | ||
780 | + f"where code='{code}' and sell_date='0' order by buy_date desc" | ||
781 | + self.engine_bot.execute(query) | ||
782 | + | ||
761 | # posses_item테이블에는 존재하지만 transaction_history테이블에 존재하지 않는 항목에 대해 업데이트 | 783 | # posses_item테이블에는 존재하지만 transaction_history테이블에 존재하지 않는 항목에 대해 업데이트 |
762 | def final_check_contract(self): | 784 | def final_check_contract(self): |
763 | query="select code from transaction_history" \ | 785 | query="select code from transaction_history" \ |
... | @@ -778,6 +800,58 @@ class Open_Api(QAxWidget): | ... | @@ -778,6 +800,58 @@ class Open_Api(QAxWidget): |
778 | "where code='%s' and sell_date='%s'" | 800 | "where code='%s' and sell_date='%s'" |
779 | self.engine_bot.execute(query%(0,self.today_time,code,0)) | 801 | self.engine_bot.execute(query%(0,self.today_time,code,0)) |
780 | 802 | ||
803 | + # 현재 보유하고 있는 종목의 수를 반환하는 함수 | ||
804 | + def get_count_possessed_item(self): | ||
805 | + query="select count(*) from possessed_item" | ||
806 | + result=self.engine_bot.execute(query).fetchall() | ||
807 | + return result[0][0] | ||
808 | + | ||
809 | + # setting_data에 possessed_item 항목을 업데이트 | ||
810 | + def set_setting_data_possessed_item(self): | ||
811 | + query=f"update setting_data set possessed_item={self.today}" | ||
812 | + self.engine_bot.execute(query) | ||
813 | + | ||
814 | + def get_total_data_min(self,code,code_name,start): | ||
815 | + self.ohlcv=defaultdict(list) | ||
816 | + | ||
817 | + self.set_input_value("종목코드",code) | ||
818 | + self.set_input_value("틱범위",1) | ||
819 | + self.set_input_value("수정주가구분",1) | ||
820 | + self.comm_rq_data("opt10080_req","opt10080",0,"1999") | ||
821 | + | ||
822 | + self.is_craw_table_exist=False | ||
823 | + | ||
824 | + if self.is_min_craw_table_exist(code_name): | ||
825 | + self.is_craw_table_exist=True | ||
826 | + self.craw_db_last_min=self.get_craw_db_last_min(code_name) | ||
827 | + self.craw_db_last_min_sum_volume=self.get_craw_db_last_min_sum_volume(code_name) | ||
828 | + | ||
829 | + else: | ||
830 | + self.craw_db_last_min=str(0) | ||
831 | + self.craw_db_last_min_sum_volume=0 | ||
832 | + | ||
833 | + while self.remained_data: | ||
834 | + time.sleep(TR_REQ_TIME_INTERVAL) | ||
835 | + self.set_input_value("종목코드",code) | ||
836 | + self.set_input_value("틱범위",1) | ||
837 | + self.set_input_value("수정주가구분",1) | ||
838 | + self.comm_rq_data("opt10080_req","opt10080",2,"1999") | ||
839 | + | ||
840 | + if self.ohlcv['date'][-1]<self.craw_db_last_min: | ||
841 | + break | ||
842 | + | ||
843 | + time.sleep(TR_REQ_TIME_INTERBVAL) | ||
844 | + | ||
845 | + if len(self.ohlcv['date']==0 or self.ohlcv['date'][0]==''): | ||
846 | + return [] | ||
847 | + | ||
848 | + if self.ohlcv['date']=='': | ||
849 | + return [] | ||
850 | + | ||
851 | + df = DataFrame(self.ohlcv, columns=['date', 'open', 'high', 'low', 'close', 'volume', 'sum_volume']) | ||
852 | + | ||
853 | + return df | ||
854 | + | ||
781 | # 주식일봉차트조회 요청 함수 - 하나의 데이터만 저장 | 855 | # 주식일봉차트조회 요청 함수 - 하나의 데이터만 저장 |
782 | def _opt10081(self, sRQName, sTrCode): | 856 | def _opt10081(self, sRQName, sTrCode): |
783 | code = self._get_comm_data(sTrCode, sRQName, 0, "종목코드") | 857 | code = self._get_comm_data(sTrCode, sRQName, 0, "종목코드") | ... | ... |
면담확인서(2020.11.22)_수정.docx
0 → 100644
No preview for this file type
주간보고서(2020.11.29).docx
0 → 100644
No preview for this file type
-
Please register or login to post a comment