Cap

53 views
Skip to first unread message

Константин

unread,
Jun 29, 2010, 7:40:47 AM6/29/10
to Open Wealth Project
Добрый день!
В настоящий момент разрабатываю на c# программу для торговли через
Quik.
При переносе контейнеров Wealth Lab столкнулся с тем, что базовые
классы не очень хорошо приспособлены для обработки realtime данных.
Например DataSeries, Bars не имеют событий о том, что появились новые
данные. И если все оставлять в неизменном виде, то необходимо после
каждого бара (или тика) целиком(или частично) перезагружать данные в
этих контейнерах - это приведет к сильной нагрузке на процессор. Также
затруднительно, например, отправлять уведомления компоненту для
отрисовки графиков.
т.е. случился тик или новый бар, после этого запускается for (bar =
firstValidBar; bar < Bars.Count; bar++) - лежать будет что угодно.

Гораздо менее ресурсозатратно добавить события прихода новых данных в
каркас классов wealth -lab - в этом случае обрабатываться будут только
новые данные, но потеряется логика разработки и тестирования в wealth-
lab

Предлагаю обсудить варианты

Алексей Неботов

unread,
Jun 29, 2010, 8:03:33 AM6/29/10
to Open Wealth Project
Вообще, при торговле через WL цикл из торговой стратегии убирается, и
вместо него ставится работа с последним баром:
т.е. вместо
for (int bar = firstValidBar; bar < Bars.Count; bar++)
во время запуска на бою писать надо
int bar = Bars.Count - 1;
и WL будет на каждый новый бар вызывать Execute в котором считается не
весь цикл, а только один бар.

Робот не должен подписываться на данные, т.к. он не должен знать на
каких данных его запустят.

В остальном я не очень понял чего Вы добиваетесь. Вы заполняете
DataSeries с данными о торгах со стороны робота? Но этим должен
заниматься провайдер.

Цепочка такая:
1) У провайдера появились данные, он их сообщил WL'у
2) WL вызвал робота (роботов) с помощью функции Execute

Из всего этого мне больше всего не понравилось, что код робота для
тестирования и для запуска на бою надо менять. Но реализовав свой
базовый класс стратегий этого тоже можно избежать. Да и вообще
переопределив базовый класс можно добавить очень много дополнительного
функционала не изменив логики разработки/тестирования в WL. Пример
переопределения базового класса для стратегий:
http://open-wealth-project.googlecode.com/files/ParentChild.zip

Константин

unread,
Jun 29, 2010, 10:13:28 AM6/29/10
to Open Wealth Project
On 29 июн, 16:03, Алексей Неботов <anebo...@gmail.com> wrote:
> Вообще, при торговле через WL цикл из торговой стратегии убирается, и
> вместо него ставится работа с последним баром:
> т.е. вместо
>    for (int bar = firstValidBar; bar < Bars.Count; bar++)
> во время запуска на бою писать надо
>    int bar = Bars.Count - 1;
> и WL будет на каждый новый бар вызывать Execute в котором считается не
> весь цикл, а только один бар.
для стратегий:http://open-wealth-project.googlecode.com/files/
ParentChild.zip

Да, но индикаторы унаследованные от DataSeries будут пересчитываться
каждый раз по всему диапазону, т.к. в промежутках между вызовами
Execute информация не сохраняется и DataSeries не может сам обновлять
данные в себе, когда изменяются данные в источнике. В результате с
каждым новым баром выполнение стратегии будет занимать все больше и
больше времени.

Алексей Неботов

unread,
Jun 29, 2010, 1:39:08 PM6/29/10
to Open Wealth Project
Так проблемма не в DataSeries, а в индикаторах :)
DataSeries позволяет добовлять значения в себя, а вот индикаторы не
позволяют получить значения для конкретного бара, только для всего
DataSeries целиком.

Выход, переписывать индикаторы. Наследованием не обойдешся. Но т.к.
исходник индикаторов доступен, то сделать свой индикатор который
сохранит совместимость с WL и будет иметь метод Refresh() труда
составить не должно.

Думаю не утешил Вас :)

Константин

unread,
Jun 30, 2010, 1:14:18 AM6/30/10
to Open Wealth Project
У индикаторов есть статический метод Value, который позволяет получить
значение для любого бара.

Проблема не в этом. Когда вызывается метод 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 добиться достаточно
трудно. А если сделать в лоб, то система будет неработоспособна.

Алексей Неботов

