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]
Пример #2
0
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)
Пример #3
0
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
Пример #4
0
            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)
Пример #5
0
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
Пример #6
0
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