фиксация первой версии
parent
9114dda27f
commit
81d772fea9
|
@ -1,6 +1,7 @@
|
||||||
using KLHZ.Trader.Core.Common;
|
using KLHZ.Trader.Core.Common;
|
||||||
using KLHZ.Trader.Core.Contracts.Declisions.Dtos.Enums;
|
using KLHZ.Trader.Core.Contracts.Declisions.Dtos.Enums;
|
||||||
using KLHZ.Trader.Core.Contracts.Declisions.Interfaces;
|
using KLHZ.Trader.Core.Contracts.Declisions.Interfaces;
|
||||||
|
using KLHZ.Trader.Core.Contracts.Messaging.Dtos;
|
||||||
using KLHZ.Trader.Core.Contracts.Messaging.Dtos.Interfaces;
|
using KLHZ.Trader.Core.Contracts.Messaging.Dtos.Interfaces;
|
||||||
using KLHZ.Trader.Core.Contracts.Messaging.Interfaces;
|
using KLHZ.Trader.Core.Contracts.Messaging.Interfaces;
|
||||||
using KLHZ.Trader.Core.DataLayer;
|
using KLHZ.Trader.Core.DataLayer;
|
||||||
|
@ -125,7 +126,31 @@ namespace KLHZ.Trader.Core.Exchange.Services
|
||||||
DeferredLongOpens.TryRemove(message.Figi, out _);
|
DeferredLongOpens.TryRemove(message.Figi, out _);
|
||||||
if (message.Value - longOpen.Price < 1)
|
if (message.Value - longOpen.Price < 1)
|
||||||
{
|
{
|
||||||
LogDeclision(declisionsForSave, DeclisionTradeAction.OpenLong, message);
|
if (!message.IsHistoricalData)
|
||||||
|
{
|
||||||
|
var accounts = _tradeDataProvider.Accounts
|
||||||
|
.Where(a => !a.Value.Assets.ContainsKey(message.Figi))
|
||||||
|
.ToArray();
|
||||||
|
foreach (var acc in accounts)
|
||||||
|
{
|
||||||
|
if (IsBuyAllowed(acc.Value, message.Value, 1))
|
||||||
|
{
|
||||||
|
await _dataBus.Broadcast(new TradeCommand()
|
||||||
|
{
|
||||||
|
AccountId = acc.Value.AccountId,
|
||||||
|
Figi = message.Figi,
|
||||||
|
CommandType = Contracts.Messaging.Dtos.Enums.TradeCommandType.MarketBuy,
|
||||||
|
Count = 1,
|
||||||
|
RecomendPrice = null,
|
||||||
|
});
|
||||||
|
LogDeclision(declisionsForSave, DeclisionTradeAction.OpenLong, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogDeclision(declisionsForSave, DeclisionTradeAction.OpenLong, message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -139,7 +164,44 @@ namespace KLHZ.Trader.Core.Exchange.Services
|
||||||
DeferredLongCloses.TryRemove(message.Figi, out _);
|
DeferredLongCloses.TryRemove(message.Figi, out _);
|
||||||
if (longClose.Price - message.Value < 1)
|
if (longClose.Price - message.Value < 1)
|
||||||
{
|
{
|
||||||
LogDeclision(declisionsForSave, DeclisionTradeAction.CloseLong, message);
|
if (!message.IsHistoricalData)
|
||||||
|
{
|
||||||
|
var assetsForClose = _tradeDataProvider.Accounts
|
||||||
|
.SelectMany(a => a.Value.Assets.Values)
|
||||||
|
.Where(a => a.Figi == message.Figi && a.Count > 0)
|
||||||
|
.ToArray();
|
||||||
|
foreach (var asset in assetsForClose)
|
||||||
|
{
|
||||||
|
var profit = 0m;
|
||||||
|
var assetType = _tradeDataProvider.GetAssetTypeByFigi(message.Figi);
|
||||||
|
if (assetType == AssetType.Common && asset.Count > 0)
|
||||||
|
{
|
||||||
|
profit = TradingCalculator.CaclProfit(asset.BoughtPrice, message.Value,
|
||||||
|
GetComission(assetType), 1, false);
|
||||||
|
}
|
||||||
|
if (assetType == AssetType.Futures)
|
||||||
|
{
|
||||||
|
profit = TradingCalculator.CaclProfit(asset.BoughtPrice, message.Value,
|
||||||
|
GetComission(assetType), GetLeverage(message.Figi, asset.Count < 0), asset.Count < 0);
|
||||||
|
}
|
||||||
|
if (profit > 0)
|
||||||
|
{
|
||||||
|
await _dataBus.Broadcast(new TradeCommand()
|
||||||
|
{
|
||||||
|
AccountId = asset.AccountId,
|
||||||
|
Figi = message.Figi,
|
||||||
|
CommandType = Contracts.Messaging.Dtos.Enums.TradeCommandType.MarketSell,
|
||||||
|
Count = (long)asset.Count,
|
||||||
|
RecomendPrice = null,
|
||||||
|
});
|
||||||
|
LogDeclision(declisionsForSave, DeclisionTradeAction.CloseLong, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogDeclision(declisionsForSave, DeclisionTradeAction.CloseLong, message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -333,46 +395,25 @@ namespace KLHZ.Trader.Core.Exchange.Services
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private decimal CalcProfit(string accountId, string figi, decimal closePrice)
|
private decimal GetLeverage(string figi, bool isShort)
|
||||||
{
|
{
|
||||||
if (_tradeDataProvider.Accounts.TryGetValue(accountId, out var account))
|
var res = 1m;
|
||||||
|
if (Leverages.TryGetValue(figi, out var leverage))
|
||||||
{
|
{
|
||||||
if (account.Assets.TryGetValue(figi, out var asset))
|
res = isShort ? leverage.ShortLeverage : leverage.LongLeverage;
|
||||||
{
|
|
||||||
var leverageValue = 1m;
|
|
||||||
var isShort = asset.Position == PositionType.Short;
|
|
||||||
if (Leverages.TryGetValue(figi, out var leverage))
|
|
||||||
{
|
|
||||||
if (asset.Type == AssetType.Futures && !isShort)
|
|
||||||
{
|
|
||||||
leverageValue = leverage.LongLeverage;
|
|
||||||
}
|
|
||||||
else if (isShort)
|
|
||||||
{
|
|
||||||
leverageValue = leverage.ShortLeverage;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return TradingCalculator.CaclProfit(asset.BoughtPrice, closePrice, GetComission(asset.Type), leverageValue, isShort);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
private decimal GetCount(string accountId, decimal boutPrice)
|
private bool IsBuyAllowed(ManagedAccount account, decimal boutPrice, decimal count)
|
||||||
{
|
|
||||||
var balance = _tradeDataProvider.Accounts[accountId].Balance;
|
|
||||||
return System.Math.Floor(balance * _defaultBuyPartOfAccount / boutPrice);
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool IsBuyAllowed(string accountId, decimal boutPrice, decimal count, bool needBigCash)
|
|
||||||
{
|
{
|
||||||
if (!_botModeSwitcher.CanPurchase()) return false;
|
if (!_botModeSwitcher.CanPurchase()) return false;
|
||||||
|
|
||||||
var balance = _tradeDataProvider.Accounts[accountId].Balance;
|
var balance = account.Balance;
|
||||||
var total = _tradeDataProvider.Accounts[accountId].Total;
|
var total = account.Total;
|
||||||
|
|
||||||
var futures = _tradeDataProvider.Accounts[accountId].Assets.Values.FirstOrDefault(v => v.Type == AssetType.Futures);
|
var futures = account.Assets.Values.FirstOrDefault(v => v.Type == AssetType.Futures);
|
||||||
if (futures != null || needBigCash)
|
if (futures != null)
|
||||||
{
|
{
|
||||||
if ((balance - boutPrice * count) / total < _accountCashPartFutures) return false;
|
if ((balance - boutPrice * count) / total < _accountCashPartFutures) return false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue