Почему double, а не decimal?
Atom Ответить
31.10.2010


Заинтересовал вопрос, почему параметры в double а не decimal, у которого фиксированная точка?



Спасибо:




40 Ответов
< 1 2 
anothar

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


Maxim Перейти
Данные для тестирования беру из SQL.
Наверно, для понимания моей ситуации стоит отметить, перед первым
запуском одной стратегии мне необходимо обсчитать все вспомогательные данные
за всю историю. При следующих запусках этого не нужно делать.

B для этого Вам нужно забивать 7 гигов памяти? А не проще ли сохранять значения в sql или подгружать данные не все разом а постепенно пакетно? А вообще мне очень интересно как Вы умудряетесь забить 5-7 гигов памяти, ведь наверняка активно пользуете намного меньше.
Автор топика
Спасибо:

Maxim

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


Алгоритм приблизительно такой:
пробегаем по всем историческим данным и находим несколько производных значений от цены и объема, например, для каждой секунды.
Конечно, можно сделать разбиение на части и уложится даже в 10Мб.

Но зачем усложнять жизнь, если все можно одним куском в память запихнуть?

В случаи не бектестинга, а робота, это надо сделать только один раз.
Просчитать все данные. После этого прога работает в 32 битном режиме и 7 гиов
ей не надо.
Спасибо:

anothar

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


Maxim Перейти
Алгоритм приблизительно такой:
пробегаем по всем историческим данным и находим несколько производных значений от цены и объема, например, для каждой секунды.
Конечно, можно сделать разбиение на части и уложится даже в 10Мб.

Но зачем усложнять жизнь, если все можно одним куском в память запихнуть?

В случаи не бектестинга, а робота, это надо сделать только один раз.
Просчитать все данные. После этого прога работает в 32 битном режиме и 7 гиов
ей не надо.

Если у Вас несколько таких роботов будет, то сколько памяти потребуется? И нет тут никакого особого усложнения жизни - сделаете еще одного робота, и придется все равно ее себе "усложнять". И дело не в double-decimal, а в проектировании программы: если так делать, то Вам вскорости никакой памяти не хватит.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 01.05.2011
Ответить


Maxim Перейти
Перевел на decimal.
Потребление ОЗУ увеличилось с 5.6Гб до 6.6Гб.
Пока что влажу в лимит.


Все правильно, размер Trade увеличился на 1.18. Меня пугает размер 5.6. Это получается что-то порядка 136 282 616 тиков. Уверены, что такой сайз нужен в памяти? Больше выделение объемов памяти плохо сказывается на производительности GC. Плюс не совсем понятно, зачем такой объем держать. Чтобы оптимизировать стратегию необходимо небольшой участок данных. Далее, найденные значения применяются ко всему периоду, который подгружается частями и выгружается. Держать больший период в памяти имеет смысл, если на нем идет частая проверка данных. Если это как раз оптимизация - то это уже плохо с точки зрения поиска на истории, так как идет подгонка параметров.
Спасибо:

Maxim

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


Все верно пишите.
Только как раз не хотелось заниматься разбитием процесса на части (загрузки и выгрузки частями).

