Commit Latest

This commit is contained in:
2025-06-23 19:13:38 -04:00
parent b1d0b835b6
commit d1a8d73ead

View File

@@ -28,7 +28,7 @@ namespace PortfolioManager.Renderers
}
public static class FontFactor
{
public const int FontSize = 10;
public const int FontSize = 11;
}
public class BollingerBandRenderer : ModelBase
@@ -48,6 +48,11 @@ namespace PortfolioManager.Renderers
private BollingerBands bollingerBands;
private InsiderTransactionSummaries insiderTransactionSummaries = null;
double maxBollingerDate = 0.00;
double minBollingerDate = 0.00;
double spread = 0.00;
double percentShift3PC = 0.00;
double percentShift1PC = 0.00;
public BollingerBandRenderer(AvaPlot plotter)
{
@@ -122,6 +127,13 @@ namespace PortfolioManager.Renderers
}
}
bollingerBands = BollingerBandGenerator.GenerateBollingerBands(prices);
maxBollingerDate = bollingerBands.Max(x=>x.Date).ToOADate();
minBollingerDate = bollingerBands.Min(x=>x.Date).ToOADate();
spread = (maxBollingerDate - minBollingerDate);
percentShift3PC = spread * .03;
percentShift1PC = spread * .01;
GenerateBollingerBands();
GenerateZeroPoint(zeroPrice);
GenerateInsiderTransactions();
@@ -158,8 +170,6 @@ namespace PortfolioManager.Renderers
imageMarker = Plotter.Plot.Add.ImageMarker(coordinates, image);
}
/// <summary>
/// Generate Stop Limits
/// </summary>
@@ -176,6 +186,7 @@ namespace PortfolioManager.Renderers
}
(DateTime[] dates, double[] values) = StopLimits.ToXYData();
// Add the markers
Image imageStopLimitMarker = TextMarkerImageGenerator.ToSPImage(ImageCache.GetInstance().GetImage(ImageCache.ImageType.RedTriangleUp));
for (int index = 0; index < dates.Length; index++)
{
@@ -185,6 +196,7 @@ namespace PortfolioManager.Renderers
ImageMarker imageMarker = Plotter.Plot.Add.ImageMarker(coordinates, imageStopLimitMarker, SizeFactor.Normal);
}
// Add the text marker
if (null != stopLimits)
{
for (int index = 0; index < stopLimits.Count; index++)
@@ -196,12 +208,13 @@ namespace PortfolioManager.Renderers
sb.Append(Utility.FormatCurrency(limit.StopPrice));
if (index == stopLimits.Count - 1)
{
Price latestPrice = prices[0];
Price latestPrice = prices[0];
double percentOffsetFromLow = ((latestPrice.Low - limit.StopPrice) / limit.StopPrice);
sb.Append(" (").Append(percentOffsetFromLow > 0 ? "+" : "").Append(Utility.FormatPercent(percentOffsetFromLow)).Append(")");
}
Image image = TextMarkerImageGenerator.GenerateImage(sb.ToString(), 150, 24, FontFactor.FontSize);
Coordinates coordinates = new Coordinates(dates[0].ToOADate(), values[0] - 5.00);
Image image = TextMarkerImageGenerator.GenerateImage(sb.ToString(), 155, 24, FontFactor.FontSize);
// Coordinates coordinates = new Coordinates(dates[0].ToOADate()-1, values[0] - 5.00);
Coordinates coordinates = new Coordinates(limit.EffectiveDate.ToOADate(), limit.StopPrice - 5.00);
ImageMarker imageMarker = Plotter.Plot.Add.ImageMarker(coordinates, image);
}
}
@@ -217,8 +230,9 @@ namespace PortfolioManager.Renderers
sb.Append(Utility.FormatCurrency(stopLimit.StopPrice));
sb.Append(" (").Append(percentOffsetFromLow > 0 ? "+" : "").Append(Utility.FormatPercent(percentOffsetFromLow)).Append(")");
Image image = TextMarkerImageGenerator.GenerateImage(sb.ToString(), 150, 24, FontFactor.FontSize);
Coordinates coordinates = new Coordinates(latestPrice.Date.ToOADate(), stopLimit.StopPrice - 5.00);
Image image = TextMarkerImageGenerator.GenerateImage(sb.ToString(), 155, 24, FontFactor.FontSize);
// Coordinates coordinates = new Coordinates(latestPrice.Date.ToOADate()/(1+onePercent), stopLimit.StopPrice - 5.00);
Coordinates coordinates = new Coordinates(latestPrice.Date.ToOADate()-percentShift3PC, stopLimit.StopPrice - 5.00);
ImageMarker imageMarker = Plotter.Plot.Add.ImageMarker(coordinates, image);
}
}
@@ -228,6 +242,31 @@ namespace PortfolioManager.Renderers
/// </summary>
private void GenerateTradePoints()
{
if (null == portfolioTradesLots || 0 == portfolioTradesLots.Count || !showTradeLabels) return;
// Here we add the image markers
Image tradePointMarker = TextMarkerImageGenerator.ToSPImage(ImageCache.GetInstance().GetImage(ImageCache.ImageType.YellowTriangleUp));
for (int index = 0; index < portfolioTradesLots.Count; index++)
{
PortfolioTrade portfolioTrade = portfolioTradesLots[index];
Coordinates coordinates = new Coordinates(portfolioTrade.TradeDate.ToOADate(), portfolioTrade.Price);
ImageMarker imageMarker = Plotter.Plot.Add.ImageMarker(coordinates, tradePointMarker, SizeFactor.Normal);
}
// This adds the text markers
for (int index = 0; index < portfolioTradesLots.Count; index++)
{
PortfolioTrade portfolioTrade = portfolioTradesLots[index];
StringBuilder sb = new StringBuilder();
sb.Append(portfolioTrade.BuySell.Equals("B") ? "Buy " : "Sell ");
sb.Append(Utility.FormatNumber(portfolioTrade.Shares));
sb.Append("@");
sb.Append(Utility.FormatCurrency(portfolioTrade.Price));
Image image = TextMarkerImageGenerator.GenerateImage(sb.ToString(), 150, 24, FontFactor.FontSize);
Coordinates coordinates = new Coordinates(portfolioTrade.TradeDate.ToOADate(), portfolioTrade.Price - 5.00);
ImageMarker imageMarker = Plotter.Plot.Add.ImageMarker(coordinates, image);
}
}
/// <summary>