def addTechnicalIndicators(simple_data):
    stock = sts.StockDataFrame(simple_data)
    stock['cr']
    stock['kdjk']
    stock['kdjd']
    stock['kdjj']
    stock['close_10_sma']
    stock['macd']
    stock['boll']
    stock['rsi_6']
    stock['rsi_12']
    stock['wr_6']
    stock['wr_10']
    stock['cci']
    stock['cci_20']
    stock['tr']
    stock['atr']
    stock['dma']
    stock['adxr']
    stock['close_12_ema']
    stock['trix']
    stock['trix_9_sma']
    stock['vr']
    stock['vr_6_sma']
    new_dataframe = pd.DataFrame(stock).loc[:, COLUMNS]
    transformed_dataframe = new_dataframe.iloc[
        10:len(new_dataframe) - SHIFT_NUMBER]  # Bỏ các hàng khuyết dữ liệu
    scaler = StandardScaler()
    scaler.fit(transformed_dataframe)
    return pd.DataFrame(scaler.transform(transformed_dataframe),
                        columns=COLUMNS)
Exemple #2
0
    def calculate_stock(self):
        stock = stockstats.StockDataFrame().retype(self.feed)
        stock['close_20_sma']
        stock['boll']
        stock['boll_ub']
        stock['boll_lb']

        return stock.round(2)
Exemple #3
0
 def calculate_stock(self):
     stock = stockstats.StockDataFrame().retype(self.feed)
     shortlen = 5
     longlen = 10
     short = talib.EMA(self.feed['volume'], shortlen)
     long = talib.EMA(self.feed['volume'], longlen)
     osc = 100 * (short - long) / long
     stock['VOSC'] = osc
     return stock
Exemple #4
0
 def __init__(self, df: pd.core.frame.DataFrame):
     # Arg Check
     co = ['open', 'high', 'low', 'close']
     if not all(i in df.columns for i in co):
         raise KeyError("arg's columns must have {}, but it has {}".format(co, df.columns))
     self._init_stock_dataframe = ss.StockDataFrame(df)  # スパン変更前のデータフレーム
     self.stock_dataframe = None  # スパン変更後、インジケータ追加後のデータフレーム
     self.freq = None  # 足の時間幅
     self._fig = None  # <-- plotly.graph_objs
     self._indicators = {}  # Plotするときに使う指標
Exemple #5
0
 def __init__(self, df: pd.core.frame.DataFrame):
     # Arg Check
     co = ['open', 'high', 'low', 'close']
     assert all(
         i in df.columns
         for i in co), 'arg\'s columns must have {}, but it has {}'.format(
             co, df.columns)
     if not type(df.index) == pd.tseries.index.DatetimeIndex:
         raise TypeError(df.index)
     self._init_stock_dataframe = ss.StockDataFrame(df)  # スパン変更前のデータフレーム
     self.stock_dataframe = None  # スパン変更後、インジケータ追加後のデータフレーム
     self.freq = None  # 足の時間幅
     self._fig = None  # <-- plotly.graph_objs
Exemple #6
0
    def resample(self, freq: str):
        """Convert ohlc time span

        Usage: `fx.resample('D')  # 日足に変換`

        * Args:  変更したい期間 M(onth) | W(eek) | D(ay) | H(our) | T(Minute) | S(econd)
        * Return: スパン変更後のデータフレーム
        """
        self.freq = freq
        df = self._init_stock_dataframe.resample(freq).ohlc2().dropna()
        self.stock_dataframe = ss.StockDataFrame(df)
        for indicator in self._indicators.keys():
            self.append(indicator)  # Re-append indicator in dataframe
        return self.stock_dataframe
    def calulate_stock(self):
        #change class attributes before calculation 
        stockstats.StockDataFrame.BOLL_PERIOD = self.boll_period
        stock = stockstats.StockDataFrame().retype(self.feed)
        stock['boll'] 
        #stock._get_boll(stockstats.StockDataFrame())
        stock['boll_ub']
        stock['boll_lb']
        #print('period',stockstats.StockDataFrame.BOLL_PERIOD)
        #print(stock['boll_lb'].tail(3))
        stock['close_30_sma']
        #boll limit  
        stock['boll_bb'] = (stock['close'] - stock['boll_lb'])/(stock['boll_ub']-stock['boll_lb'])*100
        stock['boll_band'] = (stock['boll_ub'] - stock['boll_lb'])/stock['boll']*100
        #print(stock.tail(5))
        

        #print(stock['boll'].tail(3))
        #print(ind.up_trend(stock['boll'],window=2))
        #print(ind.down_trend(stock['boll'],window=1))

        return stock.round(2)
