Example #1
0
    def __init__(self):
        atexit.register(self.__handleExit)
        self.indexStockId = 0
        self.indexStockName = 1
        self.indexSellPrice = 6
        self.indexBuyPrice = 7
        self.indexMinPrice = 8
        self.indexMaxPrice = 9
        self.indexStats = 11
        self.sqliteData = SqliteDataEtoro('stocks.db')
        self.log = Log('stock_research.log')
        driverObj = Driver(
            "/home/scitickart/.mozilla/firefox/w05kja2g.default",
            "Mozilla/5.0 (X11; Linux i686; rv:88.0) Gecko/20100101 Firefox/88.0"
        )
        self.driver = driverObj.getDriver()
        self.seleniumWrapper = SeleniumWrapper(self.driver)
        self.markets = Markets(self.driver)
        self.stock = Stock(self.driver)

        allStocks = self.markets.getAllMarketsInfo()
        self.insertDataIntoAllStocks(allStocks)
        print("getVolatileStocks")
        self.getVolatileStocks()
        print("getDipStocksWithLowPE")
        self.getDipStocksWithLowPE()
        print("getStocksWithDividends")
        self.getStocksWithDividends()
Example #2
0
 def __init__(self):
     atexit.register(self.handleExit)
     self.log = Log('eToroLog.log')
     driverObj = Driver(
         "/home/scitickart/.mozilla/firefox/w05kja2g.default")
     self.driver = driverObj.getDriver()
     self.seleniumWrapper = SeleniumWrapper(self.driver)
     self.loadEToro()
     self.monitorStocks()
 def __init__(self):
     atexit.register(self.__handleExit)
     self.stocksDataBase = SqliteDataEtoro('stocks.db')
     self.stocksData = self.stocksDataBase.readData('all_stocks')
     self.stockIdIndex = 0
     self.log = Log('stock_research.log')
     driverObj = Driver(
         "/home/scitickart/.mozilla/firefox/w05kja2g.default")
     self.driver = driverObj.getDriver()
     self.seleniumWrapper = SeleniumWrapper(self.driver)
Example #4
0
    def __init__(self, driver):
        self.seleniumWrapper = SeleniumWrapper(driver)
        self.stockMarkets = {
            'Amsterdam exchange':
            'https://www.etoro.com/discover/markets/stocks/exchange/amsterdam',
            'Brussles exchange':
            'https://www.etoro.com/discover/markets/stocks/exchange/brussels',
            'Copenhagen exchange':
            'https://www.etoro.com/discover/markets/stocks/exchange/copenhagen',
            'Frankfurt exchage':
            'https://www.etoro.com/discover/markets/stocks/exchange/frankfurt',
            'Helsinki exchage':
            'https://www.etoro.com/discover/markets/stocks/exchange/helsinki',
            'Hongkong exchange':
            'https://www.etoro.com/discover/markets/stocks/exchange/hongkong',
            'Lisabon exchange':
            'https://www.etoro.com/discover/markets/stocks/exchange/lisbon',
            'London exchange':
            'https://www.etoro.com/discover/markets/stocks/exchange/london',
            'Madrid exchage':
            'https://www.etoro.com/discover/markets/stocks/exchange/bolsademadrid',
            'Milano exchage':
            'https://www.etoro.com/discover/markets/stocks/exchange/borsaitaliana',
            'NASDAQ':
            'https://www.etoro.com/discover/markets/stocks/exchange/nasdaq',
            'NYSE':
            'https://www.etoro.com/discover/markets/stocks/exchange/nyse',
            'Oslo exchage':
            'https://www.etoro.com/discover/markets/stocks/exchange/oslo',
            'Paris exchage':
            'https://www.etoro.com/discover/markets/stocks/exchange/paris',
            'Saudi arabia exchange':
            'https://www.etoro.com/discover/markets/stocks/exchange/tadawul',
            'Stockholm exchage':
            'https://www.etoro.com/discover/markets/stocks/exchange/stockholm',
            'Zurich exchange':
            'https://www.etoro.com/discover/markets/stocks/exchange/zurich'
        }
        self.etfMarkets = {'ETF': 'https://www.etoro.com/discover/markets/etf'}

        self.driver = driver
