Пример #1
0
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()
Пример #2
0
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))
Пример #3
0
    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()))
Пример #4
0
    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
Пример #5
0
    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)
Пример #6
0
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)
Пример #7
0
    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()