Exemple #8
0
    def run(self):
        print(f"Process_{self.no}_started")

        self.stats = stockstats.StockDataFrame(self.data)

        def normalize(x):
            x = x.copy()
            return (x - np.mean(x)) / (np.std(x) + 1e-5)

        self.wr = normalize(self.stats['wr_14'])
        self.kdjk = normalize(self.stats['kdjk_20'])
        self.kdjd = normalize(self.stats['kdjd_20'])
        self.kdjj = normalize(self.stats['kdjj_20'])
        self.rsi = normalize(self.stats['rsi_18'])
        self.adx = normalize(self.stats['adx'])
        self.dma = normalize(self.stats['dma'])
        self.len = len(self.stats)

        def shirnk(x):
            if abs(x) > self.threshold:
                return x
            else:
                return 0

        sign2cate = lambda x: 1 - x

        while True:
            pos = np.random.randint(self.img_shape[1], self.len - 1 - self.k)
            img = self.grey_scale_img(pos)
            delta = self.stats.iloc[
                pos + self.k]['close'] - self.stats.iloc[pos]['close']
            t = shirnk(delta)
            sign = np.sign(t)
            cate = sign2cate(sign)

            stat = self.get_stats(pos)

            self.pair_queue.put((img, stat, cate))
Exemple #9
0
    def __init__(self, data, total_step, img_shape, charge, init_money,
                 threshold):
        self.stats = stockstats.StockDataFrame(data)

        def normalize(x):
            x = x.copy()
            return (x - np.mean(x)) / (np.std(x) + 1e-5)

        self.wr = normalize(self.stats['wr_14'])
        self.kdjk = normalize(self.stats['kdjk_20'])
        self.kdjd = normalize(self.stats['kdjd_20'])
        self.kdjj = normalize(self.stats['kdjj_20'])
        self.rsi = normalize(self.stats['rsi_12'])
        self.adx = normalize(self.stats['adx'])
        self.dma = normalize(self.stats['dma'])

        self.len = len(self.stats)
        self.start_pos = None
        self.cur_pos = None
        self.total_step = total_step
        self.step_cnt = None
        self.in_cnt = None
        self.is_win = None
        self.reward_list = None
        self.img_shape = img_shape
        self.charge = charge
        self.action = None  # 0:buy, 1:wait, 2:sell
        self.f = None
        self.threshold = threshold
        self.init_money = init_money
        self.money = None
        self.contract = None
        self.sign = None
        self.in_close = None
        self.window = None
        print("Env_started")
 def calculate_long(self):
     data = ind.load_stock(self.tker,200)
     return stockstats.StockDataFrame().retype(data)
