/
fgtmenow
/
tb
Обзор
Документация
Войти
/
fgtmenow
/
tb
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
__test/fixtures/ohlcv_data.py
184 строки
7 KB
Azarev Artem
Добавлена база знаний по стратегии Smart Money Trading, включая архитектуру, терминологию и торговые стратегии. Реализованы интерфейсы для типизации компонентов торгового бота и шаблон для торговых стратегий.
17 янв 2026, 03:39
17 янв 2026, 03:39
ab5fefa
Код
Авторство
О чём код?
""" Тестовые OHLCV данные для unit-тестов. Содержит образцы данных с известной рыночной структурой для тестирования алгоритмов анализа (swing points, BOS, CHoCH). """ import pandas as pd import numpy as np def create_uptrend_data() -> pd.DataFrame: """ Создаёт данные с восходящим трендом (серия HH-HL). Структура: - Начальный минимум (LL) - Максимум (HH) - Коррекция (HL) - Новый максимум (HH) - BOS - Коррекция (HL) - Подтверждение (HH) - Confirm Возвращает: DataFrame с OHLCV данными """ # Базовые цены для восходящего тренда prices = [ # timestamp, open, high, low, close, volume (1000, 100, 102, 98, 101, 1000), # 0: Начало (2000, 101, 103, 100, 102, 1100), # 1 (3000, 102, 105, 101, 104, 1200), # 2: Первый HH (4000, 104, 106, 103, 105, 1300), # 3 (5000, 105, 107, 104, 106, 1400), # 4: Swing High (HH) (6000, 106, 107, 102, 103, 1500), # 5: Коррекция (7000, 103, 104, 101, 102, 1600), # 6 (8000, 102, 103, 100, 101, 1700), # 7: Swing Low (HL) (9000, 101, 105, 100, 104, 1800), # 8 (10000, 104, 108, 103, 107, 1900), # 9: Новый HH (BOS) (11000, 107, 110, 106, 109, 2000), # 10: Продолжение (12000, 109, 111, 104, 105, 2100), # 11: Коррекция (13000, 105, 106, 103, 104, 2200), # 12: Swing Low (HL) (14000, 104, 108, 103, 107, 2300), # 13 (15000, 107, 113, 106, 112, 2400), # 14: Подтверждение (HH - Confirm) ] df = pd.DataFrame(prices, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']) df.index = pd.to_datetime(df['timestamp'], unit='ms') return df def create_downtrend_data() -> pd.DataFrame: """ Создаёт данные с нисходящим трендом (серия LH-LL). Структура: - Начальный максимум (HH) - Минимум (LL) - Коррекция (LH) - Новый минимум (LL) - BOS - Коррекция (LH) - Подтверждение (LL) - Confirm Возвращает: DataFrame с OHLCV данными """ prices = [ # timestamp, open, high, low, close, volume (1000, 110, 112, 108, 111, 1000), # 0: Начало (2000, 111, 113, 109, 110, 1100), # 1 (3000, 110, 112, 107, 108, 1200), # 2 (4000, 108, 110, 105, 106, 1300), # 3: Swing Low (LL) (5000, 106, 109, 104, 108, 1400), # 4: Коррекция (6000, 108, 111, 107, 110, 1500), # 5: Swing High (LH) (7000, 110, 111, 106, 107, 1600), # 6 (8000, 107, 108, 102, 103, 1700), # 7: Новый LL (BOS) (9000, 103, 107, 101, 106, 1800), # 8: Коррекция (10000, 106, 109, 105, 108, 1900), # 9: Swing High (LH) (11000, 108, 109, 103, 104, 2000), # 10 (12000, 104, 105, 98, 99, 2100), # 11: Подтверждение (LL - Confirm) ] df = pd.DataFrame(prices, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']) df.index = pd.to_datetime(df['timestamp'], unit='ms') return df def create_trend_reversal_data() -> pd.DataFrame: """ Создаёт данные со сменой тренда (CHoCH). Структура: - Нисходящий тренд (LH-LL) - Пробой последнего LH (CHoCH) - Восходящий тренд (HH-HL) Возвращает: DataFrame с OHLCV данными """ prices = [ # Нисходящий тренд (1000, 110, 112, 108, 109, 1000), # 0 (2000, 109, 111, 105, 106, 1100), # 1: LL (3000, 106, 109, 104, 108, 1200), # 2 (4000, 108, 110, 107, 109, 1300), # 3: LH (5000, 109, 110, 102, 103, 1400), # 4: LL (6000, 103, 106, 101, 105, 1500), # 5 (7000, 105, 108, 104, 107, 1600), # 6: LH # Смена тренда (CHoCH) (8000, 107, 112, 106, 111, 1700), # 7: Пробой LH (CHoCH) (9000, 111, 114, 109, 113, 1800), # 8: HH (10000, 113, 115, 108, 109, 1900), # 9: Коррекция (11000, 109, 110, 107, 108, 2000), # 10: HL (12000, 108, 117, 107, 116, 2100), # 11: Подтверждение (HH - Confirm) ] df = pd.DataFrame(prices, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']) df.index = pd.to_datetime(df['timestamp'], unit='ms') return df def create_sideways_data() -> pd.DataFrame: """ Создаёт данные с боковым движением (без явного тренда). Цена колеблется в диапазоне без формирования HH или LL. Возвращает: DataFrame с OHLCV данными """ prices = [ (1000, 100, 103, 98, 101, 1000), (2000, 101, 104, 99, 102, 1100), (3000, 102, 105, 100, 101, 1200), (4000, 101, 103, 98, 100, 1300), (5000, 100, 104, 97, 103, 1400), (6000, 103, 105, 99, 100, 1500), (7000, 100, 102, 98, 101, 1600), (8000, 101, 104, 99, 102, 1700), (9000, 102, 103, 97, 99, 1800), (10000, 99, 103, 98, 102, 1900), ] df = pd.DataFrame(prices, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']) df.index = pd.to_datetime(df['timestamp'], unit='ms') return df def create_simple_swing_data() -> pd.DataFrame: """ Создаёт простые данные для тестирования обнаружения swing points. Явные максимумы и минимумы с большим окном. Возвращает: DataFrame с OHLCV данными """ # Создаём синусоидальное движение цены n_points = 50 timestamps = list(range(1000, 1000 + n_points * 1000, 1000)) # Базовая цена + синусоида base_price = 100 amplitude = 10 period = 10 # баров на цикл prices = [] for i in range(n_points): # Синусоидальное изменение phase = (i / period) * 2 * np.pi center = base_price + amplitude * np.sin(phase) # OHLC вокруг центра volatility = 1 open_price = center + np.random.uniform(-volatility, volatility) close_price = center + np.random.uniform(-volatility, volatility) high_price = max(open_price, close_price) + np.random.uniform(0, volatility) low_price = min(open_price, close_price) - np.random.uniform(0, volatility) volume = 1000 + i * 10 prices.append((timestamps[i], open_price, high_price, low_price, close_price, volume)) df = pd.DataFrame(prices, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']) df.index = pd.to_datetime(df['timestamp'], unit='ms') return df