Как сохранить счетчик в FuncAnimation для отображения свечи OHLC, используя номер бара вместо даты - PullRequest
0 голосов
/ 04 июня 2019

Хотя я решил много проблем из всей замечательной информации о переполнении стека, это мой первый пост, в котором так много извинений за неправильное форматирование.Спасибо заранее за любую помощь.Подводя итог - я генерирую и строю график данных о ценах на акции с ненулевой осью x, номером бара.Мне нужно сохранить этот номер бара - длину исходного кадра данных - и увеличивать его на 1 каждый раз, когда получен новый живой бар.Я не нашел способа сделать это с FuncAnimation.

Я работаю с историческими и реальными торговыми данными, импортированными из Metatrader 5. Сбор данных и построение графиков с помощью matplotlib легко.Однако, как и многие аналогичные проекты, о которых я читал, я хочу устранить разрывы между торговыми сессиями, что довольно сложно, используя matplotlib.dates.Мое простое решение состояло в том, чтобы добавить столбец с номерами столбцов к кадру данных перед его построением и использовать номер столбца для оси x.Это работает нормально - пока я не хочу добавлять дополнительные живые бары с помощью FuncAnimation

Это простая функция для загрузки данных метатрейдера в фрейм данных:

def Get_Rates_Pos(Symbol, timeframe, get_from, lookback):

  df = MT5CopyRatesFromPos(Symbol, timeframe, get_from , lookback)

  df = pd.DataFrame(list(df), columns=['Time', 'Open', 'High', 'Low', 'Close',  'Tick_volume', 'Spread', 'Real_volume'])

  df = df[['Open', 'High', 'Low', 'Close', 'Time', 'Tick_volume', 'Spread', 'Real_volume']]
  df['Time'] = df['Time'].map(mdates.date2num)

return(df)

---------------- вот код, который вызывает вышеупомянутую функцию, добавляет столбец с номером бара к df, затем строит простую свечную диаграмму и объем без промежутков между сессиями.Пока все хорошо

rate = Get_Rates_Pos (Symbol, tf, get_from, look_back)

rate.insert (0, 'Barnum', диапазон (1, 1 + len (ставки)))

candystick_ohlc (ax1, rate.values, width = bw, colordown = '# ff0000', colorup = '# 00cc00')

ax2.bar (нормы ['Barnum'], ставки['Real_volume'])

----------------- Затем у меня есть функция, вызываемая FuncAnimation каждую секунду, которая извлекает только текущий текущий бар из MetaTrader.Я назначаю номер бара новому бару на основе длины исходного кадра данных.

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

Я также пытался передать исходный фрейм данных, называемый «скоростями», в функцию и добавить к ней одну строку, ноэто тоже не работает - длина исходного массива никогда не увеличивается.Это функция, вызываемая FuncAnimation - я заранее знаю, что передаю слишком много параметров, но работа над этим происходит, когда я набираю анимацию.

def Plot_Current(i, Symbol, rates, tf, get_from, look_back, bw, ax1, ax2, lp, bars):

current_bar = Get_Rates_Pos(Symbol, tf, get_from, look_back)
current_bar.insert(0, 'Barnum', range(1, 1 + len(current_bar)))
current_bar.Barnum = len(rates) + 1

if current_bar.at[0, 'Time'] > rates.at[len(rates)-1, 'Time']:
# this is the line that doesn't work as the original dataframe is passed in every time this function is called and never gets appended:
    rates = rates.append(current_bar, ignore_index=True)

candlestick_ohlc(ax1, current_bar.values, width = bw, colordown='#ff0000', colorup='#00cc00')  
ax2.bar(current_bar['Barnum'], current_bar['Real_volume'], width = bw*2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...