def main(): cybos = win32com.client.Dispatch('CpUtil.CpCybos') # 크레온에서 씨발놈들아 'CpUtil.CpCybos' 이거다 assert cybos.IsConnect, 'Disconnected' assert ctypes.windll.shell32.IsUserAnAdmin(), 'Not administrator' connect() # 모든 종목 코드 가져오기 all_codes = [stock.code for stock in stocks.ALL_STOCKS] # 모든 종목에 대한 상세 정보 가져오기 details = stocks.get_details(all_codes) x = [] # 차트 데이터 가져오기 for code in all_codes: chart = charts.request_by_term( code=code, chart_type=charts.ChartType.MINUTE, begin=date.today() - timedelta(days=1), end=date.today() ) db.push(chart) print()
def get_charts(): check_required('code', 'chart_type', 'begin', 'end') # 종목 코드 code = request.args.get('code') # 봉 타입 chart_type = charts.ChartType.create_by_name( request.args.get('chart_type')) if not chart_type: raise BadRequestError('Not supported chart_type: ' + request.args.get('chart_type')) # 기간 - 시작 begin = parse_datetime(request.args.get('begin')).date() # 기간 - 종료 end = parse_datetime(request.args.get('end')).date() max_period = timedelta(days=10) if chart_type == charts.ChartType.MINUTE and end - begin > max_period: raise BadRequestError( f'The duration of the minute chart cannot exceed {max_period.days} days.: {(end - begin).days} days' ) return asjson( charts.request_by_term(code=code, chart_type=chart_type, begin=begin, end=end))
def update(self, stock): code = normalize(stock.code) # check if already exists with db.day_candles.DayCandleTable(normalize(code)) as table: if table.exists(date=latest_business_date): # up-to-date logging.info(f'{code}: up-to-date') else: logging.info(f'{code}: will be update') candles = charts.request_by_term( code=code, chart_type=charts.ChartType.DAY, begin=self.begin, end=self.end) rows = {} for candle in candles: row = db.day_candles.DayCandle(date=candle.date, open=candle.open, close=candle.close, low=candle.low, high=candle.high, vol=candle.vol) if not table.exists(date=candle.date): rows.update({candle.date: row}) if rows: logging.info( f'Inserting {len(rows)} candles for {self.begin} ~ {self.end}' ) table.insert_all(list(rows.values()))
def __init__(self, code: str, begin: date, end: date): self.wallet = Wallet() self.code = code self.result = SimulationResult(code=normalize(self.code), name=stocks.find(code).name, begin=begin, end=end) self.candle_provider = creon.provider.MinuteCandleProvdider( code, begin, end) self.candle_provider.subscribers.append(self.on_candle) self.candle_provider.subscribers.append( lambda candle: self.result.candles.append(candle)) self.daily_candles: List[Candle] = charts.request_by_term( code=code, chart_type=charts.ChartType.DAY, begin=begin - timedelta(days=200), end=end) if not self.daily_candles: raise NotEnoughChartException(code, details.get(code).name) self.daily_candles.sort( key=lambda candle: datetime.combine(candle.date, candle.time)) if not self.daily_candles[0].date < begin < self.daily_candles[-1].date: raise NotEnoughChartException(code=code, name=stocks.get_name(code)) self.daily_candles: Dict[date, Candle] = { candle.date: candle for candle in self.daily_candles } self.last_candle: Optional[Candle] = None
def _start(self): begin = self.begin while not self.stopped: end = begin + timedelta(days=10 * self.period) if end > self.end: end = self.end self.stopped = True chart = charts.request_by_term(code=self.code, chart_type=charts.ChartType.MINUTE, begin=begin, end=end, period=self.period) for candle in chart: if candle.date > self.end: break self._publish(candle) begin = end + timedelta(days=1)
def get_metrics(): code = request.args.get('code') begin: date = parse_datetime(request.args.get('begin')).date() end: date = parse_datetime(request.args.get('end')).date() candles = charts.request_by_term(code=code, chart_type=charts.ChartType.DAY, begin=begin - timedelta(days=300), end=end) def ma(at: date, length: int): closes = [candle.close for candle in candles if candle.date <= at][-length:] if len(closes) != length: return None return int(sum(closes) / length) result = [] cur = begin while True: if cur > end: break result.append({ 'date': cur, 'moving_average': { '120': ma(cur, 120), '60': ma(cur, 60), '20': ma(cur, 20), '5': ma(cur, 5) } }) cur += timedelta(days=1) return asjson(result)
def update(self, stock): code = normalize(stock.code) self.stopped = False # 차트 테이블 연결 minute_table = db.minute_candles.MinuteCandleTable(code) day_table = db.day_candles.DayCandleTable(code) try: minute_table.open() day_table.open() end = None for begin in [ d for d in business_days if self.begin <= d <= self.end ]: if end and begin <= end: # 직전 end 보다 begin 이 커질 때까지 스킵 continue if begin > self.end: break end = begin + timedelta(days=self.period) if end > self.end: end = self.end if day_table.exists( date=begin) and not minute_table.exists(date=begin): candles = charts.request_by_term( code=code, chart_type=charts.ChartType.MINUTE, begin=begin, end=end) whitelist_dates = set([candle.date for candle in candles]) whitelist_dates = [ d for d in whitelist_dates if not minute_table.exists(date=d) ] rows = {} for candle in [ candle for candle in candles if candle.date in whitelist_dates ]: row = db.minute_candles.MinuteCandle( date=candle.date, time=candle.time, open=candle.open, close=candle.close, low=candle.low, high=candle.high, vol=candle.vol) rows.update({ datetime.combine(date=candle.date, time=candle.time): row }) if rows: logging.info(f'Inserting {len(rows)} candles...') minute_table.insert_all(list(rows.values())) finally: minute_table.close() day_table.close()