Построение графика свечи OHLC с SMA 200 с использованием функции построения графика mplfinance

#charts #candlestick-chart #mplfinance #ohlc #candlesticks

Вопрос:

Я использую функцию mplfinance plot для построения графика свечей OHLC для символа. Данные OHLC имеют 2-минутный таймфрейм. Кроме того, я рисую период sma 20 и период sma 200 на одном и том же графике. Из-за sma200 количество свечей, отображаемых на графике, довольно велико (почти два дня 2минутной свечи).

Поскольку скользящее среднее вычисляется внутренне функцией графика, поэтому мне нужно передать два дня 2-минутной свечи в функцию графика, чтобы я мог получить некоторые точки данных sma200. График свечей сохраняется в виде файла png. Теперь из-за того, что на графике отображается около 300 свечей (также отображаются линии sma20 и sma200), свечи отображаются не очень четко.

Есть ли способ ограничить количество свечей, которые отображаются на графике. Если я срежу свой фрейм данных, скажем, на 30 свечей, то sma200 в этом случае не будет рассчитан из-за недостаточного количества свечей. Что мне нужно, так это sma200 с полным набором данных, но только с фиксированным количеством свечей или для графика фиксированной продолжительности, отображаемого только как данные свечи за последний час.

  mpf.plot(df, type='candle', style='charles',
         title=title,
         ylabel='Price',
         ylabel_lower='Shares nTraded',
         mav=(20,200),
         savefig=file)
 

Ответ №1:

Я бы посоветовал вам рассчитать свою собственную скользящую среднюю и построить ее с использованием mpf.make_addplot() . Это позволит вам рассчитать скользящую среднюю на основе одноминутных или двухминутных свечей при построении графика пятиминутных или десятиминутных свечей. Например:

 # calculate mav values
mav20  = twominute_df['Close'].rolling( 20).mean()
mav200 = twominute_df['Close'].rolling(200).mean()

# resample:
resample_ohlcmap = {'Open'  :'first',
                    'High'  :'max',
                    'Low'   :'min',
                    'Close' :'last',
                    'Volume':'sum'
                   }

tenminute_df = twominute_df.resample('10T').agg(resample_ohlcmap)

# plot ten-minute candles with two-minute mavs:

apmavs = [ mpf.make_addplot(mav20),
           mpf.make_addplot(mav200) ]

mpf.plot(tenminute_df, type='candle', style='charles',
         title=title, ylabel='Price', ylabel_lower='Shares nTraded',
         addplot=apmavs, savefig=file)

 

Рекомендации:

Ответ №2:

Спасибо Дэниелу за вашу помощь. Теперь я могу построить график для 60 свечей с sma 20 и 200.

Ну, мне не нужна повторная выборка, так как мой таймфрейм графика и временные рамки скользящей средней одинаковы.

Пожалуйста, найдите мой фрагмент кода.

 # get list of close prices from symbol_docs. symbol_docs contain 2 min OHLC.
close_list = list(map(lambda a: a['close'], symbol_docs))

# sma20 and 200 calculated using ta-lib 
sma20 = sma(close_list, 20)
sma200 = sma(close_list, 200)  

# call to plot_chart function
plot_chart('TCS', symbol_docs, sma20, sma200)  

def plot_chart(symbol, docs, sma20, sma200):
  df = pd.DataFrame(docs)
  df = df.set_index(['time'])
  df.rename(columns={'open': 'Open', 'close': 'Close', 'high': 'High', 'low': 'Low'},
          inplace=True)
  title = symbol.upper()   ' - 2min'
  file = saved_chart_image_abs_path   symbol   '.png'

  df['sma20'] = sma20
  df['sma200'] = sma200

  df_sliced = df[-60:]
  apmavs = [mpf.make_addplot(df_sliced['sma20']), mpf.make_addplot(df_sliced['sma200'])]

  mpf.plot(df_sliced, type='candle', style='charles',
         title=title,
         ylabel='Price',
         ylabel_lower='Shares nTraded',
         addplot=apmavs,
         savefig=file)
  telegram_message_sender.send_document(file)
  os.remove(file)
 

Приведенная ниже диаграмма отправляется в качестве документа в мою группу telegram 🙂

TCS - 2 минуты