コード例 #1
0
ファイル: scanners1.py プロジェクト: rmlv159/live_trading
 def scan_(self, _longer_list):
     log_start = datetime.datetime.now()
     log = logging_.Logging(
         self.strat.runtime_tm, log_start,
         str(self.__class__.__name__ + ',' +
             sys._getframe().f_code.co_name))
     positive_instr = OrderedDict()
     negative_instr = OrderedDict()
     _scan_param_ix = 0
     for factor_ix in range(_longer_list):
         try:
             _key_ = list(self.positive_factors.keys())[factor_ix]
             positive_instr[_key_] = self.receive_(
                 self.positive_factors[_key_][_scan_param_ix])
         except IndexError:
             pass
         except exceptions_.ScannerReturnsNothingError:
             negative_instr[_key_] = []
         try:
             _key_ = list(self.negative_factors.keys())[factor_ix]
             negative_instr[_key_] = self.receive_(
                 self.negative_factors[_key_][_scan_param_ix])
         except IndexError:
             pass
         except exceptions_.ScannerReturnsNothingError:
             negative_instr[_key_] = []
     log.log(_longer_list)
     return positive_instr, negative_instr
コード例 #2
0
ファイル: scanners1.py プロジェクト: rmlv159/live_trading
 def _time_gates_f(self, _time_gates, ix):
     log_start = datetime.datetime.now()
     log = logging_.Logging(
         self.strat.runtime_tm, log_start,
         str(self.__class__.__name__ + ',' +
             sys._getframe().f_code.co_name))
     self.strat.add_to_manager(self.strat.strat_name, *log.monitor())
     gate = _time_gates[ix].time()
     if self.strat.debugging.dummy_time:
         _now = self.strat.lt._manipulated_time(datetime.datetime.now())
     else:
         _now = datetime.datetime.now()
     _now = self.strat.lt.us_tz_op(_now).time()
     while _now < gate:  # _time_gates
         if self.strat.debugging.dummy_time:
             _now = self.strat.lt._manipulated_time(datetime.datetime.now())
         else:
             _now = datetime.datetime.now()
         _now = self.strat.lt.us_tz_op(_now).time()
         self.strat.lt.ib.sleep(1)
         # _visible_counter += 1
         # if _visible_counter % 5 == 0:
         #     print('_visible_counter seconds {} ({} - {})'.format(str(_visible_counter),_now.strftime('%H:%M:%S'),gate.strftime('%H:%M:%S')))
         continue
     log.log()
コード例 #3
0
ファイル: scanners1.py プロジェクト: rmlv159/live_trading
 def match_f(self,
             positive_instr,
             negative_instr,
             _n_iters,
             _first_iter=False):
     log_start = datetime.datetime.now()
     log = logging_.Logging(
         self.strat.runtime_tm, log_start,
         str(self.__class__.__name__ + ',' +
             sys._getframe().f_code.co_name))
     self.strat.add_to_manager(self.strat.strat_name, *log.monitor())
     positive_list = self._relevance_discarding(positive_instr, _n_iters,
                                                self.strat.runtime_tm,
                                                _first_iter)
     # must_appear_at_least = len2 if _first_iter else 2 * _n_iters
     must_appear_at_least = len(
         self.positive_factors) if _first_iter else len(
             self.positive_factors) * _n_iters
     self.cons_disp.print_warning(
         'not sure if must_appear_at_least is correct')
     concat_ = []
     for i_ix, i in enumerate(positive_instr.keys()):
         concat_.append(positive_list[i_ix])
     counts_ = []
     flat = [j for k in concat_ for j in k]
     for f in flat:
         counts_.append([f, flat.count(f)])
     positive_matches = []
     for c_ix, c in enumerate(list(counts_)):
         if c[1] >= must_appear_at_least:
             positive_matches.append(c[0])
     positive_matches = list(set(positive_matches))
     if len(negative_instr) > 0:
         negative_list = self._relevance_discarding(negative_instr,
                                                    _n_iters,
                                                    self.strat.runtime_tm,
                                                    _first_iter)
         # sort out a certain number of overnight stars
         matches = []
         negative_list_flat = [j for i in negative_list.values() for j in i]
         _cnt_remove = 0
         _step_through = int(
             1 / (1 - self.strat.rm.fraction_sorting_out_negative_list))
         for j, i in enumerate(list(positive_matches)):
             if i in negative_list_flat:
                 if _cnt_remove < _step_through:
                     _cnt_remove += 1
                 else:
                     _cnt_remove = 0
                     continue
             matches.append(i)
     else:
         matches = positive_matches
     log.log(matches)
     return matches
