Learn practical skills, build real-world projects, and advance your career
Updated 4 years ago
import io, os, sys, types
from IPython import get_ipython
from nbformat import read
from IPython.core.interactiveshell import InteractiveShell
from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import HtmlFormatter
from IPython.display import display, HTML
from binance.client import Client
import glob
import pandas as pd
import pytz
import datetime
import urllib3
import datetime
import math
import inspect
import jovian
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
def find_notebook(fullname, path=None):
"""find a notebook, given its fully qualified name and an optional path
This turns "foo.bar" into "foo/bar.ipynb"
and tries turning "Foo_Bar" into "Foo Bar" if Foo_Bar
does not exist.
"""
name = fullname.rsplit('.', 1)[-1]
if not path:
path = ['']
for d in path:
nb_path = os.path.join(d, name + ".ipynb")
if os.path.isfile(nb_path):
return nb_path
# let import Notebook_Name find "Notebook Name.ipynb"
nb_path = nb_path.replace("_", " ")
if os.path.isfile(nb_path):
return nb_path
class NotebookLoader(object):
"""Module Loader for Jupyter Notebooks"""
def __init__(self, path=None):
self.shell = InteractiveShell.instance()
self.path = path
def load_module(self, fullname):
"""import a notebook as a module"""
path = find_notebook(fullname, self.path)
print ("importing Jupyter notebook from %s" % path)
# load the notebook object
with io.open(path, 'r', encoding='utf-8') as f:
nb = read(f, 4)
# create the module and add it to sys.modules
# if name in sys.modules:
# return sys.modules[name]
mod = types.ModuleType(fullname)
mod.__file__ = path
mod.__loader__ = self
mod.__dict__['get_ipython'] = get_ipython
sys.modules[fullname] = mod
# extra work to ensure that magics that would affect the user_ns
# actually affect the notebook module's ns
save_user_ns = self.shell.user_ns
self.shell.user_ns = mod.__dict__
try:
for cell in nb.cells:
if cell.cell_type == 'code':
# transform the input to executable Python
code = self.shell.input_transformer_manager.transform_cell(cell.source)
# run the code in themodule
exec(code, mod.__dict__)
finally:
self.shell.user_ns = save_user_ns
return mod
class NotebookFinder(object):
"""Module finder that locates Jupyter Notebooks"""
def __init__(self):
self.loaders = {}
def find_module(self, fullname, path=None):
nb_path = find_notebook(fullname, path)
if not nb_path:
return
key = path
if path:
# lists aren't hashable
key = os.path.sep.join(path)
if key not in self.loaders:
self.loaders[key] = NotebookLoader(path)
return self.loaders[key]
sys.meta_path.append(NotebookFinder())
formatter = HtmlFormatter()
lexer = PythonLexer()
# publish the CSS for pygments highlighting
display(HTML("""
<style type='text/css'>
%s
</style>
""" % formatter.get_style_defs()
))
def show_notebook(FILE_IDENTIFIER_STAMP, fname):
"""display a short summary of the cells of a notebook"""
with io.open(fname, 'r', encoding='utf-8') as f:
nb = read(f, 4)
html = []
for cell in nb.cells:
html.append("<h4>%s cell</h4>" % cell.cell_type)
if cell.cell_type == 'code':
html.append(highlight(cell.source, lexer, formatter))
else:
html.append("<pre>%s</pre>" % cell.source)
html = HTML('\n'.join(html))
filepath = FILE_IDENTIFIER_STAMP + '/' + fname.split('.')[0] + '.html'
print(filepath)
with open(filepath, 'w') as f:
f.write(html.data)
from scrape_price_data import scrap_binance_price
# from import_static_price_data import scrap_binance_price
from atr_renko_ema_on_renko_calculation import calculate_renko_atr_with_ema
# from atr_renko_ema_on_renko_calculation_with_hold import calculate_renko_atr_with_ema
from simulation_using_csv import Simulation
from print_graph import print_simulation_graph
from Time_Analysis import time_analysis
from Matrix import create_matrix
now = datetime.datetime.now()
def run ():
TIME_PERIOD_INFO = CANDLE_START_TIME.split(",")
FILE_IDENTIFIER_STAMP = SYMBOL + "|" + CANDLE_TIME_INTERVAL + "|" + TIME_PERIOD_INFO[0] + \
TIME_PERIOD_INFO[1] + "|" + EMA_TYPE + "|" + "EMA_SPAN_" + str(EMA_SPAN) + "|" + "ATR_" + str(ATR) + \
"|" + "ATR_WINDOW_" + str(ATR_WINDOW) + "|"
FILE_IDENTIFIER_STAMP += now.strftime("%m-%d-%YT%H%M")
os.mkdir(FILE_IDENTIFIER_STAMP)
os.mkdir(FILE_IDENTIFIER_STAMP + "/Source")
show_notebook(FILE_IDENTIFIER_STAMP + "/Source", os.path.join("", "scrape_price_data.ipynb"))
show_notebook(FILE_IDENTIFIER_STAMP + "/Source", os.path.join("", "simulation_using_csv.ipynb"))
show_notebook(FILE_IDENTIFIER_STAMP + "/Source", os.path.join("", "print_graph.ipynb"))
RAW_DATA_OUTPUT = FILE_IDENTIFIER_STAMP + "/Binance_Candles_" + FILE_IDENTIFIER_STAMP + ".csv"
scrap_binance_price(SYMBOL, CANDLE_TIME_INTERVAL, CANDLE_START_TIME, RAW_DATA_OUTPUT)
ATR_RENKO_DATA_OUTPUT = FILE_IDENTIFIER_STAMP + "/ATR_Renko_" + FILE_IDENTIFIER_STAMP + ".csv"
calculate_renko_atr_with_ema(RAW_DATA_OUTPUT, ATR_RENKO_DATA_OUTPUT, ATR, EMA_TYPE, EMA_SPAN, ATR_WINDOW, renko_price, prev_renko)
show_notebook(FILE_IDENTIFIER_STAMP + "/Source", os.path.join("", "atr_renko_ema_on_renko_calculation.ipynb"))
# calculate_renko_atr(RAW_DATA_OUTPUT, ATR_RENKO_DATA_OUTPUT)
SIMULATION_RESULTS_OUTPUT = FILE_IDENTIFIER_STAMP + "/TradingSimulation_" + FILE_IDENTIFIER_STAMP + ".csv"
s = Simulation(ATR_RENKO_DATA_OUTPUT, SIMULATION_RESULTS_OUTPUT)
trading_record = s.run_bot(STARTING_MONEY, STARTING_BTC)
print_simulation_graph(SIMULATION_RESULTS_OUTPUT, FILE_IDENTIFIER_STAMP)
MATRIX_OUTPUT = FILE_IDENTIFIER_STAMP + "/Matrix_" + FILE_IDENTIFIER_STAMP + ".csv"
matrix = create_matrix(trading_record, FILE_IDENTIFIER_STAMP, MATRIX_OUTPUT)
os.rename(FILE_IDENTIFIER_STAMP, str(math.floor(trading_record.iloc[-1]["total"])) + FILE_IDENTIFIER_STAMP)
INPUT_FILES.append(matrix)
importing Jupyter notebook from scrape_price_data.ipynb
importing Jupyter notebook from atr_renko_ema_on_renko_calculation.ipynb
importing Jupyter notebook from simulation_using_csv.ipynb
importing Jupyter notebook from print_graph.ipynb
importing Jupyter notebook from Time_Analysis.ipynb
importing Jupyter notebook from Matrix.ipynb
params = [
{
"SYMBOL": "BTCUSDT",
"CANDLE_TIME_INTERVAL": "2h",
"CANDLE_START_TIME": "20 Nov, 2017",
"EMA": "renko_price",
"ATR": "variable",
"EMA_SPAN": 20,
"ATR_WINDOW": 5,
"RENKO_PRICE": 8053,
"PREV_IND": 1
},
{
"SYMBOL": "BTCUSDT",
"CANDLE_TIME_INTERVAL": "2h",
"CANDLE_START_TIME": "20 Nov, 2017",
"EMA": "renko_price",
"ATR": "variable",
"EMA_SPAN": 22,
"ATR_WINDOW": 5,
"RENKO_PRICE": 8053,
"PREV_IND": 1
}
]
INPUT_FILES = []
for param in params:
CANDLE_TIME_INTERVAL = param["CANDLE_TIME_INTERVAL"]
CANDLE_START_TIME = param["CANDLE_START_TIME"]
SYMBOL = param["SYMBOL"]
EMA_TYPE = param["EMA"]
EMA_SPAN = param["EMA_SPAN"]
ATR_WINDOW = param["ATR_WINDOW"]
ATR = param["ATR"]
renko_price = param["RENKO_PRICE"]
prev_renko = param["PREV_IND"]
STARTING_MONEY, STARTING_BTC = 0, 1
run()
time_analysis(INPUT_FILES, "Master_Matrix.csv")
BTCUSDT|2h|20 Nov 2017|renko_price|EMA_SPAN_20|ATR_variable|ATR_WINDOW_5|09-09-2020T0637/Source/scrape_price_data.html
BTCUSDT|2h|20 Nov 2017|renko_price|EMA_SPAN_20|ATR_variable|ATR_WINDOW_5|09-09-2020T0637/Source/simulation_using_csv.html
BTCUSDT|2h|20 Nov 2017|renko_price|EMA_SPAN_20|ATR_variable|ATR_WINDOW_5|09-09-2020T0637/Source/print_graph.html
BTCUSDT|2h|20 Nov 2017|renko_price|EMA_SPAN_20|ATR_variable|ATR_WINDOW_5|09-09-2020T0637/Source/atr_renko_ema_on_renko_calculation.html
/home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages/pandas/core/indexing.py:671: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
BTCUSDT|2h|20 Nov 2017|renko_price|EMA_SPAN_22|ATR_variable|ATR_WINDOW_5|09-09-2020T0637/Source/scrape_price_data.html
BTCUSDT|2h|20 Nov 2017|renko_price|EMA_SPAN_22|ATR_variable|ATR_WINDOW_5|09-09-2020T0637/Source/simulation_using_csv.html
BTCUSDT|2h|20 Nov 2017|renko_price|EMA_SPAN_22|ATR_variable|ATR_WINDOW_5|09-09-2020T0637/Source/print_graph.html
BTCUSDT|2h|20 Nov 2017|renko_price|EMA_SPAN_22|ATR_variable|ATR_WINDOW_5|09-09-2020T0637/Source/atr_renko_ema_on_renko_calculation.html
jovian.commit(project="BitBotBoom_Simulation_Pipeline", environment=None, filename="/home/ec2-user/SageMaker/Renko Simulation/Pipeline.ipynb", message="Revert to Owen's version.")