Python: Преобразование данных о сделках в японские свечи (Практический пример)

В предыдущей статье мы рассмотрели теорию японских свечей и зачем они нужны трейдерам. Предыдущая статья: Теория японских свечей: Зачем преобразовывать данные о сделках? Теперь мы покажем, как реализовать преобразование данных о сделках в свечи на практике, используя Python. Мы разберем код, который принимает на вход массив строк вида "время цена объем" и преобразует их в массив свечей, с ценой открытия, максимумом, минимумом и ценой закрытия.

Предварительные требования:

  1. Установленный 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']}")
    
    

Объяснение кода:

  1. Импорт библиотеки datetime:
    • datetime: используется для работы с датой и временем.
  2. Функция parse_trade_data(trade_string):
    • Принимает строку со сделкой в формате "время цена объем".
    • Разделяет строку на части, используя пробелы в качестве разделителя.
    • Проверяет, что количество частей равно 3 (время, цена, объем).
    • Использует datetime.datetime.strptime() для преобразования строки времени в объект datetime.time.
    • Преобразует цену в float, объем в int (предварительно удаляя запятую в тысячных разрядах).
    • Возвращает время, цену и объем в виде кортежа или None в случае ошибки.
  3. Функция 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.
  4. Основной блок if __name__ == "__main__"::
    • Создает тестовый массив trade_data со строками сделок.
    • Вызывает функцию create_candles с тестовыми данными и временем в 1 минуту.
    • Проходит по массиву свечей и выводит их в консоль.

Как использовать код:

  1. Сохраните код в файл с расширением .py, например, candles_converter.py.
  2. Запустите скрипт из командной строки или терминала: python candles_converter.py.

Этот код на Python показывает, как преобразовать данные о сделках в японские свечи. Код хорошо прокомментирован, что поможет вам разобраться в каждом его шаге. Теперь вы можете использовать этот код как основу для своих собственных торговых роботов и систем.

Добавить комментарий

Оставить комментарий

Кликните на изображение чтобы обновить код, если он неразборчив