Exemple #1
0
 def load_symbol(self, symbol):
     logging.info("loading symbol %s", symbol)
     self.b3_dealer.historical_symbol_ticker_candle(
         symbol, datetime(year=2021, day=4, month=1),
         datetime(year=2021, day=20, month=5))
     # data = pd.read_csv('../data/petr4.sa')
     data = self.b3_dealer.historical_data[
         self.b3_dealer.historical_data.symbol ==
         self.b3_dealer.get_symbol_ticker(symbol)]
     if len(data):
         self.scene[0].set_data(data)
         self.ta_data.set_data(data, self.scene[0].timeline)
         # ta
         self.ta = TA(data)
         self.curves.append(CurveModel(self))
         self.curves[0].set_from_data(self.ta.ema(3),
                                      self.scene[0].timeline)
         self.curves.append(CurveModel(self))
         self.curves[1].set_from_data(self.ta.ema(10),
                                      self.scene[0].timeline)
         self.curves[1].color = (0.0, 0.0, 1.0, 1.0)
         # focus camera
         last_x = self.scene[0].timeline.index_pos(len(data))
         last_y = data.iloc[-1]["open"]
         width = self.scene[0].timeline.index_pos(14)  # 7 days radius
         self.camera = OrthographicCamera((last_x, last_y), width, self.wnd)
Exemple #2
0
class TAData:
    curves: [CurveModel]
    resistance_lines_data: [[]]
    resistance_lines: [CurveModel]
    resistance_line_count: int
    ta: TA

    def __init__(self, wcg):
        self.wcg = wcg
        self.resistance_lines_data = []
        self.resistance_lines = []

    def set_data(self, data, timeline: TimeLine):
        self.ta = TA(data)
        support_lines_data = self.ta.resistance_lines('s')
        self.resistance_lines_data = self.ta.resistance_lines('r')

        self.resistance_line_count = len(self.resistance_lines_data[0])

        self.resistance_lines_data[0].extend(support_lines_data[0])
        self.resistance_lines_data[1].extend(support_lines_data[1])

        def horizontal_line(values, ids, color):
            model = CurveModel(self.wcg)
            model.color = color
            model.set_horizontal_line(
                np.array(values).mean(), 1000, timeline.index_pos(min(ids)))
            return model

        for i in range(len(self.resistance_lines_data[0])):
            self.resistance_lines.append(
                horizontal_line(self.resistance_lines_data[0][i],
                                self.resistance_lines_data[1][i],
                                (1, 0, 0, 1)))

    def draw_closest_resistance_line(self, c: OrthographicCamera, price: float,
                                     current_index: int):
        if not len(self.resistance_lines_data):
            return
        r = get_closest_resistance(self.resistance_lines_data, price,
                                   current_index)
        if r[0] >= price and r[1] >= 0:
            self.resistance_lines[r[1]].draw(c)

    def draw_closest_support_line(self, c: OrthographicCamera, price: float,
                                  current_index: int):
        if not len(self.resistance_lines_data):
            return
        r = get_closest_support(self.resistance_lines_data, price,
                                current_index)
        if r[0] <= price and r[1] >= 0:
            self.resistance_lines[r[1]].draw(c)
    def historical_candle_series(self, symbols, start: datetime, end,
                                 interval):

        candles = {}

        symbol_list = symbols
        if type(symbols) is str:
            symbol_list = [symbols]

        self.download_history(symbol_list, start, end, interval)

        for symbol in symbol_list:
            candle_data = self.historical_data[self.historical_data.symbol ==
                                               self.get_symbol_ticker(symbol)]
            candle_data = candle_data[candle_data.interval == interval]
            candle_data = candle_data[candle_data.date >= start]
            candle_data = candle_data[candle_data.date <= end]
            prices = []
            for _, candle in candle_data.iterrows():
                prices.append(
                    Price(date=candle['date'],
                          symbol=candle['symbol'],
                          current=float(candle['open']),
                          open=float(candle['open']),
                          close=float(candle['close']),
                          low=float(candle['low']),
                          high=float(candle['high']),
                          volume=float(candle['volume']),
                          interval=interval))
            candles[symbol] = {"prices": prices, "ta": TA(candle_data)}
        return candles
