фикс опреедения пересечений
parent
9b0253b109
commit
bbef0a757b
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
// {
|
||||
|
||||
// }
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue