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

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


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


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

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

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


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; Здесь мы получаем левую границу времени текущей свечи:

timeFrame.GetCandleBounds(Security).Min

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

UsilaDobry: Получается временной период как-то зависит от инструмента? У каждого инструмента свой временной период? Тогда бы реальное время было разное... Я вот не пойму какая связь между временным периодом и инструментом... Если взглянуть на реализацию этого метода (GetCandleBounds):

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 минуту.).

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

        ```csharp

        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)

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

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

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

        ```csharp

_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() написать

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

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

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

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

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

Thanks:

IvanB

Avatar
Date: 5/1/2013
Reply


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

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

> 
> то в основном алгоритме можно не вызывать метод  _candleSeries.GetCandle(1);?
> или в этом правиле даже не надо указывать метод _candleSeries.GetCandle(1);?, т.е.
> 
> ```csharp
_candleSeries.WhenCandlesFinished()
             .Do(MainAlgorithm) 
             .Apply(this)

Так конечно не заработает. Вариантов много, программирование это творческая работа, например можно так:

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