コード例 #4
0
ファイル: scanners1.py プロジェクト: rmlv159/live_trading
 def _reduce_fraction_sorting_out_negative_list(self):
     log_start = datetime.datetime.now()
     log = logging_.Logging(
         self.strat.runtime_tm, log_start,
         str(self.__class__.__name__ + ',' +
             sys._getframe().f_code.co_name))
     self.strat.add_to_manager(self.strat.strat_name, *log.monitor())
     self.strat.rm.fraction_sorting_out_negative_list -= .1
     if self.strat.rm.fraction_sorting_out_negative_list < .0:
         self.strat.rm.fraction_sorting_out_negative_list = .0
     log.log(self.strat.rm.fraction_sorting_out_negative_list)
コード例 #5
0
ファイル: scanners1.py プロジェクト: rmlv159/live_trading
    def reshuffle_winners(self,
                          parallel_traded_instr_per_strat,
                          next_in_line,
                          remove=None):
        log_start = datetime.datetime.now()
        log = logging_.Logging(
            self.strat.runtime_tm, log_start,
            str(self.__class__.__name__ + ',' +
                sys._getframe().f_code.co_name))
        self.strat.add_to_manager(self.strat.strat_name, *log.monitor())

        if remove is None:
            # self.__traded_instr = []
            for i in range(parallel_traded_instr_per_strat):
                # if len(self.__winners) == 0 and len(self.__traded_instr) > 0:
                if len(self.__winners) == 0 and len(
                        self.strat.lt.traded_instr) > 0:
                    return
                # elif len(self.__winners) == 0 and len(self.__traded_instr) == 0:
                elif len(self.__winners) == 0 and len(
                        self.strat.lt.traded_instr) == 0:
                    raise exceptions_.NoMoreWinnersInLineError

                # self.__traded_instr.append(next_in_line)
                self.strat.lt.traded_instr.append(next_in_line)
                self.strat.add_to_manager(self.strat.strat_name,
                                          'traded_instr',
                                          self.strat.lt.traded_instr)
                self.strat.add_to_manager(self.strat.strat_name, '__winners',
                                          self.__winners)
                self.strat.lt.heartbeat_q.put(
                    [self.strat.strat_name, '__winners', self.__winners])
        else:
            # ix = self.__traded_instr.index(remove)
            try:
                ix = self.strat.lt.traded_instr.index(remove)
                del self.strat.lt.traded_instr[ix]
                # self.strat.add_to_manager(self.strat.strat_name, 'traded_instr', self.strat.lt.traded_instr)
            except ValueError:
                pass
            if len(self.__winners) == 0 and len(
                    self.strat.lt.traded_instr) > 0:
                # if len(self.__winners) == 0 and len(self.__traded_instr) > 0:
                return
            elif len(self.__winners) == 0 and len(
                    self.strat.lt.traded_instr) == 0:
                # elif len(self.__winners) == 0 and len(self.__traded_instr) == 0:
                raise exceptions_.NoMoreWinnersInLineError
            self.strat.lt.traded_instr.append(next_in_line)
            # self.__traded_instr.append(next_in_line)
            # self.strat.add_to_manager(self.strat.strat_name, 'traded_instr', self.strat.lt.traded_instr)
            # self.strat.add_to_manager(self.strat.strat_name, '__winners', self.__winners)
            self.strat.lt.heartbeat_q.put(
                [self.strat.strat_name, '__winners', self.__winners])