Example #5
0
class EToroBot:
    def __init__(self):
        atexit.register(self.handleExit)
        self.log = Log('eToroLog.log')
        driverObj = Driver(
            "/home/scitickart/.mozilla/firefox/w05kja2g.default")
        self.driver = driverObj.getDriver()
        self.seleniumWrapper = SeleniumWrapper(self.driver)
        self.loadEToro()
        self.monitorStocks()

    def handleExit(self):
        self.seleniumWrapper.close()

    def loadEToro(self):
        #self.seleniumWrapper.getRequestWaitUntilLocatedElementByXpath (
        #    'https://www.etoro.com/watchlists/4e42a954-1ce2-4938-87b3-4c9adad0608b',
        #    '/html/body/ui-layout/div/div/div[2]/et-watchlist/div[2]/div/et-watchlist-list/section/section[1]')
        self.seleniumWrapper.getRequest(
            'https://www.etoro.com/watchlists/4e42a954-1ce2-4938-87b3-4c9adad0608b'
        )

    def loadStockPage(self, stockIndex):
        #self.seleniumWrapper.getRequestWaitUntilLocatedElementByCssSelector (
        #            'https://www.etoro.com/markets/' + stockIndex + '/chart',
        #            '.i-stock-chart-info')
        self.seleniumWrapper.getRequest('https://www.etoro.com/markets/' +
                                        stockIndex + '/chart')

    def buyStock(self, price, stockIndex):
        self.loadStockPage(stockIndex)

        self.seleniumWrapper.clickElementByCssSelector(
            '.head-instrument-action > trade-button:nth-child(2)', 5)
        self.log.write("Trade button clicked...")

        self.seleniumWrapper.setTextFieldByCSSSelector('.stepper-value', price)
        self.log.write("Price set...")
        time.sleep(4)

        for i in range(5):
            try:
                self.seleniumWrapper.clickElementByCssSelector(
                    '.execution-button', 5)
                self.log.write('Clicking on Open Trade button')
            except:
                pass

        self.loadEToro()

    def sellStock(self, stockIndex):
        self.loadStockPage(stockIndex)

        self.seleniumWrapper.clickElementByCssSelector('.i-stock-chart-info',
                                                       5)
        self.log.write("stock button clicked...")

        self.seleniumWrapper.clickElementByCssSelector(
            'div.e-btn:nth-child(2) > span:nth-child(1)', 5)
        self.log.write('x button clicked')

        self.seleniumWrapper.clickElementByCssSelector(".w-sm-footer-button",
                                                       5)
        self.log.write('Close Trade button clicked')

        self.loadEToro()

    def setSellPrice(self, stockId, price):
        self.log.write('Setting a sell price for ' + stockId)
        #self.seleniumWrapper.getRequestWaitUntilLocatedElementByCssSelector (
        #                'https://www.etoro.com/portfolio/' + stockId,
        #                'div.ui-table-row:nth-child(3) > ui-table-body-slot:nth-child(2) > ui-table-cell:nth-child(6) > span:nth-child(1)')
        self.seleniumWrapper.getRequest('https://www.etoro.com/portfolio/' +
                                        stockId)

        self.log.write('Trying to click on update price button...')
        #click button to update the price
        self.seleniumWrapper.clickElementByCssSelector(
            'div.ui-table-row:nth-child(3) > ui-table-body-slot:nth-child(2) > ui-table-cell:nth-child(6) > span:nth-child(1)',
            7)

        linkString = self.seleniumWrapper.getTextByCSSSelector('.link')
        if (linkString == "Set TP"):
            self.log.write('Trying to click \'set price\' link ')
            #click on 'set price' link (it possible to can't find it, because it doesn't exist sometimes)
            self.seleniumWrapper.clickElementByCssSelector('.link', 4)

        self.log.write('Trying to setting the price')
        #set the sell price
        self.seleniumWrapper.setTextFieldByCSSSelector('.stepper-value', price)

        for i in range(5):
            try:
                self.seleniumWrapper.clickElementByCssSelector(
                    '.button-blue', 5)
                self.log.write('Clicking on Update button (set price widget)')
            except:
                pass

        self.loadEToro()

    def getAvailableCash(self):
        cash = 0
        try:
            cash = self.seleniumWrapper.getTextByCSSSelector(
                'div.footer-unit:nth-child(1) > span:nth-child(1)')
            cash = cash.replace('$', '')
        except:
            self.log.write("Can't get available cash!")
        return float(cash)

    def monitorStocks(self):
        self.config = Config()
        iteration = 0
        while True:
            cash = self.getAvailableCash()
            self.log.write("Cash: " + str(cash))

            if (cash < 0.99):
                time.sleep(5)
                continue

            self.config.readConfig()
            configData = self.config.configData

            stocksInfo = self.driver.find_element_by_xpath(
                '/html/body/ui-layout/div/div/div[2]/et-watchlist/div[2]/div/et-watchlist-list/section/section[1]'
            )

            listResult = stocksInfo.text.split('\n')
            lPart = []
            lResult = []
            index = 0
            for i in range(0, len(listResult)):
                if (listResult[i] == 'BUYING' or listResult[i] == 'SELLING'):
                    index += 1
                    lPart.append(listResult[i])
                    if (len(lPart) == 9):
                        lPart.insert(1, ' ')
                    for j in range(len(configData)):
                        if (lPart[0] == configData[j][0]):
                            lPart.append(str(index))
                            lResult.append(lPart)
                            break
                    lPart = []
                else:
                    lPart.append(listResult[i])

            print(lResult)

            for i in range(len(lResult)):
                sellPrice = float(lResult[i][5])
                buyPrice = float(lResult[i][7])
                stockCode = lResult[i][0]
                for j in range(len(configData)):
                    if (configData[j][0] == stockCode):
                        if (configData[j][1] == 'sell'):
                            self.log.write("Stock: " + stockCode +
                                           "\t\t sell price: " +
                                           str(sellPrice) + "/" +
                                           str(configData[j][2]) +
                                           "\t\t buy price: " + str(buyPrice))
                            if (sellPrice >= float(configData[j][2])):
                                self.log.write("Selling " + configData[j][0] +
                                               "==============")
                                configData.pop(j)
                                self.sellStock(stockCode)
                                break
                        elif (configData[j][1] == 'buy'):
                            self.log.write("Stock: " + stockCode +
                                           "\t\t sell price: " +
                                           str(sellPrice) +
                                           "\t\t buy price: " + str(buyPrice) +
                                           "/" + configData[j][2])
                            if (buyPrice <= float(configData[j][2])):
                                self.log.write("Buying " + configData[j][0] +
                                               "================")

                                self.buyStock(configData[j][3], stockCode)
                                self.setSellPrice(stockCode, configData[j][4])
                                configData.pop(j)
                                break
                        else:
                            pass
                        continue
            self.log.write("==============")
            time.sleep(1)