Если касательно торгового робота (где я использую S#), то 5.6 гигов необходимо один раз, при первом старте стратегии, что бы просчитать все данные которые, были с начала истории по текущий момент.


Если касательно бэктестинга, то там я S# не использую. Но там много памяти надо постоянно :)


Считаю, что если алгоритм с небольшим количеством параметров (у меня ~7) дает хорошие результаты на 10 годах истории, то с большой вероятностью он будет хорошим и в ближайшие пол года. То есть подгонка в некоторых случаях имеет право на жизнь.
Вы не согласны?
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 01.05.2011
Ответить


Maxim Перейти
Все верно пишите.
Только как раз не хотелось заниматься разбитием процесса на части (загрузки и выгрузки частями).


Так сделано сейчас в HistoryEmulationTrader. Вы еще что-то на части разбиваете?

Maxim Перейти

Если касательно торгового робота (где я использую S#), то 5.6 гигов необходимо один раз, при первом старте стратегии, что бы просчитать все данные которые, были с начала истории по текущий момент.


А вы пробовали в конце сессии писать результирующие данные, чтобы на следующий день не делать пересчет для 6 гигов тиков?

Maxim Перейти

Если касательно бэктестинга, то там я S# не использую. Но там много памяти надо постоянно :)


Давайте разбираться с конкретикой. На какой версии пробовали, сколько занимало, какой период выбирали, сколько тестировалось стратегий и инструментов.

Maxim Перейти

Считаю, что если алгоритм с небольшим количеством параметров (у меня ~7) дает хорошие результаты на 10 годах истории, то с большой вероятностью он будет хорошим и в ближайшие пол года. То есть подгонка в некоторых случаях имеет право на жизнь.
Вы не согласны?


Если говорить о тех анализе, я его вообще считаю профанацией.Laugh А если ближе к деталям, то у нас рынок меняется каждые 2 года и кризисы каждые 5 летSmile . С этими факторами российского стиля жизни сложно найти инструменту, который бы был стабилет на стратегии в течении 10 лет. Так что да, я не верю, что алго даст профит хотя бы на ближайшие пол года. Я думаю это плохое тестирование, которые в реальности не показало бы на прошедших 10 годах тот показатель, что был получен на истории.

Вам то удалось самому найти такой алго?
Спасибо:

Maxim

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


Mikhail Sukhov Перейти

Так сделано сейчас в HistoryEmulationTrader. Вы еще что-то на части разбиваете?

Для бектестинга не использую S#. Все свое :)


Mikhail Sukhov Перейти

А вы пробовали в конце сессии писать результирующие данные, чтобы на следующий день не делать пересчет для 6 гигов тиков?


Это надо сделать самый первый раз при запуске одной стратегии.
Потом эти данные считаются и записываются онлайн. И стока памяти не надо.

Maxim Перейти

Давайте разбираться с конкретикой. На какой версии пробовали, сколько занимало, какой период выбирали, сколько тестировалось стратегий и инструментов.


Я не использую S# для бектестинга )

Maxim Перейти

Вам то удалось самому найти такой алго?


Торговый робот работает с нового года.
До этого времени шел поиск золотого грааля :)
Но постоянно возникают косяки, которые мешают оценить результативность алго.
(Стоит уточнить, что в среднем одна-две сделки в неделю)
Так что через месяц другой может смогу дать Вам ответ.
Спасибо:

Maxim

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


Mikhail Sukhov Перейти

Если говорить о тех анализе, я его вообще считаю профанацией.Laugh


А это, мне кажется, надо сделать слоганом S# :)
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 01.05.2011
Ответить


Maxim Перейти
Mikhail Sukhov Перейти

Так сделано сейчас в HistoryEmulationTrader. Вы еще что-то на части разбиваете?

Для бектестинга не использую S#. Все свое :)


Значит нужно сделать переход на S# и решить проблему с потреблением памяти.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 01.05.2011
Ответить


Maxim Перейти
Mikhail Sukhov Перейти

Если говорить о тех анализе, я его вообще считаю профанацией.Laugh


А это, мне кажется, надо сделать слоганом S# :)


Это мое личное мнение. А так, на S# чего только не делалось (не мной). В том числе и тех анализ.
Спасибо:

Maxim

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


Михаил, может сталкивались со следующим?

При выполнении участка кода:
Код

ring _query = "SELECT HistoryId, Money, Paper FROM {0} WHERE Date = (SELECT MAX(DATE) FROM {0} )";
_query = String.Format(_query, sqlTableName);
SqlCommand _sqlCommand = new SqlCommand(_query, _sqlConn);

using (SqlDataReader _dataReader = _sqlCommand.ExecuteReader())
    while (_dataReader.Read())
    {
        HistoryId = _dataReader.GetInt64(0);
        Money = _dataReader.GetDecimal(1);
        Paper = _dataReader.GetInt32(2);
    }


Получается исключение:
Код

A first chance exception of type 'System.DivideByZeroException' occurred in mscorlib.dll
System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Unhandled exception</Description><AppDomain>Mts.vshost.exe</AppDomain><Exception><ExceptionType>System.DivideByZeroException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>Attempted to divide by zero.</Message><StackTrace> at System.Decimal.FCallDivide(Decimal&amp;amp; d1, Decimal&amp;amp; d2)
at System.Decimal.op_Division(Decimal d1, Decimal d2)
at Goricap.Mts.BuySell.&amp;lt;initProfitTimer&amp;gt;b__c(Object data) in G:\C\Development\MTS_Decimal\Programm\BuySellClass.cs:line 333
at System.Threading._TimerCallback.TimerCallback_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading._TimerCallback.PerformTimerCallback(Object state)</StackTrace><ExceptionString>System.DivideByZeroException: Attempted to divide by zero.
at System.Decimal.FCallDivide(Decimal&amp;amp; d1, Decimal&amp;amp; d2)
at System.Decimal.op_Division(Decimal d1, Decimal d2)
at Goricap.Mts.BuySell.&amp;lt;initProfitTimer&amp;gt;b__c(Object data) in G:\C\Development\MTS_Decimal\Programm\BuySellClass.cs:line 333
at System.Threading._TimerCallback.TimerCallback_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading._TimerCallback.PerformTimerCallback(Object state)</ExceptionString></Exception></TraceRecord>


Исключения появляется при исполнении
using (SqlDataReader _dataReader = _sqlCommand.ExecuteReader())


Раньше было Double, все работало. Ошибка появилась после перехода на Decimal.
Буду благодарен помощи.
Гугление как то не дает результатов.

И при чем тут деление? Не понимаю :)
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 02.05.2011
Ответить