Exemple #4
0
    def historical_candle_series(self, symbols, start: datetime, end=None, interval: str = '1d'):
        if end is None:
            end = datetime.today()
            if end.isoweekday() > 5:
                end -= timedelta(days=end.isoweekday() - 5)
                end = end.replace(hour=0, minute=0, second=0, microsecond=0)

        symbol_list = symbols
        if type(symbols) is str:
            symbol_list = [symbols]

        self.download_history(symbol_list, start, end, interval)

        candles = {}
        for symbol in symbol_list:
            candle_data = self.historical_data[self.historical_data.symbol == self.get_symbol_ticker(symbol)]
            candle_data = candle_data[candle_data.date >= start]
            candle_data = candle_data[candle_data.date <= end]
            prices = []
            for _, candle in candle_data.iterrows():
                prices.append(Price(date=candle['date'],
                                    symbol=candle['symbol'],
                                    current=float(candle['open']),
                                    open=float(candle['open']),
                                    close=float(candle['close']),
                                    low=float(candle['low']),
                                    high=float(candle['high']),
                                    volume=float(candle['volume']),
                                    interval=interval))
            candles[symbol] = {
                "prices": prices,
                "ta": TA(candle_data)
            }
        return candles
Exemple #5
0
 def backtrace(self, dealer: Dealer, start: datetime, end=None):
     asset_symbols = [a[0] for a in self.assets]
     dealer.historical_symbol_ticker_candle(asset_symbols, start, end)
     total_value = self.balance()
     results = {}
     for asset in self.assets:
         ta = TA(dealer.historical_data[dealer.historical_data.symbol ==
                                        dealer.get_symbol_ticker(asset[0])])
         pct_change = ta.single_pct_change()
         final_value = asset[1] + asset[1] * pct_change / 100.0
         results[asset[0]] = {
             "change": (pct_change, final_value),
             "max": (ta.max_in_range()[0], ta.max_pct_in_range()[0],
                     ta.max_in_range()[1])
         }
         total_value += final_value - asset[1]
     results['total'] = (total_value, (total_value - self.balance()) /
                         self.balance() * 100.0)
     return results
Exemple #6
0
    def set_data(self, data, timeline: TimeLine):
        self.ta = TA(data)
        support_lines_data = self.ta.resistance_lines('s')
        self.resistance_lines_data = self.ta.resistance_lines('r')

        self.resistance_line_count = len(self.resistance_lines_data[0])

        self.resistance_lines_data[0].extend(support_lines_data[0])
        self.resistance_lines_data[1].extend(support_lines_data[1])

        def horizontal_line(values, ids, color):
            model = CurveModel(self.wcg)
            model.color = color
            model.set_horizontal_line(
                np.array(values).mean(), 1000, timeline.index_pos(min(ids)))
            return model

        for i in range(len(self.resistance_lines_data[0])):
            self.resistance_lines.append(
                horizontal_line(self.resistance_lines_data[0][i],
                                self.resistance_lines_data[1][i],
                                (1, 0, 0, 1)))
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # historical data
        # self.data = Ticker('petr4.sa').history(period="ytd").reset_index(drop=False)
        self.data = pd.read_csv('../data/petr4.sa')

        # strategy specifics
        self.ta = TA(self.data)
        self.support_lines_data = self.ta.resistance_lines('s')
        self.resistance_lines_data = self.ta.resistance_lines('r')
        print(self.ta.candle_directions())
        print(self.ta.reversals())
        # simulation
        self.tick_count = len(self.data)
        self.current_tick = 0
        # scene
        self.scene.append(CandleStickChart(self))
        self.scene[0].set_data(self.data)
        # focus camera
        last_x = self.scene[0].timeline.index_pos(len(self.data))
        last_y = self.data.iloc[-1]["open"]
        width = self.scene[0].timeline.index_pos(14)  # 7 days radius
        self.camera = OrthographicCamera((last_x, last_y), width, self.wnd)
        # resistance lines
        self.resistance_lines = []
        for i in range(len(self.resistance_lines_data[0])):
            self.resistance_lines.append(
                ResistanceLine(self, self.resistance_lines_data[0][i],
                               self.resistance_lines_data[1][i],
                               self.scene[0].timeline, (1, 0, 0, 1.0)))
        # support lines
        self.support_lines = []
        for i in range(len(self.support_lines_data[0])):
            self.support_lines.append(
                ResistanceLine(self, self.support_lines_data[0][i],
                               self.support_lines_data[1][i],
                               self.scene[0].timeline, (0, 1, 0, 1.0)))
