фикс записи в бд
test / deploy_trader_prod (push) Successful in 6m41s Details

dev
vlad zverzhkhovskiy 2025-09-09 11:57:43 +03:00
parent 7d2618dd54
commit c2105ad019
3 changed files with 87 additions and 82 deletions

View File

@ -26,107 +26,100 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
var bigWindowAv = 0m; var bigWindowAv = 0m;
var smallWindowAv = 0m; var smallWindowAv = 0m;
var s = 0; var s = 0;
try var pricesForFinalComparison = new decimal[size];
var twavss = new decimal[size];
var twavbs = new decimal[size];
var times = new DateTime[size];
var crossings = new List<int>();
for (int shift = 0; shift < size - 1 && shift < prices.Length - 1; shift++)
{ {
var pricesForFinalComparison = new decimal[size]; s = shift;
var twavss = new decimal[size]; var i2 = size - 1 - shift;
var twavbs = new decimal[size]; var i1 = size - 2 - shift;
var times = new DateTime[size];
var crossings = new List<int>(); var twavs = CalcTimeWindowAverageValue(timestamps, prices, smallWindow, shift);
for (int shift = 0; shift < size - 1 && shift < prices.Length - 1; shift++) var twavb = CalcTimeWindowAverageValue(timestamps, prices, bigWindow, shift);
pricesForFinalComparison[i2] = prices[prices.Length - 1 - shift];
if (shift == 0)
{ {
s = shift; bigWindowAv = twavb.value;
var i2 = size - 1 - shift; smallWindowAv = twavs.value;
var i1 = size - 2 - shift; }
twavss[i2] = twavs.value;
twavbs[i2] = twavb.value;
times[i2] = twavb.time;
var twavs = CalcTimeWindowAverageValue(timestamps, prices, smallWindow, shift); if (shift > 0)
var twavb = CalcTimeWindowAverageValue(timestamps, prices, bigWindow, shift); {
pricesForFinalComparison[i2] = prices[prices.Length - 1 - shift]; var isCrossing = Lines.IsLinesCrossing(
times[i1 + 1],
times[i2 + 1],
twavss[i1 + 1],
twavss[i2 + 1],
twavbs[i1 + 1],
twavbs[i2 + 1]);
if (shift == 0) if (shift == 1 && !isCrossing.res) //если нет пересечения скользящих средний с окном 120 и 15 секунд между
//текущей и предыдущей точкой - можно не продолжать выполнение.
{ {
bigWindowAv = twavb.value; break;
smallWindowAv = twavs.value;
} }
twavss[i2] = twavs.value;
twavbs[i2] = twavb.value;
times[i2] = twavb.time;
if (shift > 0) if (isCrossing.res)
{ {
var isCrossing = Lines.IsLinesCrossing( crossings.Add(i2);
times[i1 + 1], if (crossings.Count == 4 || (shift + 1 == size - 1 || shift + 1 == prices.Length - 1))
times[i2 + 1],
twavss[i1 + 1],
twavss[i2 + 1],
twavbs[i1 + 1],
twavbs[i2 + 1]);
if (shift == 1 && !isCrossing.res) //если нет пересечения скользящих средний с окном 120 и 15 секунд между
//текущей и предыдущей точкой - можно не продолжать выполнение.
{ {
break; if ((shift + 1 == size - 1 || shift + 1 == prices.Length - 1))
}
if (isCrossing.res)
{
crossings.Add(i2);
if (crossings.Count == 4 || (shift + 1 == size - 1 || shift + 1 == prices.Length - 1))
{ {
if ((shift + 1 == size - 1 || shift + 1 == prices.Length - 1)) crossings.Add(shift);
}
var diffTotal = pricesForFinalComparison[crossings[0]] - pricesForFinalComparison[crossings[1]];
for (int crossingShift = 1; crossingShift < crossings.Count - 2; crossingShift++)
{
var diff = pricesForFinalComparison[crossings[crossingShift]] - pricesForFinalComparison[crossings[crossingShift + 1]];
if (diff >= 0)
{ {
crossings.Add(shift); diffTotal += diff;
} }
var diffTotal = pricesForFinalComparison[crossings[0]] - pricesForFinalComparison[crossings[1]]; else
for (int crossingShift = 1; crossingShift < crossings.Count - 2; crossingShift++)
{ {
var diff = pricesForFinalComparison[crossings[crossingShift]] - pricesForFinalComparison[crossings[crossingShift + 1]];
if (diff >= 0)
{
diffTotal += diff;
}
else
{
break;
}
}
// если фильтрация окном 15 наползает на окно 120 сверху, потенциальное время закрытия лонга и возможно открытия шорта
if (twavss[size - 1] <= twavbs[size - 1] && twavss[size - 2] > twavbs[size - 2])
{
if (diffTotal >= uptrendEndingDetectionMeanfullStep
&& times[crossings[0]] - times[crossings[1]] >= timeForUptreandStart)
{
res |= TradingEvent.UptrendEnd;
}
break; break;
} }
} }
if (crossings.Count == 2 || (shift + 1 == size - 1 || shift + 1 == prices.Length - 1)) // если фильтрация окном 15 наползает на окно 120 сверху, потенциальное время закрытия лонга и возможно открытия шорта
if (twavss[size - 1] <= twavbs[size - 1] && twavss[size - 2] > twavbs[size - 2])
{ {
if ((shift + 1 == size - 1 || shift + 1 == prices.Length - 1)) if (diffTotal >= uptrendEndingDetectionMeanfullStep
&& times[crossings[0]] - times[crossings[1]] >= timeForUptreandStart)
{ {
crossings.Add(shift); res |= TradingEvent.UptrendEnd;
} }
// если фильтрация окном 120 наползает на окно 15 сверху, потенциальное время открытия лонга и закрытия шорта break;
if (twavss[size - 1] >= twavbs[size - 1] && twavss[size - 2] < twavbs[size - 2]) }
}
if (crossings.Count == 2 || (shift + 1 == size - 1 || shift + 1 == prices.Length - 1))
{
if ((shift + 1 == size - 1 || shift + 1 == prices.Length - 1))
{
crossings.Add(shift);
}
// если фильтрация окном 120 наползает на окно 15 сверху, потенциальное время открытия лонга и закрытия шорта
if (twavss[size - 1] >= twavbs[size - 1] && twavss[size - 2] < twavbs[size - 2])
{
if (pricesForFinalComparison[crossings[0]] - pricesForFinalComparison[crossings[1]] <= -downtrendStartingDetectionMeanfullStep
&& times[crossings[0]] - times[crossings[1]] >= timeForUptreandStart)
{ {
if (pricesForFinalComparison[crossings[0]] - pricesForFinalComparison[crossings[1]] <= -downtrendStartingDetectionMeanfullStep res |= TradingEvent.UptrendStart;
&& times[crossings[0]] - times[crossings[1]] >= timeForUptreandStart)
{
res |= TradingEvent.UptrendStart;
}
break;
} }
break;
} }
} }
} }
} }
}
catch (Exception ex)
{
} }
return (res, bigWindowAv, smallWindowAv); return (res, bigWindowAv, smallWindowAv);
} }

