Created
May 22, 2020 15:12
-
-
Save princefr/5e59d253132f60b2d98d445b410db148 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from Binance import Binance_Wrapper | |
from flask import Flask, request | |
import os | |
import json | |
from selenium import webdriver | |
from selenium.webdriver.common.by import By | |
from selenium.webdriver.support.ui import WebDriverWait | |
from selenium.webdriver.support import expected_conditions as EC | |
from selenium.common.exceptions import TimeoutException | |
from selenium.webdriver.support import expected_conditions | |
from selenium.webdriver.common.keys import Keys | |
from selenium.webdriver.common.action_chains import ActionChains | |
import time | |
from pymouse import PyMouse | |
import pandas as pd | |
from bs4 import BeautifulSoup | |
from datetime import datetime, timedelta | |
class TimeHelper(): | |
def __init__(self): | |
print("yes") | |
def timeStrToTimestamp(self, s, fmt="%Y-%m-%d %H:%M"): | |
return time.mktime(datetime.strptime(s, fmt).timetuple()) | |
def timeStringToDatetime(self, s, fmt="%Y-%m-%d %H:%M"): | |
return datetime.datetime.strptime(s, fmt) | |
# t1 > t2 -> 1 | |
# t1 == t2 -> 0 | |
# t1 < t2 -> -1 | |
def compareTimes(self, t1, t2): | |
ts1 = self.timeStrToTimestamp(t1) | |
ts2 = self.timeStrToTimestamp(t2) | |
if ts1 > ts2: | |
return 1 | |
elif ts1 == ts2: | |
return 0 | |
else: | |
return -1 | |
# ascending sort | |
# index of date value in two dimensional array | |
def sortArrayByDateEx(self, dates, index=0, fmt="%Y-%m-%d %H:%M"): | |
dates.sort(key=lambda d:datetime.strptime(d[index], fmt)) | |
return dates | |
def checkIfBottomOfViewReached(driver, element): | |
return driver.execute_script("if (arguments[0].scrollHeight == arguments[0].offsetHeight + arguments[0].scrollTop) { return true; } else { return false; }", element) | |
def scrollToElement(driver, element): | |
driver.execute_script("arguments[0].scrollIntoView(true);", element) | |
def check_if_bottom_reached(): | |
print("") | |
m = PyMouse() | |
app = Flask(__name__) | |
binance_wrapper = Binance_Wrapper(api_key="", secret_key="") | |
timeout = 15 | |
def scroll_down_element(browser, element, times): | |
try: | |
action = ActionChains(browser) | |
action.move_to_element(element).perform() | |
element.click() | |
for _ in range(times): | |
element.send_keys(Keys.SPACE) | |
#sleep(0.1) | |
except Exception as e: | |
print('error scrolling down web element', e) | |
def wait_element(browser, xpath, sec =5): | |
wait = WebDriverWait(browser, sec) | |
wait.until(expected_conditions.presence_of_element_located((By.XPATH, xpath))) | |
driverweb = webdriver.Safari() | |
driverweb.maximize_window() | |
driverweb.get("https://www.tradingview.com/#signin") | |
driverweb.implicitly_wait(5) | |
wait_element(driverweb, '//BUTTON[@class="tv-button tv-button--no-border-radius tv-button--size_large tv-button--primary_ghost tv-button--loader"]') | |
driverweb.find_element_by_name("username").send_keys("email@gmail.com") | |
driverweb.find_element_by_name("password").send_keys("motdepasse") | |
driverweb.find_element_by_xpath("//button[@type='submit']").click() | |
try: | |
element_present = EC.presence_of_element_located((By.ID, 'login in progress')) | |
WebDriverWait(driverweb, timeout).until(element_present) | |
except TimeoutException: | |
print("Timed out waiting for page to load") | |
driverweb.get("https://fr.tradingview.com/chart/g6Qa1GzZ/") | |
try: | |
element_present = EC.presence_of_element_located((By.XPATH, '//DIV[@class="icon-button backtesting-open-format-dialog apply-common-tooltip"]')) | |
WebDriverWait(driverweb, timeout).until(element_present) | |
except TimeoutException: | |
print("Timed out waiting for page to load") | |
menu_click = '//*/div[@class="menu-1fA401bY button-13wlLwhJ apply-common-tooltip"]' | |
e = WebDriverWait(driverweb, timeout).until( | |
EC.visibility_of_element_located((By.XPATH, menu_click))) | |
e.click() | |
# wait the menu to be visible | |
menu_click = '//*/div[@class="menuWrap-1gEtmoET"]' | |
e = WebDriverWait(driverweb, timeout).until( | |
EC.visibility_of_element_located((By.XPATH, menu_click))) | |
#item-2xPVYue0 data-value, 1,3, 5, 15, 30 , 45, 60, 120, 180, 240 | |
menu_item_click = '//*/div[@data-value="15"]' | |
e = WebDriverWait(driverweb, timeout).until( | |
EC.visibility_of_element_located((By.XPATH, menu_item_click))) | |
e.click() | |
time.sleep(3) | |
# backtesting-select-wrapper > report-tabs > Liste des transactions > active | |
# backtesting-content-wrapper > reports-content > report-content trades > report-data > table-wra | |
### | |
"""xpath = '//*div[@data-name="backtesting"]' | |
e = WebDriverWait(driverweb, timeout).until( | |
EC.visibility_of_element_located((By.XPATH, xpath))) | |
e.click()""" | |
xpath = '//*/ul[@class="report-tabs"]/li[3]' | |
e = WebDriverWait(driverweb, timeout).until( | |
EC.visibility_of_element_located((By.XPATH, xpath))) | |
e.click() | |
time.sleep(3) | |
orders = {} | |
timehelper = TimeHelper() | |
def arange_data(data): | |
soup = BeautifulSoup(data, "lxml") | |
a = soup.find_all("td") | |
u = [a[i].text.replace(u'\xa0', ' ') for i in range(len(a))] | |
order = dict(firebase_id="", id=u[0], type="ENTRY", order_type=u[2], date=timehelper.timeStrToTimestamp(u[3]), filled=False, binance_id="", closed=False, closed_date=u[12], close_order_type=u[11]) | |
if order["closed_date"] is ' ' and str(order["date"]) not in orders.keys(): | |
order["filled"] = True | |
orders[str(order["date"])] = order | |
# si dans les entry oders | |
print("new order coming", order) | |
elif str(order["date"]) in orders.keys() and order["close_date"] is not ' ': | |
print("close this shit") | |
#commencer le programme en ne prennant uniquement que les trades avec une date de trade superieur à la date de start du programme | |
#creer son propre id sans chiffre pour chaque trade. | |
#post l'entré, si non présent | |
#post la sortie si elle n'existe pas dans la base de donnée. | |
# si | |
return order | |
def printTableDataRecursively(element_table_rows, count, table_view): | |
trades = {} | |
for el in element_table_rows: | |
count += 1 | |
arange_data(el.get_attribute("innerHTML")) | |
if count == len(element_table_rows) and checkIfBottomOfViewReached(driverweb, table_view) is False: | |
count = 0; | |
scrollToElement(driverweb, el) | |
rows = driverweb.find_elements_by_css_selector("div.report-content.trades .report-data .table-wrap table tbody") | |
rows.remove(rows[0]) | |
printTableDataRecursively(rows, count, table_view) | |
#Buy | |
#Sell | |
#Exit Buy | |
#Exit Sell | |
while True: | |
count = 0 | |
element_table_rows = driverweb.find_elements_by_css_selector("div.report-content.trades .report-data .table-wrap table tbody") | |
table_view = driverweb.find_element_by_class_name("report-content") | |
printTableDataRecursively(element_table_rows, count, table_view ) | |
time.sleep(3) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment