Почему double, а не decimal?
Atom
31.10.2010
anothar


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




Спасибо:


<< < 2 3 4 
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)

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


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

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

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

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

Спасибо:

Alexander

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


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

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

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

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

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

И? Мы и используем decimal поэтому.

Спасибо:
<< < 2 3 4 

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

loading
clippy