← Zurück

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

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


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

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

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


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

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

War dieses Thema hilfreich?

Thema teilen

Kommentare (5)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

IvanB
IvanB

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

UsilaDobry
UsilaDobry
UsilaDobry Autor

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);

IvanB
IvanB

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

UsilaDobry
UsilaDobry Autor

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 необходима в случае, если мы одновременно запускаем вывод на график и стратегию, например одной кнопкой. А если мы сначала одной кнопкой запускаем график, а потом второй кнопкой стартует наша стратегия, то такая проверка не нужна.

IvanB
IvanB

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 необходима в случае, если мы одновременно запускаем вывод на график и стратегию, например одной кнопкой. А если мы сначала одной кнопкой запускаем график, а потом второй кнопкой стартует наша стратегия, то такая проверка не нужна. Согласен, если пользователь робота будет дожидаться когда пройдут исторические данные, и только тогда запустит торговый алгоритм.

UsilaDobry