фикс опреедения пересечений

dev
vlad zverzhkhovskiy 2025-09-09 00:23:43 +03:00
parent 9b0253b109
commit bbef0a757b
3 changed files with 75 additions and 100 deletions

View File

@ -25,6 +25,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
var res = TradingEvent.None;
var bigWindowAv = 0m;
var smallWindowAv = 0m;
var s = 0;
try
{
var pricesForFinalComparison = new decimal[size];
@ -32,12 +33,10 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
var twavss = new decimal[size];
var twavbs = new decimal[size];
var times = new DateTime[size];
var areas = new List<double>();
var sign = 1d;
var areaValue = 0d;
var crossingsCounter = 1;
for (int shift = 0; shift < size - 1 && shift < prices.Length - 1; shift++)
{
s = shift;
var i2 = size - 1 - shift;
var i1 = size - 2 - shift;
@ -50,19 +49,14 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
bigWindowAv = twavb.value;
smallWindowAv = twavs.value;
}
twavss[i2] = twavs.value;
twavbs[i2] = twavb.value;
times[i2] = twavb.time;
var debugArrayB = twavbs.Reverse().ToArray();
var debugArrayS = twavss.Reverse().ToArray();
var debugArrayT = times.Reverse().ToArray();
if (System.Math.Abs(twavb.value - prices[prices.Length - 1]) > 2 * meanfullStep)
{
res |= TradingEvent.StopBuy;
return (res, bigWindowAv, smallWindowAv);
}
//if (System.Math.Abs(twavb.value - prices[prices.Length - 1]) > 2 * meanfullStep)
//{
// res |= TradingEvent.StopBuy;
// return (res, bigWindowAv, smallWindowAv);
//}
if (shift > 0)
{
var isCrossing = Lines.IsLinesCrossing(
@ -78,41 +72,13 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
{
break;
}
if (shift == 1 && isCrossing.res)//обработка ситуации когда одна из точек - совпадение
if (isCrossing.res)
{
// если фильтрация окном 120 наползает на окно 15 сверху, потенциальное время открытия лонга и закрытия шорта
//if (twavbs[size - 1] <= twavss[size - 1] && twavbs[size - 2] > twavss[size - 2])
//{
// sign = -1d;
//}
//// если фильтрация окном 15 наползает на окно 120 сверху, потенциальное время закрытия лонга и возможно открытия шорта
//if (twavss[size - 1] <= twavbs[size - 1] && twavss[size - 2] > twavbs[size - 2])
//{
// sign = 1d;
//}
// если фильтрация окном 120 наползает на окно 15 сверху, потенциальное время открытия лонга и закрытия шорта
if ((debugArrayS[0] == debugArrayB[0] && debugArrayB[1] > debugArrayS[1])
|| (debugArrayB[0] < debugArrayS[0] && debugArrayB[1] > debugArrayS[1]))
if (twavss[size - 1] >= twavbs[size - 1] && twavss[size - 2]<twavbs[size - 2] )
{
sign = -1d;
}
// если фильтрация окном 15 наползает на окно 120 снизу, потенциальное время закрытия лонга и возможно открытия шорта
if ((debugArrayS[0] == debugArrayB[0] && debugArrayS[1] < debugArrayB[1])
|| (debugArrayS[0] > debugArrayB[0] && debugArrayS[1] < debugArrayB[1]))
{
sign = 1d;
}
}
if (shift > 1 && isCrossing.res)
{
// если фильтрация окном 120 наползает на окно 15 сверху, потенциальное время открытия лонга и закрытия шорта
if (twavbs[size - 1] <= twavss[size - 1] && twavbs[size - 2] > twavss[size - 2])
{
if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] >= meanfullStep
&& timesForFinalComparison[size - 1] - timesForFinalComparison[i2 + 1] >= timeForUptreandStart)
//if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] >= meanfullStep
// && timesForFinalComparison[size - 1] - timesForFinalComparison[i2 + 1] >= timeForUptreandStart)
{
res |= TradingEvent.UptrendStart;
}
@ -120,37 +86,16 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
}
// если фильтрация окном 15 наползает на окно 120 сверху, потенциальное время закрытия лонга и возможно открытия шорта
if ((debugArrayS[0] == debugArrayB[0] && debugArrayS[1] < debugArrayB[1])
|| (debugArrayS[0] > debugArrayB[0] && debugArrayS[1] < debugArrayB[1]))
if (twavss[size - 1] <= twavbs[size - 1] && twavss[size - 2] > twavbs[size - 2])
{
if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] <= -meanfullStep
&& timesForFinalComparison[size - 1] - timesForFinalComparison[i2 + 1] >= timeForUptreandStart)
//if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] <= -meanfullStep
// && timesForFinalComparison[size - 1] - timesForFinalComparison[i2 + 1] >= timeForUptreandStart)
{
res |= TradingEvent.UptrendEnd;
}
break;
}
}
if (shift > 1)
{
if (isCrossing.res)
{
var ar = ShapeAreaCalculator.CalculateTriangleArea(
isCrossing.x, isCrossing.y, times[i1 + 1], twavss[i1 + 1], times[i1 + 1], twavbs[i1 + 1]);
areas.Add(ar);
areaValue += sign* areas.Sum();
sign *= -1;
areas.Clear();
crossingsCounter++;
}
else
{
var ar = ShapeAreaCalculator.CalculateQuadrilateralArea(
times[i1 + 1], twavss[i1 + 1], times[i1 + 1], twavbs[i1 + 1], times[i2 + 1], twavss[i2 + 1], times[i2 + 1], twavbs[i2 + 1]);
areas.Add(ar);
}
}
}
}
}

