обновление алгоритма принятия решений + добавление соотношения стакана глубиной 4
test / deploy_trader_prod (push) Successful in 1m3s
Details
test / deploy_trader_prod (push) Successful in 1m3s
Details
parent
6efea45378
commit
21833412d8
|
@ -9,5 +9,7 @@
|
||||||
ShortClose = 4,
|
ShortClose = 4,
|
||||||
LongClose = 8,
|
LongClose = 8,
|
||||||
ShortOpen = 16,
|
ShortOpen = 16,
|
||||||
|
UptrendEnd = 32,
|
||||||
|
UptrendStart = 64,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Обработка последних интервалов истории изменения цен.
|
/// Обработка последних интервалов истории изменения цен.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class TwoPeriods
|
public static class LocalTrends
|
||||||
{
|
{
|
||||||
internal static PeriodPricesInfoDto GetPriceDiffForTimeSpan(this IPriceHistoryCacheUnit unit, TimeSpan timeShift, TimeSpan timeSpan, int? pointsShift = null)
|
internal static PeriodPricesInfoDto GetPriceDiffForTimeSpan(this IPriceHistoryCacheUnit unit, TimeSpan timeShift, TimeSpan timeSpan, int? pointsShift = null)
|
||||||
{
|
{
|
||||||
|
@ -302,42 +302,14 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
|
||||||
{
|
{
|
||||||
var data = unit.GetData().Result;
|
var data = unit.GetData().Result;
|
||||||
var periodStat = data.GetTwoPeriodsProcessingData(secondPeriod, pointsStart, pointsEnd, firstPeriod, meanfullDiff);
|
var periodStat = data.GetTwoPeriodsProcessingData(secondPeriod, pointsStart, pointsEnd, firstPeriod, meanfullDiff);
|
||||||
var trendRelation = CalcTrendRelationAbs(periodStat);
|
|
||||||
var isStartOk = periodStat.Success && periodStat.DiffStart < -meanfullDiff;
|
var isStartOk = periodStat.Success && periodStat.DiffStart < -meanfullDiff;
|
||||||
var isEndOk = periodStat.Success && periodStat.DiffEnd >= meanfullDiff;
|
var isEndOk = periodStat.Success && periodStat.DiffEnd >= meanfullDiff;
|
||||||
|
|
||||||
if (isEndOk)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isStartOk)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isEndOk && isStartOk)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
return isStartOk && isEndOk && data.prices[periodStat.Start] - data.prices[periodStat.End] >= meanfullDiff;
|
return isStartOk && isEndOk && data.prices[periodStat.Start] - data.prices[periodStat.End] >= meanfullDiff;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TradingEvent Detect(IPriceHistoryCacheUnit data)
|
public static TradingEvent Detect(IPriceHistoryCacheUnit data)
|
||||||
{
|
{
|
||||||
decimal meanfullDiff;
|
decimal meanfullDiff = 1m;
|
||||||
if (data.Figi == "BBG004730N88")
|
|
||||||
{
|
|
||||||
meanfullDiff = 0.05m;
|
|
||||||
}
|
|
||||||
else if (data.Figi == "FUTIMOEXF000")
|
|
||||||
{
|
|
||||||
meanfullDiff = 1m;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return TradingEvent.None;
|
|
||||||
}
|
|
||||||
|
|
||||||
var res = TradingEvent.None;
|
var res = TradingEvent.None;
|
||||||
//var downtrendStarts = data.CheckDowntrendStarting(TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(7), meanfullDiff);
|
//var downtrendStarts = data.CheckDowntrendStarting(TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(7), meanfullDiff);
|
|
@ -77,10 +77,9 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
|
||||||
{
|
{
|
||||||
if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] >= meanfullStep)
|
if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] >= meanfullStep)
|
||||||
{
|
{
|
||||||
res |= TradingEvent.LongOpen;
|
res |= TradingEvent.UptrendStart;
|
||||||
res |= TradingEvent.ShortClose;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// если фильтрация окном 15 наползает на окно 120 сверху, потенциальное время закрытия лонга и возможно открытия шорта
|
// если фильтрация окном 15 наползает на окно 120 сверху, потенциальное время закрытия лонга и возможно открытия шорта
|
||||||
|
@ -88,10 +87,9 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
|
||||||
{
|
{
|
||||||
if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] <= -meanfullStep)
|
if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] <= -meanfullStep)
|
||||||
{
|
{
|
||||||
res |= TradingEvent.LongClose;
|
res |= TradingEvent.UptrendEnd;
|
||||||
res |= TradingEvent.ShortOpen;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ namespace KLHZ.Trader.Core.Tests
|
||||||
|
|
||||||
var periodLength = 4;
|
var periodLength = 4;
|
||||||
var shift = 0;
|
var shift = 0;
|
||||||
var result = TwoPeriods.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
|
var result = LocalTrends.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
|
||||||
|
|
||||||
var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength)));
|
var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength)));
|
||||||
var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift);
|
var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift);
|
||||||
|
@ -79,7 +79,7 @@ namespace KLHZ.Trader.Core.Tests
|
||||||
|
|
||||||
var periodLength = 4;
|
var periodLength = 4;
|
||||||
var shift = 0;
|
var shift = 0;
|
||||||
var result = TwoPeriods.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
|
var result = LocalTrends.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
|
||||||
|
|
||||||
var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength)));
|
var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength)));
|
||||||
var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift);
|
var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift);
|
||||||
|
@ -114,7 +114,7 @@ namespace KLHZ.Trader.Core.Tests
|
||||||
|
|
||||||
var periodLength = 4;
|
var periodLength = 4;
|
||||||
var shift = 1;
|
var shift = 1;
|
||||||
var result = TwoPeriods.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
|
var result = LocalTrends.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
|
||||||
|
|
||||||
var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength)));
|
var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength)));
|
||||||
var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift);
|
var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift);
|
||||||
|
@ -149,7 +149,7 @@ namespace KLHZ.Trader.Core.Tests
|
||||||
|
|
||||||
var periodLength = 4;
|
var periodLength = 4;
|
||||||
var shift = 0;
|
var shift = 0;
|
||||||
var result = TwoPeriods.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
|
var result = LocalTrends.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
|
||||||
|
|
||||||
var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength)));
|
var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength)));
|
||||||
var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift);
|
var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift);
|
||||||
|
@ -184,7 +184,7 @@ namespace KLHZ.Trader.Core.Tests
|
||||||
|
|
||||||
var periodLength = 4;
|
var periodLength = 4;
|
||||||
var shift = 3;
|
var shift = 3;
|
||||||
var result = TwoPeriods.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
|
var result = LocalTrends.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
|
||||||
|
|
||||||
var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength)));
|
var maxValue = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength)));
|
||||||
var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift);
|
var minValue = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift);
|
||||||
|
@ -219,7 +219,7 @@ namespace KLHZ.Trader.Core.Tests
|
||||||
|
|
||||||
var periodLength = 4;
|
var periodLength = 4;
|
||||||
var shift = 3;
|
var shift = 3;
|
||||||
var result = TwoPeriods.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
|
var result = LocalTrends.GetPriceDiffForTimeSpan(unit, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
|
||||||
|
|
||||||
var maxValue1 = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength)));
|
var maxValue1 = startValue + (step > 0 ? (step * count) - step * shift : (step * count) - (step * (shift + periodLength)));
|
||||||
var minValue1 = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift);
|
var minValue1 = startValue + (step > 0 ? (step * count) - (step * (shift + periodLength)) : (step * count) - step * shift);
|
||||||
|
@ -260,7 +260,7 @@ namespace KLHZ.Trader.Core.Tests
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var result2 = TwoPeriods.GetPriceDiffForTimeSpan(unit2, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
|
var result2 = LocalTrends.GetPriceDiffForTimeSpan(unit2, TimeSpan.FromSeconds(shift), TimeSpan.FromSeconds(periodLength));
|
||||||
|
|
||||||
var maxValue2 = 100;
|
var maxValue2 = 100;
|
||||||
var minValue2 = -100;
|
var minValue2 = -100;
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
{
|
{
|
||||||
Unknown = 0,
|
Unknown = 0,
|
||||||
StopBuy = 1,
|
StopBuy = 1,
|
||||||
|
StopBuyShortTime = 2,
|
||||||
OpenLong = 100,
|
OpenLong = 100,
|
||||||
CloseLong = 200,
|
CloseLong = 200,
|
||||||
OpenShort = 300,
|
OpenShort = 300,
|
||||||
|
|
|
@ -5,7 +5,9 @@
|
||||||
Unknown = 0,
|
Unknown = 0,
|
||||||
Ask = 1,
|
Ask = 1,
|
||||||
Bid = 2,
|
Bid = 2,
|
||||||
AsksSummary = 3,
|
AsksSummary10 = 3,
|
||||||
BidsSummary = 4
|
BidsSummary10 = 4,
|
||||||
|
AsksSummary4 = 5,
|
||||||
|
BidsSummary4 = 6,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -178,34 +178,54 @@ namespace KLHZ.Trader.Core.Exchange.Services
|
||||||
}
|
}
|
||||||
if (response.Orderbook != null)
|
if (response.Orderbook != null)
|
||||||
{
|
{
|
||||||
var asksSummary = new OrderbookItem()
|
var asksSummary10 = new OrderbookItem()
|
||||||
{
|
{
|
||||||
Figi = response.Orderbook.Figi,
|
Figi = response.Orderbook.Figi,
|
||||||
Ticker = GetTickerByFigi(response.Orderbook.Figi),
|
Ticker = GetTickerByFigi(response.Orderbook.Figi),
|
||||||
Count = response.Orderbook.Asks.Sum(a => (int)a.Quantity),
|
Count = response.Orderbook.Asks.Sum(a => (int)a.Quantity),
|
||||||
ItemType = DataLayer.Entities.Orders.Enums.OrderbookItemType.AsksSummary,
|
ItemType = DataLayer.Entities.Orders.Enums.OrderbookItemType.AsksSummary10,
|
||||||
Time = response.Orderbook.Time.ToDateTime().ToUniversalTime(),
|
Time = response.Orderbook.Time.ToDateTime().ToUniversalTime(),
|
||||||
};
|
};
|
||||||
|
|
||||||
var bidsSummary = new OrderbookItem()
|
var asksSummary4 = new OrderbookItem()
|
||||||
|
{
|
||||||
|
Figi = response.Orderbook.Figi,
|
||||||
|
Ticker = GetTickerByFigi(response.Orderbook.Figi),
|
||||||
|
Count = response.Orderbook.Asks.Take(4).Sum(a => (int)a.Quantity),
|
||||||
|
ItemType = DataLayer.Entities.Orders.Enums.OrderbookItemType.AsksSummary4,
|
||||||
|
Time = response.Orderbook.Time.ToDateTime().ToUniversalTime(),
|
||||||
|
};
|
||||||
|
|
||||||
|
var bidsSummary10 = new OrderbookItem()
|
||||||
{
|
{
|
||||||
Figi = response.Orderbook.Figi,
|
Figi = response.Orderbook.Figi,
|
||||||
Ticker = GetTickerByFigi(response.Orderbook.Figi),
|
Ticker = GetTickerByFigi(response.Orderbook.Figi),
|
||||||
Count = response.Orderbook.Bids.Sum(a => (int)a.Quantity),
|
Count = response.Orderbook.Bids.Sum(a => (int)a.Quantity),
|
||||||
ItemType = DataLayer.Entities.Orders.Enums.OrderbookItemType.BidsSummary,
|
ItemType = DataLayer.Entities.Orders.Enums.OrderbookItemType.BidsSummary10,
|
||||||
Time = response.Orderbook.Time.ToDateTime().ToUniversalTime(),
|
Time = response.Orderbook.Time.ToDateTime().ToUniversalTime(),
|
||||||
};
|
};
|
||||||
|
|
||||||
orderbookItemsBuffer.Add(asksSummary);
|
var bidsSummary4 = new OrderbookItem()
|
||||||
orderbookItemsBuffer.Add(bidsSummary);
|
{
|
||||||
|
Figi = response.Orderbook.Figi,
|
||||||
|
Ticker = GetTickerByFigi(response.Orderbook.Figi),
|
||||||
|
Count = response.Orderbook.Bids.Take(4).Sum(a => (int)a.Quantity),
|
||||||
|
ItemType = DataLayer.Entities.Orders.Enums.OrderbookItemType.BidsSummary4,
|
||||||
|
Time = response.Orderbook.Time.ToDateTime().ToUniversalTime(),
|
||||||
|
};
|
||||||
|
|
||||||
|
orderbookItemsBuffer.Add(asksSummary4);
|
||||||
|
orderbookItemsBuffer.Add(asksSummary10);
|
||||||
|
orderbookItemsBuffer.Add(bidsSummary4);
|
||||||
|
orderbookItemsBuffer.Add(bidsSummary10);
|
||||||
|
|
||||||
var message = new NewOrderbookMessage()
|
var message = new NewOrderbookMessage()
|
||||||
{
|
{
|
||||||
Ticker = GetTickerByFigi(response.Orderbook.Figi),
|
Ticker = GetTickerByFigi(response.Orderbook.Figi),
|
||||||
Figi = response.Orderbook.Figi,
|
Figi = response.Orderbook.Figi,
|
||||||
Time = response.Orderbook.Time.ToDateTime().ToUniversalTime(),
|
Time = response.Orderbook.Time.ToDateTime().ToUniversalTime(),
|
||||||
AsksCount = asksSummary.Count,
|
AsksCount = asksSummary10.Count,
|
||||||
BidsCount = bidsSummary.Count,
|
BidsCount = bidsSummary10.Count,
|
||||||
};
|
};
|
||||||
await _eventBus.Broadcast(message);
|
await _eventBus.Broadcast(message);
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,25 +101,14 @@ namespace KLHZ.Trader.Core.Exchange.Services
|
||||||
_ = ProcessOrdersbooks();
|
_ = ProcessOrdersbooks();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task InitStops()
|
|
||||||
{
|
|
||||||
using var context = await _dbContextFactory.CreateDbContextAsync();
|
|
||||||
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
|
|
||||||
var dt = DateTime.UtcNow.AddMinutes(-_buyStopLength);
|
|
||||||
var stops = await context.Declisions.Where(d => d.Time > dt && d.Action == DeclisionTradeAction.StopBuy).ToArrayAsync();
|
|
||||||
foreach (var stop in stops)
|
|
||||||
{
|
|
||||||
var time = stop.Time.AddMinutes(_buyStopLength);
|
|
||||||
OpeningStops.TryAdd(stop.Figi, time);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task ProcessPrices()
|
private async Task ProcessPrices()
|
||||||
{
|
{
|
||||||
var declisionsForSave = new List<Declision>();
|
var declisionsForSave = new List<Declision>();
|
||||||
var processedPrices = new List<ProcessedPrice>();
|
var processedPrices = new List<ProcessedPrice>();
|
||||||
while (await _pricesChannel.Reader.WaitToReadAsync())
|
while (await _pricesChannel.Reader.WaitToReadAsync())
|
||||||
{
|
{
|
||||||
|
var bigWindowProcessor = nameof(Trader) + "_big";
|
||||||
|
var smallWindowProcessor = nameof(Trader) + "_small";
|
||||||
var message = await _pricesChannel.Reader.ReadAsync();
|
var message = await _pricesChannel.Reader.ReadAsync();
|
||||||
if (_tradingInstrumentsFigis.Contains(message.Figi))
|
if (_tradingInstrumentsFigis.Contains(message.Figi))
|
||||||
{
|
{
|
||||||
|
@ -149,112 +138,45 @@ namespace KLHZ.Trader.Core.Exchange.Services
|
||||||
{
|
{
|
||||||
var stopTo = (message.IsHistoricalData ? message.Time : DateTime.UtcNow).AddMinutes(3);
|
var stopTo = (message.IsHistoricalData ? message.Time : DateTime.UtcNow).AddMinutes(3);
|
||||||
OpeningStops.AddOrUpdate(message.Figi, stopTo, (k, v) => stopTo);
|
OpeningStops.AddOrUpdate(message.Figi, stopTo, (k, v) => stopTo);
|
||||||
declisionsForSave.Add(new Declision()
|
LogDeclision(declisionsForSave, DeclisionTradeAction.StopBuyShortTime, message);
|
||||||
{
|
|
||||||
AccountId = string.Empty,
|
|
||||||
Figi = message.Figi,
|
|
||||||
Ticker = message.Ticker,
|
|
||||||
Price = message.Value,
|
|
||||||
Value = 3,
|
|
||||||
Time = message.IsHistoricalData ? message.Time : DateTime.UtcNow,
|
|
||||||
Action = DeclisionTradeAction.StopBuy,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var result = MovingAverage.CheckByWindowAverageMean(data.timestamps, data.prices, 100, 15, 120);
|
var resultLongOpen = MovingAverage.CheckByWindowAverageMean(data.timestamps, data.prices, 100, 45, 180, 2.5m);
|
||||||
if (result.bigWindowAv != 0)
|
var resultLongClose = MovingAverage.CheckByWindowAverageMean(data.timestamps, data.prices, 100, 15, 120, 2.5m);
|
||||||
|
|
||||||
|
if (resultLongOpen.bigWindowAv != 0)
|
||||||
{
|
{
|
||||||
var priceb = new ProcessedPrice()
|
LogPrice(processedPrices, message, bigWindowProcessor, resultLongOpen.bigWindowAv);
|
||||||
{
|
LogPrice(processedPrices, message, smallWindowProcessor, resultLongOpen.smallWindowAv);
|
||||||
Figi = message.Figi,
|
|
||||||
Ticker = message.Ticker,
|
|
||||||
Processor = nameof(Trader) + "_big",
|
|
||||||
Time = message.Time,
|
|
||||||
Value = result.bigWindowAv,
|
|
||||||
};
|
|
||||||
|
|
||||||
var prices = new ProcessedPrice()
|
|
||||||
{
|
|
||||||
Figi = message.Figi,
|
|
||||||
Ticker = message.Ticker,
|
|
||||||
Processor = nameof(Trader) + "_small",
|
|
||||||
Time = message.Time,
|
|
||||||
Value = result.smallWindowAv,
|
|
||||||
};
|
|
||||||
processedPrices.Add(priceb);
|
|
||||||
processedPrices.Add(prices);
|
|
||||||
}
|
}
|
||||||
if ((result.events & TradingEvent.StopBuy) == TradingEvent.StopBuy)
|
if ((resultLongClose.events & TradingEvent.StopBuy) == TradingEvent.StopBuy)
|
||||||
{
|
{
|
||||||
var stopTo = (message.IsHistoricalData ? message.Time : DateTime.UtcNow).AddMinutes(_buyStopLength);
|
var stopTo = (message.IsHistoricalData ? message.Time : DateTime.UtcNow).AddMinutes(_buyStopLength);
|
||||||
OpeningStops.AddOrUpdate(message.Figi, stopTo, (k, v) => stopTo);
|
OpeningStops.AddOrUpdate(message.Figi, stopTo, (k, v) => stopTo);
|
||||||
declisionsForSave.Add(new Declision()
|
//LogDeclision(declisionsForSave, DeclisionTradeAction.StopBuy, message);
|
||||||
{
|
|
||||||
AccountId = string.Empty,
|
|
||||||
Figi = message.Figi,
|
|
||||||
Ticker = message.Ticker,
|
|
||||||
Price = message.Value,
|
|
||||||
Value = (decimal)_buyStopLength,
|
|
||||||
Time = message.IsHistoricalData ? message.Time : DateTime.UtcNow,
|
|
||||||
Action = DeclisionTradeAction.StopBuy,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((result.events & TradingEvent.LongOpen) == TradingEvent.LongOpen
|
if ((resultLongOpen.events & TradingEvent.UptrendStart) == TradingEvent.UptrendStart
|
||||||
&& !OpeningStops.TryGetValue(message.Figi, out _)
|
&& !OpeningStops.TryGetValue(message.Figi, out _))
|
||||||
&& ((unit.BidsCount / unit.AsksCount) > 0.5m))
|
|
||||||
{
|
{
|
||||||
declisionsForSave.Add(new Declision()
|
LogDeclision(declisionsForSave, DeclisionTradeAction.OpenLong, message);
|
||||||
{
|
|
||||||
AccountId = string.Empty,
|
|
||||||
Figi = message.Figi,
|
|
||||||
Ticker = message.Ticker,
|
|
||||||
Price = message.Value,
|
|
||||||
Time = message.IsHistoricalData ? message.Time : DateTime.UtcNow,
|
|
||||||
Action = DeclisionTradeAction.OpenLong,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((result.events & TradingEvent.LongClose) == TradingEvent.LongClose)
|
if ((resultLongClose.events & TradingEvent.UptrendEnd) == TradingEvent.UptrendEnd)
|
||||||
{
|
{
|
||||||
declisionsForSave.Add(new Declision()
|
LogDeclision(declisionsForSave, DeclisionTradeAction.CloseLong, message);
|
||||||
{
|
|
||||||
AccountId = string.Empty,
|
|
||||||
Figi = message.Figi,
|
|
||||||
Ticker = message.Ticker,
|
|
||||||
Price = message.Value,
|
|
||||||
Time = message.IsHistoricalData ? message.Time : DateTime.UtcNow,
|
|
||||||
Action = DeclisionTradeAction.CloseLong,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((result.events & TradingEvent.ShortOpen) == TradingEvent.ShortOpen
|
//if ((resultLongOpen.events & TradingEvent.ShortOpen) == TradingEvent.ShortOpen
|
||||||
&& !OpeningStops.TryGetValue(message.Figi, out _)
|
// && !OpeningStops.TryGetValue(message.Figi, out _))
|
||||||
&& (unit.BidsCount / unit.AsksCount < 2))
|
//{
|
||||||
{
|
// LogDeclision(declisionsForSave, DeclisionTradeAction.OpenShort, message);
|
||||||
declisionsForSave.Add(new Declision()
|
//}
|
||||||
{
|
|
||||||
AccountId = string.Empty,
|
|
||||||
Figi = message.Figi,
|
|
||||||
Ticker = message.Ticker,
|
|
||||||
Price = message.Value,
|
|
||||||
Time = message.IsHistoricalData ? message.Time : DateTime.UtcNow,
|
|
||||||
Action = DeclisionTradeAction.OpenShort,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((result.events & TradingEvent.ShortClose) == TradingEvent.ShortClose)
|
//if ((resultLongOpen.events & TradingEvent.ShortClose) == TradingEvent.ShortClose)
|
||||||
{
|
//{
|
||||||
declisionsForSave.Add(new Declision()
|
// LogDeclision(declisionsForSave, DeclisionTradeAction.CloseShort, message);
|
||||||
{
|
//}
|
||||||
AccountId = string.Empty,
|
|
||||||
Figi = message.Figi,
|
|
||||||
Ticker = message.Ticker,
|
|
||||||
Price = message.Value,
|
|
||||||
Time = message.IsHistoricalData ? message.Time : DateTime.UtcNow,
|
|
||||||
Action = DeclisionTradeAction.CloseShort,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((!message.IsHistoricalData && (processedPrices.Count > 0 || declisionsForSave.Count > 0))
|
if ((!message.IsHistoricalData && (processedPrices.Count > 0 || declisionsForSave.Count > 0))
|
||||||
|| (message.IsHistoricalData && ((processedPrices.Count + declisionsForSave.Count > 10000) || _pricesChannel.Reader.Count == 0)))
|
|| (message.IsHistoricalData && ((processedPrices.Count + declisionsForSave.Count > 10000) || _pricesChannel.Reader.Count == 0)))
|
||||||
|
@ -284,6 +206,31 @@ namespace KLHZ.Trader.Core.Exchange.Services
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void LogPrice(List<ProcessedPrice> prices, INewPrice message, string processor, decimal value)
|
||||||
|
{
|
||||||
|
prices.Add(new ProcessedPrice()
|
||||||
|
{
|
||||||
|
Figi = message.Figi,
|
||||||
|
Ticker = message.Ticker,
|
||||||
|
Processor = processor,
|
||||||
|
Time = message.Time,
|
||||||
|
Value = value,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void LogDeclision(List<Declision> declisions, DeclisionTradeAction action, INewPrice message)
|
||||||
|
{
|
||||||
|
declisions.Add(new Declision()
|
||||||
|
{
|
||||||
|
AccountId = string.Empty,
|
||||||
|
Figi = message.Figi,
|
||||||
|
Ticker = message.Ticker,
|
||||||
|
Price = message.Value,
|
||||||
|
Time = message.IsHistoricalData ? message.Time : DateTime.UtcNow,
|
||||||
|
Action = action,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private async Task ProcessOrdersbooks()
|
private async Task ProcessOrdersbooks()
|
||||||
{
|
{
|
||||||
while (await _ordersbookChannel.Reader.WaitToReadAsync())
|
while (await _ordersbookChannel.Reader.WaitToReadAsync())
|
||||||
|
|
|
@ -24,6 +24,7 @@ namespace KLHZ.Trader.Service.Controllers
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
var time = new DateTime(2025, 9, 3, 13, 5, 0, DateTimeKind.Utc);
|
||||||
using var context1 = await _dbContextFactory.CreateDbContextAsync();
|
using var context1 = await _dbContextFactory.CreateDbContextAsync();
|
||||||
context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
|
context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
|
||||||
var data = await context1.PriceChanges
|
var data = await context1.PriceChanges
|
||||||
|
@ -38,7 +39,7 @@ namespace KLHZ.Trader.Service.Controllers
|
||||||
IsHistoricalData = true
|
IsHistoricalData = true
|
||||||
})
|
})
|
||||||
.ToArrayAsync();
|
.ToArrayAsync();
|
||||||
|
//data = data.Where(d=>d.Time> time).ToArray();
|
||||||
foreach (var mess in data)
|
foreach (var mess in data)
|
||||||
{
|
{
|
||||||
await _dataBus.Broadcast(mess);
|
await _dataBus.Broadcast(mess);
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"LokiUrl": "",
|
"LokiUrl": "",
|
||||||
"ExchangeConfig": {
|
"ExchangeConfig": {
|
||||||
"StopBuyLengthMinuts": 20,
|
"StopBuyLengthMinuts": 15,
|
||||||
"ExchangeDataRecievingEnabled": true,
|
"ExchangeDataRecievingEnabled": true,
|
||||||
"Token": "",
|
"Token": "",
|
||||||
"ManagingAccountNamePatterns": [ "автотрейд 1" ],
|
"ManagingAccountNamePatterns": [ "автотрейд 1" ],
|
||||||
|
|
Loading…
Reference in New Issue