Example #6
0
 def __init__(self, driver):
     self.log = Log('Stocks.log')
     self.driver = driver
     self.seleniumWrapper = SeleniumWrapper(self.driver)
Example #7
0
class Stock:
    def __init__(self, driver):
        self.log = Log('Stocks.log')
        self.driver = driver
        self.seleniumWrapper = SeleniumWrapper(self.driver)

    def dividendPercentage(self, dividendString):
        fromIndex = dividendString.find('(')
        fromIndex += 1
        toIndex = dividendString.find('%')
        percentageString = ""
        for i in range(fromIndex, toIndex, 1):
            percentageString += dividendString[i]

        return percentageString

    def __makeDictionaryByStockStatsRaw(self, stockStatsRaw):
        stockStatsSplited = stockStatsRaw.split('\n')
        stockStatsSplited = list(filter(None, stockStatsSplited))
        print(stockStatsSplited)
        data = {
            'Prev Close': '',
            'Day\'s Range': '',
            '52 Week Range': '',
            'Average Volume (3m)': '',
            '1-Year Return': '',
            'Beta': '',
            'Market Cap': '',
            'P/E Ratio': '',
            'Revenue': '',
            'EPS': '',
            'Dividend (Yield)': ''
        }
        index = 0
        while (index < len(stockStatsSplited)):
            value = ""
            try:
                value = data[stockStatsSplited[index]]
            except:
                index += 1
                continue
            key = stockStatsSplited[index]
            index += 1
            try:
                value = data[stockStatsSplited[index]]
            except:
                data[key] = stockStatsSplited[index]
                index += 1

        data['Dividend (Yield)'] = self.dividendPercentage(
            data['Dividend (Yield)'])

        return data

    #return a dictionay: stat -> value
    def getStockStats(self, stockId):
        url = 'https://www.etoro.com/markets/'
        url += stockId
        url += '/stats'
        print("Trying to download " + url)
        #self.seleniumWrapper.getRequestWaitUntilLocatedElementByXpath(
        #                url,
        #                '/html/body/ui-layout/div/div/div[2]/et-market/div/div/div/div[3]/et-market-stats/et-market-stats-overview/et-card/section/et-card-content/div[1]')
        self.seleniumWrapper.getRequest(url)
        stockStatsRaw = ""
        try:
            #ToDo: change to get text by class name or id
            stockStatsRaw = self.seleniumWrapper.getTextByXpath(
                '/html/body/ui-layout/div/div/div[2]/et-market/div/div/div/div[3]/et-market-stats/et-market-stats-overview/et-card/section/et-card-content/div[1]'
            )
        except:
            self.log.write("Can get stats of " + url)
        return self.__makeDictionaryByStockStatsRaw(stockStatsRaw)

    def getStockPriceHistory(self, stockId):
        print("getStockPriceHistory")
        #self.seleniumWrapper.getRequestWaitUntilLocatedElementByCssSelector (
        #                    'https://www.google.bg/search?q=' + stockId + '+stock',
        #                    '.uch-psvg')
        self.seleniumWrapper.getRequest('https://www.google.bg/search?q=' +
                                        stockId + '+stock')
        self.seleniumWrapper.clickElementByCssSelector(
            'div.dQlDUb:nth-child(8) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)',
            4)

        text = self.seleniumWrapper.getTextByCSSSelector('.uch-psvg')
        print(text)

        data = []
        #data[
        #[stockPrice, date]
        #]
        return data

    def getStockResearchData(self, stockId):
        print("getStockResearchData")
        #self.seleniumWrapper.getRequestWaitUntilLocatedElementByCssSelector (
        #                    "https://www.etoro.com/markets/" + stockId + "/research",
        #                    '.ew-content')
        self.seleniumWrapper.getRequest("https://www.etoro.com/markets/" +
                                        stockId + "/research")
        ##apt-graph-box > div:nth-child(2)
        #"//form[input/@name ='search']"
        #"//*[div/@class='search']"
        lowEstimate = self.seleniumWrapper.getTextByCSSSelector('.ew-content')
        #middleEstimate = self.seleniumWrapper.getTextByClassName('fb-price mb5')
        #highEstimate = self.seleniumWrapper.getTextByClassName('fb-price mb5 green')
        print(lowEstimate)
        data = []
        #data.append(lowEstimate)
        #data.append(middleEstimate)
        #data.append(highEstimate)
        print(data)
        return data

    def getStockDescription(self, stockId):
        print("getStockDescription")
        #self.seleniumWrapper.getRequestWaitUntilLocatedElementByCssSelector (
        #                        "https://www.etoro.com/markets/" + stockId,
        #                        'et-showhide.ng-star-inserted:nth-child(2) > span:nth-child(1) > span:nth-child(3)')
        self.seleniumWrapper.getRequest("https://www.etoro.com/markets/" +
                                        stockId)
        self.seleniumWrapper.clickElementByCssSelector(
            'et-showhide.ng-star-inserted:nth-child(2) > span:nth-child(1) > span:nth-child(3)',
            4)
        description = self.seleniumWrapper.getTextByCSSSelector(
            'et-showhide.ng-star-inserted:nth-child(2) > span:nth-child(1) > span:nth-child(1)'
        )
        print(description)
        print("=============")
        exchange = self.seleniumWrapper.getTextByCSSSelector(
            'a.widget-tag:nth-child(1)')
        print(exchange)
        data = []
        data.append(exchange)
        data.append(description)
        return data