View File

@ -13,6 +13,7 @@ using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Tinkoff.InvestApi; using Tinkoff.InvestApi;
using Tinkoff.InvestApi.V1; using Tinkoff.InvestApi.V1;
using static Google.Rpc.Context.AttributeContext.Types;
namespace KLHZ.Trader.Core.Exchange.Services namespace KLHZ.Trader.Core.Exchange.Services
{ {
@ -55,7 +56,7 @@ namespace KLHZ.Trader.Core.Exchange.Services
{ {
try try
{ {
//_ = SubscribeUpdates(); _ = SubscribeMyTrades();
if (_exchangeDataRecievingEnabled) if (_exchangeDataRecievingEnabled)
{ {
_ = SubscribePrices(); _ = SubscribePrices();
@ -69,7 +70,7 @@ namespace KLHZ.Trader.Core.Exchange.Services
} }
} }
private async Task SubscribeUpdates() private async Task SubscribeMyTrades()
{ {
var req = new TradesStreamRequest(); var req = new TradesStreamRequest();
foreach (var a in _tradeDataProvider.Accounts) foreach (var a in _tradeDataProvider.Accounts)
@ -81,7 +82,18 @@ namespace KLHZ.Trader.Core.Exchange.Services
{ {
if (response.OrderTrades != null) if (response.OrderTrades != null)
{ {
foreach(var t in response.OrderTrades.Trades)
{
//await _tradeDataProvider.LogDeal(new Models.AssetsAccounting.DealResult()
//{
// AccountId = response.OrderTrades.AccountId,
// Figi = response.OrderTrades.Figi,
// Count = t.Quantity,
// Price = t.Price,
// Direction = Models.AssetsAccounting.DealDirection
//})
}
} }
} }
} }
@ -210,7 +222,7 @@ namespace KLHZ.Trader.Core.Exchange.Services
await _eventBus.Broadcast(message); await _eventBus.Broadcast(message);
} }
if (orderbookItemsBuffer.Count + pricesBuffer.Count + tradesBuffer.Count > 0 || (DateTime.UtcNow - lastWrite).TotalSeconds > 10) if (orderbookItemsBuffer.Count + pricesBuffer.Count + tradesBuffer.Count > 100 || (DateTime.UtcNow - lastWrite).TotalSeconds > 5)
{ {
try try
{ {

View File

@ -210,7 +210,7 @@ namespace KLHZ.Trader.Core.Exchange.Services
{ {
var assetType = _tradeDataProvider.GetAssetTypeByFigi(message.Figi); var assetType = _tradeDataProvider.GetAssetTypeByFigi(message.Figi);
var loggedDeclisions = 0; var loggedDeclisions = 0;
if (BotModeSwitcher.CanSell()) if (!message.IsHistoricalData && BotModeSwitcher.CanSell())
{ {
var assetsForClose = _tradeDataProvider.Accounts var assetsForClose = _tradeDataProvider.Accounts
.SelectMany(a => a.Value.Assets.Values) .SelectMany(a => a.Value.Assets.Values)
@ -283,7 +283,7 @@ namespace KLHZ.Trader.Core.Exchange.Services
Processor = processor, Processor = processor,
Time = message.Time, Time = message.Time,
Value = value, Value = value,
}, !message.IsHistoricalData); }, false);
} }
private async Task LogDeclision(DeclisionTradeAction action, INewPrice message, decimal? profit = null) private async Task LogDeclision(DeclisionTradeAction action, INewPrice message, decimal? profit = null)
@ -297,7 +297,7 @@ namespace KLHZ.Trader.Core.Exchange.Services
Price = message.Value, Price = message.Value,
Time = message.IsHistoricalData ? message.Time : DateTime.UtcNow, Time = message.IsHistoricalData ? message.Time : DateTime.UtcNow,
Action = action, Action = action,
}, !message.IsHistoricalData); }, false);
} }
public Task StopAsync(CancellationToken cancellationToken) public Task StopAsync(CancellationToken cancellationToken)