class CustomStrategy(App, Strategy):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # historical data
        # self.data = Ticker('petr4.sa').history(period="ytd").reset_index(drop=False)
        self.data = pd.read_csv('../data/petr4.sa')

        # strategy specifics
        self.ta = TA(self.data)
        self.support_lines_data = self.ta.resistance_lines('s')
        self.resistance_lines_data = self.ta.resistance_lines('r')
        print(self.ta.candle_directions())
        print(self.ta.reversals())
        # simulation
        self.tick_count = len(self.data)
        self.current_tick = 0
        # scene
        self.scene.append(CandleStickChart(self))
        self.scene[0].set_data(self.data)
        # focus camera
        last_x = self.scene[0].timeline.index_pos(len(self.data))
        last_y = self.data.iloc[-1]["open"]
        width = self.scene[0].timeline.index_pos(14)  # 7 days radius
        self.camera = OrthographicCamera((last_x, last_y), width, self.wnd)
        # resistance lines
        self.resistance_lines = []
        for i in range(len(self.resistance_lines_data[0])):
            self.resistance_lines.append(
                ResistanceLine(self, self.resistance_lines_data[0][i],
                               self.resistance_lines_data[1][i],
                               self.scene[0].timeline, (1, 0, 0, 1.0)))
        # support lines
        self.support_lines = []
        for i in range(len(self.support_lines_data[0])):
            self.support_lines.append(
                ResistanceLine(self, self.support_lines_data[0][i],
                               self.support_lines_data[1][i],
                               self.scene[0].timeline, (0, 1, 0, 1.0)))

    # render
    def render_callback(self, time: float):
        for o in self.scene:
            o.draw(self.camera)
        for o in self.scene:
            o.draw_gui(self.camera)
        # self.scene[0].render(self.camera)
        # self.scene[0].render_gui(self.camera)
        # for rl in self.resistance_lines:
        #     rl.draw(self.scene[0].camera)
        # for sl in self.support_lines:
        #     sl.draw(self.scene[0].camera)
        # self.support.draw(self.scene[0].camera)
        # self.resistance.draw(self.scene[0].camera)
        # move in the timeline
        mouse_price = self.scene[0].measures.current_pointer[1]
        mouse_tick = self.scene[0].timeline.pos_index(
            self.scene[0].measures.current_pointer[0])

        old_tick = self.current_tick
        self.current_tick = int(time) % self.tick_count
        if old_tick != self.current_tick:
            self.run()

        # mouse_price = self.data.iloc[self.current_tick]['close']
        # mouse_tick = self.current_tick
        # self.scene[0].candlestick_model.upper_cut = self.current_tick

        current_support = get_closest_support(self.support_lines_data,
                                              mouse_price, mouse_tick - 1)
        if current_support[0] <= mouse_price and current_support[1] >= 0:
            self.support_lines[current_support[1]].draw(self.camera)
        current_resistance = get_closest_resistance(self.resistance_lines_data,
                                                    mouse_price,
                                                    mouse_tick - 1)
        if current_resistance[0] >= mouse_price and current_resistance[1] >= 0:
            self.resistance_lines[current_resistance[1]].draw(self.camera)

    # run strategy
    def run(self):

        pass