Maxim Перейти
И при чем тут деление? Не понимаю :)


Подозреваю, что кусов кода и текст ошибки не связаны между собой.
Спасибо:

Maxim

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


Mikhail Sukhov Перейти
Maxim Перейти
И при чем тут деление? Не понимаю :)


Подозреваю, что кусов кода и текст ошибки не связаны между собой.


Я тоже это подозреваю.
Потому что программа просто заканчивается.
Никаких привычных исключений в дебагере не появляется.

Исключение, которое я написал, появляется в Output окне.



Спасибо:

Геннадий Ванин (Gennady Vanin)

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


Alexander Mukhanchikov Перейти
А ведь ни цены, ни объём не могут быть отрицательными.
Почему бы не использовать для цен тот же самый Decimal, а для объёмов ulong?


Зато их разница - может
Текущая чистая позиция - разница объёмов, может быть отрицательная
"% изменения от закрытия"
Вход. чист. поз.

Разница цены последней к оценке предыдущей сессиии
Разница цены последней к предыдущей сессиии
и т.д.

Половина парметров, которыми я пользуюсь из КВИК, могут быть отрицательными
Спасибо:

Alexander

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


Геннадий Ванин (Gennady Vanin) Перейти
Alexander Mukhanchikov Перейти
А ведь ни цены, ни объём не могут быть отрицательными.
Почему бы не использовать для цен тот же самый Decimal, а для объёмов ulong?


Зато их разница - может
Текущая чистая позиция - разница объёмов, может быть отрицательная
"% изменения от закрытия"
Вход. чист. поз.

Разница цены последней к оценке предыдущей сессиии
Разница цены последней к предыдущей сессиии
и т.д.

Половина парметров, которыми я пользуюсь из КВИК, могут быть отрицательными


И? Мы и используем decimal поэтому.
Спасибо:
< 1 2 

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

loading
clippy