S#

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


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


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

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

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

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

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


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

Теги:


Спасибо:




5 Ответов
IvanB

Фотография
Дата: 30.04.2013
Ответить


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

Фотография
Курсы
Дата: 01.05.2013
Ответить


IvanB Перейти

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


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

Код

            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)


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

Код
var candle = _candleSeries.GetCandle<TimeFrameCandle>(1);


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

Код
_candleSeries.WhenCandlesStarted()
                         .Do(MainAlgorithm)
                         .Apply(this);
Автор топика
Спасибо:

IvanB

Фотография
Дата: 01.05.2013
Ответить


UsilaDobry Перейти

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

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

UsilaDobry

Фотография
Курсы
Дата: 01.05.2013
Ответить


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

Фотография
Дата: 01.05.2013
Ответить


UsilaDobry Перейти

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

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


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

Код
_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


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy