Здравствуйте!
Для моей стратегии нужны некоторые прошлые значения индикаторов. У меня опыт программирования c/c++, без особо объектных моделей.
В описании S# посмотрел описания всех членов, связанных с контейнерами, но не совсем понял, как они связываются с индикаторами.
Вот, создаю я контейнер. Что дальше с ним сделать, чтобы он сохранял значения?
Kommentare (9)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
На примеры из архива смотрели?
Да. По текстовому поиску в "дистрибутиве" IndicatorContainer встречается только в .dll, в исходниках - только исходники самого "контейнера". По ним понять не могу :( Не тот уровень.
Изучил исходники контейнера и менеджера индикаторов. Индикаторы в примерах не используют токены. Как получить токен из цены закрытия в итерационной стратегии - не понятно...
Так, разобрался.
Объявляем в начале кода private переменные токенов (универсальных идентификаторов) индикаторов, менеджера индикаторов:
Создаём индикаторы и менеджер индикаторов заранее! Например:
_indicatorManager = new IndicatorManager(); SimpleMovingAverage _SMA1 = new SimpleMovingAverage ;
CandleToken token = _candleManager.RegisterTimeFrameCandles(_lkoh, _timeFrame); var PriceSource = new CandleTokenIndicatorSource(token, BaseCandleIndicatorSource.ByClose);
регистрируем индикаторы в менеджере:
При вызове стратегии в аргументах вместо создания новых индикаторов указываем наши зарегистрированные
Адресация прошлых значений индикаторов (если они есть): _indicatorManager.Container.GetValue(_indicatorToken1, 0).Second.GetValue<decimal>()
Проверил, работает.
Можно использовать CandleManager для удобства. Не сразу допер как сделать, но наконец заработало.
Где второй параметр конструктора, функция которая будет выдавать нужный тип данных в Process метод индикаторов находящихся в IndicatorManager. В нашем случае у нас SMA которая принимает только decimal на входе, отсюда и (candle) => candle.ClosePrice. То есть по цене закрытия свечки. Если не указать метод, то все создастся но работать не будет, потому как в Process метод индикатора будут подваться свечки, а он не умеет свечки обрабатывать.
не работает для старых значений свечек, работает
ra81, мне пока очень трудно читать лямбда-выражения, объясните, пожалуйста, что происходит с "(candle) => candle.ClosePrice" после препроцессора.
var candleManagerSource = new CandleManagerIndicatorSource(_candleManager, BaseCandleIndicatorSource.ByClose);
А разве лямбда не разворачивается препроцессором в нормальный код? Просто, как я понял, в данном случае во всех случаях, когда появляется свечка в источнике, она заменяется на свечка.Свойство, а не преобразуется...
Или я что-то нафантазировал? В свою очередь BaseCandleIndicatorSource.ByClose - вполне так себе функция преобразования от любой свечки...