Избранное трейдера ezomm
Написал скрипт, который переделывает тиковые данные в range заданной размерности.
Но есть нюанс, когда идет быстрый рынок, некоторые бары могут иметь одинаковое время открытия, что приводит к некоторому несоответствию range баров.
<code>""" Скрипт из файлов с тиковыми данными делает файл с рандже барами """ import re from datetime import datetime from pathlib import * import pandas as pd def zero_hour(cell): """ Функция преобразует время (с финама приходят часы без нулей (с марта 2021), которые pandas не воспринимает)""" cell = f'{int(cell)}' tmp_time = datetime.strptime(cell, "%H%M%S") return tmp_time.strftime("%H%M%S") def run(tick_files: list[Path], razmer: int, target_dir: Path): for ind_file, tick_file in enumerate(tick_files, start=1): # Итерация по тиковым файлам list_split = re.split('_', tick_file.name, maxsplit=0) # Разделение имени файла по '_' tiker = list_split[0] # Получение тикера из имени файла date_quote_file = re.findall(r'\d+', str(tick_file)) # Получение цифр из пути к файлу target_name = f'{tiker}_range{razmer}_{date_quote_file[0]}.txt' # Создание имени новому файлу target_file_range: Path = Path(target_dir / target_name) # Составление пути к новому файлу if Path.is_file(target_file_range): print(f'Файл уже существует {target_file_range}') continue else: df_ticks_file: pd = pd.read_csv(tick_file, delimiter=',') # Считываем тиковые данные в DF # Создание DF под рандже бары одного тикового файла df: pd = pd.DataFrame(columns='<DATE> <TIME> <OPEN> <HIGH> <LOW> <CLOSE> <VOL>'.split(' ')) for tick in df_ticks_file.itertuples(): # Итерация по строкам тикового DF print('\rCompleted file: {:.2f}%. Completed files: {:.2f}%'.format( tick[0] * 100 / len(df_ticks_file.index), ind_file * 100 / len(tick_files) ), end='' ) if tick[0] == 0: # Добавление строки в DF с рандже барами df.loc[len(df.index)] = [int(tick[1]), int(tick[2]), tick[3], tick[3], tick[3], tick[3], tick[4]] continue # Если бар сформирован по размеру возрастающий бар if df.loc[len(df.index) - 1, '<LOW>'] + razmer < tick[3]: df.loc[len(df.index) - 1, '<CLOSE>'] = df.loc[len(df.index) - 1, '<LOW>'] + razmer df.loc[len(df.index) - 1, '<HIGH>'] = df.loc[len(df.index) - 1, '<CLOSE>'] # Добавление строки в DF с дельта барами df.loc[len(df.index)] = [int(tick[1]), int(tick[2]), tick[3], tick[3], tick[3], tick[3], tick[4]] continue # break # Если бар сформирован по размеру падающий бар if df.loc[len(df) - 1, '<HIGH>'] - razmer > tick[3]: df.loc[len(df) - 1, '<CLOSE>'] = df.loc[len(df) - 1, '<HIGH>'] - razmer df.loc[len(df) - 1, '<LOW>'] = df.loc[len(df) - 1, '<CLOSE>'] # Добавление строки в DF с дельта барами df.loc[len(df.index)] = [int(tick[1]), int(tick[2]), tick[3], tick[3], tick[3], tick[3], tick[4]] continue # break # Заполняем(изменяем) последнюю строку DF с рандже баром -------------------------------------- # Записываем <CLOSE> -------------------------------------------------------------------------- df.loc[len(df.index) - 1, '<CLOSE>'] = tick[3] # Записываем последнюю цену как цену close бара # Записываем <HIGH> --------------------------------------------------------------------------- if float(tick[3]) > df.loc[len(df) - 1, '<HIGH>']: # Если цена последнего тика больше чем high df.loc[len(df.index) - 1, '<HIGH>'] = tick[3] # Записываем цену последнего тика как high # Записываем <LOW> ---------------------------------------------------------------------------- if float(tick[3]) < df.loc[len(df.index) - 1, '<LOW>']: df.loc[len(df.index) - 1, '<LOW>'] = tick[3] # Записываем цену последней сделки как low # Записываем <VOL> ---------------------------------------------------------------------------- df.loc[len(df.index) - 1, '<VOL>'] += tick[4] # Увеличиваем объем # Изменение типа колонок df[['<DATE>', '<TIME>', '<VOL>']] = df[['<DATE>', '<TIME>', '<VOL>']].astype(int) # Преобразуем столбец <TIME>, где нужно добавив 0 перед часом df['<TIME>'] = df.apply(lambda x: zero_hour(x['<TIME>']), axis=1) df.to_csv(target_file_range, index=False) # Запись в файл для одного тикового файла # break if __name__ == "__main__": razmer: int = 250 ticker: str = 'RTS' year_tick: str = '2022' source_dir_tick: Path = Path(f'c:/data_quote/data_finam_{ticker}_tick') # Путь к ресурсному каталогу target_dir: Path = Path(f'c:/data_quote/data_prepare_{ticker}_range') # Путь к целевому каталогу # Создание списка путей к файлам с тиками tick_files: list[Path] = list(source_dir_tick.glob(f'*{year_tick}*.csv')) run(tick_files, razmer, target_dir) </code>
Привет, Всем!
Хотел бы рассчитать размерность range баров, чтобы их количество в одном дне было бы как и количество 5 мин баров.
Написал скрипт но значения так разнятся. Может кто-то уже занимался таким вопросом?
Рассчитанное значение величины range в поле <RAZMER>
<code>""" Для расчета рендж баров эквивалентных 5 мин """ from pathlib import * import pandas as pd import talib def body(open: float, close: float) -> float: return abs(close - open) if __name__ == "__main__": # 198 баров 5м в дне (с 7:00) period: int = 198 source_file: Path = Path('c:\data_quote\data_finam_RTS_5m\SPFB.RTS_210301_220131.csv') df: pd = pd.read_csv(source_file, delimiter=',') # Считываем тиковые данные в DF # Преобразуем столбец <TIME>, где нужно добавив 0 перед часом df['<BODY>'] = df.apply(lambda x: body(x['<OPEN>'], x['<CLOSE>']), axis=1) df['<RAZMER>'] = talib.MA(df['<BODY>'], timeperiod=period, matype=0) df_15: pd = df.loc[df['<TIME>'] == 150000] # Бары в 15:00 print(df_15.tail(20)) """ Получается, что рендж бар для фьючерса RTS должен быть размером 250, чтобы количество баров в дне, примерно совпадало с с количеством 5 мин баров. """</code>
Всем привет)
В последнее время опять стали всплывать странные люди с мифами и откровенной ложью про меня, в том числе о том, что случилось со мной и моими клиентами в 18-ом году. Хотя достоверной информации об этом в сети масса и давно уже можно было во всем разобраться, что нормальные люди давно и сделали. Но есть те, кому факты не нужны, а нужно распускать сплетни, преследуя разные цели, в том числе и просто хайпануть на известном имени, не особо разбираясь вообще в сути вопроса. Обычно я таких людей игнорирую, понимая истинную (часто неадекватную) мотивацию их деятельности, да и мнение такой публики меня совершенно не интересует.
Однако, после того как меня выбрали председателем Национального Союза Трейдеров — я в некотором роде перестал принадлежать только себе и теперь любая тень на мою репутацию может бросить тень и на всю нашу команду профессионалов и единомышленников, которые поставили своей целью помогать частным трейдерам и инвесторам в защите их прав и уже второй год занимаются этой благородной и очень нужной многим людям деятельностью.
Для русского брокера:
Подробная — для тех, кто подает в первый раз:https://disk.yandex.ru/i/A4LQ8EzmGT4KNg
Никто не хочет богатеть медленно. Жажда халявы и легких денег будто бы зашита в менталитет русского человека. Я не перестаю удивляться людям, которые до сих пор верят в волшебную кнопку «бабло», нажав на которую можно быстро получить материальное богатство, ничем не рискуя. Действительность такова, что реальное «бабло» получают создатели таких кнопок, а не обычные пользователи. Казино запретили, ставки на спорт уже не так популярны, хайп на торги по банкротству вроде прошел, а вот инвестиции/акции/криптовалюта/картинки NFT — это то, на чем сегодня пытаются подняться искатели легких денег.
Хочу вам показать к чему может привести путь типичного «начинающего инвестора», который решил заработать деньжат, скачав брокерское приложение на свой смартфон. Этот пост будет ярким примером того «как не нужно делать» и к чему могут привести беспорядочные половые сделки на бирже.