def __init__(self): '''Init function to initialize logger, variables for trading, and previous EMA for continuing data''' for handler in logging.root.handlers[:]: logging.root.removeHandler(handler) logging.basicConfig(format='%(asctime)s: %(message)s', datefmt='%m/%d/%Y %H:%M:%S %p', level=logging.CRITICAL, handlers=[ logging.FileHandler("LOG.log"), logging.StreamHandler() ]) self.last_completed_candle = requests.get("https://api-fxpractice.oanda.com/v3/instruments/{}/candles?count=2&price=M&granularity={}".format(INSTRUMENT, GRANULARITY), headers=HEADERS).json()['candles'][0] self.in_long = False self.in_short = False self.begin_trading = False self.fast = 0 self.slow = 0 # initialize prev EMAs with last 5000 candlesticks of data to use for live price EMA calculations prev_data = requests.get("https://api-fxpractice.oanda.com/v3/instruments/{}/candles?count=5000&price=M&granularity={}".format(INSTRUMENT, GRANULARITY), headers=HEADERS).json()['candles'][:-2] prev_data_df = pd.DataFrame([float(candle['mid']['c']) for candle in prev_data], columns=['close']) self.prev_fast = btalib.ema(prev_data_df, period=FAST, _seed=prev_data_df['close'].iloc[0]).df['ema'].iloc[-1] self.prev_slow = btalib.ema(prev_data_df, period=SLOW, _seed=prev_data_df['close'].iloc[0]).df['ema'].iloc[-1]
import plotly.express as px import plotly.graph_objs as go data = pd.read_csv( '/Users/cosmos/GitHub/haasomeapitools/market_data/BINANCE|ADA|BNB.csv', parse_dates=True) data.fillna(0) print(data) sma = btalib.sma(data, period=4) # # sma = btalib.sma(df, period=15) # print(sma.params.period) # print(sma.p.period) # print(sma.params['period']) # print(list(sma.params)) # print(dict(sma.params)) # stochastic = btalib.stochastic(data,period = 5) # print(stochastic.df) first_close_price = data.Close.iloc[0] ema = btalib.ema(data,_seed =first_close_price) bbands = btalib.bbands(data,_ma=btalib.wma) print(bbands.df) newcols = [] # data2 = pd.merge(data,bbands.df,how='right',on='index') # print(bbands) data2 = data.join(bbands.df,how='outer') data2.rename(columns={'mid': f"{bbands.p.period} mid", 'top': f"{bbands.p.devs} top", 'bot': f"{bbands.p.devs} bot"}.) print(data2)
def price_history(symbol_pair, time_step): client = client_test_net() if time_step == '5m': klines = client.get_historical_klines(symbol_pair, Client.KLINE_INTERVAL_5MINUTE, "2 day ago UTC") elif time_step == '15m': klines = client.get_historical_klines(symbol_pair, Client.KLINE_INTERVAL_15MINUTE, "6 day ago UTC") elif time_step == '30m': klines = client.get_historical_klines(symbol_pair, Client.KLINE_INTERVAL_30MINUTE, "12 day ago UTC") else: klines = client.get_historical_klines(symbol_pair, Client.KLINE_INTERVAL_1HOUR, "24 day ago UTC") # Remove unnecessary data for line in klines: del line[6:] # Generate csv file of RAW data df1 = pd.DataFrame( klines, columns=['date', 'open', 'high', 'low', 'close', 'volume']) df1.set_index('date', inplace=True) df1.to_csv('{}_history_{}.csv'.format(symbol_pair, time_step)) # Prepare to calculate indicator df = pd.read_csv('{}_history_{}.csv'.format(symbol_pair, time_step), index_col=0) df.index = pd.to_datetime(df.index, unit='ms') + pd.DateOffset(hours=7) # Average of high-low *note: is high-low-close better? df['avg'] = (df['high'] + df['low']) / 2 # Calculate moving average using Pandas df['50ma'] = df.close.rolling(50).mean() df['200ma'] = df.close.rolling(200).mean() # VWAP df['vwap'] = 0 volume = df['volume'] high = df['high'] low = df['low'] close = df['close'] typical_price = (high + low + close) / 3 for i in range(len(df)): if df.index.hour[i] == 23 and df.index.minute[i] == 0: df.loc[i:, 'vwap'] = ( volume[i:] * typical_price[i:]).cumsum() / volume[i:].cumsum() # EMA ema200 = btalib.ema(df.close, period=200) # MACD macd = btalib.macd(df.close, pfast=12, pslow=26, psignal=9) df = df.join([ema200.df, macd.df]) # Export RAW calculated file df.to_csv('{}_indicator_{}.csv'.format(symbol_pair, time_step)) # Remove blank data from calculated file df_plot = df[199:-1] df_plot.to_csv('{}_indicator_cutted_{}.csv'.format(symbol_pair, time_step)) return df_plot
in_position = False print(in_position) # Read a csv file into a pandas dataframe try: df = pd.read_csv('data/ohlc/' + SYMBOL + '1.txt', parse_dates=True, index_col='Date') except Exception as e: logging.error(e) time.sleep(.01) df = pd.read_csv('data/ohlc/' + SYMBOL + '1.txt', parse_dates=True, index_col='Date') ema = btalib.ema(df) rsi = btalib.rsi(df) df['ema'] = ema.df df['rsi'] = rsi.df macd = btalib.macd(df) df['macd'] = macd.df['macd'] df['signal'] = macd.df['signal'] df['histogram'] = macd.df['histogram'] print(df) try: df.rsi.to_csv('data/technicals/' + SYMBOL + 'rsi1.csv', header=True, index=False)
def generate_history(symbol_pair, time_step, day_ago=None, date_start=None, date_end=None, until_now=True): day_ago = str(day_ago) client = client_test_net() if until_now: klines = client.get_historical_klines(symbol_pair, time_step, '{} day ago UTC'.format(day_ago)) else: klines = client.get_historical_klines(symbol_pair, time_step, date_start, date_end) for line in klines: del line[6:] # Generate csv file of RAW data df1 = pd.DataFrame( klines, columns=['date', 'open', 'high', 'low', 'close', 'volume']) df1.set_index('date', inplace=True) df1.to_csv('{}_long_history_{}.csv'.format(symbol_pair, time_step)) # Prepare to calculate indicator df = pd.read_csv('{}_long_history_{}.csv'.format(symbol_pair, time_step), index_col=0) df.index = pd.to_datetime(df.index, unit='ms') + pd.DateOffset(hours=7) # Average of high-low *note: is close-open better? df['avg'] = (df['high'] + df['low']) / 2 # Calculate moving average using Pandas df['50ma'] = df.close.rolling(50).mean() df['200ma'] = df.close.rolling(200).mean() # VWAP df['vwap'] = 0 volume = df['volume'] high = df['high'] low = df['low'] close = df['close'] typical_price = (high + low + close) / 3 for i in range(len(df)): if df.index.hour[i] == 23 and df.index.minute[i] == 0: df.loc[i:, 'vwap'] = ( volume[i:] * typical_price[i:]).cumsum() / volume[i:].cumsum() # EMA ema200 = btalib.ema(df.close, period=200) # MACD macd = btalib.macd(df.close, pfast=12, pslow=26, psignal=9) df = df.join([ema200.df, macd.df]) # Export RAW calculated file df.to_csv('{}_history_indicator_{}.csv'.format(symbol_pair, time_step)) # Remove blank data from calculated file df_plot = df[199:-1] df_plot.to_csv('{}_history_indicator_cutted_{}.csv'.format( symbol_pair, time_step)) return df_plot
def tech_ind_features(data): """ Generate technical indicators * :param data(pd.DataFrame): Raw data for processing :return transformed_df(pd.DataFrame): Dataframe of features, sample balanced and normalised """ data['smoothed_close'] = data.close.rolling(9).mean().rolling(21).mean().shift(-15) data['dx'] = np.diff(data['smoothed_close'], prepend=data['smoothed_close'][0]) data['dx_signal'] = pd.Series(data['dx']).rolling(9).mean() data['ddx'] = np.diff(np.diff(data['smoothed_close']), prepend=data['smoothed_close'][0:2]) data['labels'] = np.zeros(len(data)) data['labels'].iloc[[(data.ddx < 0.1) & (data.dx <= 0) & (data.dx_signal > 0)]] = 1 data['labels'].iloc[[(data.ddx > -0.075) & (data.dx >= 0) & (data.dx_signal < 0)]] = 2 #Filter and drop all columns except close price, volume and date (for indexing) relevant_cols = list( compress( data.columns, [False if i in [1, 3, 4, 5, 6, len(data.columns)-1] else True for i in range(len(data.columns))] ) ) data = data.drop(columns=relevant_cols).rename(columns={'open_date_time': 'date'}) data.set_index('date', inplace = True) #Define relevant periods for lookback/feature engineering periods = [ 9, 14, 21, 30, 45, 60, 90, 100, 120 ] #Construct technical features for image synthesis for period in periods: data[f'ema_{period}'] = btalib.ema( data.close, period = period ).df['ema'] data[f'ema_{period}_dx'] = np.append(np.nan, np.diff(btalib.ema( data.close, period = period ).df['ema'])) data[f'rsi_{period}'] = btalib.rsi( data.close, period = period ).df['rsi'] data[f'cci_{period}'] = btalib.cci( data.high, data.low, data.close, period = period ).df['cci'] data[f'macd_{period}'] = btalib.macd( data.close, pfast = period, pslow = period*2, psignal = int(period/3) ).df['macd'] data[f'signal_{period}'] = btalib.macd( data.close, pfast = period, pslow = period*2, psignal = int(period/3) ).df['signal'] data[f'hist_{period}'] = btalib.macd( data.close, pfast = period, pslow = period*2, psignal = int(period/3) ).df['histogram'] data[f'volume_{period}'] = btalib.sma( data.volume, period = period ).df['sma'] data[f'change_{period}'] = data.close.pct_change(periods = period) data = data.drop(data.query('labels == 0').sample(frac=.90).index) data = data.replace([np.inf, -np.inf], np.nan).dropna() data_trimmed = data.loc[:, 'ema_9':] data_trimmed = pd.concat( [data_trimmed, data_trimmed.shift(1), data_trimmed.shift(2)], axis = 1 ) mm_scaler = MinMaxScaler(feature_range=(0, 1)) transformed_data = mm_scaler.fit_transform(data_trimmed[24:]) transformed_data = np.c_[ transformed_data, pd.to_numeric( data.labels[24:], downcast = 'signed' ).to_list() ] return transformed_data