コード例 #6
0
ファイル: scanners1.py プロジェクト: rmlv159/live_trading
 def _remove_misc_negative_instr(cls, black_list, matches, runtime_tm):
     log_start = datetime.datetime.now()
     log = logging_.Logging(
         runtime_tm, log_start,
         str(cls.__class__.__name__ + ',' + sys._getframe().f_code.co_name))
     selected_matches = []
     for i in matches:
         if i in black_list:
             continue
         selected_matches.append(i)
     log.log()
     return selected_matches
コード例 #7
0
 def get_budget(_n_winners, cap_, runtime_tm):
     log_start = datetime.datetime.now()
     log = logging_.Logging(runtime_tm, log_start,
                            str(' ' + ',' + sys._getframe().f_code.co_name))
     if _n_winners > TOO_FEW_INSTR_TRADED:
         budget = cap_ / _n_winners
     else:
         try:
             budget = (cap_ / _n_winners) * (1 -
                                             CAP_RETENTION_IF_TOO_FEW_INSTR)
         except Exception as e:
             if _n_winners == 0:
                 raise exceptions_.WinnersZero()
             else:
                 raise e
     log.log(budget, _n_winners)
     return budget
コード例 #8
0
ファイル: strategies.py プロジェクト: rmlv159/live_trading
 def update_trade_flow(self, ticker):
     log_start = datetime.datetime.now()
     log = logging_.Logging(self.runtime_tm, log_start, str(self.__class__.__name__ + ',' + sys._getframe().f_code.co_name))
     # self.lt.add_to_monitor(*log.monitor())
     price, offer_size, size, status = None, None, None, None
     try:
         curr_n_trades = self.lt.cnt_trades_per_instr_per_day[ticker.contract.symbol]
     except KeyError:
         curr_n_trades = 0
     if ticker.contract.symbol not in self.lt.portfolio_instr and curr_n_trades < self.max_trades_per_instr_per_day:
         self.__make_trade_decision(ticker, 'BUY')
     elif ticker.contract.symbol in self.lt.portfolio_instr:
         self.__make_trade_decision(ticker, 'SELL')
     log.log(price
         ,offer_size
         ,size
         ,status)
     self.add_to_manager(self.strat_name, 'n loops update_trade_flow', 'increment_1')
コード例 #9
0
 def _start_routine_check(self):
     log_start = datetime.datetime.now()
     log = logging_.Logging(
         self.runtime_tm, log_start,
         str(self.__class__.__name__ + ',' +
             sys._getframe().f_code.co_name))
     self.add_to_manager(self.strat_name, *log.monitor())
     if self.debugging.dummy_time:
         _now = self.lt._manipulated_time(datetime.datetime.now())
     else:
         _now = datetime.datetime.now()
     current = self.lt.us_tz_op(_now).time()
     op = datetime.datetime.strptime(MARKET_OPEN, '%H:%M:%S').time()
     if current < op:
         status = False
     else:
         status = True
     log.log(status)
     return status
コード例 #10
0
ファイル: scanners1.py プロジェクト: rmlv159/live_trading
 def receive_(self, _type_):
     log_start = datetime.datetime.now()
     log = logging_.Logging(
         self.strat.runtime_tm, log_start,
         str(self.__class__.__name__ + ',' +
             sys._getframe().f_code.co_name))
     scan_data = []
     self.ss.scanCode = _type_
     scan = self.strat.lt.ib.reqScannerData(self.ss)
     if len(scan) == 0:
         print('scanner did not return anything')
         raise exceptions_.ScannerReturnsNothingError
     rank = 0
     while True:
         try:
             scan_data.append([scan[rank].contractDetails.contract.symbol])
             rank += 1
         except IndexError:
             break
     log.log(_type_)
     return scan_data
コード例 #11
0
    def _check_if_done(self):
        log_start = datetime.datetime.now()
        log = logging_.Logging(
            self.runtime_tm, log_start,
            str(self.__class__.__name__ + ',' +
                sys._getframe().f_code.co_name))
        self.add_to_manager(self.strat_name, *log.monitor())
        d_is_empty = lambda x: not bool(x)  #empty dict check, turn around
        status = True
        if d_is_empty(self.lt.cnt_trades_per_instr_per_day):
            status = False
        for i in self.lt.cnt_trades_per_instr_per_day.keys():
            if self.lt.cnt_trades_per_instr_per_day[
                    i] < MAX_TRADES_PER_INSTR_PER_DAY:
                status = False
        if status:
            raise exceptions_.MaxTradesPerDayError

        if self.signals.sell_at_eob_f():
            raise exceptions_.SellAtEOBWarning

        log.log(status)