class YahooFinanceWebScraper:
    def __init__(self):
        atexit.register(self.__handleExit)
        self.stocksDataBase = SqliteDataEtoro('stocks.db')
        self.stocksData = self.stocksDataBase.readData('all_stocks')
        self.stockIdIndex = 0
        self.log = Log('stock_research.log')
        driverObj = Driver(
            "/home/scitickart/.mozilla/firefox/w05kja2g.default")
        self.driver = driverObj.getDriver()
        self.seleniumWrapper = SeleniumWrapper(self.driver)

    def __handleExit(self):
        self.seleniumWrapper.close()

    def __downloadStockData(self, stockId):
        print("Trying to download stats for stock id: " + stockId)
        return self.__downloadData(
            "https://finance.yahoo.com/quote/" + stockId + "?p=" + stockId,
            '#quote-summary')

    #scrapping stock stats, stock description
    def scrappingData(self):
        for i in range(len(self.stocksData)):
            stockData = self.__downloadStockData(
                self.stocksData[i][self.stockIdIndex])
            self.__recordStatsData(self.stocksData[i][self.stockIdIndex],
                                   stockData)
            descriptionData = self.__downloadDescriptionData(
                self.stocksData[i][self.stockIdIndex])
            self.__recordDescriptionData(self.stocksData[i][self.stockIdIndex],
                                         descriptionData)

    def scrappingStockData(self):
        for i in range(len(self.stocksData)):
            stockData = self.__downloadStockData(
                self.stocksData[i][self.stockIdIndex])
            self.__recordStatsData(self.stocksData[i][self.stockIdIndex],
                                   stockData)

    def __generateStockDataDictionary(self, parsedData):
        dict = {
            'Previous Close': '',
            'Open': '',
            'Bid': '',
            'Ask': '',
            'Day\'s Range': '',
            '52 Week Range': '',
            'Avg. Volume': '',
            'Volume': '',
            'Market Cap': '',
            'Beta (5Y Monthly)': '',
            'PE Ratio (TTM)': '',
            'EPS (TTM)': '',
            'Earnings Date': '',
            'Forward Dividend & Yield': '',
            'Ex-Dividend Date': '',
            '1y Target Est': ''
        }

        splited = parsedData.split('\n')
        splited = list(filter(None, splited))

        for i in range(len(splited)):
            for key, item in dict.items():
                result = splited[i].split(key + ' ')
                if (len(result) > 1):
                    dict[key] = result[1]
                    break
        print(dict)
        return dict

    def __recordStatsData(self, stockId, parsedData):
        dict = self.__generateStockDataDictionary(parsedData)
        self.stocksDataBase.insertDataIntoStockStats(
            stockId, dict['Previous Close'], dict['Market Cap'],
            dict['Day\'s Range'], dict['52 Week Range'], dict['Avg. Volume'],
            '', dict['Beta (5Y Monthly)'], dict['PE Ratio (TTM)'], '',
            dict['EPS (TTM)'], dict['Forward Dividend & Yield'],
            dict['Ex-Dividend Date'])

    def __downloadData(self, url, cssSelector):
        data = ""
        try:
            self.seleniumWrapper.getRequest(url)
            data = self.seleniumWrapper.getTextByCSSSelector(cssSelector)
        except:
            pass

        return data

    def __downloadDescriptionData(self, stockId):
        print("Trying to download a description for stock id: " + stockId)
        return self.__downloadData(
            "https://finance.yahoo.com/quote/" + stockId + "/profile?p=" +
            stockId, 'p.Mt\(15px\)')

    def scrappingDescriptionData(self):
        for i in range(len(self.stocksData)):
            descriptionData = self.__downloadDescriptionData(
                self.stocksData[i][self.stockIdIndex])
            self.__recordDescriptionData(self.stocksData[i][self.stockIdIndex],
                                         descriptionData)

    def __recordDescriptionData(self, stockId, description):
        print("Description: " + description)
        self.stocksDataBase.insertDataIntoStockDescription(
            stockId, "", description)
