From c99a580822ba0cd3156472d38caf1b0ab6f128e7 Mon Sep 17 00:00:00 2001 From: vlad zverzhkhovskiy Date: Tue, 23 Sep 2025 12:58:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D0=BA=D0=BB=D1=8E=D1=87=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D1=83=20=D0=B8=D0=B7?= =?UTF-8?q?=D0=BB=D0=BE=D0=BC=D0=B0=20=D1=82=D1=80=D0=B5=D0=BD=D0=B4=D0=B0?= =?UTF-8?q?=20=D0=B2=20=D0=BE=D0=B1=D1=89=D0=B8=D0=B9=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D0=B2=D0=B5=D0=B9=D0=B5=D1=80=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B8=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KLHZ.Trader.Core/Exchange/Services/Trader.cs | 66 ++++---------------- 1 file changed, 12 insertions(+), 54 deletions(-) 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;