Различия значений Indicator.GetCurrentValue и ChartingIndicatorValue~/topic/4778/razlichiya-znachenii-indicator_getcurrentvalue-i-chartingindicatorvalue/Copyright @ StockSharp Platform LLC 2010 - 20242024-03-29T05:30:40Zhttps://stocksharp.ru/images/logo.pnghttps://stocksharp.ru/posts/m/31954/При тестировании обнаружил, что в рамках одной и той же обрабатываемой свечи значения одного и того ...2014-10-20T13:50:05Z2014-10-20T13:50:05ZJaguarFXhttps://stocksharp.ru/users/49779/info@stocksharp.ruПри тестировании обнаружил, что в рамках одной и той же обрабатываемой свечи значения одного и того же индикатора разные при вызове Indicator.GetCurrentValue и ChartingIndicatorValue.<br /><br />Исходный код такой<br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
public CandleSeries series { get; set; }
private SimpleMovingAverage LongSma { get; set; }
private SimpleMovingAverage ShortSma { get; set; }
private AwesomeOscillator AweOsc { get; set; }
private ChartIndicatorElement LongSmaInd { get; set; }
private ChartIndicatorElement ShortSmaInd { get; set; }
private ChartIndicatorElement AweInd { get; set; }
protected override void OnStarted()
{
base.OnStarted();
LongSma = new SimpleMovingAverage();
LongSma.Length = 60;
ShortSma = new SimpleMovingAverage();
ShortSma.Length = 20;
AweOsc = new AwesomeOscillator(LongSma, ShortSma);
series
.WhenCandlesFinished()
.Do(ProcessCandle)
.Apply(this);
if (Params.chartIndex)
{
LongSmaInd = new ChartIndicatorElement { Title = "LongSMA", Indicator = LongSma, Color = Colors.DarkBlue};
MainWindow.Instance.GuiAsync(() => HistoryChart.Areas[0].Elements.Add(LongSmaInd));
ShortSmaInd = new ChartIndicatorElement { Title = "ShortSMA", Indicator = ShortSma, Color = Colors.Crimson};
MainWindow.Instance.GuiAsync(() => HistoryChart.Areas[0].Elements.Add(ShortSmaInd));
AweInd = new ChartIndicatorElement { Title = "DiffSMA", Indicator = AweOsc, Color = Colors.Crimson};
}
......
}
private void ProcessCandle(Candle candle)
{
if (Params.chartIndex)
{
var OpenTime = candle.OpenTime;
var myDic = new Dictionary<IChartElement, object>();
var valLongSMA = LongSmaInd.Indicator.Process(new CandleIndicatorValue(candle) );
var ValueLongSMA = new ChartIndicatorValue(LongSmaInd.Indicator, valLongSMA);
myDic.Add(LongSmaInd, ValueLongSMA);
var valShortSma = ShortSmaInd.Indicator.Process(new CandleIndicatorValue(candle) );
var ValueShortSma = new ChartIndicatorValue(ShortSmaInd.Indicator, valShortSma);
myDic.Add(ShortSmaInd, ValueShortSma);
var valAweInd = AweInd.Indicator.Process(new CandleIndicatorValue(candle));
var ValueAweInd = new ChartIndicatorValue(AweInd.Indicator, valAweInd);
myDic.Add(AweInd, ValueAweInd);
MainWindow.Instance.GuiAsync(() =>
{
HistoryChart.ProcessValues(OpenTime, myDic);
});
}
// вычисляем новое положение относительно друг друга (SLL = ShortLessThenLong)
var SSMval = ShortSma.GetCurrentValue();
var LSMval = LongSma.GetCurrentValue();
var SLdiff = SSMval - LSMval;
......
}
</pre>
</div></div><br /><br />В результате для каждой обработанной свечки обнаруживаем что, значения базовых индикаторов LongSMA и ShortSma, полученные через функцию ChartIndicatorValue, отличаются от значений тех же индикаторов на основе функции GetCurrentValue (т.е. ValueLongSMA<>LSMval и ValueShortSma<>SSMval).<br />При этом значение индикатора разницы AwesomeOscillator, полученное через функцию ChartIndicatorValue совпадает с вычисленой разницей между значениями базовых индикаторов (т.е. ValueAweInd= SSMval - LSMval).<br /><br />Это более чем странно!<br />Так явно не должно быть, т.е. где-то ошибка.<br /><br />Таблица с реальными значениями, полученными при прогоне на SPFB.SBRF в аттаче.<br /><br /><br /><br />Copyright @ StockSharp Platform LLC 2010 - 2024