コード例 #12
0
ファイル: scanners1.py プロジェクト: rmlv159/live_trading
 def _relevance_discarding(cls,
                           factors,
                           _n_iters,
                           runtime_tm,
                           _first_iter=False):
     log_start = datetime.datetime.now()
     log = logging_.Logging(
         runtime_tm, log_start,
         str(cls.__class__.__name__ + ',' + sys._getframe().f_code.co_name))
     selection_dict = OrderedDict()
     for ix, i in enumerate(factors.values()):
         flat = [j for k in i for j in k]
         n = []
         for f in flat:
             n.append([f, flat.count(f)])
         if not _first_iter:
             for cix, c in enumerate(n):
                 if c[1] < _n_iters:
                     del n[cix]
         fittest = [r[0] for r in n]
         selection_dict[ix] = fittest
     log.log()
     return selection_dict
コード例 #13
0
ファイル: scanners1.py プロジェクト: rmlv159/live_trading
 def initial_scan_to_sort(self, _longer_list):
     log_start = datetime.datetime.now()
     log = logging_.Logging(
         self.strat.runtime_tm, log_start,
         str(self.__class__.__name__ + ',' +
             sys._getframe().f_code.co_name))
     positive_instr = OrderedDict()
     negative_instr = OrderedDict()
     _scan_param_ix = 0
     for factor_ix in range(_longer_list):
         try:
             _key_ = list(self.positive_factors.keys())[factor_ix]
             positive_instr[_key_] = self.receive_(
                 self.positive_factors[_key_][_scan_param_ix])
         except IndexError:
             pass
         except exceptions_.ScannerReturnsNothingError:
             del self.positive_factors[factor_ix]
         try:
             _factor_val_ix, _factor_type_ix = 0, 1
             if isinstance(self.negative_factors, tuple):
                 for _nf in self.negative_factors:
                     if list(_nf.values())[0][_factor_type_ix] == 'scanner':
                         _neg_fact = _nf
                         break
             else:
                 _neg_fact = self.negative_factors[0]
             _key_ = list(_neg_fact.keys())[factor_ix]
             negative_instr[_key_] = self.receive_(
                 _neg_fact[_key_][_scan_param_ix])
         except IndexError:
             pass
         except exceptions_.ScannerReturnsNothingError:
             del self.negative_factors[factor_ix]
     log.log(_longer_list)
     return positive_instr, negative_instr
コード例 #14
0
ファイル: scanners1.py プロジェクト: rmlv159/live_trading
 def _check_tradeability_of_instr(self, traded_instr_this_strat):
     log_start = datetime.datetime.now()
     log = logging_.Logging(
         self.strat.runtime_tm, log_start,
         str(self.__class__.__name__ + ',' +
             sys._getframe().f_code.co_name))
     removables = []
     # for wnr_ in self.__winners:
     instrs = copy.copy(traded_instr_this_strat)
     for wnr_ in traded_instr_this_strat:
         if self.is_used_by_another_parallel_strat(wnr_):
             removables.append(wnr_)
     if len(removables) > 0:
         for rem_ in removables:
             next_in_line = self.__winners.pop(0)
             instrs.append(next_in_line)
             self.reshuffle_winners(
                 self.strat.parallel_traded_instr_per_strat,
                 next_in_line,
                 remove=rem_)
             _ix = instrs.index(rem_)
             del instrs[_ix]
     log.log(removables)
     return instrs