Exemple #11
0
def get_technical_indicators(data, last_days=2691, plot=False):
    # 获取股价技术指标 输入参数为数据集、持续时间和是否绘制图表 输出技术指标 key表示对哪一个指标进行统计分析
    # 7日均线和21日均线
    import stockstats

    dataset_tech = data[[
        'open', 'close_x_x', 'high', 'low', 'vol', 'amount', 'pct_chg'
    ]]
    dataset_tech['close'] = dataset_tech['close_x_x']
    dataset_tech['volume'] = dataset_tech['vol']
    dataset_tech = dataset_tech.drop(columns=['close_x_x', 'vol'])
    stock = stockstats.StockDataFrame(dataset_tech)

    technical_keys = [
        'macd',  # moving average convergence divergence. Including signal and histogram. 
        'macds',  # MACD signal line
        'macdh',  # MACD histogram
        'volume_delta',  # volume delta against previous day
        'open_2_d',  # open delta against next 2 day
        'open_-2_r',  # open price change (in percent) between today and the day before yesterday, 'r' stands for rate.
        'cr',  # CR indicator, including 5, 10, 20 days moving average
        'cr-ma1',
        'cr-ma2',
        'cr-ma3',
        'volume_-3,2,-1_max',  # volume max of three days ago, yesterday and two days later
        'volume_-3~1_min',  # volume min between 3 days ago and tomorrow
        'kdjk',  # KDJ, default to 9 days
        'kdjd',
        'kdjj',
        'kdjk_3_xu_kdjd_3',  # three days KDJK cross up 3 days KDJD
        'open_2_sma',  # 2 days simple moving average on open price
        'boll',  # bolling, including upper band and lower band
        'boll_ub',
        'boll_lb',
        'close_10.0_le_5_c',  # close price less than 10.0 in 5 days count
        'cr-ma2_xu_cr-ma1_20_c',  # CR MA2 cross up CR MA1 in 20 days count
        'rsi_6',  # 6 days RSI
        'rsi_12',  # 12 days RSI
        'wr_10',  # 10 days WR
        'wr_6',  # 6 days WR
        'cci',  # CCI, default to 14 days
        'cci_20',  ## 20 days CCI
        'tr',  #TR (true range)
        'atr',  # ATR (Average True Range)
        'dma',  # DMA, difference of 10 and 50 moving average
        'pdi',  # DMI  +DI, default to 14 days
        'mdi',  # -DI, default to 14 days
        'dx',  # DX, default to 14 days of +DI and -DI
        'adx',  # ADX, 6 days SMA of DX, same as stock['dx_6_ema']
        'adxr',  # ADXR, 6 days SMA of ADX, same as stock['adx_6_ema']
        'trix',  # TRIX, default to 12 days
        'trix_9_sma',  # MATRIX is the simple moving average of TRIX
        'vr',  # VR, default to 26 days
        'vr_6_sma'  # MAVR is the simple moving average of VR
    ]
    for key in technical_keys:
        dataset_tech[key] = pd.DataFrame(stock[key])

    if plot:  # 绘制技术指标
        plot_dataset = dataset_tech
        plot_dataset = dataset_tech.iloc[-last_days:, :]
        shape_0 = plot_dataset.shape[0]
        x = list(plot_dataset.index)

        plt.figure(dpi=100)
        # 1.股价、成交量,成交额、MA移动平均线、MACD
        plt.subplot(2, 1, 1)
        plt.plot(plot_dataset['close'], label='Close Price')
        plt.xticks(plot_dataset['volume'])
        plt.plot(plot_dataset[''])

        # 2.KDJ

        # 3.RSI

        # 4.BOLL

        # 5.WR

        # 6.DMI

        # 7.All in one

        for key in technical_keys:
            plt.plot(dataset_tech[key], label=key, color=choose_color())
        plt.legend()
        plt.show()

        # Plot first subplot

        plt.subplot(2, 1, 1)
        plt.plot(plot_dataset[key + '_' + 'tech'],
                 label=key + '_' + 'technical indicator',
                 linestyle='-')
        plt.plot(plot_dataset[key + '_' + 'ma7'],
                 label=key + '_' + 'MA 7',
                 color=colors[0],
                 linestyle='--')
        plt.plot(plot_dataset[key + '_' + 'ma21'],
                 label=key + '_' + 'MA 21',
                 color=colors[1],
                 linestyle='--')
        plt.plot(plot_dataset[key + '_' + '20sd'],
                 label=key + '_' + '20days Standard Deviation',
                 color=colors[6],
                 linestyle='--')
        plt.plot(plot_dataset[key + '_' + 'upper_band'],
                 label=key + '_' + 'Upper Band',
                 color=colors[2],
                 linestyle=':')
        plt.plot(plot_dataset[key + '_' + 'lower_band'],
                 label=key + '_' + 'Lower Band',
                 color=colors[3],
                 linestyle=':')
        plt.fill_between(x,
                         plot_dataset[key + '_' + 'lower_band'],
                         plot_dataset[key + '_' + 'upper_band'],
                         alpha=0.3)
        plt.title(' Technical indicators in {} days .'.format(last_days))
        plt.ylabel(key + '_' + 'technical')
        plt.legend()
        # Plot second subplot
        plt.subplot(2, 1, 2)
        plt.title('MACD')
        plt.plot(plot_dataset[key + '_' + 'MACD'],
                 label=key + '_' + 'MACD',
                 linestyle='-')
        plt.hlines(plot_dataset[key + '_' + 'MACD'].mean(),
                   plot_dataset.index[0],
                   plot_dataset.index[shape_0 - 1],
                   color=colors[4],
                   linestyles=':',
                   label='MACD mean')

        plt.plot(plot_dataset[key + '_' + 'ema'],
                 label=key + '_' + 'Ema',
                 linestyle='--')
        plt.hlines(plot_dataset[key + '_' + 'ema'].mean(),
                   plot_dataset.index[0],
                   plot_dataset.index[shape_0 - 1],
                   colors=colors[5],
                   linestyles=':',
                   label='Exponential moving average mean')
        plt.legend()
        plt.show()
    # 汇总技术指标

    return dataset_tech
