Предварительные требования:
- Установленный Python: Убедитесь, что у вас установлен Python (версия 3.6 или выше).
Код на Python:
import datetime
def parse_trade_data(trade_string):
"""Разбирает строку сделки на время, цену и объем."""
parts = trade_string.split()
if len(parts) != 3:
return None
try:
time_str, price_str, volume_str = parts
time_obj = datetime.datetime.strptime(time_str, '%H:%M:%S').time()
price = float(price_str)
volume = int(volume_str.replace(',',''))
return time_obj, price, volume
except ValueError:
return None
def create_candles(trades, time_frame_minutes=1):
"""Преобразует массив сделок в массив свечей."""
candles = []
current_candle = None
start_time = None
for trade_string in trades:
trade = parse_trade_data(trade_string)
if trade is None:
continue
time_obj, price, volume = trade
time_dt = datetime.datetime.combine(datetime.date.today(), time_obj) # Преобразуем time в datetime
if start_time is None:
start_time = time_dt
time_diff = (time_dt - start_time).total_seconds() / 60 # Разница в минутах
if current_candle is None:
# Начало новой свечи
current_candle = {
'open': price,
'high': price,
'low': price,
'close': price,
'volume': volume,
'start_time': time_dt
}
elif time_diff < time_frame_minutes:
# Продолжение текущей свечи
current_candle['high'] = max(current_candle['high'], price)
current_candle['low'] = min(current_candle['low'], price)
current_candle['close'] = price
current_candle['volume'] += volume
else:
# Свеча завершена, добавляем в массив и начинаем новую
candles.append(current_candle)
start_time = time_dt
current_candle = {
'open': price,
'high': price,
'low': price,
'close': price,
'volume': volume,
'start_time': time_dt
}
# Добавляем последнюю свечу
if current_candle:
candles.append(current_candle)
return candles
if __name__ == "__main__":
trade_data = [
"10:00:00 109000 15",
"10:00:01 109500 16",
"10:00:15 109200 10",
"10:00:30 109700 20",
"10:00:45 109600 12",
"10:01:00 109800 18",
"10:01:15 109900 22",
"10:01:30 109800 15",
"10:01:45 109600 11",
"10:02:00 109500 10",
"10:14:59 108700 14",
"10:16:01 108800 13",
"10:17:00 109000 18"
]
candles = create_candles(trade_data, time_frame_minutes=1)
for candle in candles:
print(f"Start Time: {candle['start_time'].strftime('%H:%M:%S')}, Open: {candle['open']}, High: {candle['high']}, Low: {candle['low']}, Close: {candle['close']}, Volume:{candle['volume']}")
Объяснение кода:
- Импорт библиотеки
datetime
:datetime
: используется для работы с датой и временем.
- Функция
parse_trade_data(trade_string)
:- Принимает строку со сделкой в формате
"время цена объем"
. - Разделяет строку на части, используя пробелы в качестве разделителя.
- Проверяет, что количество частей равно 3 (время, цена, объем).
- Использует
datetime.datetime.strptime()
для преобразования строки времени в объектdatetime.time
. - Преобразует цену в
float
, объем вint
(предварительно удаляя запятую в тысячных разрядах). - Возвращает время, цену и объем в виде кортежа или
None
в случае ошибки.
- Принимает строку со сделкой в формате
- Функция
create_candles(trades, time_frame_minutes=1)
:- Принимает массив строк со сделками
trades
и размер таймфрейма в минутахtime_frame_minutes
. - Инициализирует пустой массив
candles
для хранения сформированных свечей. - Инициализирует
current_candle
какNone
(для хранения данных текущей свечи). - Инициализирует
start_time
какNone
(для отсчета времени начала свечи). - Проходит по каждой строке сделки в массиве
trades
: - Разбирает строку на время, цену и объем с помощью
parse_trade_data()
. - Использует
datetime.datetime.combine()
для преобразования времени вdatetime
(для возможности считать разницу между временем сделок) - Если
start_time
не задано, устанавливаем его на время первой сделки - Высчитываем разницу во времени между текущей сделкой и началом текущей свечи.
- Если
current_candle
еще не создан (первая сделка для свечи): - Создает словарь
current_candle
с ключами: open
: цена открытия (цена текущей сделки).high
: максимум (цена текущей сделки).low
: минимум (цена текущей сделки).close
: цена закрытия (цена текущей сделки).volume
: суммарный объемstart_time
: время начала свечи
- Создает словарь
- Иначе если время сделки в пределах времени текущей свечи:
- Обновляет максимум, если текущая цена больше максимума
- Обновляет минимум, если текущая цена меньше минимума
- Обновляет цену закрытия текущей сделкой
- Обновляет суммарный объем
- Иначе (новая свеча)
- добавляем текущую свечу в массив свечей
- устанавливаем время начала свечи
- Создаем новую свечу
- Разбирает строку на время, цену и объем с помощью
- Если
current_candle
все еще существует (последняя свеча) - добавляем его в массивcandles
- Возвращает массив свечей
candles
.
- Принимает массив строк со сделками
- Основной блок
if __name__ == "__main__":
:- Создает тестовый массив
trade_data
со строками сделок. - Вызывает функцию
create_candles
с тестовыми данными и временем в 1 минуту. - Проходит по массиву свечей и выводит их в консоль.
- Создает тестовый массив
Как использовать код:
- Сохраните код в файл с расширением
.py
, например,candles_converter.py
. - Запустите скрипт из командной строки или терминала:
python candles_converter.py
.
Этот код на Python показывает, как преобразовать данные о сделках в японские свечи. Код хорошо прокомментирован, что поможет вам разобраться в каждом его шаге. Теперь вы можете использовать этот код как основу для своих собственных торговых роботов и систем.