コード例 #15
0
 def _init_trade_cnt(self, _traded_instr):
     self.cons_disp.print_warning('this might be conflicting')
     # print('this might be conflicting')
     log_start = datetime.datetime.now()
     log = logging_.Logging(
         self.runtime_tm, log_start,
         str(self.__class__.__name__ + ',' +
             sys._getframe().f_code.co_name))
     self.add_to_manager(self.strat_name, *log.monitor())
     if len(_traded_instr) == 0:
         self.lt.cnt_trades_per_instr_per_day = {}
     else:
         for w_ix, wnr in enumerate(_traded_instr):
             if w_ix == 0:
                 self.lt.cnt_trades_per_instr_per_day = {wnr: 0}
             else:
                 self.lt.cnt_trades_per_instr_per_day[wnr] = 0
     self.add_to_manager(self.strat_name, 'cnt_trades_per_instr_per_day',
                         self.lt.cnt_trades_per_instr_per_day)
     self.lt.heartbeat_q.put([
         self.strat_name, 'cnt_trades_per_instr_per_day',
         self.lt.cnt_trades_per_instr_per_day
     ])
     log.log()
コード例 #16
0
    def mkt_cap(self, symbol_, threshold_):
        log_start = datetime.datetime.now()
        log = logging_.Logging(
            self.lt.runtime_tm, log_start,
            str(self.__class__.__name__ + ',' +
                sys._getframe().f_code.co_name))

        if isinstance(threshold_, int) or isinstance(threshold_, float):
            raise Exception('invalid value, must be a letter at end')
        if threshold_[-1] == 'M':
            mult_ = 1000000
        elif threshold_[-1] == 'B':
            mult_ = 1000000000
        else:
            mult_ = 1
        threshold_ = int(threshold_[:-1]) * mult_
        self.lt.hlprs.add_to_manager(self.lt.manager_, *log.monitor())

        contract_ = Stock(symbol_, 'ISLAND', 'USD')
        snapshot_xml = self.lt.ib.reqFundamentalData(contract_,
                                                     'ReportSnapshot')
        if len(snapshot_xml) > 0:
            snapshot = xmltodict.parse(snapshot_xml)
            fin_stat_xml = self.lt.ib.reqFundamentalData(
                contract_, 'ReportsFinStatements')
            fin_stat = xmltodict.parse(fin_stat_xml)
            px_ = float(snapshot \
                ['ReportSnapshot']\
                ['Ratios']\
                ['Group']\
                [0]\
                ['Ratio']\
                [0]\
                ['#text'])
            coa_ = fin_stat \
                ['ReportFinancialStatements']\
                ['FinancialStatements']\
                ['COAMap']\
                ['mapItem']
            # periods = fin_stat \
            #     ['ReportFinancialStatements']\
            #     ['FinancialStatements']\
            #     ['AnnualPeriods']\
            #     ['FiscalPeriod']
            line_items_ = fin_stat \
                ['ReportFinancialStatements']\
                ['FinancialStatements']\
                ['AnnualPeriods']\
                ['FiscalPeriod']\
                [0]\
                ['Statement']\
                [1]\
                ['lineItem']
            # [len(periods)-1]\
            for ix_, acc_grp in enumerate(coa_):
                if acc_grp['#text'] == 'Total Common Shares Outstanding':
                    where = coa_[ix_]['@coaItem']
                    precision_ = int(acc_grp['@precision'])
                    if precision_ == 1:
                        zeros = 1000.0
                    elif precision_ == 2:
                        zeros = 1000000.0
                    else:
                        zeros = 1.0
                    for ix2, line_ in enumerate(line_items_):
                        if line_['@coaCode'] == where:
                            shares_outstanding_ = float(
                                line_items_[ix2]['#text']) * zeros
                            break
            mkt_cap = px_ * shares_outstanding_
        else:
            mkt_cap = 0.0
        log.log()
        if mkt_cap > threshold_:
            return True
        else:
            return False