unread,
Jun 30, 2010, 5:21:22 AM6/30/10
to Open Wealth Project
Метод Value, я бы использовал крайне остарожно, т.к. у него
встречаются такие реализации:
public static double Value(int bar, Bars bars, int period)
{
return Series(bars, period)[bar];
}

Не знал, что 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 перезаливается/пересоздается на каждый новый
бар. Как это можно подтвердить?

Константин

unread,
Jun 30, 2010, 6:28:28 AM6/30/10
to Open Wealth Project
Вы правы. С перезаливкой Bars я скорее всего погорячился, не знаю
почему так решил. Но у меня тоже нет возможности посмотреть в real
time.

Gazrvs

unread,
Jul 7, 2010, 4:31:00 AM7/7/10
to Open Wealth Project
Подскажите пожалуйста в WealthLab 5.6 есть возможность подписаться на
поступление тика, а не бара.
Стою перед выбором OpenQuant или WealthLab, или продолжать своим путем
идти.
Сейчас мечта приделать генетический алгоритм/нейронную сеть , который
периодически в бэктестинге оптимизирует параметры стратегии.

Алексей Неботов

unread,
Jul 7, 2010, 5:28:58 AM7/7/10
to Open Wealth Project
В WealthLab нет понятия подписаться и тик

но у стратегии есть метод execute который вызывается на каждый бар.
размер бара может быть равен одному тику (тогда цены OHLC равны между
собой)

Gazrvs

unread,
Jul 7, 2010, 6:22:09 AM7/7/10
to Open Wealth Project
Ясно, это как в WL4. В таком случае возможно ли в одной стратегии
несколько DataSeries с разными таймфреймами и разными инструментами
(что было бы удобно для арбитража), или опять все упрется в
ограниченное количество bar.

Алексей Неботов

unread,
Jul 7, 2010, 6:33:47 AM7/7/10
to Open Wealth Project
возможно

Дмитрий Белоусов

unread,
Jul 7, 2010, 6:34:29 AM7/7/10
to open-weal...@googlegroups.com
Для сложных стратегий, особенно высокочастотных, могу порекомендовать Matlab.
В Matlab очень удобно проводить любой изощренный бэктестинг, а после генерировать код C++ для реализации робота.
Насколько мне известно, все серьезные западные высокочастотники именно так делают.

По моему мнению, WealthLab хоть и является отличным ПО, не подходит для тестирования стратегий с таймфреймами меньше минуты, а так же для любых арбитражных стратегий. 

С уважением,
Дмитрий Белоусов


Gazrvs

unread,
Jul 7, 2010, 7:07:34 AM7/7/10
to Open Wealth Project
Согласен Mathlab хорошая программа, но там опять же необходимо
подавать входные сигналы, т.е. подключать провайдера.
А пока видел только примеры работы на истории (например на данных
Метастока). Имеется ли возможность подключения источников данных DDE,
или какое нить встроенное API для подключения внешних источников.

Дмитрий Белоусов

unread,
Jul 7, 2010, 8:18:31 AM7/7/10
to open-weal...@googlegroups.com
Я использую Matlab только для проверки стат. гипотез и бэктестинга, для реальной торговли я генерирую код C++ и пишу автономного робота, поэтому импорт данных в реальном времени мне не нужен.
Тем не менее, использование DDE в Matlab возможно, причем реализовывается очень просто, поищите в гугле.

С уважением,
Дмитрий Белоусов

Gazrvs

unread,
Jul 8, 2010, 4:10:28 AM7/8/10
to Open Wealth Project
Да DDE для Mathlab использовать возможно, только привязку к Квику я не
нашел, да и "любители точного" не очень делятся своими наблюдениями и
опытом. А переходить на программирование с С# на С++, это еще год
работы.
Алексей извиняюсь. что немного отошли от темы WL. Оказывается непросто
найти среду, в которой можно реализовать все задумки в полном объеме.
Насчет S#, его очень даже можно было бы взять за основу добавив
хорошее GUI и убрав жесткую привязку к торговой системе, иначе она не
позволяет тестировать стратегии.
Message has been deleted

Алексей Неботов

unread,
Jul 8, 2010, 4:31:15 AM7/8/10
to Open Wealth Project
> Насчет S#, его очень даже можно было бы взять за основу добавив
> хорошее GUI и убрав жесткую привязку к торговой системе, иначе она не
> позволяет тестировать стратегии.
Правильный ход мысли! это и планируется
Reply all
Reply to author
Forward
0 new messages