이하영

주간보고서

...@@ -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, "종목코드")
......
No preview for this file type
No preview for this file type