Включил проверку излома тренда в общий конвейер обработки запросов
test / deploy_trader_prod (push) Successful in 2m26s Details

dev
vlad zverzhkhovskiy 2025-09-23 12:58:12 +03:00
parent 52753c8fd9
commit c99a580822
1 changed files with 12 additions and 54 deletions

View File

@ -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<ValueAmplitudePosition> CheckPosition(INewPrice message)
private async Task<ValueAmplitudePosition> 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<TradingEvent, decimal> 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<ImmutableDictionary<TradingEvent, decimal>> 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;