using CryptoExchange.Net.Objects; using FTX.Net.Enums; using FTX.Net.Objects.Models; using Managing.Common; using Managing.Core; using Managing.Domain.Candles; using Managing.Domain.Trades; using static Managing.Common.Enums; namespace Managing.Infrastructure.Exchanges.Helpers { public static class FtxHelpers { public static string ToFtxTicker(Ticker ticker) { switch (ticker) { case Ticker.ADA: return "ADA-PERP"; case Ticker.APE: return "APE-PERP"; case Ticker.ALICE: return "ALICE-PERP"; case Ticker.ALGO: return "ALGO-PERP"; case Ticker.ATOM: return "ATOM-PERP"; case Ticker.AVAX: return "AVAX-PERP"; case Ticker.AXS: return "AXS-PERP"; case Ticker.BAT: return "BAT-PERP"; case Ticker.BNB: return "BNB-PERP"; case Ticker.BTC: return "BTC-PERP"; case Ticker.BAL: return "BAL-PERP"; case Ticker.C98: return "C98-PERP"; case Ticker.CHR: return "CHR-PERP"; case Ticker.CHZ: return "CHZ-PERP"; case Ticker.COMP: return "COMP-PERP"; case Ticker.CRO: return "CRO-PERP"; case Ticker.CRV: return "CRV-PERP"; case Ticker.CVC: return "CVC-PERP"; case Ticker.DEFI: return "DEFI-PERP"; case Ticker.DOGE: return "DOGE-PERP"; case Ticker.DOT: return "DOT-PERP"; case Ticker.DYDX: return "DYDX-PERP"; case Ticker.ENS: return "ENS-PERP"; case Ticker.ETC: return "ETC-PERP"; case Ticker.ETH: return "ETH-PERP"; case Ticker.FIL: return "FIL-PERP"; case Ticker.FLM: return "FLM-PERP"; case Ticker.FTM: return "FTM-PERP"; case Ticker.GALA: return "GALA-PERP"; case Ticker.GMT: return "GMT-PERP"; case Ticker.GRT: return "GRT-PERP"; case Ticker.HNT: return "HNT-PERP"; case Ticker.IMX: return "IMX-PERP"; case Ticker.JASMY: return "JASMY-PERP"; case Ticker.KAVA: return "KAVA-PERP"; case Ticker.KSM: return "KSM-PERP"; case Ticker.LDO: return "LDO-PERP"; case Ticker.LINK: return "LINK-PERP"; case Ticker.LOOKS: return "LOOKS-PERP"; case Ticker.LRC: return "LRC-PERP"; case Ticker.LTC: return "LTC-PERP"; case Ticker.MANA: return "MANA-PERP"; case Ticker.MATIC: return "MATIC-PERP"; case Ticker.MKR: return "MKR-PERP"; case Ticker.NEAR: return "NEAR-PERP"; case Ticker.NEO: return "NEO-PERP"; case Ticker.OMG: return "OMG-PERP"; case Ticker.ONE: return "ONE-PERP"; case Ticker.ONT: return "ONT-PERP"; case Ticker.QTUM: return "QTUM-PERP"; case Ticker.REEF: return "REEF-PERP"; case Ticker.REN: return "REN-PERP"; case Ticker.ROSE: return "ROSE-PERP"; case Ticker.RSR: return "RSR-PERP"; case Ticker.RUNE: return "RUNE-PERP"; case Ticker.SAND: return "SAND-PERP"; case Ticker.SOL: return "SOL-PERP"; case Ticker.SRM: return "SRM-PERP"; case Ticker.STMX: return "STMX-PERP"; case Ticker.SUSHI: return "SUSHI-PERP"; case Ticker.SXP: return "SXP-PERP"; case Ticker.THETA: return "THETA-PERP"; case Ticker.UNI: return "UNI-PERP"; case Ticker.VET: return "VET-PERP"; case Ticker.WAVES: return "WAVES-PERP"; case Ticker.XMR: return "XMR-PERP"; case Ticker.XRP: return "XRP-PERP"; case Ticker.XTZ: return "XTZ-PERP"; case Ticker.YFI: return "YFI-PERP"; case Ticker.ZEC: return "ZEC-PERP"; case Ticker.ZIL: return "ZIL-PERP"; default: break; } throw new NotImplementedException(); } public static Trade Map(WebCallResult result, decimal? leverage = null) { var data = result.Data; if (data == null) { return new Trade(DateTime.Now, TradeDirection.None, TradeStatus.Cancelled, TradeType.Market, Ticker.BTC, 0, 0, 0, "", result.Error?.Message); } return new Trade(data.CreateTime, (data.Side == OrderSide.Buy) ? TradeDirection.Long : TradeDirection.Short, (TradeStatus)data.Status, (TradeType)data.Type, MiscExtensions.ParseEnum(data.Symbol), data.Quantity, data.AverageFillPrice ?? 0, leverage, data.ClientOrderId, ""); } internal static Trade Map(WebCallResult ftxResult, decimal? leverage) { var data = ftxResult.Data; if (data == null) { return new Trade(DateTime.Now, TradeDirection.None, TradeStatus.Cancelled, TradeType.Market, Ticker.BTC, 0, 0, 0, "", ftxResult.Error?.Message); } return new Trade(data.CreateTime, (data.Side == OrderSide.Buy) ? TradeDirection.Long : TradeDirection.Short, (TradeStatus)data.Status, (TradeType)data.Type, MiscExtensions.ParseEnum(data.Symbol), data.Quantity, data.TriggerPrice ?? 0, leverage, Guid.NewGuid().ToString(), ""); } public static OrderType FtxOrderTypeMap(TradeType tradeType) { switch (tradeType) { case TradeType.Limit: return OrderType.Limit; case TradeType.Market: return OrderType.Market; default: return OrderType.Limit; } } public static Trade Map(FTXOrder data) { if (data == null) return null; return new Trade(data.CreateTime, TradeDirection.None, (TradeStatus)data.Status, (TradeType)data.Type, MiscExtensions.ParseEnum(data.Symbol), data.Quantity, data.AverageFillPrice ?? 0, 0, data.ClientOrderId, ""); } public static Candle Map( FTXKline ftxKline, Ticker ticker, Enums.TradingExchanges exchange, Timeframe timeframe) { return new Candle { Date = ftxKline.OpenTime, BaseVolume = ftxKline.Volume ?? 0, Close = ftxKline.ClosePrice, High = ftxKline.HighPrice, Low = ftxKline.LowPrice, Open = ftxKline.OpenPrice, Ticker = ticker.ToString(), OpenTime = ftxKline.OpenTime, Exchange = exchange, Timeframe = timeframe }; } internal static KlineInterval Map(Timeframe interval) => interval switch { Timeframe.FiveMinutes => KlineInterval.FiveMinutes, Timeframe.FifteenMinutes => KlineInterval.FifteenMinutes, Timeframe.OneHour => KlineInterval.OneHour, Timeframe.FourHour => KlineInterval.FourHours, Timeframe.OneDay => KlineInterval.OneDay, _ => throw new NotImplementedException(), }; internal static TriggerOrderType FtxTriggerOrderTypeMap(TradeType tradeType) => tradeType switch { TradeType.StopMarket => TriggerOrderType.Stop, TradeType.StopLimit => TriggerOrderType.Stop, TradeType.StopLoss => TriggerOrderType.Stop, TradeType.TakeProfit => TriggerOrderType.TakeProfit, TradeType.StopLossProfit => TriggerOrderType.Stop, TradeType.StopLossProfitLimit => TriggerOrderType.Stop, TradeType.StopLossLimit => TriggerOrderType.Stop, TradeType.TakeProfitLimit => TriggerOrderType.TakeProfit, TradeType.TrailingStop => TriggerOrderType.TrailingStop, TradeType.TrailingStopLimit => TriggerOrderType.TrailingStop, TradeType.StopLossAndLimit => TriggerOrderType.Stop, TradeType.SettlePosition => TriggerOrderType.Stop, _ => throw new NotImplementedException(), }; internal static Orderbook Map(WebCallResult ftxOrderBook) { return new Orderbook() { Asks = Map(ftxOrderBook.Data.Asks), Bids = Map(ftxOrderBook.Data.Bids) }; } private static List Map(IEnumerable entry) { return entry.Select(ask => new OrderBookEntry() { Price = ask.Price, Quantity = ask.Quantity}).ToList(); } } }