コード例 #17
0
ファイル: scanners1.py プロジェクト: rmlv159/live_trading
    def collect_hist_ticks(self, ticker, unix_ts):
        log_start = datetime.datetime.now()
        log = logging_.Logging(
            self.strat.runtime_tm, log_start,
            str(self.__class__.__name__ + ',' +
                sys._getframe().f_code.co_name))
        self.strat.add_to_manager(self.strat.strat_name, *log.monitor())
        cnt = 0
        log_msg1 = ""
        while cnt < self.strat.iteration_timeout_secs:
            # if DEBUGGING:
            if self.strat.debugging.dummy_data:
                # available_bids, available_asks = 5, 6
                available_bids = self.strat.lt._ticker_len_n_type_check(
                    ticker.domBids)
                available_asks = self.strat.lt._ticker_len_n_type_check(
                    ticker.domAsks)
            else:
                available_bids = self.strat.lt._ticker_len_n_type_check(
                    ticker.domBids)
                available_asks = self.strat.lt._ticker_len_n_type_check(
                    ticker.domAsks)
            if available_asks > 0 and available_bids > 0:
                break
            else:
                log_msg1 = 'no bids or asks available for contract, iterating through {}/ITERATION_TIMEOUT_SECS = {}'\
                    .format(str(cnt), str(self.strat.iteration_timeout_secs))
                log.log(log_msg1)
                self.strat.add_to_manager(self.strat.strat_name,
                                          *log.monitor())
            self.strat.lt.ib.sleep(1)
            cnt += 1
        else:
            log_msg1 = 'ending iteration - no bids or asks available for contract'
            self.cons_disp.print_warning(log_msg1)
            status = 1
            log.log(log_msg1)
            return status

        for interm_side in ['ask', 'bid']:
            symbol = ticker.contract.symbol
            if interm_side == 'ask':
                side = 0
                items = ticker.domAsks
            else:
                side = 1
                items = ticker.domBids
            _n_ranks = self.strat.n_willingness_to_move_up_price \
                if self.strat.n_willingness_to_move_up_price >= len(items) \
                else len(items)
            for rank in range(_n_ranks):
                if self.strat.debugging.dummy_data:
                    # price, size = float(random.randint(10,100)), random.randint(100,10000)
                    price, size = items[rank].price, items[rank].size
                else:
                    try:
                        price, size = items[rank].price, items[rank].size
                    except IndexError:
                        try:
                            price, size = items.price, items.size
                        except AttributeError:
                            continue
                df = pd.DataFrame([[symbol, unix_ts, side, rank, price, size]],
                                  columns=[
                                      'symbol', 'unix_ts', 'side', 'rank',
                                      'price', 'size'
                                  ])
                self.__hist_data_winners_df = pd.concat(
                    [self.__hist_data_winners_df, df])
                _row_major = 0
                # self.lt.add_to_monitor('n __hist_data_winners_df', self.__hist_data_winners_df.shape[_row_major])
                # print(self.hist_data_winners_df)
        status = 0
        log.log(log_msg1, price, size, side)
        return status
