← Atrás

Stock# 2.0.1

Только что залил. Описание в блог добавлю позднее. Практически один багофикс. У кого были проблемы с 2.0 - качайте. Исправил все, о чем писали.

¿Le resultó útil este tema?

Compartir tema

Comentarios (26)

Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario

Tauler
Tauler

Михаил, вы хоть вкратце опишите, в чем заключается фикс.

Mikhail Sukhov
Mikhail Sukhov Autor

Описание -http://stockmarketdotnet.blogspot.com/2010/06/stock-201.html

Фикс? Это не один фикс. Все, о чем писали, то и фиксил.

artemox
artemox

Спасибо, за проделанную работу :)

Mikhail Sukhov
Mikhail Sukhov Autor

Это значит баги пофикшены? Или просто спасибо? =)

artemox
artemox

Для меня основным багом была ошибка при котировании, а это я не успел проверить. В ПН отчитаюсь :) Михаил, правильно ли я понимаю, что отсутствует доступ к членам amCharts через ChartControl? Хотел отключить IsDataGroupingEnabled, но не нашел как :(

Alexander
Alexander

Спасибо, всё о чём я отписывался - пофикшено.

Mikhail Sukhov
Mikhail Sukhov Autor

Да, не сделал... Как вариант, через reflection.

Alexander
Alexander

Не получается вывести сообщение в лог - добавляю в StrategyLogger стратегию, создаю обработчик события Log, с помощью OnLog вывожу сообщения из стратегии. Но при попытки записать в файл внутри OnLog возникает ошибка, связанная с тем, что к этому файлу уже кто-то имеет доступ из другого потока (я никак к нему не обращаюсь):

   private void OnLog(Strategy strategy, StrategyErrorStates

errorState, string message) { if (errorState != StrategyErrorStates.None) this.GuiAsync(() => MessageBox.Show(message));

       Log(" [" + strategy.Id + "] " + errorState + " => " +

message); }

   public void Log(string message)
    {
        using (StreamWriter sw = File.AppendText(logger.FileName))
        {
            sw.WriteLine(DateTime.Now.ToString("o") + " " +

message); } }

Как с этим можно бороться?

artemox
artemox

А может в версии 2.0.2 расшарить эти переменные? Или они приватные из принципиальных соображений?

Mikhail Sukhov
Mikhail Sukhov Autor

А текст исключения?

Mikhail Sukhov
Mikhail Sukhov Autor

Да нет никаких принципиальных соображений. Просто не сделал.

Alexander
Alexander

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.Action3.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:

Mikhail Sukhov
Mikhail Sukhov Autor

А где тут ошибка в StrategyLogger? Судя по логу ошибки, его вообще нет в цепочке вызовов.

Alexander
Alexander

Тогда немного не понимаю как должно быть устроено.

Есть методы: private void OnLog(Strategy strategy, StrategyErrorStates errorState, string message) { // если стратегия вывела не просто сообщение, то вывести на экран. if (errorState != StrategyErrorStates.None) this.GuiAsync(() => MessageBox.Show(message));

       Log(" [" + strategy.Id + "] " + errorState + " => " +

message); }

   public void Log(string message)
    {
        using (StreamWriter sw = File.AppendText(logger.FileName))
        {
            sw.WriteLine(DateTime.Now.ToString("o") + " " +

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))

Mikhail Sukhov
Mikhail Sukhov Autor

StrategyLogger слушает событие Log и пишет в файл. У Вас есть параллельный код, который так же пишет в файл. Судя по ошибке, именно он и падает.

Alexander
Alexander

Т.е. руками писать, как я это делаю из метода Log:

не нужно? у меня просто нигде больше нет записи в файл.

P.S. Посмотрел без вызова этого метода - обработчик события вызывается, сообщение приходит, но в файл ничего не пишется.

Можно небольшой наглядный пример что нужно сделать для записи в лог файл, как из обработчика события Log записывать сообщение в файл?

artemox
artemox

Такой ошибки по-моему не было "[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 остановлена.

Mikhail Sukhov
Mikhail Sukhov Autor
  1. Это значит заявка уже исполнена.
  2. "MyOrdersChanged по два раза вызывается для одной сделки" такого события нет.
Mikhail Sukhov
Mikhail Sukhov Autor

StrategyLogger сам пишет в файл. Пишет в тот файл, который указали в конструкторе. Пример есть в документации.

artemox
artemox
  1. Т.е. это допустимая ошибка для MQS? (считается что стратегия завершилась успешно?)
  2. Сорри, я имел ввиду Trader.OrdersChanged. Сообщение дублируется для состояния Active (та заявка, которую выставляю на котирование): 08.06.2010 13:42:01 [0] SS_RIM0 => Заявка 16003537 по цене 132210 по бумаге RIM0 по объему 1 в 08.06.2010 13:42:03, комент:'[309]SL', состояние=Active, статус=Done 08.06.2010 13:42:01 [0] SS_RIM0 => Заявка 16003537 по цене 132210 по бумаге RIM0 по объему 1 в 08.06.2010 13:42:03, комент:'[309]SL', состояние=Active, статус=Done

Мне не мешает это задвоение, но вдруг какой глючок найдется...

Константин
Константин

у меня тоже самое Trader.OrdersChanged срабатывает два раза с одинаковыми параметрами

Mikhail Sukhov
Mikhail Sukhov Autor

Интересно. А режим синхронный?

Константин
Константин

режим асинхронный

Mikhail Sukhov
Mikhail Sukhov Autor

http://stockmarketdotnet.blogspot.com/2010/03/stock-18.htmlПункт 1 начиная со слов о котировании.

Константин
Константин

Михаил, ну зачем так. Исходников библиотеки нет, в документации про это ни слова, а еще мне нужно выискивать где-то, что там работает, а что нет. Подумал - А зачем мне это нужно? Сел за выходные нарисовал привод с преферансом и гейшами. Свои глюки как-то ближе и понятнее. А главное их всегда можно исправить. За сим откланиваюсь и тестирование прекращаю

Mikhail Sukhov
Mikhail Sukhov Autor

Котирование я делал до асинхронных заявок. Еще не сделал поддержку таких заявок. Причина - время. Само по себе поведение отписал в блоге. Если кто-то сталкивается - пишу ссылку, предлагаю варианты. Вам кажется это мало? Я думаю, этого вполне достаточно.

Понятно, что хочется много и сразу. Но такое не бывает. Всегда выстраиваются приоритеты. Думаю, бессмысленно винить меня в том, что я сделал котирование, и что его пока не продолжаю. Это так же бессмысленно, как винить строителей дома, что они не могут построить его за 1 день. Котирование не поддерживает асинхронные заявки. Это не бага, это ограничение, которое я отписал. Баги я закрываю в каждой новой версии. Фичи - реализую не так часто.

Другой вопрос, если Вы написали за выходные привод без использовать S#, то у Вас уровень достаточный, чтобы реализовать свой аналог котирования. Но Вы решили отказаться вообще от всего S#. Причина мне не ясна.