96 lines
3.4 KiB
C#
96 lines
3.4 KiB
C#
using KLHZ.Trader.Core.Common;
|
|
using KLHZ.Trader.Core.Contracts.Declisions.Dtos.Enums;
|
|
using KLHZ.Trader.Core.Contracts.Messaging.Dtos.Interfaces;
|
|
using KLHZ.Trader.Core.DataLayer.Entities.Prices;
|
|
using KLHZ.Trader.Core.Exchange.Interfaces;
|
|
using KLHZ.Trader.Core.Exchange.Models.AssetsAccounting;
|
|
|
|
namespace KLHZ.Trader.Core.Exchange.Utils
|
|
{
|
|
internal static class TraderUtils
|
|
{
|
|
internal static Dictionary<TradingEvent, decimal> MergeResultsMult(IDictionary<TradingEvent, decimal> result, IDictionary<TradingEvent, decimal> data)
|
|
{
|
|
var res = new Dictionary<TradingEvent, decimal>();
|
|
foreach (var k in result.Keys)
|
|
{
|
|
var valRes = result[k];
|
|
var valData = data[k];
|
|
res[k] = valRes * valData;
|
|
}
|
|
return res;
|
|
}
|
|
|
|
internal static Dictionary<TradingEvent, decimal> MergeResultsMax(IDictionary<TradingEvent, decimal> result, IDictionary<TradingEvent, decimal> data)
|
|
{
|
|
var res = new Dictionary<TradingEvent, decimal>();
|
|
foreach (var k in result.Keys)
|
|
{
|
|
var valRes = result[k];
|
|
var valData = result[k];
|
|
res[k] = System.Math.Max(valRes, valData);
|
|
}
|
|
return res;
|
|
}
|
|
|
|
internal static Dictionary<TradingEvent, decimal> GetInitDict(decimal initValue)
|
|
{
|
|
var values = Enum.GetValues<TradingEvent>();
|
|
return values.ToDictionary(v => v, v => initValue);
|
|
}
|
|
|
|
internal static bool IsOperationAllowed(IManagedAccount account, decimal boutPrice, decimal count,
|
|
decimal accountCashPartFutures, decimal accountCashPart)
|
|
{
|
|
if (!BotModeSwitcher.CanPurchase()) return false;
|
|
|
|
var balance = account.Balance;
|
|
var total = account.Total;
|
|
|
|
var futures = account.Assets.Values.FirstOrDefault(v => v.Type == AssetType.Futures);
|
|
if (futures != null)
|
|
{
|
|
if ((balance - boutPrice * count) / total < accountCashPartFutures) return false;
|
|
}
|
|
else
|
|
{
|
|
if ((balance - boutPrice * count) / total < accountCashPart) return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
internal static ITradeDataItem FilterHighFreqValues(ITradeDataItem message, Dictionary<string, List<ITradeDataItem>> pricesCache1)
|
|
{
|
|
if (!pricesCache1.TryGetValue(message.Figi, out var list))
|
|
{
|
|
list = new List<ITradeDataItem>();
|
|
pricesCache1[message.Figi] = list;
|
|
}
|
|
list.Add(message);
|
|
|
|
if ((list.Last().Time - list.First().Time).TotalSeconds < 0.5)
|
|
{
|
|
list.Add(message);
|
|
return message;
|
|
}
|
|
else
|
|
{
|
|
message = new PriceChange()
|
|
{
|
|
Figi = message.Figi,
|
|
Ticker = message.Ticker,
|
|
Count = list.Sum(l => l.Count),
|
|
Direction = message.Direction,
|
|
IsHistoricalData = message.IsHistoricalData,
|
|
Time = message.Time,
|
|
Price = list.Sum(l => l.Price) / list.Count
|
|
};
|
|
list.Clear();
|
|
return message;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|