[3.0.2]
Действия:
0. Создал БД со скриптом trading.sql из 3.0.2
- Запустил Hydra
- Нажал Инструменты-Обновить
- Выпал диалог с SQL ошибкой. Она же записана в логи
Finam 20:46:06.1406250 Вне диапазона времени.
RTS 20:46:06.2031250 Вне диапазона времени.
Гидра 20:54:01.5156250 System.Data.SqlClient.SqlException: Error 547, Level 16, State 0, Procedure Security_UpdateById, Line 119, Message: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Security_Exchange". The conflict occurred in database "trading", table "dbo.Exchange", column 'Name'.
Error Number: 547
Line Number: 119
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Security_Exchange". The conflict occurred in database "trading", table "dbo.Exchange", column 'Name'.
....
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at Ecng.Data.DatabaseCommand.<ExecuteNonQuery>b__5(DbCommand cmd)
at Ecng.Data.DatabaseCommand.<>c__DisplayClass3`1.<Execute>b__0(DbConnection connection)
at Ecng.Data.Database.GetConnection(Action`1 action)
at Ecng.Data.DatabaseCommand.Execute[TResult](IEnumerable`1 input, Func`2 handler)
at Ecng.Data.DatabaseCommand.ExecuteNonQuery(SerializationItemCollection input)
at Ecng.Data.Database.Execute(DatabaseCommand command, SerializationItemCollection source, Boolean needRetVal)
at Ecng.Data.Database.Update(DatabaseCommand command, SerializationItemCollection source, Boolean needRetVal)
at Ecng.Data.Database.<>c__DisplayClassf`1.<Update>b__e()
at Ecng.Data.Database.Update[TEntity](TEntity entity, FieldCollection keyFields, FieldCollection valueFields)
at Ecng.Data.Database.Update[TEntity](TEntity entity, FieldCollection valueFields)
at Ecng.Data.Database.Update[TEntity](TEntity entity)
at Ecng.Serialization.RelationManyList`1.OnUpdate(TEntity entity)
at Ecng.Data.HierarchicalPageLoadList`1.OnUpdate(TEntity entity)
at Ecng.Serialization.RelationManyList`1.Update(TEntity entity)
at Ecng.Trading.Algo.Storages.BaseStorageEntityList`1.Save(T entity)
at Ecng.Trading.Hydra.Core.SecurityStorage.Save(Security security) in D:\SS\Sources\Hydra\Core\SecurityStorage.cs:line 69
at Ecng.Trading.Hydra.Finam.FinamSecurityStorage.Save(Security security) in D:\SS\Sources\Hydra\Plugins\Finam\FinamSecurityStorage.cs:line 32
at Ecng.Trading.Algo.History.Finam.FinamHistorySource.GetNewSecurities()
at Ecng.Trading.Hydra.Finam.FinamTradeSource.GetNewSecurities() in
....
В Ecng.Trading.Hydra.Finam.FinamSecurityStorage.Save(Security) поставил брекпойнт
Security=TESTESSR, Exchange=Тестовая биржа
Руками создал в Exchange Тестовая биржа и ММВБ в результате Hydra скачала 3000 c чем-то security.
Значит, проблема в отсутствии записей в Exchange.
Посмотрел базу получилось 314 security из ММВБ и 3304 из Тестовая биржа
Но в окне "Инструменты" они не появились, какие бы фильтры я не выбирал.
Далее, я поставил источнику "РТС" и "Finam" IsEnabled=true, working from=0:0:0, working to=23.59.59.
и нажал "Старт".
В итоге в логе получил
Finam 21:50:00.4687500 Стартовал.
Finam 21:50:00.4687500 System.NullReferenceException: Object reference not set to an instance of an object.
at Ecng.Trading.Hydra.Finam.FinamTradeSource.Load(Security security) in D:\SS\Sources\Hydra\Plugins\Finam\FinamTradeSource.cs:line 158
at Ecng.Trading.Hydra.Worker.<Download>b__10(IMarketDataSource source) in D:\SS\Sources\Hydra\Hydra\Worker.cs:line 112
RTS 21:50:00.4843750 Стартовал.
RTS 21:51:19.0937500 System.Data.SqlClient.SqlException: Error 547, Level 16, State 0, Procedure Security_UpdateById, Line 119, Message: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Security_Exchange". The conflict occurred in database "trading", table "dbo.Exchange", column 'Name'.
Error Number: 547
Line Number: 119
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Security_Exchange". The conflict occurred in database "trading", table "dbo.Exchange", column 'Name'.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at Ecng.Data.DatabaseCommand.<ExecuteNonQuery>b__5(DbCommand cmd)
at Ecng.Data.DatabaseCommand.<>c__DisplayClass3`1.<Execute>b__0(DbConnection connection)
at Ecng.Data.Database.GetConnection(Action`1 action)
at Ecng.Data.DatabaseCommand.Execute[TResult](IEnumerable`1 input, Func`2 handler)
at Ecng.Data.DatabaseCommand.ExecuteNonQuery(SerializationItemCollection input)
at Ecng.Data.Database.Execute(DatabaseCommand command, SerializationItemCollection source, Boolean needRetVal)
at Ecng.Data.Database.Update(DatabaseCommand command, SerializationItemCollection source, Boolean needRetVal)
at Ecng.Data.Database.<>c__DisplayClassf`1.<Update>b__e()
at Ecng.Data.Database.Update[TEntity](TEntity entity, FieldCollection keyFields, FieldCollection valueFields)
at Ecng.Data.Database.Update[TEntity](TEntity entity, FieldCollection valueFields)
at Ecng.Data.Database.Update[TEntity](TEntity entity)
at Ecng.Serialization.RelationManyList`1.OnUpdate(TEntity entity)
at Ecng.Data.HierarchicalPageLoadList`1.OnUpdate(TEntity entity)
at Ecng.Serialization.RelationManyList`1.Update(TEntity entity)
at Ecng.Trading.Algo.Storages.BaseStorageEntityList`1.Save(T entity)
at Ecng.Trading.Hydra.Core.SecurityStorage.Save(Security security) in D:\SS\Sources\Hydra\Core\SecurityStorage.cs:line 69
at Ecng.Trading.Algo.History.Rts.RtsHistorySource.GetTrades(DateTime time)
at Ecng.Trading.Hydra.Rts.RtsTradeSource.Load(Security security) in D:\SS\Sources\Hydra\Plugins\Rts\RtsTradeSource.cs:line 168
at Ecng.Trading.Hydra.Worker.<Download>b__10(IMarketDataSource source) in D:\SS\Sources\Hydra\Hydra\Worker.cs:line 112
Тут сразу две проблемы - одна с передачей null в FinamTradeSource.Load (при загрузке через Finam)
вторая, видимо, снова с отсутствующей записью в Exchange (при загрузке через РТС)
После этого всего я закрыл Hydra. Когда заново запустил получил на старте
System.Data.SqlClient.SqlException: Procedure or function 'PageSelect' expects parameter '@columns', which was not supplied.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader()
at Ecng.Data.DatabaseCommand.<ExecuteTable>b__a(DbCommand cmd)
at Ecng.Data.DatabaseCommand.<>c__DisplayClass3`1.<Execute>b__0(DbConnection connection)
at Ecng.Data.Database.GetConnection(Action`1 action)
at Ecng.Data.DatabaseCommand.Execute[TResult](IEnumerable`1 input, Func`2 handler)
at Ecng.Data.DatabaseCommand.ExecuteTable(SerializationItemCollection input)
at Ecng.Data.Database.ReadAll[TEntity](DatabaseCommand command, SerializationItemCollection input)
at Ecng.Data.HierarchicalDatabase.ReadAll[TEntity](DatabaseCommand command, SerializationItemCollection source)
at Ecng.Data.Database.ReadAll[TEntity](Int64 startIndex, Int64 count, Field orderBy, SortDirection direction)
at Ecng.Data.Database.Ecng.Serialization.IStorage.GetGroup[TEntity](Int64 startIndex, Int64 count, Field orderBy, SortDirection direction)
at Ecng.Serialization.RelationManyList`1.OnGetGroup(Int64 startIndex, Int64 count, Field orderBy, SortDirection direction)
at Ecng.Data.HierarchicalPageLoadList`1.OnGetGroup(Int64 startIndex, Int64 count, Field orderBy, SortDirection direction)
at Ecng.Serialization.RelationManyList`1.ReadAll(Int64 startIndex, Int64 count, Field orderBy, SortDirection direction)
at Ecng.Serialization.RelationManyList`1.GetRange(Int64 startIndex, Int64 count, String sortExpression, SortDirection directions)
at Ecng.Collections.BaseListEx`1.GetRange(Int64 startIndex, Int64 count)
at Ecng.Serialization.RelationManyList`1.get_Count()
at Ecng.Serialization.RelationManyList`1.RelationManyListEnumerator.ProcessMove(Boolean& canProcess)
at Ecng.Collections.BaseEnumerator`2.System.Collections.IEnumerator.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
at Ecng.Collections.CollectionHelper.AddRange[T](ICollection`1 source, IEnumerable`1 items)
at Ecng.Trading.Hydra.MainWindow.FillSecurities() in D:\SS\Sources\Hydra\Hydra\MainWindow.xaml.cs:line 155
at Ecng.Trading.Hydra.MainWindow..ctor() in D:\SS\Sources\Hydra\Hydra\MainWindow.xaml.cs:line 64
--- End of inner exception stack trace ---
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Windows.Markup.BamlRecordReader.CreateInstanceFromType(Type type, Int16 typeId, Boolean throwOnFail)
--- End of inner exception stack trace ---
at System.Windows.Markup.XamlParseException.ThrowException(String message, Exception innerException, Int32 lineNumber, Int32 linePosition, Uri baseUri, XamlObjectIds currentXamlObjectIds, XamlObjectIds contextXamlObjectIds, Type objectType)
at System.Windows.Markup.XamlParseException.ThrowException(ParserContext parserContext, Int32 lineNumber, Int32 linePosition, String message, Exception innerException)
at System.Windows.Markup.BamlRecordReader.ThrowExceptionWithLine(String message, Exception innerException)
at System.Windows.Markup.BamlRecordReader.CreateInstanceFromType(Type type, Int16 typeId, Boolean throwOnFail)
at System.Windows.Markup.BamlRecordReader.GetElementAndFlags(BamlElementStartRecord bamlElementStartRecord, Object& element, ReaderFlags& flags, Type& delayCreatedType, Int16& delayCreatedTypeId)
at System.Windows.Markup.BamlRecordReader.BaseReadElementStartRecord(BamlElementStartRecord bamlElementRecord)
at System.Windows.Markup.BamlRecordReader.ReadElementStartRecord(BamlElementStartRecord bamlElementRecord)
at System.Windows.Markup.BamlRecordReader.ReadRecord(BamlRecord bamlRecord)
at System.Windows.Markup.BamlRecordReader.Read(Boolean singleRecord)
at System.Windows.Markup.TreeBuilderBamlTranslator.ParseFragment()
at System.Windows.Markup.TreeBuilder.Parse()
at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
at System.Windows.Application.LoadBamlStreamWithSyncInfo(Stream stream, ParserContext pc)
at System.Windows.Application.LoadComponent(Uri resourceLocator, Boolean bSkipJournaledProperties)
at System.Windows.Application.DoStartup()
at System.Windows.Application.<.ctor>b__0(Object unused)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
Это уже вне моего какого бы то понимания, потому что это похоже на stored procedure .net, в чем я слабо разбираюсь, особенно без исходников, но чувствуется что Ecng.Serialization и Ecng.Data вещи нетривиальные ;)
Есть догадка, что Ecng.Trading.Hydra.MainWindow.FillSecurities() загружает объекты из таблицы Exchange которые я руками добавил и скорее всего некорректно (все поля кроме Name оставил пустыми)
В общем, похоже дело в создании Exchange, но я не знаю толи они должны автоматически создаваться кодом, толи их создание должно быть в trading.sql.
Кроме того в trading.sql обнаружил в начале явный CREATE DATABASE с абсолютными путями. Мне кажется создать базу должен пользователь сам, а в скрипте должны инициализироваться все объекты БД.
С уважением.