コード例 #18
0
ファイル: scanners1.py プロジェクト: rmlv159/live_trading
    def __make_trade_decision(self, ticker, order):
        log_start = datetime.datetime.now()
        log = logging_.Logging(
            self.runtime_tm, log_start,
            str(self.__class__.__name__ + ',' +
                sys._getframe().f_code.co_name))
        self.strat.add_to_manager(self.strat.strat_name, *log.monitor())
        buy_try, sell_try, status = None, None, None
        if order == 'BUY':
            side = 1  # bid
        elif order == 'SELL':
            side = 0  # ask
        else:
            raise Exception('must be either BUY or SELL')

        # if DEBUGGING:
        if self.strat.debugging.dummy_data:
            # available_bids, available_asks = 5, 6
            available_bids = self.strat.lt._ticker_len_n_type_check(
                ticker.domBids)
            available_asks = self.strat.lt._ticker_len_n_type_check(
                ticker.domAsks)
        else:
            available_bids = self.strat.lt._ticker_len_n_type_check(
                ticker.domBids)
            available_asks = self.strat.lt._ticker_len_n_type_check(
                ticker.domAsks)

        buy_conditions = self.signals.__buy_conditions(ticker)
        if order == 'BUY' and not buy_conditions:
            status = -1
        elif order == 'BUY' and buy_conditions:
            buy_try = 0
            while True:
                price, offer_size = self.signals.price_size_select(
                    ticker, buy_try, side)
                if price > self.strat.max_price_instr_usd:
                    status = 1
                    break
                price, offer_size = self.signals.price_size_select(
                    ticker, buy_try, side)
                cap_ = ''
                _cap_cnt = 0
                _max_cap_cnt = 10
                while _cap_cnt < _max_cap_cnt:
                    cap_ = self.strat.lt.cash.available_funds(
                        self.strat.lt.report.pnl(), self.strat.lt.account_curr)
                    if cap_ != 'value cannot be determined':
                        break
                    self.strat.lt.ib.sleep(0.5)
                    _cap_cnt += 1
                    if _cap_cnt == _max_cap_cnt:
                        raise exceptions_.ReportExtractionError
                self.strat.add_to_manager(self.strat.strat_name, 'cap_usd',
                                          cap_)
                # budget = self.scanner_based.rm.get_budget(len(self.__traded_instr), cap_, self.scanner_based.runtime_tm)
                budget = self.strat.rm.get_budget(
                    len(self.strat.lt.traded_instr), cap_,
                    self.strat.runtime_tm)
                # self.lt.add_to_monitor('budget_per_instr RiskManagement.get_budget', budget)
                offer = price * offer_size
                size = int(budget / price)
                # if budget < price:
                #     buy_try += 1
                # else:
                #     buy_order_filled_status = self.lt.buy(ticker, buy_try, size, ORDER_TYPE)
                #     if buy_order_filled_status == 0:
                #         status = 0
                #         break
                #     else:
                #         status = -1
                buy_order_filled_status = self.strat.lt.buy(
                    ticker, buy_try, size, self.order_type)
                if buy_order_filled_status == 0:
                    status = 0
                    break
                else:
                    status = -1
                if buy_try == self.strat.n_willingness_to_move_up_price - 1 or buy_try == available_bids:
                    status = -1
                    break
        elif order == 'SELL' and not self.signals.__sell_conditions(ticker):
            status = -1
        elif order == 'SELL' \
                and (self.signals.__sell_conditions(ticker) or self.signals.stop_loss_f(ticker)):
            sell_try = 0
            size_ix = 3
            symbol_ix = 0
            while True:
                price, offer_size = self.signals.price_size_select(
                    ticker, sell_try, side)
                # offer = price * size
                # held_position = self.lt.held_instruments[str(reqId)]['size'] * price
                row_num = [i[symbol_ix] for i in self.strat.lt.portfolio
                           ].index(ticker.contract.symbol)
                held_size = self.strat.lt.portfolio[row_num][size_ix]
                if offer_size < held_size:
                    sell_try += 1
                else:
                    status = 0
                    self.strat.lt.sell(ticker, sell_try, self.order_type)
                    break
                if sell_try == self.strat.n_willingness_to_move_up_price - 1 or sell_try == available_asks:
                    status = -1
                    break
        # statuses:
        # -1 = next try/price up
        # 0 = ok = buy/sell
        # 1 = other conditions not met = abandon
        log.log(buy_try, sell_try, status)