Example #9
0
class StockResearch:
    def __init__(self):
        atexit.register(self.__handleExit)
        self.indexStockId = 0
        self.indexStockName = 1
        self.indexSellPrice = 6
        self.indexBuyPrice = 7
        self.indexMinPrice = 8
        self.indexMaxPrice = 9
        self.indexStats = 11
        self.sqliteData = SqliteDataEtoro('stocks.db')
        self.log = Log('stock_research.log')
        driverObj = Driver(
            "/home/scitickart/.mozilla/firefox/w05kja2g.default",
            "Mozilla/5.0 (X11; Linux i686; rv:88.0) Gecko/20100101 Firefox/88.0"
        )
        self.driver = driverObj.getDriver()
        self.seleniumWrapper = SeleniumWrapper(self.driver)
        self.markets = Markets(self.driver)
        self.stock = Stock(self.driver)

        allStocks = self.markets.getAllMarketsInfo()
        self.insertDataIntoAllStocks(allStocks)
        print("getVolatileStocks")
        self.getVolatileStocks()
        print("getDipStocksWithLowPE")
        self.getDipStocksWithLowPE()
        print("getStocksWithDividends")
        self.getStocksWithDividends()

    def __handleExit(self):
        self.seleniumWrapper.close()

    def insertDataIntoAllStocks(self, allStocksData):
        for i in range(len(allStocksData)):
            self.sqliteData.insertDataIntoAllStocks(
                allStocksData[i][self.indexStockId],
                allStocksData[i][self.indexStockName],
                allStocksData[i][self.indexSellPrice],
                allStocksData[i][self.indexBuyPrice],
                allStocksData[i][self.indexMinPrice],
                allStocksData[i][self.indexMaxPrice])

    def calculateDayRangePercentage(self, minDayPrice, maxDayPrice):
        return ((maxDayPrice - minDayPrice) / maxDayPrice) * 100

    def calculatePercentage(self, buyPrice, minPrice, maxPrice):
        tolMaxMin = maxPrice - minPrice
        percentage = ((buyPrice - minPrice) / tolMaxMin) * 100
        print("percentage: " + str(percentage))
        return percentage

    #get dip stocks with low p/e ratio
    def isStockWithDipPrice(self, buyPrice, minPrice, maxPrice):
        percentage = self.calculatePercentage(buyPrice, minPrice, maxPrice)
        if (percentage < 15):
            return 1
        return 0

    def isStockWithLowPE(self, peRatio):
        if (peRatio == '' or peRatio
                == 'N/A'):  #it ignores stocks with missing P/E ratio
            return 0
        peRatio = float(peRatio)
        if (peRatio < 26):
            return 1
        return 0

    def getDipStocksWithLowPE(self):
        filename = 'dipStocksWithLowPE.txt'
        stockStats = self.sqliteData.readData('stock_stats')
        allStocks = self.sqliteData.readData('all_stocks')
        self.cleanFile(filename)
        f = open(filename)
        for i in range(len(allStocks)):
            if (self.isStockWithDipPrice(float(allStocks[i][3]),
                                         float(allStocks[i][4]),
                                         float(allStocks[i][5]))):
                for j in range(len(stockStats)):
                    if (allStocks[i][0] == stockStats[j][0]):
                        if (self.isStockWithLowPE(stockStats[j][8])):
                            self.exportStockPlusStats(allStocks[i],
                                                      stockStats[j], filename)
        f.close()

    def exportStock(self, stock, fileDescriptor):
        fileDescriptor.write("=============\n")
        fileDescriptor.write("Stock id: " + stock[0] + "\n")
        fileDescriptor.write("Stock name: " + stock[1] + "\n")
        fileDescriptor.write("Sell price: " + stock[2] + "\n")
        fileDescriptor.write("Buy price: " + stock[3] + "\n")
        fileDescriptor.write("Min prie: " + stock[4] + "\n")
        fileDescriptor.write("Max price: " + stock[5] + "\n")

    def exportStats(self, stats, fileDescriptor):
        fileDescriptor.write("Stock ID: " + stats[0] + "\n")
        fileDescriptor.write("Previous close: " + stats[1] + "\n")
        fileDescriptor.write("Market cap: " + stats[2] + "\n")
        fileDescriptor.write("Days range: " + stats[3] + "\n")
        fileDescriptor.write("52 week range: " + stats[4] + "\n")
        fileDescriptor.write("Average volume: " + stats[5] + "\n")
        fileDescriptor.write("1 year return: " + stats[6] + "\n")
        fileDescriptor.write("Beta: " + stats[7] + "\n")
        fileDescriptor.write("P/E ratio: " + stats[8] + "\n")
        fileDescriptor.write("Revenue: " + stats[9] + "\n")
        fileDescriptor.write("EPS: " + stats[10] + "\n")
        fileDescriptor.write("Dividend: " + stats[11] + "\n")

    def exportStockPlusStats(self, stocks, stats, filename):
        f = open(filename, 'a')
        self.exportStock(stocks, f)
        self.exportStats(stats, f)
        f.close()

    def getVolatileStocks(self):
        volatileStocks = 'volatileStocks.txt'
        stats = self.sqliteData.readData('stock_stats')
        allStocks = self.sqliteData.readData('all_stocks')
        self.cleanFile(volatileStocks)
        for i in range(len(allStocks)):
            for j in range(len(stats)):
                if (allStocks[i][0] == stats[j][0]):
                    dayRange = stats[j][3]
                    dayRange = dayRange.replace(' ', '')
                    minMax = dayRange.split('-')
                    if (len(minMax) != 2):
                        continue
                    if (minMax[0] == 'N/A' or minMax[1] == 'N/A'):
                        continue
                    minMax[0] = minMax[0].replace(',', '')
                    minMax[1] = minMax[1].replace(',', '')
                    minDayPrice = float(minMax[0])
                    maxDayPrice = float(minMax[1])
                    dayRangePercentage = self.calculateDayRangePercentage(
                        minDayPrice, maxDayPrice)
                    self.log.write("Min: " + str(minDayPrice) + ", Max: " +
                                   str(maxDayPrice) + ", Range: " +
                                   str(dayRangePercentage))
                    if (dayRangePercentage >= 5):
                        self.exportStockPlusStats(allStocks[i], stats[j],
                                                  volatileStocks)
                    break

    def cleanFile(self, filename):
        f = open(filename, 'w')
        f.close()

    def getStocksWithDividends(self):
        dividendsFile = 'dividendStocks.txt'
        self.cleanFile(dividendsFile)
        stats = self.sqliteData.readData('stock_stats')
        allStocks = self.sqliteData.readData('all_stocks')
        for i in range(len(allStocks)):
            for j in range(len(stats)):
                if (allStocks[i][0] == stats[j][0]):
                    if (stats[j][11] != '0' and stats[j][11] != ''
                            and stats[j][11] != 'N/A (N/A)'):
                        print("Export sDividend: " + stats[j][11])
                        self.exportStockPlusStats(allStocks[i], stats[j],
                                                  dividendsFile)