Exemple #12
0
def reset_dataframe(df):
    """Reset dataframe as stockstats"""
    return ss.StockDataFrame(df.ix[:, ['open', 'high', 'low', 'close']])
Exemple #13
0
 def calulate_stock(self):
     stock = stockstats.StockDataFrame().retype(self.feed)
     #print(stock['boll'].tail(3))
     return stock.round(2)
def get_technical_indicators(data, last_days=2691, plot=True, save=False):
    # 获取股价技术指标 输入参数为数据集、持续时间和是否绘制图表 输出技术指标 key表示对哪一个指标进行统计分析
    # 7日均线和21日均线
    import stockstats

    dataset_tech = data[[
        'daily_open', 'daily_close', 'daily_high', 'daily_low', 'daily_vol',
        'daily_amount'
    ]]
    dataset_tech = dataset_tech.rename(
        columns=lambda x: x.lstrip('daily_')).rename(columns={
            'vol': 'volume',
            'ow': 'low',
            'mount': 'amount'
        })

    stock = stockstats.StockDataFrame(dataset_tech)

    technical_keys = [
        'macd',  # moving average convergence divergence. Including signal and histogram. 
        'macds',  # MACD signal line
        'macdh',  # MACD histogram
        'volume_delta',  # volume delta against previous day
        'volume_-3,2,-1_max',  # volume max of three days ago, yesterday and two days later
        'volume_-3~1_min',  # volume min between 3 days ago and tomorrow
        'kdjk',  # KDJ, default to 9 days
        'kdjd',
        'kdjj',
        'kdjk_3_xu_kdjd_3',  # three days KDJK cross up 3 days KDJD
        'boll',  # bolling, including upper band and lower band
        'boll_ub',
        'boll_lb',
        'open_2_sma',  # 2 days simple moving average on open price
        'open_2_d',  # open delta against next 2 day
        'open_-2_r',  # open price change (in percent) between today and the day before yesterday, 'r' stands for rate.
        'close_10.0_le_5_c',  # close price less than 10.0 in 5 days count
        'cr',  # CR indicator, including 5, 10, 20 days moving average
        'cr-ma1',
        'cr-ma2',
        'cr-ma3',
        'cr-ma2_xu_cr-ma1_20_c',  # CR MA2 cross up CR MA1 in 20 days count
        'rsi_6',  # 6 days RSI
        'rsi_12',  # 12 days RSI
        'wr_10',  # 10 days WR
        'wr_6',  # 6 days WR
        'cci',  # CCI, default to 14 days
        'cci_20',  ## 20 days CCI
        'dma',  # DMA, difference of 10 and 50 moving average
        'pdi',  # DMI  +DI, default to 14 days
        'mdi',  # -DI, default to 14 days
        'dx',  # DX, default to 14 days of +DI and -DI
        'adx',  # ADX, 6 days SMA of DX, same as stock['dx_6_ema']
        'adxr',  # ADXR, 6 days SMA of ADX, same as stock['adx_6_ema']
        'tr',  #TR (true range)
        'atr',  # ATR (Average True Range)
        'trix',  # TRIX, default to 12 days
        'trix_9_sma',  # MATRIX is the simple moving average of TRIX
        'vr',  # VR, default to 26 days
        'vr_6_sma'  # MAVR is the simple moving average of VR
    ]
    for key in technical_keys:
        dataset_tech[key] = pd.DataFrame(stock[key])

    dataset_tech['ma7'] = dataset_tech['close'].rolling(window=7).mean()
    dataset_tech['ma21'] = dataset_tech['close'].rolling(window=21).mean()
    dataset_tech['ema'] = dataset_tech['close'].ewm(com=0.5).mean()
    dataset_tech['momentum'] = dataset_tech['close'] - 1

    if plot:  # 绘制技术指标
        plot_dataset = dataset_tech
        plot_dataset = dataset_tech.iloc[-last_days:, :]
        shape_0 = plot_dataset.shape[0]
        x = list(plot_dataset.index)
        colors = choose_color(10)

        # 0.股价、成交量,成交额、MA移动平均线
        plt.figure(figsize=(16, 10), dpi=150)
        linewidth = 1
        plt.subplot(3, 1, 1)
        plt.title('Close Price and Volume Statistics')
        plt.plot(plot_dataset['close'], label='Close Price')
        plt.plot(plot_dataset['ma7'],
                 label='MA-7',
                 linestyle='--',
                 linewidth=linewidth)
        plt.plot(plot_dataset['ma21'],
                 label='MA-21',
                 linestyle='--',
                 linewidth=linewidth)
        plt.plot(plot_dataset['ema'],
                 label='EMA',
                 linestyle=':',
                 linewidth=linewidth)
        plt.legend()
        plt.subplot(3, 1, 2)
        plt.bar(x, plot_dataset['volume'], label='Volume', width=linewidth)
        plt.bar(x, -plot_dataset['amount'], label='Amount', width=linewidth)
        plt.legend()
        plt.subplot(3, 1, 3)
        plt.plot(plot_dataset['volume_delta'],
                 label='volume delta',
                 linestyle='-',
                 linewidth=linewidth / 2,
                 color='k')
        plt.legend()
        if save:
            plt.savefig('project\\feature_engineering\\30_price_amount.png')
        plt.show()

        # 1.MACD
        plt.figure(figsize=(16, 10), dpi=150)
        linewidth = 1
        plt.subplot(2, 1, 1)
        plt.title('Close price and MACD')
        plt.plot(plot_dataset['close'], label='Close Price')
        plt.legend()
        plt.subplot(2, 1, 2)
        plt.plot(plot_dataset['macd'], label='macd', linewidth=linewidth)
        plt.plot(plot_dataset['macds'],
                 label='macd signal line',
                 linestyle='--',
                 linewidth=linewidth)
        plt.bar(plot_dataset['macdh'].loc[plot_dataset['macdh'] >= 0].index,
                plot_dataset['macdh'].loc[plot_dataset['macdh'] >= 0],
                label='macd histgram',
                width=linewidth,
                color='r')
        plt.bar(plot_dataset['macdh'].loc[plot_dataset['macdh'] < 0].index,
                plot_dataset['macdh'].loc[plot_dataset['macdh'] < 0],
                label='macd histgram',
                width=linewidth,
                color='g')
        plt.legend()
        if save:
            plt.savefig('project\\feature_engineering\\31_MACD.png')
        plt.show()

        # 2.KDJ and BOLL
        plt.figure(figsize=(16, 10), dpi=150)
        linewidth = 1
        plt.subplot(2, 1, 1)
        plt.title('Bolling band and KDJ')
        plt.plot(plot_dataset['close'], label='Close Price')
        plt.plot(plot_dataset['boll'],
                 label='Bolling',
                 linestyle='--',
                 linewidth=linewidth)
        plt.plot(plot_dataset['boll_ub'],
                 color='c',
                 label='Bolling up band',
                 linewidth=linewidth)
        plt.plot(plot_dataset['boll_lb'],
                 color='c',
                 label='Bolling low band',
                 linewidth=linewidth)
        plt.fill_between(x,
                         plot_dataset['boll_ub'],
                         plot_dataset['boll_lb'],
                         alpha=0.35)
        plt.legend()
        plt.subplot(2, 1, 2)
        plt.plot(plot_dataset['kdjk'], label='KDJ-K', linewidth=linewidth)
        plt.plot(plot_dataset['kdjd'], label='KDJ-K', linewidth=linewidth)
        plt.plot(plot_dataset['kdjj'], label='KDJ-K', linewidth=linewidth)
        plt.scatter(
            plot_dataset['kdjk'].loc[plot_dataset['kdjk_3_xu_kdjd_3'] ==
                                     True].index,
            plot_dataset['kdjk'].loc[plot_dataset['kdjk_3_xu_kdjd_3'] == True],
            marker='^',
            color='r',
            label='three days KDJK cross up 3 days KDJD')
        plt.legend()
        if save:
            plt.savefig('project\\feature_engineering\\32_boll_kdj.png')
        plt.show()

        # 3.Open price and RSI
        plt.figure(figsize=(16, 10), dpi=150)
        linewidth = 1
        plt.subplot(2, 1, 1)
        plt.title('Open price and RSI')
        plt.plot(plot_dataset['open'], label='Open Price')
        plt.bar(x,
                plot_dataset['open_2_d'],
                label='open delta against next 2 day')
        plt.plot(
            plot_dataset['open_-2_r'],
            label=
            'open price change (in percent) between today and the day before yesterday',
            linewidth=linewidth)
        plt.legend()
        plt.subplot(2, 1, 2)
        plt.plot(plot_dataset['rsi_12'], label='12 days RSI ', color='c')
        plt.plot(plot_dataset['rsi_6'],
                 label='6 days RSI',
                 linewidth=linewidth,
                 color='r')
        plt.legend()
        if save:
            plt.savefig('project\\feature_engineering\\33_open_rsi.png')
        plt.show()

        # 4.CR and WR

        plt.figure(figsize=(16, 10), dpi=150)
        linewidth = 1
        plt.subplot(2, 1, 1)
        plt.title('WR and CR in 5/10/20 days')
        plt.plot(plot_dataset['wr_10'],
                 label='10 days WR',
                 linestyle='-',
                 linewidth=linewidth,
                 color='g')
        plt.plot(plot_dataset['wr_6'],
                 label='6 days WR',
                 linestyle='-',
                 linewidth=linewidth,
                 color='r')
        plt.legend()
        plt.subplot(2, 1, 2)
        plt.bar(x,
                plot_dataset['cr'],
                label='CR indicator',
                linestyle='--',
                linewidth=linewidth,
                color='skyblue')
        plt.plot(plot_dataset['cr-ma1'],
                 label='CR 5 days MA',
                 linestyle='-',
                 linewidth=linewidth)
        plt.plot(plot_dataset['cr-ma2'],
                 label='CR 10 days MA',
                 linestyle='-',
                 linewidth=linewidth)
        plt.plot(plot_dataset['cr-ma3'],
                 label='CR 20 days MA',
                 linestyle='-',
                 linewidth=linewidth)
        plt.legend()
        if save:
            plt.savefig('project\\feature_engineering\\34_cr_ma.png')
        plt.show()

        # 5.CCI TR VR
        #
        plt.figure(figsize=(16, 10), dpi=150)
        linewidth = 1
        plt.subplot(2, 1, 1)
        plt.title('CCI TR and VR')
        plt.plot(plot_dataset['tr'],
                 label='TR (true range)',
                 linewidth=linewidth)
        plt.plot(plot_dataset['atr'],
                 label='ATR (Average True Range)',
                 linewidth=linewidth)
        plt.plot(plot_dataset['trix'],
                 label='TRIX, default to 12 days',
                 linewidth=linewidth)
        plt.plot(plot_dataset['trix_9_sma'],
                 label='MATRIX is the simple moving average of TRIX',
                 linewidth=linewidth)
        plt.legend()
        plt.subplot(2, 1, 2)
        plt.plot(plot_dataset['cci'],
                 label='CCI, default to 14 days',
                 linestyle='-',
                 linewidth=linewidth,
                 color='r')
        plt.plot(plot_dataset['cci_20'],
                 label='20 days CCI',
                 linestyle='-',
                 linewidth=linewidth,
                 color='g')
        plt.bar(x, plot_dataset['vr'], label='VR, default to 26 days')
        plt.bar(x,
                -plot_dataset['vr_6_sma'],
                label='MAVR is the simple moving average of VR')
        plt.legend()
        if save:
            plt.savefig('project\\feature_engineering\\35_cci_tr_vr.png')
        plt.show()

        # 6.DMI
        plt.figure(figsize=(16, 10), dpi=150)
        linewidth = 1
        plt.subplot(3, 1, 1)
        plt.title('DMI and DMA')
        plt.bar(x,
                plot_dataset['pdi'],
                label='+DI, default to 14 days',
                color='r')
        plt.bar(x,
                -plot_dataset['mdi'],
                label='-DI, default to 14 days',
                color='g')
        plt.legend()
        plt.subplot(3, 1, 2)
        plt.plot(plot_dataset['dma'],
                 label='DMA, difference of 10 and 50 moving average',
                 linewidth=linewidth,
                 color='k')
        plt.legend()
        plt.subplot(3, 1, 3)
        plt.plot(plot_dataset['dx'],
                 label='DX, default to 14 days of +DI and -DI',
                 linewidth=linewidth)
        plt.plot(plot_dataset['adx'],
                 label='6 days SMA of DX',
                 linewidth=linewidth)
        plt.plot(plot_dataset['adxr'],
                 label='ADXR, 6 days SMA of ADX',
                 linewidth=linewidth)
        plt.legend()
        if save:
            plt.savefig('project\\feature_engineering\\36_close_DMI.png')
        plt.show()

    return dataset_tech