protected override void UpdateColor(FootPrint.FpBar bar) { double maxVolume = 0; foreach (var line1 in bar.Lines) { var line = (BidAskLine)line1; maxVolume = Math.Max(maxVolume, line.AskVolume); maxVolume = Math.Max(maxVolume, line.BidVolume); } var logMax = ConvertPriceValue(maxVolume); foreach (var line1 in bar.Lines) { var line = (BidAskLine)line1; int r = 50; int g = 50; if (line.AskVolume >= line.BidVolume) { var coef = line.AskVolume == 0 ? 0 : ConvertPriceValue(line.AskVolume) / logMax; g = 255 - Math.Min(120, (int)(coef * 120)); } if (line.AskVolume <= line.BidVolume) { var coef = line.BidVolume == 0 ? 0 : ConvertPriceValue(line.BidVolume) / logMax; r = 255 - Math.Min(120, (int)(coef * 120)); } line.Color = new Color(r, g, 50); } }
private void ProcessTrades(FootPrint.FpBar bar, IEnumerable <ITrade> trades) { foreach (var trade in trades) { ProcessTrade(bar, trade); m_lastTrade = trade; } }
protected override void UpdateColor(FootPrint.FpBar bar) { double maxVolume = bar.Lines.Cast <VolumeLine>().Aggregate <VolumeLine, double>(0, (current, line) => Math.Max(current, line.Volume)); var logMax = ConvertPriceValue(maxVolume); foreach (var line1 in bar.Lines) { var line = (VolumeLine)line1; var coef = line.Volume == 0 ? 0 : ConvertPriceValue(line.Volume) / logMax; var intCoef = Math.Min(120, (int)(coef * 120)); line.Color = new Color(50, 50, 255 - intCoef); } }
protected abstract FootPrint.Line GetLine(FootPrint.FpBar bar, ITrade trade);
protected abstract void UpdateColor(FootPrint.FpBar bar);
protected abstract void ProcessTrade(FootPrint.FpBar bar, ITrade trade);
private void AddTick(FootPrint.FpBar bar, IEnumerable <ITrade> barTrades) { bar.Lines.Clear(); ProcessTrades(bar, barTrades); UpdateColor(bar); }
protected override FootPrint.Line GetLine(FootPrint.FpBar bar, ITrade trade) { return(bar.GetLine <DeltaLine>(trade.Price)); }
protected override void ProcessTrade(FootPrint.FpBar bar, ITrade trade) { var line = (BidAskLine)GetLine(bar, trade); bool isProcessed = false; if (trade.Direction != TradeDirection.Unknown) { if (trade.Direction == TradeDirection.Buy) { line.AskVolume += trade.Quantity; } else { line.BidVolume += trade.Quantity; } isProcessed = true; } else if (trade is ITradeWithBidAsk) { var trd = trade as ITradeWithBidAsk; if (trd.AskPrice > 0 && trd.BidPrice > 0) { if (Math.Abs(trd.AskPrice - trade.Price) < Math.Abs(trd.BidPrice - trade.Price)) { line.AskVolume += trade.Quantity; } else { line.BidVolume += trd.Quantity; } isProcessed = true; } else if (trd.AskPrice > 0) { line.AskVolume += trade.Quantity; isProcessed = true; } else if (trd.BidPrice > 0) { line.BidVolume += trd.Quantity; isProcessed = true; } } if (!isProcessed) { var lastPrice = m_lastTrade == null ? 0.0 : m_lastTrade.Price; if (trade.Price > lastPrice) { line.AskVolume += trade.Quantity; m_lastWasAsk = true; } else if (trade.Price < lastPrice) { line.BidVolume += trade.Quantity; m_lastWasAsk = false; } else { if (m_lastWasAsk) { line.AskVolume += trade.Quantity; } else { line.BidVolume += trade.Quantity; } } } }
protected override void ProcessTrade(FootPrint.FpBar bar, ITrade trade) { var line = (VolumeLine)GetLine(bar, trade); line.Volume += trade.Quantity; }