Add funding rate watcher (#2)
* Add FundingRate interfaces and worker * Add build on PR * Remove zip * Specify the solution path * Add build for worker too * Set up StatisticService.cs for funding rate * Add Fundingrate alerts * Send alert when big funding rate change + add SlashCommands.cs for fundingrate * Remove fixtures * Refact names * Renames
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using Managing.Common;
|
||||
using Managing.Domain.Accounts;
|
||||
using Managing.Domain.Candles;
|
||||
using Managing.Domain.Statistics;
|
||||
using Managing.Domain.Trades;
|
||||
using static Managing.Common.Enums;
|
||||
|
||||
@@ -36,4 +37,5 @@ public interface IExchangeProcessor
|
||||
Orderbook GetOrderbook(Account account, Ticker ticker);
|
||||
Task<List<Trade>> GetOrders(Account account, Ticker ticker);
|
||||
Task<Trade> GetTrade(string reference, string orderId, Ticker ticker);
|
||||
Task<List<FundingRate>> GetFundingRates();
|
||||
}
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
using Managing.Domain.Trades;
|
||||
using Managing.Application.Abstractions.Repositories;
|
||||
using Managing.Application.Abstractions.Services;
|
||||
using Managing.Domain.Accounts;
|
||||
using Managing.Domain.Candles;
|
||||
using Managing.Domain.Statistics;
|
||||
using Managing.Domain.Trades;
|
||||
using Managing.Infrastructure.Exchanges.Abstractions;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using static Managing.Common.Enums;
|
||||
using Managing.Domain.Accounts;
|
||||
using Managing.Application.Abstractions.Repositories;
|
||||
using Managing.Application.Abstractions.Services;
|
||||
using Managing.Infrastructure.Exchanges.Abstractions;
|
||||
|
||||
namespace Managing.Infrastructure.Exchanges
|
||||
{
|
||||
@@ -145,6 +146,12 @@ namespace Managing.Infrastructure.Exchanges
|
||||
return await processor.GetTrade(reference, orderId, ticker);
|
||||
}
|
||||
|
||||
public Task<List<FundingRate>> GetFundingRates()
|
||||
{
|
||||
var processor = _exchangeProcessor.First(e => e.Exchange() == Common.Enums.TradingExchanges.Evm);
|
||||
return processor.GetFundingRates();
|
||||
}
|
||||
|
||||
public async Task<List<Trade>> GetTrades(Account account, Ticker ticker)
|
||||
{
|
||||
var processor = GetProcessor(account);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using Managing.Common;
|
||||
using Managing.Domain.Accounts;
|
||||
using Managing.Domain.Candles;
|
||||
using Managing.Domain.Statistics;
|
||||
using Managing.Domain.Trades;
|
||||
using Managing.Infrastructure.Exchanges.Abstractions;
|
||||
using static Managing.Common.Enums;
|
||||
@@ -26,5 +27,6 @@ namespace Managing.Infrastructure.Exchanges.Exchanges
|
||||
public abstract Task<List<Balance>> GetBalances(Account account, bool isForPaperTrading = false);
|
||||
public abstract Task<List<Trade>> GetOrders(Account account, Ticker ticker);
|
||||
public abstract Task<Trade> GetTrade(string reference, string orderId, Ticker ticker);
|
||||
public abstract Task<List<FundingRate>> GetFundingRates();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ using Managing.Common;
|
||||
using Managing.Core;
|
||||
using Managing.Domain.Accounts;
|
||||
using Managing.Domain.Candles;
|
||||
using Managing.Domain.Statistics;
|
||||
using Managing.Domain.Trades;
|
||||
using Managing.Infrastructure.Exchanges.Helpers;
|
||||
using Microsoft.Extensions.Logging;
|
||||
@@ -98,6 +99,11 @@ public class BinanceProcessor : BaseProcessor
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override Task<List<FundingRate>> GetFundingRates()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override async Task<List<Trade>> GetTrades(Account account, Ticker ticker)
|
||||
{
|
||||
var binanceOrder =
|
||||
|
||||
@@ -3,6 +3,7 @@ using Managing.Common;
|
||||
using Managing.Domain.Accounts;
|
||||
using Managing.Domain.Candles;
|
||||
using Managing.Domain.Evm;
|
||||
using Managing.Domain.Statistics;
|
||||
using Managing.Domain.Trades;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using static Managing.Common.Enums;
|
||||
@@ -96,6 +97,11 @@ public class EvmProcessor : BaseProcessor
|
||||
return await _evmManager.GetTrade(reference, Constants.Chains.Arbitrum, ticker);
|
||||
}
|
||||
|
||||
public override async Task<List<FundingRate>> GetFundingRates()
|
||||
{
|
||||
return await _evmManager.GetFundingRates();
|
||||
}
|
||||
|
||||
public override decimal GetVolume(Account account, Ticker ticker)
|
||||
{
|
||||
var volume = _evmManager.GetVolume(SubgraphProvider.ChainlinkPrice, ticker);
|
||||
|
||||
@@ -4,6 +4,7 @@ using FTX.Net.Objects;
|
||||
using Managing.Common;
|
||||
using Managing.Domain.Accounts;
|
||||
using Managing.Domain.Candles;
|
||||
using Managing.Domain.Statistics;
|
||||
using Managing.Domain.Trades;
|
||||
using Managing.Infrastructure.Exchanges.Helpers;
|
||||
using Microsoft.Extensions.Logging;
|
||||
@@ -194,4 +195,9 @@ public class FtxProcessor : BaseProcessor
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override Task<List<FundingRate>> GetFundingRates()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ using Kraken.Net.Objects.Options;
|
||||
using Managing.Common;
|
||||
using Managing.Domain.Accounts;
|
||||
using Managing.Domain.Candles;
|
||||
using Managing.Domain.Statistics;
|
||||
using Managing.Domain.Trades;
|
||||
using Managing.Infrastructure.Exchanges.Helpers;
|
||||
using Microsoft.Extensions.Logging;
|
||||
@@ -92,6 +93,11 @@ public class KrakenProcessor : BaseProcessor
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override Task<List<FundingRate>> GetFundingRates()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override async Task<List<Trade>> GetTrades(Account account, Ticker ticker)
|
||||
{
|
||||
LoadClient(account);
|
||||
|
||||
@@ -19,7 +19,8 @@ namespace Managing.Infrastructure.Exchanges.Helpers
|
||||
|
||||
return new Trade(data.CreateTime,
|
||||
(data.Side == OrderSide.Buy) ? TradeDirection.Long : TradeDirection.Short,
|
||||
(TradeStatus)data.Status, (TradeType)data.OriginalType, MiscExtensions.ParseEnum<Ticker>(data.Symbol), data.Quantity, data.AveragePrice, 1,
|
||||
(TradeStatus)data.Status, (TradeType)data.OriginalType, MiscExtensions.ParseEnum<Ticker>(data.Symbol),
|
||||
data.Quantity, data.AveragePrice, 1,
|
||||
data.ClientOrderId, "");
|
||||
}
|
||||
|
||||
@@ -68,8 +69,8 @@ namespace Managing.Infrastructure.Exchanges.Helpers
|
||||
}
|
||||
|
||||
return new Trade(DateTime.Now, TradeDirection.None,
|
||||
TradeStatus.Cancelled, TradeType.Market, Ticker.BTC, 0, 0, 0,
|
||||
"", result.Error?.Message);
|
||||
TradeStatus.Cancelled, TradeType.Market, Ticker.BTC, 0, 0, 0,
|
||||
"", result.Error?.Message);
|
||||
}
|
||||
|
||||
public static Candle Map(IBinanceKline binanceKline, Ticker ticker, Enums.TradingExchanges exchange)
|
||||
@@ -115,16 +116,12 @@ namespace Managing.Infrastructure.Exchanges.Helpers
|
||||
return "ATOMUSDT";
|
||||
case Ticker.AVAX:
|
||||
return "AVAXUSDT";
|
||||
case Ticker.BAT:
|
||||
return "BATUSDT";
|
||||
case Ticker.BNB:
|
||||
return "BNBUSDT";
|
||||
case Ticker.BTC:
|
||||
return "BTCUSDT";
|
||||
case Ticker.CRV:
|
||||
return "CRVUSDT";
|
||||
case Ticker.DEFI:
|
||||
return "DEFIUSDT";
|
||||
case Ticker.DOGE:
|
||||
return "DOGEUSDT";
|
||||
case Ticker.DOT:
|
||||
@@ -143,8 +140,6 @@ namespace Managing.Infrastructure.Exchanges.Helpers
|
||||
return "GRTUSDT";
|
||||
case Ticker.IMX:
|
||||
return "IMXUSDT";
|
||||
case Ticker.KAVA:
|
||||
return "KAVAUSDT";
|
||||
case Ticker.KSM:
|
||||
return "KSMUSDT";
|
||||
case Ticker.LINK:
|
||||
@@ -159,10 +154,6 @@ namespace Managing.Infrastructure.Exchanges.Helpers
|
||||
return "MKRUSDT";
|
||||
case Ticker.NEAR:
|
||||
return "NEARUSDT";
|
||||
case Ticker.NEO:
|
||||
return "NEOUSDT";
|
||||
case Ticker.ONT:
|
||||
return "ONTUSDT";
|
||||
case Ticker.SAND:
|
||||
return "SANDUSDT";
|
||||
case Ticker.SOL:
|
||||
@@ -175,19 +166,16 @@ namespace Managing.Infrastructure.Exchanges.Helpers
|
||||
return "THETAUSDT";
|
||||
case Ticker.UNI:
|
||||
return "UNIUSDT";
|
||||
case Ticker.WAVES:
|
||||
return "WAVESUSDT";
|
||||
case Ticker.XMR:
|
||||
return "XMRUSDT";
|
||||
case Ticker.XRP:
|
||||
return "XRPUSDT";
|
||||
case Ticker.XTZ:
|
||||
return "XTZUSDT";
|
||||
case Ticker.ZEC:
|
||||
return "ZECUSDT";
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
@@ -200,4 +188,4 @@ namespace Managing.Infrastructure.Exchanges.Helpers
|
||||
public class BinanceFuturesPlacedOrder
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,28 +19,18 @@ namespace Managing.Infrastructure.Exchanges.Helpers
|
||||
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:
|
||||
@@ -49,10 +39,6 @@ namespace Managing.Infrastructure.Exchanges.Helpers
|
||||
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:
|
||||
@@ -73,26 +59,14 @@ namespace Managing.Infrastructure.Exchanges.Helpers
|
||||
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:
|
||||
@@ -105,18 +79,8 @@ namespace Managing.Infrastructure.Exchanges.Helpers
|
||||
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:
|
||||
@@ -131,35 +95,22 @@ namespace Managing.Infrastructure.Exchanges.Helpers
|
||||
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();
|
||||
}
|
||||
|
||||
@@ -177,7 +128,8 @@ namespace Managing.Infrastructure.Exchanges.Helpers
|
||||
|
||||
return new Trade(data.CreateTime,
|
||||
(data.Side == OrderSide.Buy) ? TradeDirection.Long : TradeDirection.Short,
|
||||
(TradeStatus)data.Status, (TradeType)data.Type, MiscExtensions.ParseEnum<Ticker>(data.Symbol), data.Quantity, data.AverageFillPrice ?? 0, leverage,
|
||||
(TradeStatus)data.Status, (TradeType)data.Type, MiscExtensions.ParseEnum<Ticker>(data.Symbol),
|
||||
data.Quantity, data.AverageFillPrice ?? 0, leverage,
|
||||
data.ClientOrderId, "");
|
||||
}
|
||||
|
||||
@@ -194,7 +146,8 @@ namespace Managing.Infrastructure.Exchanges.Helpers
|
||||
|
||||
return new Trade(data.CreateTime,
|
||||
(data.Side == OrderSide.Buy) ? TradeDirection.Long : TradeDirection.Short,
|
||||
(TradeStatus)data.Status, (TradeType)data.Type, MiscExtensions.ParseEnum<Ticker>(data.Symbol), data.Quantity, data.TriggerPrice ?? 0, leverage,
|
||||
(TradeStatus)data.Status, (TradeType)data.Type, MiscExtensions.ParseEnum<Ticker>(data.Symbol),
|
||||
data.Quantity, data.TriggerPrice ?? 0, leverage,
|
||||
Guid.NewGuid().ToString(), "");
|
||||
}
|
||||
|
||||
@@ -217,7 +170,8 @@ namespace Managing.Infrastructure.Exchanges.Helpers
|
||||
return null;
|
||||
|
||||
return new Trade(data.CreateTime, TradeDirection.None,
|
||||
(TradeStatus)data.Status, (TradeType)data.Type, MiscExtensions.ParseEnum<Ticker>(data.Symbol), data.Quantity, data.AverageFillPrice ?? 0, 0,
|
||||
(TradeStatus)data.Status, (TradeType)data.Type, MiscExtensions.ParseEnum<Ticker>(data.Symbol),
|
||||
data.Quantity, data.AverageFillPrice ?? 0, 0,
|
||||
data.ClientOrderId, "");
|
||||
}
|
||||
|
||||
@@ -280,7 +234,7 @@ namespace Managing.Infrastructure.Exchanges.Helpers
|
||||
|
||||
private static List<OrderBookEntry> Map(IEnumerable<FTXOrderBookEntry> entry)
|
||||
{
|
||||
return entry.Select(ask => new OrderBookEntry() { Price = ask.Price, Quantity = ask.Quantity}).ToList();
|
||||
return entry.Select(ask => new OrderBookEntry() { Price = ask.Price, Quantity = ask.Quantity }).ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user