コード例 #19
0
ファイル: scanners1.py プロジェクト: rmlv159/live_trading
    def find_winners(self, parallel_traded_instr_per_strat):
        log_start = datetime.datetime.now()
        log = logging_.Logging(
            self.strat.runtime_tm, log_start,
            str(self.__class__.__name__ + ',' +
                sys._getframe().f_code.co_name))
        self.strat.add_to_manager(self.strat.strat_name, *log.monitor())
        hist_data_df = None
        # matches = None
        _analysis_logic = datetime.datetime.strptime(
            self.analysis_logic_start_time, '%H:%M:%S')
        _trading_logic = datetime.datetime.strptime(
            self.trading_logic_start_time, '%H:%M:%S')
        _n_iters = int((_trading_logic - _analysis_logic).seconds / 60)
        if self.strat.debugging.dummy_time:
            _now = self.strat.lt._manipulated_time(datetime.datetime.now())
        else:
            _now = datetime.datetime.now()

        _time_gates = [
            self.strat.lt.us_tz_op(_now) + datetime.timedelta(minutes=ix)
            for ix, _ in enumerate(range(_n_iters))
        ]  # minutes=ix works fairly well

        _inst_ = self
        del _inst_

        negative_scan_instr, negative_misc_factors = [], []
        _factor_val_ix, _factor_type_ix = 0, 1
        for nf in self.negative_factors:
            v_ = list(nf.values())
            if v_[0][_factor_type_ix] == 'scanner':
                negative_scan_instr.append(v_)
            else:
                negative_misc_factors.append(v_)

        longer_scan_list = len(self.positive_factors) \
            if len(self.positive_factors) >= len(negative_scan_instr) \
            else len(self.negative_factors)
        reduce_from_longer_scan_list = self.positive_factors \
            if len(self.positive_factors) >= len(negative_scan_instr) \
            else self.negative_factors

        for ix, turn in enumerate(range(_n_iters)):
            if ix == 0:
                while True:
                    # first iter, check lenghts and availabilities
                    # this might be too complicated for the small number of factors
                    positive_instr, negative_scan_instr = self.initial_scan_to_sort(
                        longer_scan_list)

                    matches = self.match_f(positive_instr,
                                           negative_scan_instr,
                                           _n_iters,
                                           _first_iter=True)

                    negative_misc_instr = []
                    for nmi_ in negative_misc_factors:
                        if nmi_[0][_factor_type_ix] == 'finRatiosMarketCap':
                            for match in matches[0:int(self.strat.lt.
                                                       funda_data_req_max /
                                                       self.strat.n_strats)]:
                                try:
                                    if not self.strat.lt.fin_ratios.mkt_cap(
                                            match, nmi_[0][_factor_val_ix]):
                                        negative_misc_instr.append(match)
                                except Exception as e:
                                    print('stop')

                    negative_misc_instr = negative_misc_instr + self.black_list
                    matches = self._remove_misc_negative_instr(
                        negative_misc_instr, matches, self.strat.runtime_tm)

                    if len(matches
                           ) < parallel_traded_instr_per_strat and not len(
                               matches) == 0:
                        if self.strat.rm.fraction_sorting_out_negative_list > .0:
                            self._reduce_fraction_sorting_out_negative_list()
                            continue

                        if len(self.negative_factors) > 0:
                            # _key_ = list(self.negative_factors.keys())[0]
                            _key_ = list(self.negative_factors)
                            del self.negative_factors[_key_]
                            continue

                        self.cons_disp.print_warning(
                            'not sure if this can be deleted or needs to stay')
                        # if len(self.positive_factors) == 2:
                        #     break

                        # _key_ = list(reduce_from_longer_scan_list.keys())[longer_scan_list - 1]
                        _key_ = list(reduce_from_longer_scan_list.keys())[
                            longer_scan_list - 1]
                        del reduce_from_longer_scan_list[_key_]
                        longer_list = len(self.positive_factors) \
                            if len(self.positive_factors) >= len(self.negative_factors) \
                            else len(self.negative_factors)
                        reduce_from_longer_scan_list = self.positive_factors \
                            if len(self.positive_factors) >= len(self.negative_factors) \
                            else self.negative_factors
                    elif len(matches) == 0:
                        raise exceptions_.TooFewContractsWhileDeterminingError
                    else:
                        break
            else:
                self._time_gates_f(_time_gates, ix)

                _pos_instr, _neg_instr = self.scan_(longer_scan_list)
                for _fctr_ix in range(len(positive_instr)):
                    _key_ = list(positive_instr.keys())[_fctr_ix]
                    positive_instr[
                        _key_] = positive_instr[_key_] + _pos_instr[_key_]
                for _fctr_ix in range(len(negative_scan_instr)):
                    _key_ = list(negative_scan_instr.keys())[_fctr_ix]
                    negative_scan_instr[
                        _key_] = negative_scan_instr[_key_] + _neg_instr[_key_]

        matches = self.match_f(positive_instr, negative_scan_instr, _n_iters)
        # matches = self._remove_misc_negative_instr(self.black_list, matches, self.strat.runtime_tm)

        if self.strat.debugging.dummy_data:
            matches = self.strat.debugging.dummy_instr
        log.log(hist_data_df, matches)
        return matches