Вопросы по уроку. Определение времени предпоследней свечи

Вопросы по уроку. Определение времени предпоследней свечи
Atom
4/29/2013
UsilaDobry


В алгоритме SMAStrategy мы определяем время предпоследней свечи. Зачем? Только для привязки стратегии к реальному времени?
Поясните мне смысл этой строки
Code

var time = timeFrame.GetCandleBounds(Security).Min - timeFrame;

Получается временной период как-то зависит от инструмента? У каждого инструмента свой временной период? Тогда бы реальное время было разное... Я вот не пойму какая связь между временным периодом и инструментом...

Прошу пояснить первое условие в этой строке
Code

if (candle.OpenTime >= time && _parabolic.IsFormed && candle.State == CandleStates.Finished)


если время открытия полученной свечи больше или равно времени предпоследней свечи... Разве может быть время открытия последней меньше предпоследней? Они поступаю в стратегию на обработку по очереди...



Thanks:


IvanB

Avatar
Date: 4/30/2013
Reply


UsilaDobry
В алгоритме SMAStrategy мы определяем время предпоследней свечи. Зачем? Только для привязки стратегии к реальному времени?
Поясните мне смысл этой строки

var time = timeFrame.GetCandleBounds(Security).Min - timeFrame;

Здесь мы получаем левую границу времени текущей свечи:
Code
timeFrame.GetCandleBounds(Security).Min

и затем из нее вычитаем таймфрейм свечи. чтобы получить левую временную границу предыдущей свечи.
UsilaDobry

Получается временной период как-то зависит от инструмента? У каждого инструмента свой временной период? Тогда бы реальное время было разное... Я вот не пойму какая связь между временным периодом и инструментом...

Если взглянуть на реализацию этого метода (GetCandleBounds):
Code
public static Range<DateTime> GetCandleBounds(this TimeSpan timeFrame, Security security)
		{
			if (security == null)
				throw new ArgumentNullException("security");

			return timeFrame.GetCandleBounds(security.GetMarketTime(), security.ExchangeBoard);
		}

то дело прояснится, видно, что торговый инструмент используется для получения времени торговой площадки.
UsilaDobry

Прошу пояснить первое условие в этой строке

if (candle.OpenTime >= time && _parabolic.IsFormed && candle.State == CandleStates.Finished)

если время открытия полученной свечи больше или равно времени предпоследней свечи... Разве может быть время открытия последней меньше предпоследней? Они поступаю в стратегию на обработку по очереди...

Дело в том, что мы должны пропускать только последние свечи чтобы наша стратегия работала, исторические свечи, например, которые были час назад нас (например при таймфрейме 1 мин.) не устраивают, ведь, при запуске получения свечей мы начинаем получать все свечи, котрые доступны системе, в том числе и историчсески, т.е. те, которые прошли например час назад (если говорим о таймфрейме, например, в 1 минуту.).
Thanks: UsilaDobry

UsilaDobry

Avatar
Date: 5/1/2013
Reply


IvanB

Дело в том, что мы должны пропускать только последние свечи чтобы наша стратегия работала, исторические свечи, например, которые были час назад нас (например при таймфрейме 1 мин.) не устраивают, ведь, при запуске получения свечей мы начинаем получать все свечи, котрые доступны системе, в том числе и историчсески, т.е. те, которые прошли например час назад (если говорим о таймфрейме, например, в 1 минуту.).


Зачем городить для этого этот код:

Code

            var candle = _candleSeries.GetCurrentCandle<TimeFrameCandle>();

            var timeFrame = (TimeSpan) candle.Arg;
            
            var time = timeFrame.GetCandleBounds(Security).Min - timeFrame;
            
            if (candle.OpenTime >= time && _parabolic.IsFormed && candle.State == CandleStates.Finished)


Можно просто указать в основном алгоритме

Code
var candle = _candleSeries.GetCandle<TimeFrameCandle>(1);


А основной алгоритм запускать по правилу

Code
_candleSeries.WhenCandlesStarted()
                         .Do(MainAlgorithm)
                         .Apply(this);
Thanks:

IvanB

Avatar
Date: 5/1/2013
Reply


UsilaDobry

Зачем городить для этого этот код...

Более того, можно использовать правило _candleSeries.WhenCandlesFinished() и он же передает завершенную свечу, т.е. не надо специально получать свечи. НО, без проверки:
candle.OpenTime >= time
никак не обойтись, иначе при запуске стратегии, наш алгоритм отработается на старых свечах и такое наторгует.....
Thanks:

UsilaDobry

Avatar
Date: 5/1/2013
Reply


IvanB
UsilaDobry

Зачем городить для этого этот код...

Более того, можно использовать правило _candleSeries.WhenCandlesFinished() и он же передает завершенную свечу, т.е. не надо специально получать свечи.


Т.е. если в OnStarted() написать

Code
_candleSeries.WhenCandlesFinished()
             .Do(()=>{
                      _candleSeries.GetCandle(1);
                      MainAlgorithm(); 
           }).Apply(this)


то в основном алгоритме можно не вызывать метод _candleSeries.GetCandle(1);?
или в этом правиле даже не надо указывать метод _candleSeries.GetCandle(1);?, т.е.

Code
_candleSeries.WhenCandlesFinished()
             .Do(MainAlgorithm) 
             .Apply(this)



Quote:
НО, без проверки:
candle.OpenTime >= time
никак не обойтись, иначе при запуске стратегии, наш алгоритм отработается на старых свечах и такое наторгует.....



Я думаю проверка candle.OpenTime >= time необходима в случае, если мы одновременно запускаем вывод на график и стратегию, например одной кнопкой.
А если мы сначала одной кнопкой запускаем график, а потом второй кнопкой стартует наша стратегия, то такая проверка не нужна.
Thanks:

IvanB

Avatar
Date: 5/1/2013
Reply


UsilaDobry

Т.е. если в OnStarted() написать

Code
_candleSeries.WhenCandlesFinished()
             .Do(()=>{
                      _candleSeries.GetCandle(1);
                      MainAlgorithm(); 
           }).Apply(this)


то в основном алгоритме можно не вызывать метод _candleSeries.GetCandle(1);?
или в этом правиле даже не надо указывать метод _candleSeries.GetCandle(1);?, т.е.

Code
_candleSeries.WhenCandlesFinished()
             .Do(MainAlgorithm) 
             .Apply(this)


Так конечно не заработает.
Вариантов много, программирование это творческая работа, например можно так:
Code
protected override void OnStarted()
        {
            //подписываемся на событие изменения индикатора
           // _sma.Changed += MainAlgorithm;

            _candleSeries.WhenCandlesFinished()
                         .Do(candle =>
                             {
                                 // Обработать завершенную свечу candle
                             })
                         .Apply();

            base.OnStarted();
        }

если надо получать предпоследнюю свечу, то нужно будет делать как-то специально, например даже так _candleSeries.GetCandle(1)

UsilaDobry

Я думаю проверка candle.OpenTime >= time необходима в случае, если мы одновременно запускаем вывод на график и стратегию, например одной кнопкой.
А если мы сначала одной кнопкой запускаем график, а потом второй кнопкой стартует наша стратегия, то такая проверка не нужна.

Согласен, если пользователь робота будет дожидаться когда пройдут исторические данные, и только тогда запустит торговый алгоритм.
Thanks: UsilaDobry


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy