Table of Contents

Конвертация типов

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

Основные функции

  1. Преобразование типов StockSharp (например, Sides, OrderTypes, TimeInForce) в строковые представления, используемые биржей.
  2. Обратное преобразование данных, полученных от биржи, в типы StockSharp.
  3. Конвертация идентификаторов инструментов между форматами StockSharp и биржи.
  4. Преобразование временных форматов и таймфреймов.

Пример реализации

Ниже приведен пример класса с методами расширения для конвертации типов:

static class Extensions
{
    // Конвертация направления заявки StockSharp в строковое представление биржи
    public static string ToNative(this Sides side)
    {
        return side switch
        {
            Sides.Buy => "buy",
            Sides.Sell => "sell",
            _ => throw new ArgumentOutOfRangeException(nameof(side), side, LocalizedStrings.InvalidValue),
        };
    }

    // Конвертация строкового представления направления заявки биржи в тип StockSharp
    public static Sides ToSide(this string side)
        => side?.ToLowerInvariant() switch
        {
            "buy" or "bid" => Sides.Buy,
            "sell" or "ask" or "offer" => Sides.Sell,
            _ => throw new ArgumentOutOfRangeException(nameof(side), side, LocalizedStrings.InvalidValue),
        };

    // Конвертация типа заявки StockSharp в строковое представление биржи
    public static string ToNative(this OrderTypes? type)
    {
        return type switch
        {
            null => null,
            OrderTypes.Limit => "limit",
            OrderTypes.Market => "market",
            OrderTypes.Conditional => "stop",
            _ => throw new ArgumentOutOfRangeException(nameof(type), type, LocalizedStrings.InvalidValue),
        };
    }

    // Конвертация строкового представления типа заявки биржи в тип StockSharp
    public static OrderTypes ToOrderType(this string type)
        => type?.ToLowerInvariant() switch
        {
            "limit" => OrderTypes.Limit,
            "market" => OrderTypes.Market,
            "stop" or "stop limit" => OrderTypes.Conditional,
            _ => throw new ArgumentOutOfRangeException(nameof(type), type, LocalizedStrings.InvalidValue),
        };

    // Другие методы конвертации...

    // Словарь для сопоставления таймфреймов StockSharp и строковых представлений биржи
    public static readonly PairSet<TimeSpan, string> TimeFrames = new()
    {
        { TimeSpan.FromMinutes(1), "ONE_MINUTE" },
        { TimeSpan.FromMinutes(5), "FIVE_MINUTE" },
        // Другие таймфреймы...
    };

    // Конвертация таймфрейма StockSharp в строковое представление биржи
    public static string ToNative(this TimeSpan timeFrame)
        => TimeFrames.TryGetValue(timeFrame) ?? throw new ArgumentOutOfRangeException(nameof(timeFrame), timeFrame, LocalizedStrings.InvalidValue);

    // Конвертация строкового представления таймфрейма биржи в TimeSpan
    public static TimeSpan ToTimeFrame(this string name)
        => TimeFrames.TryGetKey2(name) ?? throw new ArgumentOutOfRangeException(nameof(name), name, LocalizedStrings.InvalidValue);
}

Рекомендации

  • Используйте методы расширения для удобства использования функций конвертации.
  • Обрабатывайте все возможные значения перечислений, включая null и неизвестные значения.
  • Используйте switch выражения (C# 8.0+) для более чистого и читаемого кода.
  • Добавляйте проверки на недопустимые значения и выбрасывайте исключения с понятными сообщениями об ошибках.
  • Рассмотрите возможность использования словарей для сопоставления значений, особенно для сложных или часто изменяющихся соответствий (например, для таймфреймов).

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