перешел с float на decimal в расчётаз

main
vlad zverzhkhovskiy 2025-09-02 21:54:35 +03:00
parent ff1090c819
commit fbd3da2b8d
13 changed files with 94 additions and 84 deletions

View File

@ -5,13 +5,13 @@
public readonly int Start;
public readonly int Bound;
public readonly int End;
public readonly float DiffStart;
public readonly float DiffEnd;
public readonly decimal DiffStart;
public readonly decimal DiffEnd;
public readonly bool Success;
public readonly TimeSpan PeriodStart;
public readonly TimeSpan PeriodEnd;
public TwoPeriodsResultDto(bool success, float diffStart, float diffEnd, int start, int bound, int end,
public TwoPeriodsResultDto(bool success, decimal diffStart, decimal diffEnd, int start, int bound, int end,
TimeSpan periodStart, TimeSpan periodEnd)
{
Success = success;

View File

@ -7,7 +7,7 @@ namespace KLHZ.Trader.Core.Contracts.Declisions.Interfaces
public string Figi { get; }
public int Length { get; }
public ValueTask AddData(INewPrice priceChange);
public ValueTask<(DateTime[] timestamps, float[] prices)> GetData();
public ValueTask<(DateTime[] timestamps, decimal[] prices)> GetData();
public ValueTask AddOrderbook(IOrderbook orderbook);
/// <summary>

View File

@ -2,7 +2,7 @@
{
public static class Lines
{
public static (float x, float y) LinesCrossing(float k1, float b1, float k2, float b2)
public static (decimal x, decimal y) LinesCrossing(decimal k1, decimal b1, decimal k2, decimal b2)
{
var x = (b2 - b1) / (k1 - k2);
var y = k1 * x + b1;
@ -10,9 +10,9 @@
return (x, y);
}
public static bool IsLinesCrossing(DateTime time1, DateTime time2, float val1_1, float val1_2, float val2_1, float val2_2)
public static bool IsLinesCrossing(DateTime time1, DateTime time2, decimal val1_1, decimal val1_2, decimal val2_1, decimal val2_2)
{
var dtime = (float)(time2 - time1).TotalSeconds;
var dtime = (decimal)(time2 - time1).TotalSeconds;
var dval1 = val1_2 - val1_1;
var k1 = dval1 / dtime;
@ -25,7 +25,7 @@
if (k1 != k2)
{
var cross = LinesCrossing(k1, b1, k2, b2);
var crossingTimestamp = time1.AddSeconds(cross.x);
var crossingTimestamp = time1.AddSeconds((double)cross.x);
return crossingTimestamp >= time1 && crossingTimestamp <= time2;
}
return false;

View File

@ -4,15 +4,15 @@
{
public readonly int Start;
public readonly int End;
public readonly float LastPrice;
public readonly float FirstPrice;
public readonly float PeriodDiff;
public readonly float PeriodMax;
public readonly float PeriodMin;
public readonly decimal LastPrice;
public readonly decimal FirstPrice;
public readonly decimal PeriodDiff;
public readonly decimal PeriodMax;
public readonly decimal PeriodMin;
public readonly bool Success;
public readonly TimeSpan Period;
public PeriodPricesInfoDto(bool success, float firstPrice, float lastPrice, float periodDiff, float periodMin, float periodMax, TimeSpan period, int start, int end)
public PeriodPricesInfoDto(bool success, decimal firstPrice, decimal lastPrice, decimal periodDiff, decimal periodMin, decimal periodMax, TimeSpan period, int start, int end)
{
Success = success;
LastPrice = lastPrice;

View File

@ -24,7 +24,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Services.Cache
public decimal BidsCount => 1;
private readonly object _locker = new();
private readonly float[] Prices = new float[CacheMaxLength];
private readonly decimal[] Prices = new decimal[CacheMaxLength];
private readonly DateTime[] Timestamps = new DateTime[CacheMaxLength];
private int _length = 0;
@ -36,7 +36,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Services.Cache
Array.Copy(Prices, 1, Prices, 0, Prices.Length - 1);
Array.Copy(Timestamps, 1, Timestamps, 0, Timestamps.Length - 1);
Prices[Prices.Length - 1] = (float)priceChange.Value;
Prices[Prices.Length - 1] = priceChange.Value;
Timestamps[Timestamps.Length - 1] = priceChange.Time;
if (_length < CacheMaxLength)
@ -47,11 +47,11 @@ namespace KLHZ.Trader.Core.Math.Declisions.Services.Cache
return ValueTask.CompletedTask;
}
public ValueTask<(DateTime[] timestamps, float[] prices)> GetData()
public ValueTask<(DateTime[] timestamps, decimal[] prices)> GetData()
{
lock (_locker)
{
var prices = new float[_length];
var prices = new decimal[_length];
var timestamps = new DateTime[_length];
Array.Copy(Prices, Prices.Length - _length, prices, 0, prices.Length);
Array.Copy(Timestamps, Prices.Length - _length, timestamps, 0, timestamps.Length);
@ -79,7 +79,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Services.Cache
.Skip(priceChanges.Length - CacheMaxLength)
.ToArray();
var prices = selectedPriceChanges
.Select(pc => (float)pc.Value)
.Select(pc => pc.Value)
.ToArray();
var times = selectedPriceChanges
.Select(pc => pc.Time)

View File

@ -44,7 +44,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Services.Cache
}
private readonly object _locker = new();
private readonly float[] Prices = new float[_arrayMaxLength];
private readonly decimal[] Prices = new decimal[_arrayMaxLength];
private readonly DateTime[] Timestamps = new DateTime[_arrayMaxLength];
private int _length = 0;
@ -59,7 +59,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Services.Cache
lock (_locker)
{
_pointer++;
Prices[_pointer] = (float)priceChange.Value;
Prices[_pointer] = priceChange.Value;
Timestamps[_pointer] = priceChange.Time;
if (_length < CacheMaxLength)
{
@ -76,17 +76,17 @@ namespace KLHZ.Trader.Core.Math.Declisions.Services.Cache
return ValueTask.CompletedTask;
}
public ValueTask<(DateTime[] timestamps, float[] prices)> GetData()
public ValueTask<(DateTime[] timestamps, decimal[] prices)> GetData()
{
lock (_locker)
{
if (_pointer < 0)
{
return ValueTask.FromResult((Array.Empty<DateTime>(), Array.Empty<float>()));
return ValueTask.FromResult((Array.Empty<DateTime>(), Array.Empty<decimal>()));
}
else
{
var prices = new float[_length];
var prices = new decimal[_length];
var timestamps = new DateTime[_length];
Array.Copy(Prices, 1 + _pointer - _length, prices, 0, prices.Length);
Array.Copy(Timestamps, 1 + _pointer - _length, timestamps, 0, timestamps.Length);
@ -123,7 +123,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Services.Cache
foreach (var pc in selectedPriceChanges)
{
AddData(pc);
AddData(pc).AsTask().Wait();
}
}
}

View File

@ -5,10 +5,10 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
{
public static class MovingAverage
{
private static (DateTime time, float value) CalcTimeWindowAverageValue(DateTime[] timestamps, float[] values, int window, int shift = 0)
internal static (DateTime time, decimal value) CalcTimeWindowAverageValue(DateTime[] timestamps, decimal[] values, int window, int shift = 0)
{
var sum = values[values.Length - 1 - shift];
var count = 1;
var count = 1m;
var startTime = timestamps[timestamps.Length - 1 - shift];
for (int i = 2; i < values.Length && startTime - timestamps[values.Length - i - shift] < TimeSpan.FromSeconds(window); i++)
{
@ -18,12 +18,18 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
return (startTime, sum / count);
}
public static TradingEvent CheckByWindowAverageMean(DateTime[] timestamps, float[] prices, int size, float meanfullStep = 3f)
public static TradingEvent CheckByWindowAverageMean(DateTime[] timestamps, decimal[] prices, int size, decimal meanfullStep = 3m)
{
var twav15s = new float[size];
var twav120s = new float[size];
var times = new DateTime[size];
var res = TradingEvent.None;
if (timestamps.Length < size)
{
return res;
}
var twav15s = new decimal[size];
var twav120s = new decimal[size];
var times = new DateTime[size];
for (int shift = 0; shift < size; shift++)
{
var twav15 = CalcTimeWindowAverageValue(timestamps, prices, 15, shift);
@ -38,8 +44,8 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
}
if (shift > 0)
{
var i1 = size - 1 - shift;
var i2 = size - 2 - shift;
var i1 = size - shift;
var i2 = size - 1 - shift;
var isCrossing = Lines.IsLinesCrossing(
times[i1],
times[i2],

View File

@ -21,8 +21,8 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
var lastPriceTime = times[times.Length - 1];
var intervalEnd = lastPriceTime - timeShift;
var intervalStart = intervalEnd - timeSpan;
var max = float.MinValue;
var min = float.MaxValue;
var max = decimal.MinValue;
var min = decimal.MaxValue;
var intervaEndIndex = -1;
var intervaStartIndex = -1;
@ -69,18 +69,18 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
return res;
}
internal static bool CheckStable(this PeriodPricesInfoDto data, float meanfullDiff)
internal static bool CheckStable(this PeriodPricesInfoDto data, decimal meanfullDiff)
{
meanfullDiff = System.Math.Abs(meanfullDiff);
return data.Success && System.Math.Abs(data.PeriodDiff) < 1.5 * meanfullDiff && System.Math.Abs(data.PeriodMax - data.PeriodMin) < 2 * meanfullDiff;
return data.Success && System.Math.Abs(data.PeriodDiff) < 1.5m * meanfullDiff && System.Math.Abs(data.PeriodMax - data.PeriodMin) < 2 * meanfullDiff;
}
internal static bool CheckGrowing(this PeriodPricesInfoDto data, float meanfullDiff)
internal static bool CheckGrowing(this PeriodPricesInfoDto data, decimal meanfullDiff)
{
return meanfullDiff > 0 && data.Success && data.PeriodDiff > meanfullDiff && System.Math.Abs(data.PeriodMax - data.PeriodMin) < 3 * System.Math.Abs(data.PeriodDiff);
}
internal static bool CheckFalling(this PeriodPricesInfoDto data, float meanfullDiff)
internal static bool CheckFalling(this PeriodPricesInfoDto data, decimal meanfullDiff)
{
meanfullDiff = -meanfullDiff;
return meanfullDiff < 0 && data.Success && data.PeriodDiff < meanfullDiff && System.Math.Abs(data.PeriodMax - data.PeriodMin) < 3 * System.Math.Abs(data.PeriodDiff);
@ -88,20 +88,20 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
internal static float CalcTrendRelationAbs(PeriodPricesInfoDto first, PeriodPricesInfoDto second)
{
var k1 = System.Math.Abs(first.PeriodDiff) / System.Math.Abs(first.Period.TotalSeconds);
var k2 = System.Math.Abs(second.PeriodDiff) / System.Math.Abs(second.Period.TotalSeconds);
var k1 = System.Math.Abs(first.PeriodDiff) / System.Math.Abs((decimal)first.Period.TotalSeconds);
var k2 = System.Math.Abs(second.PeriodDiff) / System.Math.Abs((decimal)second.Period.TotalSeconds);
if (k2 == 0 && k1 != 0) return 1000;
return (float)(k1 / k2);
}
internal static float CalcTrendRelationAbs(TwoPeriodsResultDto data)
{
var k1 = System.Math.Abs(data.DiffStart) / System.Math.Abs(data.PeriodStart.TotalSeconds);
var k2 = System.Math.Abs(data.DiffEnd) / System.Math.Abs(data.PeriodEnd.TotalSeconds);
var k1 = System.Math.Abs(data.DiffStart) / System.Math.Abs((decimal)data.PeriodStart.TotalSeconds);
var k2 = System.Math.Abs(data.DiffEnd) / System.Math.Abs((decimal)data.PeriodEnd.TotalSeconds);
if (k2 == 0 && k1 != 0) return 1000;
return (float)(k1 / k2);
}
internal static bool CheckDowntrendEnding(this IPriceHistoryCacheUnit unit, TimeSpan firstPeriod, TimeSpan secondPeriod, float meanfullDiff)
internal static bool CheckDowntrendEnding(this IPriceHistoryCacheUnit unit, TimeSpan firstPeriod, TimeSpan secondPeriod, decimal meanfullDiff)
{
var totalDiff = unit.GetPriceDiffForTimeSpan(TimeSpan.Zero, firstPeriod + secondPeriod);
var startDiff = unit.GetPriceDiffForTimeSpan(secondPeriod, firstPeriod);
@ -121,7 +121,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
return res;
}
internal static bool CheckUptrendEnding(this IPriceHistoryCacheUnit unit, TimeSpan firstPeriod, TimeSpan secondPeriod, float meanfullDiff)
internal static bool CheckUptrendEnding(this IPriceHistoryCacheUnit unit, TimeSpan firstPeriod, TimeSpan secondPeriod, decimal meanfullDiff)
{
var totalDiff = unit.GetPriceDiffForTimeSpan(TimeSpan.Zero, firstPeriod + secondPeriod);
var startDiff = unit.GetPriceDiffForTimeSpan(secondPeriod, firstPeriod);
@ -141,7 +141,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
return res;
}
internal static bool CheckDowntrendStarting(this PriceHistoryCacheUnit unit, TimeSpan firstPeriod, TimeSpan secondPeriod, float meanfullDiff)
internal static bool CheckDowntrendStarting(this PriceHistoryCacheUnit unit, TimeSpan firstPeriod, TimeSpan secondPeriod, decimal meanfullDiff)
{
var totalDiff = unit.GetPriceDiffForTimeSpan(TimeSpan.Zero, firstPeriod + secondPeriod);
var startDiff = unit.GetPriceDiffForTimeSpan(secondPeriod, firstPeriod);
@ -156,7 +156,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
return totalDiff.Success && (isStartStable || isStartGrows) && isEndFalls && trendRelation >= 2;
}
internal static bool CheckUptrendStarting(this PriceHistoryCacheUnit unit, TimeSpan firstPeriod, TimeSpan secondPeriod, float meanfullDiff)
internal static bool CheckUptrendStarting(this PriceHistoryCacheUnit unit, TimeSpan firstPeriod, TimeSpan secondPeriod, decimal meanfullDiff)
{
var totalDiff = unit.GetPriceDiffForTimeSpan(TimeSpan.Zero, firstPeriod + secondPeriod);
var startDiff = unit.GetPriceDiffForTimeSpan(secondPeriod, firstPeriod);
@ -185,7 +185,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
return res;
}
internal static TwoPeriodsResultDto GetTwoPeriodsProcessingData(this (DateTime[] timestamps, float[] prices) data, TimeSpan shift, int shiftPointsStart, int shiftPointsEnd, TimeSpan firstPeriod, float meanfullDiff)
internal static TwoPeriodsResultDto GetTwoPeriodsProcessingData(this (DateTime[] timestamps, decimal[] prices) data, TimeSpan shift, int shiftPointsStart, int shiftPointsEnd, TimeSpan firstPeriod, decimal meanfullDiff)
{
var res = new TwoPeriodsResultDto(success: false, 0, 0, 0, 0, 0, TimeSpan.Zero, TimeSpan.Zero);
var time = data.timestamps;
@ -222,12 +222,12 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
return res;
}
public static bool CheckLongClose(this IPriceHistoryCacheUnit unit, TimeSpan firstPeriod, TimeSpan secondPeriod, float meanfullDiff, int pointsStart, int pointsEnd)
public static bool CheckLongClose(this IPriceHistoryCacheUnit unit, TimeSpan firstPeriod, TimeSpan secondPeriod, decimal meanfullDiff, int pointsStart, int pointsEnd)
{
var data = unit.GetData().Result;
var periodStat = data.GetTwoPeriodsProcessingData(secondPeriod, pointsStart, pointsEnd, firstPeriod, meanfullDiff);
var trendRelation = CalcTrendRelationAbs(periodStat);
var isStartOk = periodStat.Success && periodStat.DiffStart > 0 && periodStat.DiffStart > 1.5 * meanfullDiff;
var isStartOk = periodStat.Success && periodStat.DiffStart > 0 && periodStat.DiffStart > 1.5m * meanfullDiff;
var isEndOk = periodStat.Success && periodStat.DiffEnd < meanfullDiff;
if (isEndOk)
@ -247,7 +247,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
return isStartOk && isEndOk && data.prices[periodStat.End] - data.prices[periodStat.Start] >= meanfullDiff;
}
internal static bool CheckUptrendStarting2(this IPriceHistoryCacheUnit unit, TimeSpan firstPeriod, TimeSpan secondPeriod, float meanfullDiff)
internal static bool CheckUptrendStarting2(this IPriceHistoryCacheUnit unit, TimeSpan firstPeriod, TimeSpan secondPeriod, decimal meanfullDiff)
{
var data = unit.GetData().Result;
var periodStat = data.GetTwoPeriodsProcessingData(secondPeriod, 15, 2, firstPeriod, meanfullDiff);
@ -272,7 +272,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
return isStartOk && isEndOk;
}
internal static bool _CheckUptrendStarting2(this IPriceHistoryCacheUnit unit, TimeSpan firstPeriod, TimeSpan secondPeriod, float meanfullDiff)
internal static bool _CheckUptrendStarting2(this IPriceHistoryCacheUnit unit, TimeSpan firstPeriod, TimeSpan secondPeriod, decimal meanfullDiff)
{
var data = unit.GetData().Result;
var periodStat = data.GetTwoPeriodsProcessingData(secondPeriod, 15, 1, firstPeriod, meanfullDiff);
@ -298,7 +298,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
}
public static bool CheckLongOpen(this IPriceHistoryCacheUnit unit, TimeSpan firstPeriod, TimeSpan secondPeriod, float meanfullDiff, int pointsStart, int pointsEnd)
public static bool CheckLongOpen(this IPriceHistoryCacheUnit unit, TimeSpan firstPeriod, TimeSpan secondPeriod, decimal meanfullDiff, int pointsStart, int pointsEnd)
{
var data = unit.GetData().Result;
var periodStat = data.GetTwoPeriodsProcessingData(secondPeriod, pointsStart, pointsEnd, firstPeriod, meanfullDiff);
@ -325,14 +325,14 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
public static TradingEvent Detect(IPriceHistoryCacheUnit data)
{
float meanfullDiff;
decimal meanfullDiff;
if (data.Figi == "BBG004730N88")
{
meanfullDiff = 0.05f;
meanfullDiff = 0.05m;
}
else if (data.Figi == "FUTIMOEXF000")
{
meanfullDiff = 1f;
meanfullDiff = 1m;
}
else
{
@ -352,7 +352,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Utils
}
//var downtrendEnds = data.CheckDowntrendEnding(TimeSpan.FromSeconds(60), TimeSpan.FromSeconds(15), meanfullDiff);
var uptrendEnds = data.CheckLongClose(TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(20), meanfullDiff * 1.5f, 8, 8);
var uptrendEnds = data.CheckLongClose(TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(20), meanfullDiff * 1.5m, 8, 8);
var uptrendEnds2 = data.CheckLongClose(TimeSpan.FromSeconds(120), TimeSpan.FromSeconds(30), meanfullDiff, 15, 8);
uptrendEnds |= uptrendEnds2;
if (uptrendEnds)

View File

@ -46,7 +46,7 @@ namespace KLHZ.Trader.Core.Tests
var count = 1;
var figi = "figi";
var hist = GetHistory(count, figi);
var cacheUnit = new PriceHistoryCacheUnit2("", hist);
var cacheUnit = new PriceHistoryCacheUnit2(figi, hist);
var data = cacheUnit.GetData().Result;
Assert.That(data.prices.Length == count);
@ -64,7 +64,7 @@ namespace KLHZ.Trader.Core.Tests
var count = 20;
var figi = "figi";
var hist = GetHistory(count, figi);
var cacheUnit = new PriceHistoryCacheUnit2("", hist);
var cacheUnit = new PriceHistoryCacheUnit2(figi, hist);
var data = cacheUnit.GetData().Result;
Assert.That(data.prices.Length == count);
@ -83,7 +83,7 @@ namespace KLHZ.Trader.Core.Tests
var count = PriceHistoryCacheUnit.CacheMaxLength;
var figi = "figi";
var hist = GetHistory(count, figi);
var cacheUnit = new PriceHistoryCacheUnit2("", hist);
var cacheUnit = new PriceHistoryCacheUnit2(figi, hist);
var data = cacheUnit.GetData().Result;
Assert.That(data.prices.Length == count);
@ -103,7 +103,7 @@ namespace KLHZ.Trader.Core.Tests
var count = PriceHistoryCacheUnit.CacheMaxLength + shift;
var figi = "figi";
var hist = GetHistory(count, figi);
var cacheUnit = new PriceHistoryCacheUnit2("", hist);
var cacheUnit = new PriceHistoryCacheUnit2(figi, hist);
var data = cacheUnit.GetData().Result;
Assert.That(data.prices.Length == count - shift);
@ -127,7 +127,7 @@ namespace KLHZ.Trader.Core.Tests
var count = PriceHistoryCacheUnit.CacheMaxLength + shift;
var figi = "figi";
var hist = GetHistory(count, figi);
var cacheUnit = new PriceHistoryCacheUnit2("", hist);
var cacheUnit = new PriceHistoryCacheUnit2(figi, hist);
var data = cacheUnit.GetData().Result;
Assert.That(data.prices.Length == count - shift);
@ -151,7 +151,7 @@ namespace KLHZ.Trader.Core.Tests
var count = PriceHistoryCacheUnit.CacheMaxLength + shift;
var figi = "figi";
var hist = GetHistory(count, figi);
var cacheUnit = new PriceHistoryCacheUnit2("", hist);
var cacheUnit = new PriceHistoryCacheUnit2(figi, hist);
var data = cacheUnit.GetData().Result;
Assert.That(data.prices.Length == count - shift);
@ -175,7 +175,7 @@ namespace KLHZ.Trader.Core.Tests
var count = PriceHistoryCacheUnit.CacheMaxLength;
var figi = "figi";
var hist = GetHistory(count, figi);
var cacheUnit = new PriceHistoryCacheUnit2("", hist);
var cacheUnit = new PriceHistoryCacheUnit2(figi, hist);
var data = cacheUnit.GetData().Result;
Assert.That(data.prices.Length == count);
@ -192,7 +192,7 @@ namespace KLHZ.Trader.Core.Tests
cacheUnit.AddData(newData1);
var data2 = cacheUnit.GetData().Result;
Assert.IsTrue(data2.prices[data2.prices.Length - 1] == (float)newData1.Value);
Assert.IsTrue(data2.prices[data2.prices.Length - 1] == newData1.Value);
Assert.IsTrue(data2.timestamps[data2.timestamps.Length - 1] == newData1.Time);
var newData2 = new PriceChange() { Figi = figi, Ticker = figi, Value = 100501, Time = DateTime.UtcNow };
@ -200,7 +200,7 @@ namespace KLHZ.Trader.Core.Tests
cacheUnit.AddData(newData2);
var data3 = cacheUnit.GetData().Result;
Assert.IsTrue(data3.prices[data3.prices.Length - 1] == (float)newData2.Value);
Assert.IsTrue(data3.prices[data3.prices.Length - 1] == newData2.Value);
Assert.IsTrue(data3.timestamps[data3.timestamps.Length - 1] == newData2.Time);
}

View File

@ -192,7 +192,7 @@ namespace KLHZ.Trader.Core.Tests
cacheUnit.AddData(newData1);
var data2 = cacheUnit.GetData().Result;
Assert.IsTrue(data2.prices[data2.prices.Length - 1] == (float)newData1.Value);
Assert.IsTrue(data2.prices[data2.prices.Length - 1] == newData1.Value);
Assert.IsTrue(data2.timestamps[data2.timestamps.Length - 1] == newData1.Time);
var newData2 = new PriceChange() { Figi = figi, Ticker = figi, Value = 100501, Time = DateTime.UtcNow };
@ -200,7 +200,7 @@ namespace KLHZ.Trader.Core.Tests
cacheUnit.AddData(newData2);
var data3 = cacheUnit.GetData().Result;
Assert.IsTrue(data3.prices[data3.prices.Length - 1] == (float)newData2.Value);
Assert.IsTrue(data3.prices[data3.prices.Length - 1] == newData2.Value);
Assert.IsTrue(data3.timestamps[data3.timestamps.Length - 1] == newData2.Time);
}
}

View File

@ -6,7 +6,7 @@ namespace KLHZ.Trader.Core.Tests
{
public class HistoryProcessingInstrumentsTests
{
private static PriceChange[] GetHistory(int count, string figi, DateTime startDt, float startValue, float step)
private static PriceChange[] GetHistory(int count, string figi, DateTime startDt, decimal startValue, decimal step)
{
var res = new PriceChange[count];
if (count != 0)
@ -21,7 +21,7 @@ namespace KLHZ.Trader.Core.Tests
Ticker = figi + "_ticker",
Id = i,
Time = startDt,
Value = (decimal)startValue,
Value = startValue,
};
}
}
@ -68,7 +68,7 @@ namespace KLHZ.Trader.Core.Tests
var figi = "figi";
var startDate = new DateTime(2020, 1, 1, 1, 0, 0, DateTimeKind.Utc);
var count = 100;
var step = 0.5f;
var step = 0.5m;
var startValue = 10;
var unit = new PriceHistoryCacheUnit(figi, GetHistory(count, figi, startDate, startValue, step));
@ -102,7 +102,7 @@ namespace KLHZ.Trader.Core.Tests
var figi = "figi";
var startDate = new DateTime(2020, 1, 1, 1, 0, 0, DateTimeKind.Utc);
var count = 100;
var step = 0.5f;
var step = 0.5m;
var startValue = 10;
var unit = new PriceHistoryCacheUnit(figi, GetHistory(count, figi, startDate, startValue, step));
@ -137,7 +137,7 @@ namespace KLHZ.Trader.Core.Tests
var figi = "figi";
var startDate = new DateTime(2020, 1, 1, 1, 0, 0, DateTimeKind.Utc);
var count = 100;
var step = -0.5f;
var step = -0.5m;
var startValue = 10;
var unit = new PriceHistoryCacheUnit(figi, GetHistory(count, figi, startDate, startValue, step));
@ -172,7 +172,7 @@ namespace KLHZ.Trader.Core.Tests
var figi = "figi";
var startDate = new DateTime(2020, 1, 1, 1, 0, 0, DateTimeKind.Utc);
var count = 100;
var step = -0.5f;
var step = -0.5m;
var startValue = 10;
var unit = new PriceHistoryCacheUnit(figi, GetHistory(count, figi, startDate, startValue, step));
@ -207,7 +207,7 @@ namespace KLHZ.Trader.Core.Tests
var figi = "figi";
var startDate = new DateTime(2020, 1, 1, 1, 0, 0, DateTimeKind.Utc);
var count = 100;
var step = -0.5f;
var step = -0.5m;
var startValue = 10;
var unit = new PriceHistoryCacheUnit(figi, GetHistory(count, figi, startDate, startValue, step));

View File

@ -10,11 +10,11 @@ namespace KLHZ.Trader.Core.Tests
var time2 = DateTime.UtcNow;
var time1 = time2.AddSeconds(-20);
var val1_1 = 0.5f;
var val1_2 = -0.5f;
var val1_1 = 0.5m;
var val1_2 = -0.5m;
var val2_1 = -0.5f;
var val2_2 = 0.5f;
var val2_1 = -0.5m;
var val2_2 = 0.5m;
Assert.IsTrue(Lines.IsLinesCrossing(time1, time2, val1_1, val1_2, val2_1, val2_2));
}
@ -25,11 +25,11 @@ namespace KLHZ.Trader.Core.Tests
var time2 = DateTime.UtcNow;
var time1 = time2.AddSeconds(-20);
var val1_1 = 0.5f;
var val1_2 = -0.5f;
var val1_1 = 0.5m;
var val1_2 = -0.5m;
var val2_1 = 0.5f;
var val2_2 = -0.5f;
var val2_1 = 0.5m;
var val2_2 = -0.5m;
Assert.IsFalse(Lines.IsLinesCrossing(time1, time2, val1_1, val1_2, val2_1, val2_2));
}

View File

@ -135,7 +135,11 @@ namespace KLHZ.Trader.Core.Exchange.Services
var declisionsForSave = new List<Declision>();
if (message.Figi == "FUTIMOEXF000")
{
var result = MovingAverage.CheckByWindowAverageMean(data.timestamps, data.prices, 100, 3f);
if (unit.Length < 100)
{
continue;
}
var result = MovingAverage.CheckByWindowAverageMean(data.timestamps, data.prices, 100, 2m);
if ((result & TradingEvent.StopBuy) == TradingEvent.StopBuy)
{
var stopTo = DateTime.UtcNow.AddMinutes(_buyStopLength);