Example #10
0
class Markets:
    def __init__(self, driver):
        self.seleniumWrapper = SeleniumWrapper(driver)
        self.stockMarkets = {
            'Amsterdam exchange':
            'https://www.etoro.com/discover/markets/stocks/exchange/amsterdam',
            'Brussles exchange':
            'https://www.etoro.com/discover/markets/stocks/exchange/brussels',
            'Copenhagen exchange':
            'https://www.etoro.com/discover/markets/stocks/exchange/copenhagen',
            'Frankfurt exchage':
            'https://www.etoro.com/discover/markets/stocks/exchange/frankfurt',
            'Helsinki exchage':
            'https://www.etoro.com/discover/markets/stocks/exchange/helsinki',
            'Hongkong exchange':
            'https://www.etoro.com/discover/markets/stocks/exchange/hongkong',
            'Lisabon exchange':
            'https://www.etoro.com/discover/markets/stocks/exchange/lisbon',
            'London exchange':
            'https://www.etoro.com/discover/markets/stocks/exchange/london',
            'Madrid exchage':
            'https://www.etoro.com/discover/markets/stocks/exchange/bolsademadrid',
            'Milano exchage':
            'https://www.etoro.com/discover/markets/stocks/exchange/borsaitaliana',
            'NASDAQ':
            'https://www.etoro.com/discover/markets/stocks/exchange/nasdaq',
            'NYSE':
            'https://www.etoro.com/discover/markets/stocks/exchange/nyse',
            'Oslo exchage':
            'https://www.etoro.com/discover/markets/stocks/exchange/oslo',
            'Paris exchage':
            'https://www.etoro.com/discover/markets/stocks/exchange/paris',
            'Saudi arabia exchange':
            'https://www.etoro.com/discover/markets/stocks/exchange/tadawul',
            'Stockholm exchage':
            'https://www.etoro.com/discover/markets/stocks/exchange/stockholm',
            'Zurich exchange':
            'https://www.etoro.com/discover/markets/stocks/exchange/zurich'
        }
        self.etfMarkets = {'ETF': 'https://www.etoro.com/discover/markets/etf'}

        self.driver = driver

    def getETFMarkets(self):
        return self.etfMarkets

    def getStockMarkets(self):
        return self.stockMarkets

    def getMarketInfo(self, marketName, dictMarkets):
        print("Tyring to load: " + marketName + ": " + dictMarkets[marketName])

        #self.seleniumWrapper.getRequestWaitUntilLocatedElementByCssSelector (
        #            dictMarkets[marketName],
        #            '.market-list')
        self.seleniumWrapper.getRequest(dictMarkets[marketName])
        stocks = []
        while (True):
            #.market-list
            stocksInfo = self.seleniumWrapper.getTextByCSSSelector(
                '.market-list')
            #stocksInfo = self.driver.find_element_by_xpath("/html/body/ui-layout/div/div/div[2]/et-discovery-markets-results/div/div")
            parser = Parser()
            currentStocks = parser.parseStocksInfo(stocksInfo, marketName)
            for i in range(len(currentStocks)):
                stocks.append(currentStocks[i])
            try:
                currentStockCount = self.seleniumWrapper.getTextByXpath(
                    '/html/body/ui-layout/div/div/div[2]/et-discovery-markets-results/div/et-discovery-markets-results-header/div/div[2]/div/div[1]/span[2]/span[1]'
                )
                maxStockCount = self.seleniumWrapper.getTextByXpath(
                    '/html/body/ui-layout/div/div/div[2]/et-discovery-markets-results/div/et-discovery-markets-results-header/div/div[2]/div/div[1]/span[2]/span[3]'
                )
                #check if it is the last page
                splited = currentStockCount.split('-')
                if (splited[1] == maxStockCount):
                    print("It is the last page.")
                    break
            except:
                print("End text")
                break

            try:
                #click on the next page button
                element = self.driver.find_element_by_css_selector(
                    '.nav-button-right')
            except:
                print("End")
                break

            self.seleniumWrapper.clickElementByCssSelector(
                '.nav-button-right', 4)

        return stocks

    def getAllMarketsInfo(self):
        stocks = []
        for key, vlaue in self.stockMarkets.items():
            currentStocks = self.getMarketInfo(key, self.stockMarkets)
            for j in range(len(currentStocks)):
                stocks.append(currentStocks[j])
        return stocks

    def getAllEtfsInfo(self):
        etfs = []
        for key, vlaue in self.etfMarkets.items():
            currentEtfs = self.getMarketInfo(key, self.etfMarkets)
            for j in range(len(currentEtfs)):
                etfs.append(currentEtfs[j])
        return etfs