#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 🙂