Здравствуйте!
Для моей стратегии нужны некоторые прошлые значения индикаторов. У меня опыт программирования c/c++, без особо объектных моделей.
В описании S# посмотрел описания всех членов, связанных с контейнерами, но не совсем понял, как они связываются с индикаторами.
Вот, создаю я контейнер. Что дальше с ним сделать, чтобы он сохранял значения?
Comentarios (9)
Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario
На примеры из архива смотрели?
Да. По текстовому поиску в "дистрибутиве" 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 - вполне так себе функция преобразования от любой свечки...