Exemple #9
0
class MainApp(App):
    # dealers
    cripto_dealer: BinanceExchange
    b3_dealer: YQBroker
    # wallets
    cripto_wallet: Wallet
    b3_wallet: Wallet
    # windows
    my_wallet_window: MyWalletWindow
    strategy_backtrace_window: StrategyBacktraceWindow
    # gui
    symbol_list = fund.get_symbol_list("../tests/raw_fund_html", False)
    input_text = ""

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # scene
        self.ta_data = TAData(self)
        self.scene.append(CandleStickChart(self))
        self.ta = None
        self.curves = []
        self.b3_dealer = YQBroker()
        self.b3_wallet = Wallet()
        self.b3_wallet.load_cache('../data/transactions.csv')
        self.b3_wallet.log()
        self.my_wallet_window = MyWalletWindow(self.b3_wallet)
        self.strategy_backtrace_window = StrategyBacktraceWindow()

    # render
    def render_callback(self, time: float):
        self.my_wallet_window.draw()
        self.strategy_backtrace_window.draw()

        self.menu_bar()
        for o in self.scene:
            o.draw(self.camera)
        for o in self.scene:
            o.draw_gui(self.camera)
        for c in self.curves:
            c.draw(self.camera)

        mouse_price = self.scene[0].measures.current_pointer[1]
        mouse_tick = self.scene[0].timeline.pos_index(
            self.scene[0].measures.current_pointer[0])
        self.ta_data.draw_closest_support_line(self.camera, mouse_price,
                                               mouse_tick)
        self.ta_data.draw_closest_resistance_line(self.camera, mouse_price,
                                                  mouse_tick)

    def cleanup(self):
        del self.my_wallet_window
        self.b3_wallet.save_cache('../data/transactions.csv')
        del self.b3_wallet

    def menu_bar(self):
        if imgui.begin_main_menu_bar():
            if imgui.begin_menu("File", True):
                clicked_quit, selected_quit = imgui.menu_item(
                    "Quit", 'Cmd+Q', False, True)
                if clicked_quit:
                    self.cleanup()
                    exit(0)
                imgui.end_menu()
            changed, value = imgui.input_text("", self.input_text, 30)
            if changed:
                imgui.set_next_window_position(imgui.get_item_rect_min().x,
                                               imgui.get_item_rect_max().y)
                imgui.set_next_window_size(imgui.get_item_rect_size().x, 0)
                if imgui.begin(
                        "##popup", False, imgui.WINDOW_NO_TITLE_BAR
                        | imgui.WINDOW_NO_MOVE | imgui.WINDOW_NO_RESIZE):
                    for index, row in self.symbol_list.iterrows():
                        if value.upper() in row[0]:
                            _, _ = imgui.selectable(row[0] + " - " + row[2])
                            if imgui.is_item_clicked():
                                self.input_text = row[0]
                                self.load_symbol(str(row[0]).lower())
                imgui.end()
            imgui.end_main_menu_bar()

    def load_symbol(self, symbol):
        logging.info("loading symbol %s", symbol)
        self.b3_dealer.historical_symbol_ticker_candle(
            symbol, datetime(year=2021, day=4, month=1),
            datetime(year=2021, day=20, month=5))
        # data = pd.read_csv('../data/petr4.sa')
        data = self.b3_dealer.historical_data[
            self.b3_dealer.historical_data.symbol ==
            self.b3_dealer.get_symbol_ticker(symbol)]
        if len(data):
            self.scene[0].set_data(data)
            self.ta_data.set_data(data, self.scene[0].timeline)
            # ta
            self.ta = TA(data)
            self.curves.append(CurveModel(self))
            self.curves[0].set_from_data(self.ta.ema(3),
                                         self.scene[0].timeline)
            self.curves.append(CurveModel(self))
            self.curves[1].set_from_data(self.ta.ema(10),
                                         self.scene[0].timeline)
            self.curves[1].color = (0.0, 0.0, 1.0, 1.0)
            # focus camera
            last_x = self.scene[0].timeline.index_pos(len(data))
            last_y = data.iloc[-1]["open"]
            width = self.scene[0].timeline.index_pos(14)  # 7 days radius
            self.camera = OrthographicCamera((last_x, last_y), width, self.wnd)
Exemple #10
0
    parser = argparse.ArgumentParser(description="")
    # retrieve symbol list
    # symbol_list = fund.get_symbol_list("../tests/raw_fund_html", False).sample(1)
    symbol_list = ["PETR4"]
    # create ticker list
    tickers = list()
    for name in symbol_list:
        logging.info("Downloading history of %s", name)
        tickers.append(Ticker(name + ".SA"))
    # retrieve history data
    tas = []
    for ticker in tickers:
        # check cache first
        cache_file = "../data/" + ticker.symbols[0]
        if os.path.isfile(cache_file):
            tas.append(TA(pd.read_csv(cache_file)))
        else:
            data = ticker.history()
            data.to_csv(cache_file)
            tas.append(TA(data))

    class Data:
        resistance_lines = None
        support_lines = None

    for ta in tas:
        data = Data()
        data.support_lines = ta.resistance_lines("s")
        data.resistance_lines = ta.resistance_lines("r")
        ta.run(run, data)
        plot_ta(ta)