Mikhail Sukhov
|
Date: 6/21/2013
UsilaDobry Михаил Сухов UsilaDobry Изменил немного код вывода значений индикатора, картинка без изменений...
IIndicator.IsFormed проверяется? Разве свойство значения индикатора IsFinal = true не решает эту проверку? IsFinal - это свойство, определяющее что данные окончательные в текущем ТФ. IsFormed - что индикатор сформировался и готов к работе (в т.ч. и отрисовки на графике). Посмотрите математическую формулу скользящих (я так понимаю Полосы на основе них сделаны). Все станет понятно.
|
|
Thanks:
|
|
|
|
|
UsilaDobry
|
Date: 6/21/2013
Проверка на IsFormed вообще не пропускает исполнение кода в ветку оператора if, выводятся только свечи по оператору else... Code
_series.ProcessCandle += candle =>
{
if (candle.State == CandleStates.Finished && _chartBollingerElement.Indicator.IsFormed)
{
var valueBb = _chartBollingerElement.Indicator.Process(new CandleIndicatorValue(candle) { IsFinal = true });
this.GuiAsync(() => _chartWindow.Chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
{
{_candlesElem, candle},
{_chartBollingerElement, new ChartIndicatorValue(_chartBollingerElement.Indicator, valueBb)},
}));
}
else
{
this.GuiAsync(() => _chartWindow.Chart.ProcessCandle(_candlesElem, candle));
}
};
И почему же я указываю выводить в debug значения законченных свечей, а выводятся 5-секундные значения изменяемой свечи?.. Code
_series.ProcessCandle += candle =>
{
if (candle.State != CandleStates.Finished)
return;
Debug.WriteLine("{0}", candle.ToString());
};
|
|
Thanks:
|
|
|
|
|
Mikhail Sukhov
|
Date: 6/21/2013
UsilaDobry Проверка на IsFormed вообще не пропускает исполнение кода в ветку оператора if, выводятся только свечи по оператору else...
Сейчас код неправильно написан в корне... Мне кажется надо не игнорировать, а понять, что такое IsFormed. Давайте резберем формулу скользящей средней.
|
|
Thanks:
|
|
|
|
|
UsilaDobry
|
Date: 6/21/2013
Михаил Сухов UsilaDobry Проверка на IsFormed вообще не пропускает исполнение кода в ветку оператора if, выводятся только свечи по оператору else...
Сейчас код неправильно написан в корне... Мне кажется надо не игнорировать, а понять, что такое IsFormed. Давайте резберем формулу скользящей средней. Простая скользящая средняя цены закрытия это среднее арифметическое значений цены закрытия за период. В нашем случае период = 20. В моем понимании свойство SMA.IsFormed = true, т.е. индикатор сформирован, значит есть минимум 20 значений цены закрытия, которые позволяют рассчитать первое значение индикатора, до тех пор, пока не будут получены 20 значений цены закрытия свойство SMA.IsFormed = false.
|
|
Thanks:
|
|
|
|
|
Mikhail Sukhov
|
Date: 6/21/2013
UsilaDobry Простая скользящая средняя цены закрытия это среднее арифметическое значений цены закрытия за период. В нашем случае период = 20. В моем понимании свойство SMA.IsFormed = true, т.е. индикатор сформирован, значит есть минимум 20 значений цены закрытия, которые позволяют рассчитать первое значение индикатора, до тех пор, пока не будут получены 20 значений цены закрытия свойство SMA.IsFormed = false. Ну вот, а вы индикатор то в своем коде не заполняете. Как ему сформироваться при этом?
|
|
|
|
|
UsilaDobry
|
Date: 6/21/2013
|
|
|
|
Изменил код, индикатор сначала выводится корректно (вложение 1), а потом с приходом нового тика сжимается и на последней свечке стягивается в точку (вложение 2)...? Хотя, согласно кода на последней свечке вообще не должно быть вычисление индикатора пока она в состоянии изменения... Code
////////////////////ОТРИСОВКА ИСТОРИЧЕСКИХ СВЕЧЕЙ/////////////////////////////////////////////////////////////////////
this.GuiAsync(() =>
{
foreach (var candle in candles)
{
var valueBb = _chartBollingerElement.Indicator.Process(new CandleIndicatorValue(candle) { IsFinal = true });
var candle1 = candle;
this.GuiAsync(() => _chartWindow.Chart.ProcessValues(candle1.OpenTime, new Dictionary<IChartElement, object>
{
{_candlesElem, candle1},
{_chartBollingerElement, new ChartIndicatorValue(_chartBollingerElement.Indicator, valueBb)},
}));
}
});
///////////////////ОТРИСОВКА РЕАЛЬНЫХ СВЕЧЕЙ/////////////////////////////////////////////////////////////////////
_candleManager = new CandleManager(_trader);
_series = new CandleSeries(typeof(TimeFrameCandle), security, (TimeSpan)AlfaTimeFrames.Minute10);
_series.ProcessCandle += candle => this.GuiAsync(() =>
{
if (candle.State == CandleStates.Finished)
{
var valueBb = _chartBollingerElement.Indicator.Process(new CandleIndicatorValue(candle){IsFinal = true});
if (_chartBollingerElement.Indicator.IsFormed)
{
var candle1 = candle;
this.GuiAsync(() =>_chartWindow.Chart.ProcessValues(candle1.OpenTime,new Dictionary<IChartElement, object>
{
{_candlesElem, candle1},
{_chartBollingerElement,new ChartIndicatorValue(_chartBollingerElement.Indicator,valueBb)
},
}));
}
}
else
{
var candle1 = candle;
this.GuiAsync(() => _chartWindow.Chart.ProcessCandle(_candlesElem, candle1));
}
});
|
|
Thanks:
|
|
|
|
|
Mikhail Sukhov
|
Date: 6/21/2013
UsilaDobry Изменил код, индикатор сначала выводится корректно (вложение 1), а потом с приходом нового тика сжимается и на последней свечке стягивается в точку (вложение 2)...? А теперь изучайте что такое IsFinal[laugh]
|
|
Thanks:
|
|
|
|
|
UsilaDobry
|
Date: 6/21/2013
Михаил Сухов UsilaDobry Изменил код, индикатор сначала выводится корректно (вложение 1), а потом с приходом нового тика сжимается и на последней свечке стягивается в точку (вложение 2)...? А теперь изучайте что такое IsFinal[laugh] [confused] Как я понимаю, IsFinal=true например для 10-минутного графика означает, что после формирования 10-минутной свечи (когда она примет состояние Finished) значение индикатора больше не будет изменяться, оно будет окончательным.
|
|
Thanks:
|
|
|
|
|
UsilaDobry
|
Date: 6/21/2013
|
|
|
|
Странно...Вернул всё в первоначальный вид, (топик #18), убрал проверку на IsFormed, ничего не изменилось...Всё также, как в топике #27. Я уже закипаю... Code
////////////////////////ОТРИСОВКА ИСТОРИЧЕСКИХ СВЕЧЕЙ/////////////////////////////////////////////////////////////////////
this.GuiAsync(() =>
{
foreach (var candle in candles)
{
var valueBb = _chartBollingerElement.Indicator.Process(new CandleIndicatorValue(candle));
var candle1 = candle;
this.GuiAsync(() => _chartWindow.Chart.ProcessValues(candle1.OpenTime, new Dictionary<IChartElement, object>
{
{_candlesElem, candle1},
{_chartBollingerElement, new ChartIndicatorValue(_chartBollingerElement.Indicator, valueBb)},
}));
}
});
///////////ОТРИСОВКА РЕАЛЬНЫХ СВЕЧЕЙ/////////////////////////////////////////////////////////////////////
_candleManager = new CandleManager(_trader);
_series = new CandleSeries(typeof(TimeFrameCandle), security, (TimeSpan)AlfaTimeFrames.Minute10);
_series.ProcessCandle += candle => this.GuiAsync(() =>
{
if (candle.State == CandleStates.Finished)
{
var valueBb = _chartBollingerElement.Indicator.Process(new CandleIndicatorValue(candle));
this.GuiAsync(() =>_chartWindow.Chart.ProcessValues(candle.OpenTime,new Dictionary<IChartElement, object>
{
{_candlesElem, candle},
{_chartBollingerElement,new ChartIndicatorValue(_chartBollingerElement.Indicator,valueBb)},
}));
}
else
{
this.GuiAsync(() => _chartWindow.Chart.ProcessCandle(_candlesElem, candle));
}
});
|
|
Thanks:
|
|
|
|
|
UsilaDobry
|
Date: 6/24/2013
Почему с AlfaDirect выводятся график завершенные и последняя незавершенная свечи? В Quik такого нет, при исполнении такого кода выводятся только завершенные свечи... Или это особенность терминала AlfaDirect? Code
_series.ProcessCandle += candle =>
{
if (candle.State == CandleStates.Finished)
{
this.GuiAsync(() =>_chartWindow.Chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
{
{_candlesElem, candle},
}));
}
};
|
|
Thanks:
|
|
|
|