def populate(df): for index, item in df.iterrows(): # only do the PSEi for now_ts if(not item.psei): continue # retrieve history symbol = item.name item = client.get_history(symbol, days=400) # calculate the indicators item = indicators.relative_strength_index(item, n=14) item = indicators.ema_rsi(item, n=30) # normalize and smoothen item['norm_ema_rsi'] = (item['ema_rsi'] - 0.5) * 200 item['norm_close'] = ((item['close'] - item['close'].min()) / (item['close'].max() - item['close'].min())) * 100 item['smoothed_close'] = item['norm_close'].rolling( window=5, win_type='gaussian', center=True).mean(std=3).shift(2) # remove all NA -- cleanup # not really neccessary... # item = item.dropna() # just take last 200 rows # item = item.tail(200) # item.reset_index(drop=True, inplace=True) # add to df dataframe df.loc[symbol,'strength_index'] = item['norm_ema_rsi'].tail(1).values df.loc[symbol,'price'] = item['close'].tail(1).values df.loc[symbol,'norm_close'] = item['norm_close'].tail(1).values df.reset_index(inplace=True) df = df.dropna() return df
import client import indicators import pandas as pd df = pd.read_csv('equities.csv', index_col='symbol') df['price'] = pd.Series() df['average_volatility'] = pd.Series() df['average_volume'] = pd.Series() for index, item in df.iterrows(): symbol = item.name equity = client.get_history(symbol) equity = indicators.day_range_pct(equity) equity = indicators.ema(equity, 'volume', 'ema_volume') equity = equity.join( pd.Series(equity['ema_volume'] / 1000000, name="vol(M)")) equity = indicators.ema(equity, 'day_range_pct', 'ema_day_range_pct') if len(equity) > 0: df.loc[symbol, 'price'] = equity['close'].tail(1).values df.loc[symbol, 'average_volatility'] = equity['ema_day_range_pct'].tail( 1).values df.loc[symbol, 'average_volume'] = equity['vol(M)'].tail(1).values df.to_pickle('./equities.pkl')
import matplotlib.pyplot as plt import pandas as pd import numpy as np # %% # Read JSON file for # %% stocks = [ "AC", "AEV", "AGI", "ALI", "AP", "BDO", "BPI", "DMC", "EDC", "EMP", "FGEN", "GLO", "GTCAP", "ICT", "JFC", "LTG", "MBT", "MEG", "MER", "MPI", "PCOR", "RLC", "SCC", "SECB", "SM", "SMC", "SMPH", "TEL", "URC" ] scatter = pd.DataFrame(index=stocks, columns=["strength", "price", "range"]) for stock in stocks: df = client.get_history(stock, days=365) df = indicators.relative_strength_index(df, n=14) df = indicators.ema_rsi(df, n=5) df_norm = df[["ema_rsi", "rsi"]] # df_norm = (df_norm - 0.50) * 2 * 100 ema_rsi = df_norm[ "ema_rsi"] # .rolling(window=5, win_type="gaussian", center=True).mean(std=3) ema_rsi = (ema_rsi - 0.5) ema_rsi = ema_rsi * 200 # ema_rsi = ema_rsi.rolling(window=5, win_type="gaussian", center=True).mean(std=3) # ema_rsi = ema_rsi.shift(2) rsi = df["rsi"] rsi = (rsi - 0.5) * 200
figsize=(10, 6), grid=True, ax=ax) ax.set_axisbelow(True) ax.minorticks_on() ax.grid(which='major', linestyle='-', linewidth='0.4', color='black') ax.grid(which='minor', linestyle=':', linewidth='0.4', color='black') plt.axhline(y=0, color='black', linestyle='--', alpha=0.2) plt.xlim(xlimit) plt.show() # %% # retrieve history symbol = "SECB" df = client.get_history(symbol, days=800) df2 = client.get_history("GLO", days=800) # %% df = indicators.heiken_ashi(df) df['ha_strength'] = (df['ha_high'] - df['ha_open']) - (df['ha_close'] - df['ha_low']) df['ha_cd'] = (df['ha_close'] - df['ha_open']) df['ha_cd_s'] = (df['ha_strength'] + df['ha_cd']) # calculate the indicators df.set_index('date', inplace=True) # %% xlimit = [200, 800] ylimit = [0, 270] plot(df, xlim=xlimit, ylim=ylimit)
def __init__(self): super().__init__() self.title = "Main window" self.top = 55 self.left = 7 w = data.scale[0] h = data.scale[1] data.reso[0] = App.primaryScreen().size().width() data.reso[1] = App.primaryScreen().size().height() self.width = App.primaryScreen().size().width() / w self.height = App.primaryScreen().size().height() / h self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) data.graphResolution = [ self.width / data.scale[2], self.height / data.scale[3] ] self.setWindowIcon(QtGui.QIcon('icon1.ico')) self.formLayout0 = QFormLayout() self.groupBox0 = QGroupBox("Available Asks") self.groupBox0.setLayout(self.formLayout0) scroll0 = QScrollArea() scroll0.setWidget(self.groupBox0) scroll0.setWidgetResizable(True) self.formLayout = QFormLayout() self.groupBox = QGroupBox("Available Bids") customTheme() data.pref_prd = list(client.get_stars(data.username, data.password)) # TODO UNCOMMENT #print(client.get_stars(data.username, data.password)) self.groupBox.setLayout(self.formLayout) scroll = QScrollArea() scroll.setWidget(self.groupBox) scroll.setWidgetResizable(True) self.formLayout3 = QFormLayout() self.groupBox3 = QGroupBox("Your orders") self.groupBox3.setLayout(self.formLayout3) scroll3 = QScrollArea() scroll3.setWidget(self.groupBox3) scroll3.setWidgetResizable(True) self.formLayout1 = QFormLayout() self.groupBox1 = QGroupBox("Orders' History") history = client.get_history(data.username, data.password) print("HERE WE GO AGAIN") for r in history: #print(r) if len(r): Order = QtWidgets.QPushButton() if r[-1] == "sell": sign = func.sellOrder( r[0], r[1], r[2], r[3]) # ordertype, product, amount, price Order.setStyleSheet(styles.sellbutton) else: sign = func.buyOrder(r[0], r[1], r[2], r[3]) Order.setStyleSheet(styles.buybutton) Order.setText(sign) Order.setDisabled(True) # formLayout1.addWidget(Order) self.formLayout1.insertRow(0, Order) self.groupBox1.setLayout(self.formLayout1) scroll2 = QScrollArea() scroll2.setWidget(self.groupBox1) scroll2.setWidgetResizable(True) rightArea = QVBoxLayout() threeScrolls = QHBoxLayout() threeScrolls.addWidget(scroll) threeScrolls.addWidget(scroll0) Column = QVBoxLayout() Column.addWidget(scroll3) Column.addWidget(scroll2) threeScrolls.addLayout(Column) rightArea.addLayout(threeScrolls) leftArea = QVBoxLayout() BuySell = QHBoxLayout() buyButton = QtWidgets.QPushButton("BUY") buyButton.setStyleSheet( styles.buybuttonFus.replace("text-align: left;", "")) BuySell.addWidget(buyButton) sellButton = QtWidgets.QPushButton("SELL") sellButton.setStyleSheet( styles.sellbuttonFus.replace("text-align: left;", "")) BuySell.addWidget(sellButton) settingsButton = QtWidgets.QPushButton("configuring".upper()) BuySell.addWidget(settingsButton) self.MainProduct = QComboBox() self.MainProduct.currentIndexChanged.connect( self.prdChanged, self.MainProduct.currentIndex()) self.MainProduct.addItem("No filter") for prd in data.pref_prd: self.MainProduct.addItem(prd) BuySell.addWidget(self.MainProduct) buy_shortcut = QShortcut(QtGui.QKeySequence("B"), self) buy_shortcut.activated.connect(lambda: callOrderWindow("Buy")) sell_shortcut = QShortcut(QtGui.QKeySequence("S"), self) sell_shortcut.activated.connect(lambda: callOrderWindow("Sell")) conf_shortcut = QShortcut(QtGui.QKeySequence("C"), self) conf_shortcut.activated.connect(lambda: callConfigWindow()) my_assets = QShortcut(QtGui.QKeySequence("A"), self) my_assets.activated.connect(lambda: call_my_assets()) buyButton.clicked.connect(lambda: callOrderWindow("Buy")) sellButton.clicked.connect(lambda: callOrderWindow("Sell")) settingsButton.clicked.connect(lambda: callConfigWindow()) shortcut1 = QShortcut(QtGui.QKeySequence("1"), self) shortcut1.activated.connect(lambda: change_prd_keyboard(1)) shortcut2 = QShortcut(QtGui.QKeySequence("2"), self) shortcut2.activated.connect(lambda: change_prd_keyboard(2)) shortcut3 = QShortcut(QtGui.QKeySequence("3"), self) shortcut3.activated.connect(lambda: change_prd_keyboard(3)) shortcut4 = QShortcut(QtGui.QKeySequence("4"), self) shortcut4.activated.connect(lambda: change_prd_keyboard(4)) shortcut5 = QShortcut(QtGui.QKeySequence("5"), self) shortcut5.activated.connect(lambda: change_prd_keyboard(5)) shortcut6 = QShortcut(QtGui.QKeySequence("6"), self) shortcut6.activated.connect(lambda: change_prd_keyboard(6)) shortcut7 = QShortcut(QtGui.QKeySequence("7"), self) shortcut7.activated.connect(lambda: change_prd_keyboard(7)) shortcut8 = QShortcut(QtGui.QKeySequence("8"), self) shortcut8.activated.connect(lambda: change_prd_keyboard(8)) shortcut9 = QShortcut(QtGui.QKeySequence("9"), self) shortcut9.activated.connect(lambda: change_prd_keyboard(9)) shortcut0 = QShortcut(QtGui.QKeySequence("0"), self) shortcut0.activated.connect(lambda: change_prd_keyboard(0)) shortcutR = QShortcut(QtGui.QKeySequence("F5"), self) shortcutR.activated.connect(lambda: self.F5_EVENT()) leftArea.addLayout(BuySell) graphsArea = QVBoxLayout() self.graph1 = CanvasUp() self.graph2 = CanvasLow() self.sliderUP = QSlider(Qt.Horizontal) self.sliderUP.setTickInterval(10) self.sliderUP.setSingleStep(30) self.sliderUP.valueChanged.connect(lambda: self.sliderChanged1()) self.sliderDOWN = QSlider(Qt.Horizontal) self.sliderDOWN.setTickInterval(10) self.sliderDOWN.setSingleStep(30) self.sliderDOWN.valueChanged.connect(lambda: self.sliderChanged2()) self.load = QtWidgets.QLabel() self.load1 = QtWidgets.QLabel() self.tabs = QTabWidget() self.graphUP = QWidget() self.graphUP.layout = QVBoxLayout(self.graphUP) self.graphUP.layout.addWidget(self.graph1) self.graphUP.layout.addWidget(self.sliderUP) self.tabs.setFixedHeight(data.graphResolution[0]) self.tabs.setFixedWidth(data.graphResolution[1]) self.tabs.addTab(self.graphUP, "Graph1") graphsArea.addWidget(self.tabs) self.tabs1 = QTabWidget() self.graphLOW = QWidget() self.graphLOW.layout = QVBoxLayout(self.graphLOW) self.graphLOW.layout.addWidget(self.graph2) self.graphLOW.layout.addWidget(self.sliderDOWN) self.tabs1.setFixedHeight(data.graphResolution[0]) self.tabs1.setFixedWidth(data.graphResolution[1]) self.tabs1.addTab(self.graphLOW, "Graph2") graphsArea.addWidget(self.tabs1) leftArea.addLayout(graphsArea) global bar bar = QPushButton(func.barInfo()) bar.setStyleSheet(styles.barstyle1) bar.clicked.connect(lambda: call_my_assets()) lowBar = QPushButton("NEWS: " + data.news[randrange(0, len(data.news))]) lowBar.setStyleSheet(styles.news) lowBar.setDisabled(True) Mainlayout = QVBoxLayout(self) ContentArea = QHBoxLayout() ContentArea.addLayout(leftArea) ContentArea.addLayout(rightArea) Mainlayout.addWidget(bar) Mainlayout.addLayout(ContentArea) Mainlayout.addWidget(lowBar) self.show() self.thread = MyThread() #time self.thread.timeToSleep = 0.3 self.thread.change_value.connect(lambda: setProgressVal()) self.thread.start() self.thread1 = MyThread() # add possible orders self.thread1.timeToSleep = 2.5 self.thread1.change_value.connect(lambda: self.getUpdate()) self.thread1.start() self.thread2 = MyThread() # update graphs self.thread2.timeToSleep = 4 self.thread2.change_value.connect(lambda: self.updateGraphs()) self.thread2.start() self.thread3 = MyThread() # update news self.thread3.timeToSleep = 7 self.thread3.change_value.connect(lambda: printNews()) self.thread3.start() def setProgressVal(): bar.setText(func.barInfo()) def change_prd_keyboard(i): try: if i == 0: self.MainProduct.setCurrentIndex(0) elif len(data.pref_prd) > i - 1: self.MainProduct.setCurrentIndex(i) else: self.MainProduct.setCurrentIndex(0) except: print("error in change_prd_keyboard") def callConfigWindow(): data.orderResolution[0], data.orderResolution[ 1] = self.width / 2.3, self.height / 1.7 Dialog = QtWidgets.QDialog() ui = cfg.Ui_DialogConfig() ui.setupUi(Dialog) Dialog.exec_() if data.mode == "Dark": switchDark() bar.setStyleSheet(styles.barstyle2) else: QtWidgets.QApplication.instance().setPalette( self.style().standardPalette()) switchLight() bar.setStyleSheet(styles.barstyle1) if data.clearHis == True: try: for i in reversed(range(self.formLayout1.count())): self.formLayout1.itemAt(i).widget().deleteLater() except: pass data.clearHis = False if data.addToBox[0]: self.MainProduct.clear() self.MainProduct.addItem("No filter") for prd in data.pref_prd: self.MainProduct.addItem(prd) data.addToBox = [False, []] if data.joinG[0] == True and data.joinG[1] == True: self.updateGraphs() self.graph1.upd() self.graph2.upd() if self.MainProduct.currentText() == "No filter": self.graph1.clear() self.graph1.no_data() self.graph2.clear() self.graph2.no_data() if data.joinG[0] == True and data.joinG[1] == True: data.zoom1 = data.zoom tm = time.time() step = 3600 tm_ = tm - 60 * 60 * 24 inp = [[x, x + step] for x in range(int(tm_), int(tm), int(step))] prd = self.MainProduct.currentText() data.bx = client.box_graph(prd, inp) #data.bx1 = client.box_graph(prd, inp) data.bx_lab = inp #print("Box", inp) data.box_reload = 0 def call_my_assets(): data.orderResolution[0], data.orderResolution[ 1] = self.width / data.scale_[0], self.height / data.scale_[1] Dialog = QtWidgets.QDialog() ui = assets.Ui_DialogAssets() ui.setupUi(Dialog) Dialog.exec_() def callOrderWindow(type): data.orderWinIsON = True data.orderResolution[0], data.orderResolution[ 1] = self.width / data.scale_[2], self.height / data.scale_[3] data.orderType = str(type) if self.MainProduct.currentText() != "No filter": try: amtN = 0 # для средневзвешенного wcc = 0 # computing autocomplete prices if str(type) == "Buy": for i in reversed(range(self.formLayout0.count())): try: #print("=>",func.getPrice(self.formLayout0.itemAt(i).widget().text())) amtN += float( func.getAmt( self.formLayout0.itemAt( i).widget().text())) wcc += float( func.getAmt( self.formLayout0.itemAt( i).widget().text())) * float( func.getPrice( self.formLayout0.itemAt( i).widget().text())) except: pass data.acPrice = func.getPrice( self.formLayout0.itemAt(0).widget().text()) #print("wcc1",wcc, amtN) data.acPriceFOK = (wcc / (amtN)) else: for i in reversed(range(self.formLayout.count())): try: amtN += float( func.getAmt( self.formLayout.itemAt( i).widget().text())) wcc += float( func.getAmt( self.formLayout.itemAt( i).widget().text())) * float( func.getPrice( self.formLayout.itemAt( i).widget().text())) except: pass #print("wcc2", wcc, amtN) data.acPrice = func.getPrice( self.formLayout.itemAt(self.formLayout.count() - 1).widget().text()) data.acPriceFOK = wcc / (amtN) except: pass data.autocomplete = self.MainProduct.currentText() Dialog = QtWidgets.QDialog() ui = ord.Ui_DialogOrder() ui.setupUi(Dialog) Dialog.exec_() if data.addToHis[0]: ### ALSO CHECKS FOR SUCCESS sign = func.Order(data.addToHis[1][0], data.addToHis[1][1], data.addToHis[1][2], data.addToHis[1][3], data.addToHis[1][4]) newOrder = QtWidgets.QPushButton() newOrder.setStyleSheet(styles.buybutton) if data.addToHis[1][0].lower() == "sell": newOrder.setStyleSheet(styles.sellbutton) newOrder.setDisabled(True) newOrder.setText(sign) self.formLayout1.insertRow(0, newOrder) bar.setText(func.barInfo()) #CHEANGE BALANCE #RELOADING AVALIABLE ORDERS self.reloadData() elif data.addToOrd[0]: self.reloadData() if len(data.system_ord) != 0: self.reloadSystemOrders("") data.addToHis = (False, []) data.addToOrd = (False, "Buy", "") data.acPrice = "" bal = client.get_balance(data.username) data.balance = (bal, "$") func.putPersonalData() bar.setText(func.barInfo()) data.orderWinIsON = False def printNews(): i = randrange(0, len(data.news)) lowBar.setText("NEWS: " + data.news[i])
import client import indicators from datetime import datetime, timedelta import pandas as pd import matplotlib.pyplot as plt # retrieve history symbol = "AC" df = client.get_history(symbol, days=800) df # %% df['date'] = pd.to_datetime(df['date']) df.set_index('date', inplace=True) date_ago = (datetime.now() - timedelta(days=365)).strftime('%Y-%m-%d') # %% dd = indicators.ema(df, "close", "ema_close", n=200) dd = dd[date_ago:] fw_low = dd[date_ago:]['close'].min() fw_high = dd[date_ago:]['close'].max() # normalize dd # %% dd[['close','ema_close']].plot() plt.show()