diff --git a/KLHZ.Trader.Core/Exchange/Services/Trader.cs b/KLHZ.Trader.Core/Exchange/Services/Trader.cs index abb1412..2e1347f 100644 --- a/KLHZ.Trader.Core/Exchange/Services/Trader.cs +++ b/KLHZ.Trader.Core/Exchange/Services/Trader.cs @@ -141,7 +141,7 @@ namespace KLHZ.Trader.Core.Exchange.Services while (await _pricesChannel.Reader.WaitToReadAsync()) { var message = await _pricesChannel.Reader.ReadAsync(); - + var changeMods = GetInitDict(1); try { if (message.IsHistoricalData) @@ -241,7 +241,7 @@ namespace KLHZ.Trader.Core.Exchange.Services } } #endregion - if (_tradingInstrumentsFigis.Contains(message.Figi)) + if (_tradingInstrumentsFigis.Contains(message.Figi) && message.Figi == "FUTIMOEXF000") { var currentTime = message.IsHistoricalData ? message.Time : DateTime.UtcNow; try @@ -257,63 +257,20 @@ namespace KLHZ.Trader.Core.Exchange.Services if ((oldMod == TradingMode.Growing || oldMod == TradingMode.Stable) && oldMod != newMod) { - if (!message.IsHistoricalData && BotModeSwitcher.CanSell()) - { - var assetsForClose = _portfolioWrapper.Accounts - .SelectMany(a => a.Value.Assets.Values) - .Where(a => a.Figi == message.Figi && a.Count > 0) - .ToArray(); - await ClosePositions(assetsForClose, message); - } - - await LogDeclision(DeclisionTradeAction.CloseLong, message); + changeMods[TradingEvent.UptrendEnd] = Constants.PowerUppingCoefficient; } if ((oldMod == TradingMode.Dropping || oldMod == TradingMode.SlowDropping) && oldMod != newMod) { - if (!message.IsHistoricalData && BotModeSwitcher.CanPurchase()) - { - var assetsForClose = _portfolioWrapper.Accounts - .SelectMany(a => a.Value.Assets.Values) - .Where(a => a.Figi == message.Figi && a.Count < 0) - .ToArray(); - await ClosePositions(assetsForClose, message); - } - await LogDeclision(DeclisionTradeAction.CloseShort, message); + changeMods[TradingEvent.DowntrendEnd] = Constants.PowerUppingCoefficient; } if (newMod == TradingMode.Growing && newMod != oldMod && !LongOpeningStops.ContainsKey(message.Figi)) { - var stops = GetStops(message, PositionType.Long); - if (!message.IsHistoricalData && BotModeSwitcher.CanPurchase()) - { - var accounts = _portfolioWrapper.Accounts - .Where(a => !a.Value.Assets.ContainsKey(message.Figi)) - .Take(1) - .Select(a => a.Value) - .ToArray(); - await OpenPositions(accounts, message, PositionType.Long, stops.stopLoss, stops.takeProfit, 1); - LongOpeningStops[message.Figi] = DateTime.UtcNow.AddMinutes(1); - } - await LogDeclision(DeclisionTradeAction.OpenLong, message); - await LogDeclision(DeclisionTradeAction.OpenLong, message.Value + stops.takeProfit, message.Time.AddMilliseconds(-RandomNumberGenerator.GetInt32(300, 1000)), message); - await LogDeclision(DeclisionTradeAction.OpenLong, message.Value - stops.stopLoss, message.Time.AddMilliseconds(RandomNumberGenerator.GetInt32(300, 1000)), message); + changeMods[TradingEvent.UptrendStart] = Constants.UppingCoefficient; } if (newMod == TradingMode.Dropping && newMod != oldMod && !ShortOpeningStops.ContainsKey(message.Figi)) { - var stops = GetStops(message, PositionType.Short); - if (!message.IsHistoricalData && BotModeSwitcher.CanSell()) - { - var accounts = _portfolioWrapper.Accounts - .Where(a => !a.Value.Assets.ContainsKey(message.Figi)) - .Take(1) - .Select(a => a.Value) - .ToArray(); - await OpenPositions(accounts, message, PositionType.Short, stops.stopLoss, stops.takeProfit, 1); - ShortOpeningStops[message.Figi] = DateTime.UtcNow.AddMinutes(1); - } - await LogDeclision(DeclisionTradeAction.OpenShort, message); - await LogDeclision(DeclisionTradeAction.OpenShort, message.Value - stops.takeProfit, message.Time.AddMilliseconds(-RandomNumberGenerator.GetInt32(10, 100)), message); - await LogDeclision(DeclisionTradeAction.OpenShort, message.Value + stops.stopLoss, message.Time.AddMilliseconds(RandomNumberGenerator.GetInt32(300, 1000)), message); + changeMods[TradingEvent.DowntrendStart] = Constants.UppingCoefficient; } TradingModes[message.Figi] = newMod; if (oldMod != newMod) @@ -367,7 +324,7 @@ namespace KLHZ.Trader.Core.Exchange.Services var windowMaxSize = 2000; var data = await _tradeDataProvider.GetData(message.Figi, windowMaxSize); var state = ExchangeScheduler.GetCurrentState(message.Time); - await ProcessNewPriceIMOEXF3(data, state, message, windowMaxSize); + await ProcessNewPriceIMOEXF3(data, state, message, windowMaxSize, changeMods.ToImmutableDictionary()); } catch (Exception ex) { @@ -426,7 +383,7 @@ INewPrice message, int windowMaxSize, decimal uptrendStartingDetectionMeanfullSt return null; } - private async Task CheckPosition(INewPrice message) + private async Task CheckHarmonicPosition(INewPrice message) { var data2 = await GetData(message); var position = await CheckHarmonicPosition(data2, message); @@ -503,7 +460,7 @@ INewPrice message, int windowMaxSize, decimal uptrendStartingDetectionMeanfullSt private async Task ProcessNewPriceIMOEXF3((DateTime[] timestamps, decimal[] prices) data, ExchangeState state, - INewPrice message, int windowMaxSize) + INewPrice message, int windowMaxSize, ImmutableDictionary changeModeData) { if (data.timestamps.Length <= 4) { @@ -528,6 +485,7 @@ INewPrice message, int windowMaxSize, decimal uptrendStartingDetectionMeanfullSt //result = MergeResults(result, resTask2.Result.ToImmutableDictionary()); //result = MergeResults(result, resTask3.Result.ToImmutableDictionary()); + result = MergeResults(result, changeModeData); result = MergeResults(result, getFFTModsTask.Result); result = MergeResults(result, getAreasModsTask.Result); result = MergeResults(result, getSellsDiffsModsTask.Result); @@ -794,7 +752,7 @@ INewPrice message, int windowMaxSize, decimal uptrendStartingDetectionMeanfullSt private async Task> GetFFTMods(INewPrice message) { var res = GetInitDict(1); - var position = await CheckPosition(message); + var position = await CheckHarmonicPosition(message); if (position == ValueAmplitudePosition.LowerThenMediana) @@ -806,7 +764,7 @@ INewPrice message, int windowMaxSize, decimal uptrendStartingDetectionMeanfullSt } if (position == ValueAmplitudePosition.UpperThen30Decil) { - res[TradingEvent.UptrendStart] = Constants.LowingCoefficient; + res[TradingEvent.UptrendStart] = Constants.PowerLowingCoefficient; res[TradingEvent.DowntrendEnd] = Constants.LowingCoefficient; res[TradingEvent.UptrendEnd] = Constants.UppingCoefficient; res[TradingEvent.DowntrendStart] = Constants.UppingCoefficient;