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:
Oda
2024-07-19 08:31:09 +07:00
committed by GitHub
parent 545c9d8e4a
commit 029ba5f40e
41 changed files with 914 additions and 304 deletions

View File

@@ -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();
}

View File

@@ -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);

View File

@@ -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();
}
}

View File

@@ -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 =

View File

@@ -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);

View File

@@ -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();
}
}

View File

@@ -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);

View File

@@ -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
{
}
}
}

View File

@@ -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();
}
}
}
}