Гораздо менее ресурсозатратно добавить события прихода новых данных в
каркас классов wealth -lab - в этом случае обрабатываться будут только
новые данные, но потеряется логика разработки и тестирования в wealth-
lab
Предлагаю обсудить варианты
Робот не должен подписываться на данные, т.к. он не должен знать на
каких данных его запустят.
В остальном я не очень понял чего Вы добиваетесь. Вы заполняете
DataSeries с данными о торгах со стороны робота? Но этим должен
заниматься провайдер.
Цепочка такая:
1) У провайдера появились данные, он их сообщил WL'у
2) WL вызвал робота (роботов) с помощью функции Execute
Из всего этого мне больше всего не понравилось, что код робота для
тестирования и для запуска на бою надо менять. Но реализовав свой
базовый класс стратегий этого тоже можно избежать. Да и вообще
переопределив базовый класс можно добавить очень много дополнительного
функционала не изменив логики разработки/тестирования в WL. Пример
переопределения базового класса для стратегий:
http://open-wealth-project.googlecode.com/files/ParentChild.zip
Да, но индикаторы унаследованные от DataSeries будут пересчитываться
каждый раз по всему диапазону, т.к. в промежутках между вызовами
Execute информация не сохраняется и DataSeries не может сам обновлять
данные в себе, когда изменяются данные в источнике. В результате с
каждым новым баром выполнение стратегии будет занимать все больше и
больше времени.
Выход, переписывать индикаторы. Наследованием не обойдешся. Но т.к.
исходник индикаторов доступен, то сделать свой индикатор который
сохранит совместимость с WL и будет иметь метод Refresh() труда
составить не должно.
Думаю не утешил Вас :)
Проблема не в этом. Когда вызывается метод Execute, ему необходимо
подготовить контейнер Bars (а это DataSeries Open, High, Low, Close,
Volume, еще контейнер с датами баров)
В wealth lab эти контейнеры готовяться один раз, при загрузке данных,
после этого тестер вызывает Execute с нужными параметрами. Между
вызовами Execute информация не сохраняется.
(Да и Вы говорите, что робот не должен знать на каких данных его
загружают)
Допустим в Execute у меня объявлен расчет индикатора
DataSeries myIndicator1 = SMA.Series(High, 10);
В результате, на данных реального времени, для каждого вновь
поступившего бара, нужно будет сделать след. вещи:
1. Создать контейнер Bars, наполнив его данными за нужный период. +
вновь поступившие от квика данные
2. Рассчитать все индикаторы, которые у меня объявлены внутри Execute
3. Отрисовать (очень желательно, чтобы визуально контролировать)
т.е. для каждого нового нового бара происходит копирование и обработка
уже обработанных до этого баров.
В результате, по моему, полной совместимости с WL добиться достаточно
трудно. А если сделать в лоб, то система будет неработоспособна.
Не знал, что Bars создается для каждого вызова Execute() вы в этом
уверены?
При оптимизации это точно не так, попробывал прогнать следующий код в
оптимизаторе
WealthLab.Bars b = null;
protected override void Execute()
{
if (b!=Bars)
{
b = Bars;
System.Windows.Forms.MessageBox.Show("изменилось");
}
}
Если убрал строку b = Bars, то MessageBox появился десять раз, с ней
только один.
Или после каждого вызова Execute данные в нем очищаются, а потом
заново заливаются? Этого я тоже не заметил, как-то глупо это было бы
со стороны WL.
Bars устанавливается в методе а, Цепочка вызова данного метода:
WealthLab.WealthScript.a(Bars, ChartRenderer, TradingSystemExecutor,
DataSource) : Void
WealthLab.TradingSystemExecutor.Execute(WealthScript, Bars,
IList<Bars>) : Void
WealthLab.TradingSystemExecutor.Execute(WealthScript, Bars) : Void
WealthLabPro.ChartForm.a(TradingSystemExecutor, Bars, Boolean) :
Void
WealthLabPro.Optimization.c() : Void
WealthLabPro.Optimization.h() : Void
WealthLabPro.StrategyRanking.a(StrategyRankingItem) : Void
но у меня нет стрим адаптера, т.е. все эти познания только об
оптимизации кода на статических данных.
Итак есть две проблеммы:
1) архитектура индикаторов не позволяет пересчитывать их частично
(лечится переписыванием индикатора, не трогая DataSeries)
2) Возможно, что Bars перезаливается/пересоздается на каждый новый
бар. Как это можно подтвердить?
но у стратегии есть метод execute который вызывается на каждый бар.
размер бара может быть равен одному тику (тогда цены OHLC равны между
собой)