Включил проверку излома тренда в общий конвейер обработки запросов
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()) while (await _pricesChannel.Reader.WaitToReadAsync())
{ {
var message = await _pricesChannel.Reader.ReadAsync(); var message = await _pricesChannel.Reader.ReadAsync();
var changeMods = GetInitDict(1);
try try
{ {
if (message.IsHistoricalData) if (message.IsHistoricalData)
@ -241,7 +241,7 @@ namespace KLHZ.Trader.Core.Exchange.Services
} }
} }
#endregion #endregion
if (_tradingInstrumentsFigis.Contains(message.Figi)) if (_tradingInstrumentsFigis.Contains(message.Figi) && message.Figi == "FUTIMOEXF000")
{ {
var currentTime = message.IsHistoricalData ? message.Time : DateTime.UtcNow; var currentTime = message.IsHistoricalData ? message.Time : DateTime.UtcNow;
try try
@ -257,63 +257,20 @@ namespace KLHZ.Trader.Core.Exchange.Services
if ((oldMod == TradingMode.Growing || oldMod == TradingMode.Stable) if ((oldMod == TradingMode.Growing || oldMod == TradingMode.Stable)
&& oldMod != newMod) && oldMod != newMod)
{ {
if (!message.IsHistoricalData && BotModeSwitcher.CanSell()) changeMods[TradingEvent.UptrendEnd] = Constants.PowerUppingCoefficient;
{
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);
} }
if ((oldMod == TradingMode.Dropping || oldMod == TradingMode.SlowDropping) if ((oldMod == TradingMode.Dropping || oldMod == TradingMode.SlowDropping)
&& oldMod != newMod) && oldMod != newMod)
{ {
if (!message.IsHistoricalData && BotModeSwitcher.CanPurchase()) changeMods[TradingEvent.DowntrendEnd] = Constants.PowerUppingCoefficient;
{
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);
} }
if (newMod == TradingMode.Growing && newMod != oldMod && !LongOpeningStops.ContainsKey(message.Figi)) if (newMod == TradingMode.Growing && newMod != oldMod && !LongOpeningStops.ContainsKey(message.Figi))
{ {
var stops = GetStops(message, PositionType.Long); changeMods[TradingEvent.UptrendStart] = Constants.UppingCoefficient;
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);
} }
if (newMod == TradingMode.Dropping && newMod != oldMod && !ShortOpeningStops.ContainsKey(message.Figi)) if (newMod == TradingMode.Dropping && newMod != oldMod && !ShortOpeningStops.ContainsKey(message.Figi))
{ {
var stops = GetStops(message, PositionType.Short); changeMods[TradingEvent.DowntrendStart] = Constants.UppingCoefficient;
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);
} }
TradingModes[message.Figi] = newMod; TradingModes[message.Figi] = newMod;
if (oldMod != newMod) if (oldMod != newMod)
@ -367,7 +324,7 @@ namespace KLHZ.Trader.Core.Exchange.Services
var windowMaxSize = 2000; var windowMaxSize = 2000;
var data = await _tradeDataProvider.GetData(message.Figi, windowMaxSize); var data = await _tradeDataProvider.GetData(message.Figi, windowMaxSize);
var state = ExchangeScheduler.GetCurrentState(message.Time); var state = ExchangeScheduler.GetCurrentState(message.Time);
await ProcessNewPriceIMOEXF3(data, state, message, windowMaxSize); await ProcessNewPriceIMOEXF3(data, state, message, windowMaxSize, changeMods.ToImmutableDictionary());
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -426,7 +383,7 @@ INewPrice message, int windowMaxSize, decimal uptrendStartingDetectionMeanfullSt
return null; return null;
} }
private async Task<ValueAmplitudePosition> CheckPosition(INewPrice message) private async Task<ValueAmplitudePosition> CheckHarmonicPosition(INewPrice message)
{ {
var data2 = await GetData(message); var data2 = await GetData(message);
var position = await CheckHarmonicPosition(data2, 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, private async Task ProcessNewPriceIMOEXF3((DateTime[] timestamps, decimal[] prices) data,
ExchangeState state, ExchangeState state,
INewPrice message, int windowMaxSize) INewPrice message, int windowMaxSize, ImmutableDictionary<TradingEvent, decimal> changeModeData)
{ {
if (data.timestamps.Length <= 4) if (data.timestamps.Length <= 4)
{ {
@ -528,6 +485,7 @@ INewPrice message, int windowMaxSize, decimal uptrendStartingDetectionMeanfullSt
//result = MergeResults(result, resTask2.Result.ToImmutableDictionary()); //result = MergeResults(result, resTask2.Result.ToImmutableDictionary());
//result = MergeResults(result, resTask3.Result.ToImmutableDictionary()); //result = MergeResults(result, resTask3.Result.ToImmutableDictionary());
result = MergeResults(result, changeModeData);
result = MergeResults(result, getFFTModsTask.Result); result = MergeResults(result, getFFTModsTask.Result);
result = MergeResults(result, getAreasModsTask.Result); result = MergeResults(result, getAreasModsTask.Result);
result = MergeResults(result, getSellsDiffsModsTask.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) private async Task<ImmutableDictionary<TradingEvent, decimal>> GetFFTMods(INewPrice message)
{ {
var res = GetInitDict(1); var res = GetInitDict(1);
var position = await CheckPosition(message); var position = await CheckHarmonicPosition(message);
if (position == ValueAmplitudePosition.LowerThenMediana) if (position == ValueAmplitudePosition.LowerThenMediana)
@ -806,7 +764,7 @@ INewPrice message, int windowMaxSize, decimal uptrendStartingDetectionMeanfullSt
} }
if (position == ValueAmplitudePosition.UpperThen30Decil) if (position == ValueAmplitudePosition.UpperThen30Decil)
{ {
res[TradingEvent.UptrendStart] = Constants.LowingCoefficient; res[TradingEvent.UptrendStart] = Constants.PowerLowingCoefficient;
res[TradingEvent.DowntrendEnd] = Constants.LowingCoefficient; res[TradingEvent.DowntrendEnd] = Constants.LowingCoefficient;
res[TradingEvent.UptrendEnd] = Constants.UppingCoefficient; res[TradingEvent.UptrendEnd] = Constants.UppingCoefficient;
res[TradingEvent.DowntrendStart] = Constants.UppingCoefficient; res[TradingEvent.DowntrendStart] = Constants.UppingCoefficient;