View File

@ -172,7 +172,8 @@ namespace KLHZ.Trader.Core.Exchange.Services
&& !OpeningStops.TryGetValue(message.Figi, out _)
&& state == ExchangeState.Open
&& data.timestamps.Length > 1
&& (data.timestamps[data.timestamps.Length - 1] - data.timestamps[data.timestamps.Length - 2] < TimeSpan.FromMinutes(1)))
//&& (data.timestamps[data.timestamps.Length - 1] - data.timestamps[data.timestamps.Length - 2] < TimeSpan.FromMinutes(1))
)
{
var fullData = await _tradeDataProvider.GetData(message.Figi, TimeSpan.FromMinutes(60));
if (fullData.isFullIntervalExists)
@ -180,7 +181,7 @@ namespace KLHZ.Trader.Core.Exchange.Services
var max = fullData.prices.Max();
var min = fullData.prices.Min();
if (max - min < 15 && fullData.prices.Last() - fullData.prices.First() < 4)
//if (max - min < 15 && fullData.prices.Last() - fullData.prices.First() < 4)
{
if (!message.IsHistoricalData && BotModeSwitcher.CanPurchase())
{
@ -209,9 +210,10 @@ namespace KLHZ.Trader.Core.Exchange.Services
}
else
{
await LogDeclision(DeclisionTradeAction.OpenLong, message);
// await LogDeclision(DeclisionTradeAction.OpenLong, message);
}
}
await LogDeclision(DeclisionTradeAction.OpenLong, message);
}
}

View File

@ -52,33 +52,61 @@ namespace KLHZ.Trader.Service.Controllers
}
}
[HttpGet]
public async Task LoadTradesToHistory(string figi)
{
try
{
using var context1 = await _dbContextFactory.CreateDbContextAsync();
context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
var data = await context1.InstrumentTrades
.Where(c => c.Figi == figi)
.OrderBy(c => c.BoughtAt)
.Select(c => new PriceChange()
{
Figi = figi,
Ticker = c.Ticker,
Time = c.BoughtAt,
Value = c.Price,
IsHistoricalData = true
})
.ToArrayAsync();
await context1.PriceChanges.Where(p => p.Figi == figi).ExecuteDeleteAsync();
await context1.PriceChanges.AddRangeAsync(data);
await context1.SaveChangesAsync();
}
catch (Exception ex)
{
////[HttpGet]
//public async Task LoadTradesToHistory(string figi)
//{
// try
// {
// using var context1 = await _dbContextFactory.CreateDbContextAsync();
// context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
// var data = await context1.InstrumentTrades
// .Where(c => c.Figi == figi)
// .OrderBy(c => c.BoughtAt)
// .Select(c => new PriceChange()
// {
// Figi = figi,
// Ticker = c.Ticker,
// Time = c.BoughtAt,
// Value = c.Price,
// IsHistoricalData = true
// })
// .ToArrayAsync();
// await context1.PriceChanges.Where(p => p.Figi == figi).ExecuteDeleteAsync();
// await context1.PriceChanges.AddRangeAsync(data);
// await context1.SaveChangesAsync();
// }
// catch (Exception ex)
// {
}
}
// }
//}
////[HttpGet]
//public async Task LoadTradesToHistory(string figi)
//{
// try
// {
// using var context1 = await _dbContextFactory.CreateDbContextAsync();
// context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
// var data = await context1.InstrumentTrades
// .Where(c => c.Figi == figi)
// .OrderBy(c => c.BoughtAt)
// .Select(c => new PriceChange()
// {
// Figi = figi,
// Ticker = c.Ticker,
// Time = c.BoughtAt,
// Value = c.Price,
// IsHistoricalData = true
// })
// .ToArrayAsync();
// await context1.PriceChanges.Where(p => p.Figi == figi).ExecuteDeleteAsync();
// await context1.PriceChanges.AddRangeAsync(data);
// await context1.SaveChangesAsync();
// }
// catch (Exception ex)
// {
// }
//}
}
}