фикс опреедения пересечений
parent
9b0253b109
commit
bbef0a757b
|
@ -25,6 +25,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
|
||||||
var res = TradingEvent.None;
|
var res = TradingEvent.None;
|
||||||
var bigWindowAv = 0m;
|
var bigWindowAv = 0m;
|
||||||
var smallWindowAv = 0m;
|
var smallWindowAv = 0m;
|
||||||
|
var s = 0;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var pricesForFinalComparison = new decimal[size];
|
var pricesForFinalComparison = new decimal[size];
|
||||||
|
@ -32,12 +33,10 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
|
||||||
var twavss = new decimal[size];
|
var twavss = new decimal[size];
|
||||||
var twavbs = new decimal[size];
|
var twavbs = new decimal[size];
|
||||||
var times = new DateTime[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++)
|
for (int shift = 0; shift < size - 1 && shift < prices.Length - 1; shift++)
|
||||||
{
|
{
|
||||||
|
s = shift;
|
||||||
var i2 = size - 1 - shift;
|
var i2 = size - 1 - shift;
|
||||||
var i1 = size - 2 - shift;
|
var i1 = size - 2 - shift;
|
||||||
|
|
||||||
|
@ -50,19 +49,14 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
|
||||||
bigWindowAv = twavb.value;
|
bigWindowAv = twavb.value;
|
||||||
smallWindowAv = twavs.value;
|
smallWindowAv = twavs.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
twavss[i2] = twavs.value;
|
twavss[i2] = twavs.value;
|
||||||
twavbs[i2] = twavb.value;
|
twavbs[i2] = twavb.value;
|
||||||
times[i2] = twavb.time;
|
times[i2] = twavb.time;
|
||||||
|
//if (System.Math.Abs(twavb.value - prices[prices.Length - 1]) > 2 * meanfullStep)
|
||||||
var debugArrayB = twavbs.Reverse().ToArray();
|
//{
|
||||||
var debugArrayS = twavss.Reverse().ToArray();
|
// res |= TradingEvent.StopBuy;
|
||||||
var debugArrayT = times.Reverse().ToArray();
|
// 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)
|
if (shift > 0)
|
||||||
{
|
{
|
||||||
var isCrossing = Lines.IsLinesCrossing(
|
var isCrossing = Lines.IsLinesCrossing(
|
||||||
|
@ -78,41 +72,13 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (isCrossing.res)
|
||||||
if (shift == 1 && isCrossing.res)//обработка ситуации когда одна из точек - совпадение
|
|
||||||
{
|
{
|
||||||
// если фильтрация окном 120 наползает на окно 15 сверху, потенциальное время открытия лонга и закрытия шорта
|
// если фильтрация окном 120 наползает на окно 15 сверху, потенциальное время открытия лонга и закрытия шорта
|
||||||
//if (twavbs[size - 1] <= twavss[size - 1] && twavbs[size - 2] > twavss[size - 2])
|
if (twavss[size - 1] >= twavbs[size - 1] && twavss[size - 2]<twavbs[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]))
|
|
||||||
{
|
{
|
||||||
sign = -1d;
|
//if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] >= meanfullStep
|
||||||
}
|
// && timesForFinalComparison[size - 1] - timesForFinalComparison[i2 + 1] >= timeForUptreandStart)
|
||||||
|
|
||||||
// если фильтрация окном 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)
|
|
||||||
{
|
{
|
||||||
res |= TradingEvent.UptrendStart;
|
res |= TradingEvent.UptrendStart;
|
||||||
}
|
}
|
||||||
|
@ -120,37 +86,16 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
|
||||||
}
|
}
|
||||||
|
|
||||||
// если фильтрация окном 15 наползает на окно 120 сверху, потенциальное время закрытия лонга и возможно открытия шорта
|
// если фильтрация окном 15 наползает на окно 120 сверху, потенциальное время закрытия лонга и возможно открытия шорта
|
||||||
if ((debugArrayS[0] == debugArrayB[0] && debugArrayS[1] < debugArrayB[1])
|
if (twavss[size - 1] <= twavbs[size - 1] && twavss[size - 2] > twavbs[size - 2])
|
||||||
|| (debugArrayS[0] > debugArrayB[0] && debugArrayS[1] < debugArrayB[1]))
|
|
||||||
{
|
{
|
||||||
if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] <= -meanfullStep
|
//if (pricesForFinalComparison[i2 + 1] - pricesForFinalComparison[size - 1] <= -meanfullStep
|
||||||
&& timesForFinalComparison[size - 1] - timesForFinalComparison[i2 + 1] >= timeForUptreandStart)
|
// && timesForFinalComparison[size - 1] - timesForFinalComparison[i2 + 1] >= timeForUptreandStart)
|
||||||
{
|
{
|
||||||
res |= TradingEvent.UptrendEnd;
|
res |= TradingEvent.UptrendEnd;
|
||||||
}
|
}
|
||||||
break;
|
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 _)
|
&& !OpeningStops.TryGetValue(message.Figi, out _)
|
||||||
&& state == ExchangeState.Open
|
&& state == ExchangeState.Open
|
||||||
&& data.timestamps.Length > 1
|
&& 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));
|
var fullData = await _tradeDataProvider.GetData(message.Figi, TimeSpan.FromMinutes(60));
|
||||||
if (fullData.isFullIntervalExists)
|
if (fullData.isFullIntervalExists)
|
||||||
|
@ -180,7 +181,7 @@ namespace KLHZ.Trader.Core.Exchange.Services
|
||||||
var max = fullData.prices.Max();
|
var max = fullData.prices.Max();
|
||||||
var min = fullData.prices.Min();
|
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())
|
if (!message.IsHistoricalData && BotModeSwitcher.CanPurchase())
|
||||||
{
|
{
|
||||||
|
@ -209,11 +210,12 @@ namespace KLHZ.Trader.Core.Exchange.Services
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// await LogDeclision(DeclisionTradeAction.OpenLong, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
await LogDeclision(DeclisionTradeAction.OpenLong, message);
|
await LogDeclision(DeclisionTradeAction.OpenLong, message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((res & TradingEvent.UptrendEnd) == TradingEvent.UptrendEnd)
|
if ((res & TradingEvent.UptrendEnd) == TradingEvent.UptrendEnd)
|
||||||
{
|
{
|
||||||
|
|
|
@ -52,33 +52,61 @@ namespace KLHZ.Trader.Service.Controllers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
////[HttpGet]
|
||||||
public async Task LoadTradesToHistory(string figi)
|
//public async Task LoadTradesToHistory(string figi)
|
||||||
{
|
//{
|
||||||
try
|
// try
|
||||||
{
|
// {
|
||||||
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.InstrumentTrades
|
// var data = await context1.InstrumentTrades
|
||||||
.Where(c => c.Figi == figi)
|
// .Where(c => c.Figi == figi)
|
||||||
.OrderBy(c => c.BoughtAt)
|
// .OrderBy(c => c.BoughtAt)
|
||||||
.Select(c => new PriceChange()
|
// .Select(c => new PriceChange()
|
||||||
{
|
// {
|
||||||
Figi = figi,
|
// Figi = figi,
|
||||||
Ticker = c.Ticker,
|
// Ticker = c.Ticker,
|
||||||
Time = c.BoughtAt,
|
// Time = c.BoughtAt,
|
||||||
Value = c.Price,
|
// Value = c.Price,
|
||||||
IsHistoricalData = true
|
// IsHistoricalData = true
|
||||||
})
|
// })
|
||||||
.ToArrayAsync();
|
// .ToArrayAsync();
|
||||||
await context1.PriceChanges.Where(p => p.Figi == figi).ExecuteDeleteAsync();
|
// await context1.PriceChanges.Where(p => p.Figi == figi).ExecuteDeleteAsync();
|
||||||
await context1.PriceChanges.AddRangeAsync(data);
|
// await context1.PriceChanges.AddRangeAsync(data);
|
||||||
await context1.SaveChangesAsync();
|
// await context1.SaveChangesAsync();
|
||||||
}
|
// }
|
||||||
catch (Exception ex)
|
// 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