Только что залил. Описание в блог добавлю позднее. Практически один багофикс. У кого были проблемы с 2.0 - качайте. Исправил все, о чем писали.
Только что залил. Описание в блог добавлю позднее. Практически один багофикс. У кого были проблемы с 2.0 - качайте. Исправил все, о чем писали.
评论 (26)
登录 或 创建账户, 登录或注册以发表评论
Михаил, вы хоть вкратце опишите, в чем заключается фикс.
Описание -http://stockmarketdotnet.blogspot.com/2010/06/stock-201.html
Фикс? Это не один фикс. Все, о чем писали, то и фиксил.
Спасибо, за проделанную работу :)
Это значит баги пофикшены? Или просто спасибо? =)
Для меня основным багом была ошибка при котировании, а это я не успел проверить. В ПН отчитаюсь :) Михаил, правильно ли я понимаю, что отсутствует доступ к членам amCharts через ChartControl? Хотел отключить IsDataGroupingEnabled, но не нашел как :(
Спасибо, всё о чём я отписывался - пофикшено.
Да, не сделал... Как вариант, через reflection.
Не получается вывести сообщение в лог - добавляю в StrategyLogger стратегию, создаю обработчик события Log, с помощью OnLog вывожу сообщения из стратегии. Но при попытки записать в файл внутри OnLog возникает ошибка, связанная с тем, что к этому файлу уже кто-то имеет доступ из другого потока (я никак к нему не обращаюсь):
errorState, string message) { if (errorState != StrategyErrorStates.None) this.GuiAsync(() => MessageBox.Show(message));
message); }
message); } }
Как с этим можно бороться?
А может в версии 2.0.2 расшарить эти переменные? Или они приватные из принципиальных соображений?
А текст исключения?
Да нет никаких принципиальных соображений. Просто не сделал.
System.IO.IOException was unhandled Message=The process cannot access the file 'C:\Users\Alexander \Documents\Visual Studio 2010\Projects\Robots\Robots\bin\Debug \2010_06_07_strong_days.txt' because it is being used by another process. Source=mscorlib StackTrace: at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) at System.IO.StreamWriter.CreateFile(String path, Boolean append) at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize) at System.IO.StreamWriter..ctor(String path, Boolean append) at System.IO.File.AppendText(String path) at Robots.MainWindow.Log(String message) in C:\Users\Alexander \Documents\Visual Studio 2010\Projects\Robots\Robots \MainWindow.xaml.cs:line 334 at Robots.MainWindow.OnLog(Strategy strategy, StrategyErrorStates errorState, String message) in C:\Users\Alexander \Documents\Visual Studio 2010\Projects\Robots\Robots \MainWindow.xaml.cs:line 328 at System.Action
3.Invoke(T1 arg1, T2 arg2, T3 arg3) at Ecng.Common.DelegateHelper.SafeInvoke[T1,T2,T3](Action3 handler, T1 arg1, T2 arg2, T3 arg3) at Ecng.Trading.Algo.Strategy.AddLog(StrategyErrorStates errorState, String message, Object[] args) at Robots.StrongDaysStrategy.OnRunning() in C:\Users\Alexander \Documents\Visual Studio 2010\Projects\Robots\Robots \StrongDaysStrategy.cs:line 48 at Ecng.Trading.Algo.Strategy. (StrategyProcessStates ) at Ecng.Trading.Algo.Strategy.Start() at Robots.MainWindow.<>c__DisplayClass14.<>c__DisplayClass1c.<ConnectBtn_Clic>b__b() in C:\Users\Alexander\Documents\Visual Studio 2010\Projects\Robots \Robots\MainWindow.xaml.cs:line 209 at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) at System.Windows.Threading.DispatcherOperation.InvokeImpl() at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state) at System.Threading.ExecutionContext.runTryCode(Object userData) at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedClanup(TryCode code, CleanupCode backoutCode, Object userData) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Windows.Threading.DispatcherOperation.Invoke() at System.Windows.Threading.Dispatcher.ProcessQueue() at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) at System.Windows.Threading.Dispatcher.Run() at System.Windows.Application.RunDispatcher(Object ignore) at System.Windows.Application.RunInternal(Window window) at System.Windows.Application.Run(Window window) at System.Windows.Application.Run() at Robots.App.Main() in C:\Users\Alexander\Documents\Visual Studio 2010\Projects\Robots\Robots\obj\x86\Debug\App.g.cs:line 0 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException:А где тут ошибка в StrategyLogger? Судя по логу ошибки, его вообще нет в цепочке вызовов.
Тогда немного не понимаю как должно быть устроено.
Есть методы: private void OnLog(Strategy strategy, StrategyErrorStates errorState, string message) { // если стратегия вывела не просто сообщение, то вывести на экран. if (errorState != StrategyErrorStates.None) this.GuiAsync(() => MessageBox.Show(message));
message); }
message); } }
Есть инициализация private StrategyLogger logger; и подписка: logger = new StrategyLogger("{0}{1:00}{2:00} _strong_days.txt".Put(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day)); logger.Strategies.Add(_strategy);
Из стратегии вызывается AddLog, к примеру: AddLog(StrategyErrorStates.None, "Останавливаем стратегию...", new object());
Исключение выкидывается тут: using (StreamWriter sw = File.AppendText(logger.FileName))
StrategyLogger слушает событие Log и пишет в файл. У Вас есть параллельный код, который так же пишет в файл. Судя по ошибке, именно он и падает.
Т.е. руками писать, как я это делаю из метода Log:
не нужно? у меня просто нигде больше нет записи в файл.
P.S. Посмотрел без вызова этого метода - обработчик события вызывается, сообщение приходит, но в файл ничего не пишется.
Можно небольшой наглядный пример что нужно сделать для записи в лог файл, как из обработчика события Log записывать сообщение в файл?
Такой ошибки по-моему не было "[FORTS] Не найдена заявка для перестановки" И еще - у меня MyOrdersChanged по два раза вызывается для одной сделки (но это и до версии 201) Протокол:
07.06.2010 19:21:02 [0] MQS_RIM0 => Цена текущей 133205 и лучшей 133205. 07.06.2010 19:21:03 [0] MQS_RIM0 => Цена текущей 133205 и лучшей 133205. 07.06.2010 19:21:04 [0] MQS_RIM0 => Цена текущей 133205 и лучшей 133205. 07.06.2010 19:21:06 [0] MQS_RIM0 => Цена текущей 133205 и лучшей 133280. 07.06.2010 19:21:06 [0] MQS_RIM0 => Регистрация новой заявки Sell с ценой 133280 и объемом 1. 07.06.2010 19:21:06 [0] SS_RIM0_01:00:00 => Transaction: ACCOUNT=SPBFUT005La; CLIENT_CODE=XXX; TYPE=L; TRANS_ID=69666064; CLASSCODE=SPBFUT; SECCODE=RIM0; ACTION=NEW_ORDER; OPERATION=S; QUANTITY=1; PRICE=133280; COMMENT=[303]SL; 07.06.2010 19:21:06 [0] SS_RIM0_01:00:00 => Quiting Заявка 15354886 по цене 133280 по бумаге RIM0 по объему 1 в 01.01.0001 0:00:00, состояние=Active, статус=Done 07.06.2010 19:21:06 [0] MQS_RIM0 => Заявка зарегистрирована Sell под номером 15354886 с ценой 133280 объемом 1 ID транзакции 69666064. 07.06.2010 19:21:07 [0] SS_RIM0_01:00:00 => Заявка 15354886 по цене 133280 по бумаге RIM0 по объему 1 в 07.06.2010 19:21:08, состояние=Active, статус=Done 07.06.2010 19:21:07 [0] SS_RIM0_01:00:00 => Заявка 15354886 по цене 133280 по бумаге RIM0 по объему 1 в 07.06.2010 19:21:08, состояние=Active, статус=Done 07.06.2010 19:21:08 [0] MQS_RIM0 => Цена текущей 133280 и лучшей 133280. 07.06.2010 19:21:09 [0] MQS_RIM0 => Цена текущей 133280 и лучшей 133280. 07.06.2010 19:21:10 [0] MQS_RIM0 => Цена текущей 133280 и лучшей 133265. 07.06.2010 19:21:10 [0] MQS_RIM0 => Котирование заявки Sell под номером 15354886 с ценой 133280 объемом 1 ID транзакции 69666064. 07.06.2010 19:21:10 [0] SS_RIM0_01:00:00 => Transaction: ACTION=MOVE_ORDERS; TRANS_ID=69670380; CLASSCODE=SPBFUT; SECCODE=RIM0; MODE=0; FIRST_ORDER_NUMBER=15354886; FIRST_ORDER_NEW_PRICE=133265; FIRST_ORDER_NEW_QUANTITY=1; 07.06.2010 19:21:10 [0] SS_RIM0_01:00:00 => Заявка 15354886 по цене 133280 по бумаге RIM0 по объему 1 в 07.06.2010 19:21:08, состояние=Cancelled, статус=Done 07.06.2010 19:21:10 [0] SS_RIM0_01:00:00 => Заявка 15354886 по цене 133280 по бумаге RIM0 по объему 1 в 07.06.2010 19:21:08, состояние=Cancelled, статус=Done 07.06.2010 19:21:10 [0] SS_RIM0_01:00:00 => Заявка 15355011 по цене 133265 по бумаге RIM0 по объему 1 в 07.06.2010 19:21:12, состояние=Active, статус=Done 07.06.2010 19:21:10 [0] SS_RIM0_01:00:00 => Отмена заявки 15354886, Position=Buy 07.06.2010 19:21:10 [0] MQS_RIM0 => Перекотирование прошло успешно для заявки Sell под номером 15355011 с ценой 133265 объемом 1 ID транзакции 69670380. 07.06.2010 19:21:10 [0] SS_RIM0_01:00:00 => Quiting Заявка 15355011 по цене 133265 по бумаге RIM0 по объему 1 в 07.06.2010 19:21:12, состояние=Active, статус=Done 07.06.2010 19:21:11 [0] MQS_RIM0 => Цена текущей 133265 и лучшей 133265. 07.06.2010 19:21:13 [0] MQS_RIM0 => Цена текущей 133265 и лучшей 133265. 07.06.2010 19:21:14 [0] MQS_RIM0 => Цена текущей 133265 и лучшей 133375. 07.06.2010 19:21:14 [0] MQS_RIM0 => Котирование заявки Sell под номером 15355011 с ценой 133265 объемом 1 ID транзакции 69670380. 07.06.2010 19:21:14 [0] SS_RIM0_01:00:00 => Transaction: ACTION=MOVE_ORDERS; TRANS_ID=69674197; CLASSCODE=SPBFUT; SECCODE=RIM0; MODE=0; FIRST_ORDER_NUMBER=15355011; FIRST_ORDER_NEW_PRICE=133375; FIRST_ORDER_NEW_QUANTITY=1; 07.06.2010 19:21:14 [0] MQS_RIM0 => System.ArgumentException: Транзакции 'ACTION=MOVE_ORDERS; TRANS_ID=69674197; CLASSCODE=SPBFUT; SECCODE=RIM0; MODE=0; FIRST_ORDER_NUMBER=15355011; FIRST_ORDER_NEW_PRICE=133375; FIRST_ORDER_NEW_QUANTITY=1;' не была зарегистрирована. Причина '[FORTS] Не найдена заявка для перестановки.. New Order1 ID: 0, new Order2 ID: 0'. Имя параметра: transactionTxt в . (String , OrderStatus& , UInt32& , Double& , String& ) в Ecng.Trading.Quik.QuikTrader. (Order , TransactionBuilder , Boolean , Boolean ) в Ecng.Trading.Quik.QuikTrader.ReRegisterOrder(Order oldOrder, Order newOrder) в Ecng.Trading.BusinessEntities.BaseTrader.ReRegisterOrder(Order oldOrder, Double price, Int32 volume) в Ecng.Trading.Algo.TraderHelper.ReRegisterOrder(ITrader trader, Order oldOrder, Func`1 getNewPrice, Boolean isForts) в Ecng.Trading.Algo.QuotingStrategy.OnProcess() в Ecng.Trading.Algo.Strategy. () 07.06.2010 19:21:14 [0] SS_RIM0_01:00:00 => Сделка 533951 по цене 133265 по бумаге RIM0 по объему 1 в 07.06.2010 19:21:14 07.06.2010 19:21:14 [0] MQS_RIM0 => MQS_RIM0 останавливается. 07.06.2010 19:21:15 [0] MQS_RIM0 => Котирование заканчивается на заявке 15355011. 07.06.2010 19:21:15 [0] MQS_RIM0 => MQS_RIM0 остановлена.
StrategyLogger сам пишет в файл. Пишет в тот файл, который указали в конструкторе. Пример есть в документации.
Мне не мешает это задвоение, но вдруг какой глючок найдется...
у меня тоже самое Trader.OrdersChanged срабатывает два раза с одинаковыми параметрами
Интересно. А режим синхронный?
режим асинхронный
http://stockmarketdotnet.blogspot.com/2010/03/stock-18.htmlПункт 1 начиная со слов о котировании.
Михаил, ну зачем так. Исходников библиотеки нет, в документации про это ни слова, а еще мне нужно выискивать где-то, что там работает, а что нет. Подумал - А зачем мне это нужно? Сел за выходные нарисовал привод с преферансом и гейшами. Свои глюки как-то ближе и понятнее. А главное их всегда можно исправить. За сим откланиваюсь и тестирование прекращаю
Котирование я делал до асинхронных заявок. Еще не сделал поддержку таких заявок. Причина - время. Само по себе поведение отписал в блоге. Если кто-то сталкивается - пишу ссылку, предлагаю варианты. Вам кажется это мало? Я думаю, этого вполне достаточно.
Понятно, что хочется много и сразу. Но такое не бывает. Всегда выстраиваются приоритеты. Думаю, бессмысленно винить меня в том, что я сделал котирование, и что его пока не продолжаю. Это так же бессмысленно, как винить строителей дома, что они не могут построить его за 1 день. Котирование не поддерживает асинхронные заявки. Это не бага, это ограничение, которое я отписал. Баги я закрываю в каждой новой версии. Фичи - реализую не так часто.
Другой вопрос, если Вы написали за выходные привод без использовать S#, то у Вас уровень достаточный, чтобы реализовать свой аналог котирования. Но Вы решили отказаться вообще от всего S#. Причина мне не ясна.