|
|
|
@@ -56,6 +56,13 @@ namespace PortfolioManager.Renderers
|
|
|
|
PropertyChanged += OnBollingerBandRendererPropertyChanged;
|
|
|
|
PropertyChanged += OnBollingerBandRendererPropertyChanged;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private DateTime EarliestBollingerBandDate {get;set;} // This gets set when the bollinger band is generated
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private bool IsVisible(DateTime date)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return syncTradeToBand || date >= EarliestBollingerBandDate;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void OnBollingerBandRendererPropertyChanged(Object sender, PropertyChangedEventArgs eventArgs)
|
|
|
|
private void OnBollingerBandRendererPropertyChanged(Object sender, PropertyChangedEventArgs eventArgs)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (eventArgs.PropertyName.Equals("ShowLegend"))
|
|
|
|
if (eventArgs.PropertyName.Equals("ShowLegend"))
|
|
|
|
@@ -94,6 +101,7 @@ namespace PortfolioManager.Renderers
|
|
|
|
{
|
|
|
|
{
|
|
|
|
lock(Plotter.Plot.Sync)
|
|
|
|
lock(Plotter.Plot.Sync)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
int bollingerBandMovingAverageDays = 20;
|
|
|
|
MDTrace.WriteLine(LogLevel.DEBUG,$"[SetData] ENTER");
|
|
|
|
MDTrace.WriteLine(LogLevel.DEBUG,$"[SetData] ENTER");
|
|
|
|
this.selectedSymbol = selectedSymbol;
|
|
|
|
this.selectedSymbol = selectedSymbol;
|
|
|
|
this.selectedDayCount = selectedDayCount;
|
|
|
|
this.selectedDayCount = selectedDayCount;
|
|
|
|
@@ -106,13 +114,18 @@ namespace PortfolioManager.Renderers
|
|
|
|
if (null != portfolioTrades && 0 != portfolioTrades.Count)
|
|
|
|
if (null != portfolioTrades && 0 != portfolioTrades.Count)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
DateGenerator dateGenerator = new DateGenerator();
|
|
|
|
DateGenerator dateGenerator = new DateGenerator();
|
|
|
|
DateTime earliestTrade = portfolioTrades[0].TradeDate;
|
|
|
|
DateTime earliestTrade = portfolioTrades.First().TradeDate; // portfolio trades are ordered with earliest trade in the lowest index
|
|
|
|
earliestTrade = earliestTrade.AddDays(-30);
|
|
|
|
earliestTrade = dateGenerator.GenerateHistoricalDate(earliestTrade, bollingerBandMovingAverageDays); // cover the moving average lag in the band
|
|
|
|
int daysBetween = dateGenerator.DaysBetween(earliestTrade, DateTime.Now);
|
|
|
|
int daysBetween = dateGenerator.DaysBetween(earliestTrade, DateTime.Now);
|
|
|
|
if (daysBetween < selectedDayCount || !syncTradeToBand) prices = PricingDA.GetPrices(selectedSymbol, selectedDayCount);
|
|
|
|
if (daysBetween < selectedDayCount || !syncTradeToBand)
|
|
|
|
else prices = PricingDA.GetPrices(selectedSymbol, earliestTrade);
|
|
|
|
{
|
|
|
|
|
|
|
|
prices = PricingDA.GetPrices(selectedSymbol, selectedDayCount + bollingerBandMovingAverageDays);
|
|
|
|
DateTime earliestInsiderTransactionDate = dateGenerator.GenerateFutureBusinessDate(prices[prices.Count - 1].Date, 30);
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
prices = PricingDA.GetPrices(selectedSymbol, earliestTrade);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
DateTime earliestInsiderTransactionDate = dateGenerator.GenerateFutureBusinessDate(prices.Last().Date, 30);
|
|
|
|
insiderTransactionSummaries = InsiderTransactionDA.GetInsiderTransactionSummaries(selectedSymbol, earliestInsiderTransactionDate);
|
|
|
|
insiderTransactionSummaries = InsiderTransactionDA.GetInsiderTransactionSummaries(selectedSymbol, earliestInsiderTransactionDate);
|
|
|
|
|
|
|
|
|
|
|
|
// calculate the break even price on the open trades for this symbol
|
|
|
|
// calculate the break even price on the open trades for this symbol
|
|
|
|
@@ -123,8 +136,8 @@ namespace PortfolioManager.Renderers
|
|
|
|
|
|
|
|
|
|
|
|
if (!syncTradeToBand)
|
|
|
|
if (!syncTradeToBand)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
DateTime earliestPricingDate = prices[prices.Count - 1].Date;
|
|
|
|
DateTime earliestPricingDate = prices.Last().Date;
|
|
|
|
earliestPricingDate = earliestPricingDate.AddDays(30);
|
|
|
|
earliestPricingDate = dateGenerator.GenerateHistoricalDate(earliestPricingDate, bollingerBandMovingAverageDays);
|
|
|
|
IEnumerable<PortfolioTrade> tradesInRange = (from portfolioTrade in portfolioTradesLots where portfolioTrade.TradeDate >= earliestPricingDate select portfolioTrade);
|
|
|
|
IEnumerable<PortfolioTrade> tradesInRange = (from portfolioTrade in portfolioTradesLots where portfolioTrade.TradeDate >= earliestPricingDate select portfolioTrade);
|
|
|
|
portfolioTrades = new PortfolioTrades();
|
|
|
|
portfolioTrades = new PortfolioTrades();
|
|
|
|
foreach (PortfolioTrade portfolioTrade in tradesInRange) portfolioTrades.Add(portfolioTrade);
|
|
|
|
foreach (PortfolioTrade portfolioTrade in tradesInRange) portfolioTrades.Add(portfolioTrade);
|
|
|
|
@@ -133,15 +146,16 @@ namespace PortfolioManager.Renderers
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
prices = PricingDA.GetPrices(selectedSymbol, selectedDayCount);
|
|
|
|
prices = PricingDA.GetPrices(selectedSymbol, selectedDayCount + bollingerBandMovingAverageDays);
|
|
|
|
if (null != prices && 0 != prices.Count)
|
|
|
|
if (null != prices && 0 != prices.Count)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
DateGenerator dateGenerator = new DateGenerator();
|
|
|
|
DateGenerator dateGenerator = new DateGenerator();
|
|
|
|
DateTime earliestInsiderTransactionDate = dateGenerator.GenerateFutureBusinessDate(prices[prices.Count - 1].Date, 30);
|
|
|
|
DateTime earliestInsiderTransactionDate = dateGenerator.GenerateFutureBusinessDate(prices.Last().Date, 30);
|
|
|
|
insiderTransactionSummaries = InsiderTransactionDA.GetInsiderTransactionSummaries(selectedSymbol, earliestInsiderTransactionDate);
|
|
|
|
insiderTransactionSummaries = InsiderTransactionDA.GetInsiderTransactionSummaries(selectedSymbol, earliestInsiderTransactionDate);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
bollingerBands = BollingerBandGenerator.GenerateBollingerBands(prices);
|
|
|
|
bollingerBands = BollingerBandGenerator.GenerateBollingerBands(prices, bollingerBandMovingAverageDays);
|
|
|
|
|
|
|
|
EarliestBollingerBandDate = bollingerBands.Min(x=>x.Date);
|
|
|
|
textMarkerManager.Clear();
|
|
|
|
textMarkerManager.Clear();
|
|
|
|
CalculateOffsets();
|
|
|
|
CalculateOffsets();
|
|
|
|
GenerateBollingerBands();
|
|
|
|
GenerateBollingerBands();
|
|
|
|
@@ -236,97 +250,77 @@ namespace PortfolioManager.Renderers
|
|
|
|
imageMarker = Plotter.Plot.Add.ImageMarker(coordinates, image);
|
|
|
|
imageMarker = Plotter.Plot.Add.ImageMarker(coordinates, image);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// Generate Stop Limits
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
private void GenerateStopLimits()
|
|
|
|
private void GenerateStopLimits()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (null == externalStopLimits && null == zeroPrice) return;
|
|
|
|
if (externalStopLimits == null && zeroPrice == null) return;
|
|
|
|
if (null != externalStopLimits)
|
|
|
|
|
|
|
|
{
|
|
|
|
// Create the composite data source
|
|
|
|
|
|
|
|
if (externalStopLimits != null)
|
|
|
|
StopLimits = StopLimitCompositeModel.CreateCompositeDataSource(externalStopLimits);
|
|
|
|
StopLimits = StopLimitCompositeModel.CreateCompositeDataSource(externalStopLimits);
|
|
|
|
}
|
|
|
|
else if (internalStopLimits != null && zeroPrice != null)
|
|
|
|
else if (null != internalStopLimits && null != zeroPrice)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
StopLimits = StopLimitCompositeModel.CreateCompositeDataSource(zeroPrice.Date, internalStopLimits);
|
|
|
|
StopLimits = StopLimitCompositeModel.CreateCompositeDataSource(zeroPrice.Date, internalStopLimits);
|
|
|
|
}
|
|
|
|
|
|
|
|
(DateTime[] dates, double[] values) = StopLimits.ToXYData();
|
|
|
|
(DateTime[] dates, double[] values) = StopLimits.ToXYData();
|
|
|
|
|
|
|
|
|
|
|
|
// Add the image markers
|
|
|
|
// Add the image markers
|
|
|
|
Image imageStopLimitMarker = TextMarkerImageGenerator.ToSPImage(ImageCache.GetInstance().GetImage(ImageCache.ImageType.RedTriangleUp));
|
|
|
|
Image imageStopLimitMarker = TextMarkerImageGenerator.ToSPImage(
|
|
|
|
for (int index = 0; index < dates.Length; index++)
|
|
|
|
ImageCache.GetInstance().GetImage(ImageCache.ImageType.RedTriangleUp));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < dates.Length; i++)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
DateTime date = dates[index];
|
|
|
|
DateTime date = dates[i];
|
|
|
|
double value = values[index];
|
|
|
|
|
|
|
|
|
|
|
|
if (!IsVisible(date))
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double value = values[i];
|
|
|
|
Coordinates coordinates = new Coordinates(date.ToOADate(), value);
|
|
|
|
Coordinates coordinates = new Coordinates(date.ToOADate(), value);
|
|
|
|
ImageMarker imageMarker = Plotter.Plot.Add.ImageMarker(coordinates, imageStopLimitMarker, SizeFactor.Normal);
|
|
|
|
Plotter.Plot.Add.ImageMarker(coordinates, imageStopLimitMarker, SizeFactor.Normal);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(!showTradeLabels)return;
|
|
|
|
if (!showTradeLabels) return;
|
|
|
|
|
|
|
|
|
|
|
|
Price latestPrice = prices[0];
|
|
|
|
Price latestPrice = prices[0];
|
|
|
|
|
|
|
|
|
|
|
|
// Add the text marker
|
|
|
|
// Helper to draw text markers
|
|
|
|
if (null != externalStopLimits)
|
|
|
|
void DrawTextMarker(StopLimit limit, bool isLast)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
for (int index = 0; index < externalStopLimits.Count; index++)
|
|
|
|
if (!IsVisible(limit.EffectiveDate)) return;
|
|
|
|
{
|
|
|
|
|
|
|
|
StopLimit limit = externalStopLimits[index];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
sb.Append(limit.StopType).Append(" ");
|
|
|
|
sb.Append(limit.StopType).Append(" ");
|
|
|
|
sb.Append(Utility.FormatCurrency(limit.StopPrice));
|
|
|
|
sb.Append(Utility.FormatCurrency(limit.StopPrice));
|
|
|
|
if (index == externalStopLimits.Count - 1)
|
|
|
|
|
|
|
|
|
|
|
|
if (isLast)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
double percentOffsetFromLow = ((latestPrice.Low - limit.StopPrice) / limit.StopPrice);
|
|
|
|
double percentOffsetFromLow = (latestPrice.Low - limit.StopPrice) / limit.StopPrice;
|
|
|
|
sb.Append(" (").Append(percentOffsetFromLow > 0 ? "+" : "").Append(Utility.FormatPercent(percentOffsetFromLow)).Append(")");
|
|
|
|
sb.Append(" (")
|
|
|
|
|
|
|
|
.Append(percentOffsetFromLow > 0 ? "+" : "")
|
|
|
|
|
|
|
|
.Append(Utility.FormatPercent(percentOffsetFromLow))
|
|
|
|
|
|
|
|
.Append(")");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Image image = TextMarkerImageGenerator.GenerateImage(sb.ToString(), FontFactor.FontSize);
|
|
|
|
Image image = TextMarkerImageGenerator.GenerateImage(sb.ToString(), FontFactor.FontSize);
|
|
|
|
Coordinates coordinates = new Coordinates(limit.EffectiveDate.ToOADate(),
|
|
|
|
Coordinates coordinates = new Coordinates(
|
|
|
|
|
|
|
|
limit.EffectiveDate.ToOADate(),
|
|
|
|
limit.StopPrice - offsets.Offset(OffsetDictionary.OffsetType.VerticalOffset6P5PC));
|
|
|
|
limit.StopPrice - offsets.Offset(OffsetDictionary.OffsetType.VerticalOffset6P5PC));
|
|
|
|
|
|
|
|
|
|
|
|
coordinates = textMarkerManager.GetBestMarkerLocation(coordinates.X, coordinates.Y,offsets, offsets.Offset(OffsetDictionary.OffsetType.VerticalOffset6P5PC));
|
|
|
|
coordinates = textMarkerManager.GetBestMarkerLocation(
|
|
|
|
|
|
|
|
coordinates.X, coordinates.Y, offsets, offsets.Offset(OffsetDictionary.OffsetType.VerticalOffset6P5PC));
|
|
|
|
|
|
|
|
|
|
|
|
ImageMarker imageMarker = Plotter.Plot.Add.ImageMarker(coordinates, image);
|
|
|
|
Plotter.Plot.Add.ImageMarker(coordinates, image);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
// Draw external or internal stop limits
|
|
|
|
|
|
|
|
if (externalStopLimits != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (null == zeroPrice) return;
|
|
|
|
for (int i = 0; i < externalStopLimits.Count; i++)
|
|
|
|
if (null == internalStopLimits || null == zeroPrice) return;
|
|
|
|
DrawTextMarker(externalStopLimits[i], i == externalStopLimits.Count - 1);
|
|
|
|
for (int index = 0; index < internalStopLimits.Count; index++)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
StopLimit limit = internalStopLimits[index];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
|
|
|
|
sb.Append(limit.StopType).Append(" ");
|
|
|
|
|
|
|
|
sb.Append(Utility.FormatCurrency(limit.StopPrice));
|
|
|
|
|
|
|
|
if (index == internalStopLimits.Count - 1)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
double percentOffsetFromLow = ((latestPrice.Low - limit.StopPrice) / limit.StopPrice);
|
|
|
|
|
|
|
|
sb.Append(" (").Append(percentOffsetFromLow > 0 ? "+" : "").Append(Utility.FormatPercent(percentOffsetFromLow)).Append(")");
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Image image = TextMarkerImageGenerator.GenerateImage(sb.ToString(), FontFactor.FontSize);
|
|
|
|
else if (internalStopLimits != null && zeroPrice != null)
|
|
|
|
Coordinates coordinates = new Coordinates(limit.EffectiveDate.ToOADate(),
|
|
|
|
{
|
|
|
|
limit.StopPrice - offsets.Offset(OffsetDictionary.OffsetType.VerticalOffset6P5PC));
|
|
|
|
for (int i = 0; i < internalStopLimits.Count; i++)
|
|
|
|
|
|
|
|
DrawTextMarker(internalStopLimits[i], i == internalStopLimits.Count - 1);
|
|
|
|
coordinates = textMarkerManager.GetBestMarkerLocation(coordinates.X, coordinates.Y,offsets, offsets.Offset(OffsetDictionary.OffsetType.VerticalOffset6P5PC));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ImageMarker imageMarker = Plotter.Plot.Add.ImageMarker(coordinates, image);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// double percentOffsetFromLow = ((latestPrice.Low - stopLimit.StopPrice) / stopLimit.StopPrice);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// StringBuilder sb = new StringBuilder();
|
|
|
|
|
|
|
|
// sb.Append(stopLimit.StopType).Append(" ");
|
|
|
|
|
|
|
|
// sb.Append(Utility.FormatCurrency(stopLimit.StopPrice));
|
|
|
|
|
|
|
|
// sb.Append(" (").Append(percentOffsetFromLow > 0 ? "+" : "").Append(Utility.FormatPercent(percentOffsetFromLow)).Append(")");
|
|
|
|
|
|
|
|
// Image image = TextMarkerImageGenerator.GenerateImage(sb.ToString(), FontFactor.FontSize);
|
|
|
|
|
|
|
|
// Coordinates coordinates = new Coordinates(latestPrice.Date.ToOADate() - offsets.Offset(OffsetDictionary.OffsetType.HorizontalOffset3PC),
|
|
|
|
|
|
|
|
// stopLimit.StopPrice - offsets.Offset(OffsetDictionary.OffsetType.VerticalOffset6P5PC));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// coordinates = textMarkerManager.GetBestMarkerLocation(coordinates.X, coordinates.Y,offsets, offsets.Offset(OffsetDictionary.OffsetType.VerticalOffset6P5PC));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ImageMarker imageMarker = Plotter.Plot.Add.ImageMarker(coordinates, image);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -335,38 +329,54 @@ namespace PortfolioManager.Renderers
|
|
|
|
/// </summary>
|
|
|
|
/// </summary>
|
|
|
|
private void GenerateTradePoints()
|
|
|
|
private void GenerateTradePoints()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (null == portfolioTradesLots || 0 == portfolioTradesLots.Count) return;
|
|
|
|
if (portfolioTradesLots == null || portfolioTradesLots.Count == 0) return;
|
|
|
|
|
|
|
|
|
|
|
|
// Here we add the image markers
|
|
|
|
// Add the image markers
|
|
|
|
Image tradePointMarker = TextMarkerImageGenerator.ToSPImage(ImageCache.GetInstance().GetImage(ImageCache.ImageType.YellowTriangleUp));
|
|
|
|
Image tradePointMarker = TextMarkerImageGenerator.ToSPImage(
|
|
|
|
for (int index = 0; index < portfolioTradesLots.Count; index++)
|
|
|
|
ImageCache.GetInstance().GetImage(ImageCache.ImageType.YellowTriangleUp));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var portfolioTrade in portfolioTradesLots)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
PortfolioTrade portfolioTrade = portfolioTradesLots[index];
|
|
|
|
if (!IsVisible(portfolioTrade.TradeDate))
|
|
|
|
Coordinates coordinates = new Coordinates(portfolioTrade.TradeDate.ToOADate(), portfolioTrade.Price);
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Coordinates coordinates = new Coordinates(
|
|
|
|
|
|
|
|
portfolioTrade.TradeDate.ToOADate(),
|
|
|
|
|
|
|
|
portfolioTrade.Price);
|
|
|
|
|
|
|
|
|
|
|
|
ImageMarker imageMarker = Plotter.Plot.Add.ImageMarker(coordinates, tradePointMarker, SizeFactor.Normal);
|
|
|
|
ImageMarker imageMarker = Plotter.Plot.Add.ImageMarker(coordinates, tradePointMarker, SizeFactor.Normal);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (showTradeLabels)
|
|
|
|
if (!showTradeLabels) return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Add the text markers
|
|
|
|
|
|
|
|
foreach (var portfolioTrade in portfolioTradesLots)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// This adds the text markers
|
|
|
|
if (!IsVisible(portfolioTrade.TradeDate))
|
|
|
|
for (int index = 0; index < portfolioTradesLots.Count; index++)
|
|
|
|
continue;
|
|
|
|
{
|
|
|
|
|
|
|
|
PortfolioTrade portfolioTrade = portfolioTradesLots[index];
|
|
|
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
sb.Append(portfolioTrade.BuySell.Equals("B") ? "Buy " : "Sell ");
|
|
|
|
sb.Append(portfolioTrade.BuySell.Equals("B") ? "Buy " : "Sell ");
|
|
|
|
sb.Append(Utility.FormatNumber(portfolioTrade.Shares));
|
|
|
|
sb.Append(Utility.FormatNumber(portfolioTrade.Shares));
|
|
|
|
sb.Append("@");
|
|
|
|
sb.Append("@");
|
|
|
|
sb.Append(Utility.FormatCurrency(portfolioTrade.Price));
|
|
|
|
sb.Append(Utility.FormatCurrency(portfolioTrade.Price));
|
|
|
|
|
|
|
|
|
|
|
|
Image image = TextMarkerImageGenerator.GenerateImage(sb.ToString(), FontFactor.FontSize);
|
|
|
|
Image image = TextMarkerImageGenerator.GenerateImage(sb.ToString(), FontFactor.FontSize);
|
|
|
|
Coordinates coordinates = new Coordinates(portfolioTrade.TradeDate.ToOADate(),
|
|
|
|
|
|
|
|
|
|
|
|
Coordinates coordinates = new Coordinates(
|
|
|
|
|
|
|
|
portfolioTrade.TradeDate.ToOADate(),
|
|
|
|
portfolioTrade.Price - offsets.Offset(OffsetDictionary.OffsetType.VerticalOffset6P5PC));
|
|
|
|
portfolioTrade.Price - offsets.Offset(OffsetDictionary.OffsetType.VerticalOffset6P5PC));
|
|
|
|
|
|
|
|
|
|
|
|
coordinates = textMarkerManager.GetBestMarkerLocation(coordinates.X, coordinates.Y,offsets, offsets.Offset(OffsetDictionary.OffsetType.VerticalOffset6P5PC));
|
|
|
|
coordinates = textMarkerManager.GetBestMarkerLocation(
|
|
|
|
|
|
|
|
coordinates.X,
|
|
|
|
|
|
|
|
coordinates.Y,
|
|
|
|
|
|
|
|
offsets,
|
|
|
|
|
|
|
|
offsets.Offset(OffsetDictionary.OffsetType.VerticalOffset6P5PC));
|
|
|
|
|
|
|
|
|
|
|
|
ImageMarker imageMarker = Plotter.Plot.Add.ImageMarker(coordinates, image);
|
|
|
|
ImageMarker imageMarker = Plotter.Plot.Add.ImageMarker(coordinates, image);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// <summary>
|
|
|
|
/// Generate Insider Transactions
|
|
|
|
/// Generate Insider Transactions
|
|
|
|
@@ -382,8 +392,8 @@ namespace PortfolioManager.Renderers
|
|
|
|
// get the maximum date in the bollinger band series
|
|
|
|
// get the maximum date in the bollinger band series
|
|
|
|
DateTime maxBollingerDate = (from BollingerBandElement bollingerBandElement in bollingerBands select bollingerBandElement.Date).Max();
|
|
|
|
DateTime maxBollingerDate = (from BollingerBandElement bollingerBandElement in bollingerBands select bollingerBandElement.Date).Max();
|
|
|
|
// ensure that the insider transactions are clipped to the bollingerband max date. There are some items in insider transaction summaries (options dated in the future) that will throw the graphic out of proportion
|
|
|
|
// ensure that the insider transactions are clipped to the bollingerband max date. There are some items in insider transaction summaries (options dated in the future) that will throw the graphic out of proportion
|
|
|
|
InsiderTransactionSummaries disposedSummaries = new InsiderTransactionSummaries((from InsiderTransactionSummary insiderTransactionSummary in insiderTransactionSummaries where insiderTransactionSummary.NumberOfSharesAcquiredDisposed < 0 && insiderTransactionSummary.TransactionDate.Date <= maxBollingerDate select insiderTransactionSummary).ToList());
|
|
|
|
InsiderTransactionSummaries disposedSummaries = new InsiderTransactionSummaries((from InsiderTransactionSummary insiderTransactionSummary in insiderTransactionSummaries where insiderTransactionSummary.NumberOfSharesAcquiredDisposed < 0 && insiderTransactionSummary.TransactionDate.Date <= maxBollingerDate && IsVisible(insiderTransactionSummary.TransactionDate.Date) select insiderTransactionSummary).ToList());
|
|
|
|
InsiderTransactionSummaries acquiredSummaries = new InsiderTransactionSummaries((from InsiderTransactionSummary insiderTransactionSummary in insiderTransactionSummaries where insiderTransactionSummary.NumberOfSharesAcquiredDisposed > 0 && insiderTransactionSummary.TransactionDate.Date <= maxBollingerDate select insiderTransactionSummary).ToList());
|
|
|
|
InsiderTransactionSummaries acquiredSummaries = new InsiderTransactionSummaries((from InsiderTransactionSummary insiderTransactionSummary in insiderTransactionSummaries where insiderTransactionSummary.NumberOfSharesAcquiredDisposed > 0 && insiderTransactionSummary.TransactionDate.Date <= maxBollingerDate && IsVisible(insiderTransactionSummary.TransactionDate.Date) select insiderTransactionSummary).ToList());
|
|
|
|
|
|
|
|
|
|
|
|
BinCollection<InsiderTransactionSummary> disposedSummariesBin = BinHelper<InsiderTransactionSummary>.CreateBins(new BinItems<InsiderTransactionSummary>(disposedSummaries), 3);
|
|
|
|
BinCollection<InsiderTransactionSummary> disposedSummariesBin = BinHelper<InsiderTransactionSummary>.CreateBins(new BinItems<InsiderTransactionSummary>(disposedSummaries), 3);
|
|
|
|
BinCollection<InsiderTransactionSummary> acquiredSummariesBin = BinHelper<InsiderTransactionSummary>.CreateBins(new BinItems<InsiderTransactionSummary>(acquiredSummaries), 3);
|
|
|
|
BinCollection<InsiderTransactionSummary> acquiredSummariesBin = BinHelper<InsiderTransactionSummary>.CreateBins(new BinItems<InsiderTransactionSummary>(acquiredSummaries), 3);
|
|
|
|
|