Atr, FlowIndicator and fixes

This commit is contained in:
Miha Kralj
2024-10-21 16:06:47 -07:00
parent fbe4046b5d
commit e3d7cd9896
15 changed files with 335 additions and 189 deletions
+19 -19
View File
@@ -6,11 +6,11 @@ public class GbmFeed : TBarSeries
{
private readonly double _mu, _sigma;
private readonly RandomNumberGenerator _rng;
private double _lastClose, _lastHigh, _lastLow;
private double _lastClose;
public GbmFeed(double initialPrice = 100.0, double mu = 0.05, double sigma = 0.2)
{
_lastClose = _lastHigh = _lastLow = initialPrice;
_lastClose = initialPrice;
_mu = mu;
_sigma = sigma;
_rng = RandomNumberGenerator.Create();
@@ -24,9 +24,7 @@ public class GbmFeed : TBarSeries
DateTime startTime = DateTime.UtcNow - TimeSpan.FromHours(count);
for (int i = 0; i < count; i++)
{
Add(startTime, true);
Add(startTime, false);
Add(startTime, false);
Add(startTime, isNew: true);
startTime = startTime.AddHours(1);
}
}
@@ -36,27 +34,29 @@ public class GbmFeed : TBarSeries
double dt = 1.0 / 252;
double drift = (_mu - 0.5 * _sigma * _sigma) * dt;
double diffusion = _sigma * Math.Sqrt(dt) * GenerateNormalRandom();
double newClose = _lastClose * Math.Exp(drift + diffusion);
double open = _lastClose;
double high = Math.Max(_lastHigh, Math.Max(open, newClose) * (1 + GenerateRandomDouble() * 0.01));
double low = Math.Min(_lastLow, Math.Min(open, newClose) * (1 - GenerateRandomDouble() * 0.01));
double close = open * Math.Exp(drift + diffusion);
// Generate intra-bar price movements
double maxMove = Math.Abs(close - open) * 1.5; // Allow for some extra movement within the bar
double high = Math.Max(open, close) + maxMove * GenerateRandomDouble();
double low = Math.Min(open, close) - maxMove * GenerateRandomDouble();
// Ensure high is always greater than or equal to both open and close
high = Math.Max(high, Math.Max(open, close));
// Ensure low is always less than or equal to both open and close
low = Math.Min(low, Math.Min(open, close));
double volume = 1000 + GenerateRandomDouble() * 1000;
if (isNew)
{
_lastClose = newClose;
_lastClose = close;
}
else
{
high = Math.Max(_lastHigh, high);
low = Math.Min(_lastLow, low);
}
_lastHigh = high;
_lastLow = low;
TBar bar = new(time, open, high, low, newClose, volume, isNew);
return bar;
return new TBar(time, open, high, low, close, volume, isNew);
}
private double GenerateNormalRandom()
@@ -73,4 +73,4 @@ public class GbmFeed : TBarSeries
_rng.GetBytes(bytes);
return (double)BitConverter.ToUInt64(bytes, 0) / ulong.MaxValue;
}
}
}