Alexander
|
Дата: 07.03.2012
Покажите кодом как идёт создание стратегии и где идёт вывод этого лога.
|
|
|
|
vader
|
Дата: 07.03.2012
Создание стратегии - нужен вызов конструктора или сам конструктор?
|
Автор топика
|
|
|
Alexander
|
Дата: 07.03.2012
Точнее создание правила интересует. Правила CancelFailed и вывод всего что написали в лог
|
|
|
|
vader
|
Дата: 07.03.2012
|
|
|
|
Код
private void ReplaceOrder(string callingMethod)
{
WriteDiagnostics("ReplaceOrder " + callingMethod + " " + _order.TransactionId.ToString());
this.When(_order.CancelFailed())
.Do(OnCancelFailed)
.Once();
if(CancelOrder(_order)) {
Thread.Sleep(500);
FormNewOrder(_order, callingMethod);
}
}
private void OnCancelFailed(OrderFail orderFail)
{
string message = orderFail.Error.Message;
WriteDiagnostics("OnCancelFailed " + message + orderFail.Order.TransactionId.ToString());
if(IsErrorBecauseClearing(message) || IsOrderCancelInEveningClearing(orderFail.Order)) {
if(IsErrorBecauseClearing(message)){
this.When(StrategyRuleHelper.Changed(Security))
.Do(() => ReplaceOrder("OnCancelFailed"))
.Once();
}
}
Stop();
}
protected bool CancelOrder(Order order)
{
WriteDiagnostics("CancelOrder " + order.TransactionId.ToString());
try {
Trader.CancelOrder(order);
return true;
}
catch(Exception ex) {
WriteDiagnostics("ex " + ex.Message);
return IsOrderCancelInEveningClearing(order);
}
}
protected void WriteDiagnostics(string message)
{
LogMessage logMessage = new LogMessage(this, DateTime.Now, ErrorTypes.None, message);
AddLog(logMessage);
}
|
Автор топика
|
|
|
Alexander
|
Дата: 07.03.2012
На 4.1 работает? Там много хороших изменений в плане параллельного исполнения заявок
|
|
|
|
vader
|
Дата: 07.03.2012
Не знаю, не пробовал. Попробую - отпишусь о результатах.
Качать из Souce code/Last version?
|
Автор топика
|
|
|
Alexander
|
Дата: 07.03.2012
ok, буду ждать :)
|
|
|
|
vader
|
Дата: 07.03.2012
К сожалению, версия 4.1 у меня не работоспособна. К примеру, стратегия ставит первую заявку, но вторую уже не может. Причина - OnRegisterFailed Операция является недопустимой из-за текущего состояния объекта. Или не срабатывает правило When(Func<(Of <<'(Boolean>)>>), TimeSpan).
Сылки использовал из \stocksharp-15359\dev\Reference
|
Автор топика
|
|
|
freelancer
|
Дата: 07.03.2012
Напишите уже наконец в документации, что некоторые правила исполняются несколько раз (хотя должны 1 раз) и что Once() не работает. Люди же жалуются. У меня с Matched то же самое. Once() не помогает
|
|
|
|
Mikhail Sukhov
|
Дата: 07.03.2012
vader  Причина - OnRegisterFailed Операция является недопустимой из-за текущего состояния объекта. Можно весть текст ошибки? vader  Или не срабатывает правило When(Func<(Of <<'(Boolean>)>>), TimeSpan).
Это что за зверь такой? Можно ввиде кода?
|
|
|
|
Alexander
|
Дата: 09.03.2012
Цитата:Причина - OnRegisterFailed Операция является недопустимой из-за текущего состояния объекта. И чтоб второй раз не ходить - StackTrace ошибки, без него никуда.
|
|
|
|
Alexander
|
Дата: 09.03.2012
И ещё вопрос по вашему коду - у вас в ReplaceOrder печатается вызывающий метод. Он во всех случаях пустой. Покажите откуда вы ещё вызываете ReplaceOrder - если б он вызывался из OnCancelFailed - это было бы видно.
Случайно правило не 2 раза создаётеся?
|
|
|
|
Alexander
|
Дата: 09.03.2012
Выложил 4.0.21, запустите с ним с включённым логом. Ответ на последний вопрос тогда получим.
|
|
|
|
vader
|
Дата: 11.03.2012
Включенный лог - это ведь EnableRulesLog = true, так? Тогнда он у меня и так включен.
|
Автор топика
|
|
|
Alexander
|
Дата: 11.03.2012
И что выдаёт 4.0.21? Я включил доп печать там.
|
|
|
|
vader
|
Дата: 12.03.2012
Касательно ошибок, возникавших при работе с промежуточной версией 15359. Ошибка при создании заявки - Операция является недопустимой из-за текущего состояния объекта. StackTrace - в StockSharp.Algo.BaseTrader.#=q1jPECpcYhkCDc1endsWfTp1VhJY$g9vaOlgOde9HMXI=.#=q7YCdHsNqy4nRQBNoT76vpw==() в StockSharp.Algo.BaseTrader.ProcessEvents(Action handler) в StockSharp.Quik.QuikTrader.#=qP$c9$YUhcgOXgGByrfkYQoLex2$ov$Irbl5B37enmzc=(Order #=qm5lz5WVqlloZ$wO5Bw075w==, TransactionBuilder #=qh1QBkeMdoSN6zg0mxHuV5w==) в StockSharp.Quik.QuikTrader.OnRegisterOrder(Order order) в StockSharp.Algo.BaseTrader.RegisterOrder(Order order) в StockSharp.Algo.Strategies.Strategy.RegisterOrder(Order order) в BSPB.Partizan.BaseStrategy.RegisterOrder(Order order) в C:\vb\General\PartizanV2\source\v.2.0\BaseStrategy.cs:строка 175
правило When(Func<(Of <<'(Boolean>)>>), TimeSpan) - это я из документации скопировал. (Зарегистрировать в стратегии условие, которое будет проверяться с интервалом interval.)
|
Автор топика
|
|
|
vader
|
Дата: 12.03.2012
|
|
|
|
Касательно работы в релизной версии 4.0.21.
Вот лог. 11:59:56.529 | | CRBR | Правило 'Интервал условие 00:00:30 (55486438)' активировано. 11:59:56.529 | | CRBR | ReplaceOrder RuleWaitingActivated 42601474 11:59:56.529 | | CRBR | CancelOrder 42601474 11:59:56.763 | | CRBR | Правило 'Ошибка снятия заявки 42601474 (61617225)' активировано. 11:59:56.763 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Ошибка снятия заявки. [FORTS] "Идет пром. клиринг, нельзя удалять заявки.".42601474 11:59:56.794 | | CRBR | Правило 'Ошибка снятия заявки 42601474 (61617225)' удалено. 11:59:56.810 | | CRBR | ex Транзакция 'CLASSCODE=SPBFUT; SECCODE=LKU2; TRANS_ID=42601475; ORDER_KEY=2713761048; ACTION=KILL_ORDER;' не была зарегистрирована. Причина 'Ошибка снятия заявки. [FORTS] "Идет пром. клиринг, нельзя удалять заявки.".'. 11:59:57.028 | | CRBR | Правило 'Изменение инструмента LKU2@RTS (103653)' активировано. 11:59:57.028 | | CRBR | ReplaceOrder OnCancelFailed 42601474 11:59:57.028 | | CRBR | CancelOrder 42601474 11:59:57.200 | | CRBR | ex Транзакция 'CLASSCODE=SPBFUT; SECCODE=LKU2; TRANS_ID=42601476; ORDER_KEY=2713761048; ACTION=KILL_ORDER;' не была зарегистрирована. Причина 'Ошибка снятия заявки. [FORTS] "Идет пром. клиринг, нельзя удалять заявки.".'. 11:59:57.200 | | CRBR | Правило 'Изменение инструмента LKU2@RTS (103653)' удалено. 11:59:57.200 | | CRBR | Правило 'Ошибка снятия заявки 42601474 (61617225)' активировано. 11:59:57.200 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Ошибка снятия заявки. [FORTS] "Идет пром. клиринг, нельзя удалять заявки.".42601474 11:59:57.216 | | CRBR | Правило 'Ошибка снятия заявки 42601474 (61617225)' удалено. 11:59:57.216 | | CRBR | Правило 'Ошибка снятия заявки 42601474 (42931033)' активировано. 11:59:57.216 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Ошибка снятия заявки. [FORTS] "Идет пром. клиринг, нельзя удалять заявки.".42601474 11:59:57.216 | | CRBR | Правило 'Ошибка снятия заявки 42601474 (42931033)' удалено.
|
Автор топика
|
|
|
vader
|
Дата: 12.03.2012
|
|
|
|
Ещё один Лог, запись приведена от начала работы стратегии.
15:48:11.291 | | CRBR | Стратегия запущена. 15:48:11.303 | | CRBR | CreateOrder OnStarting 15:48:11.573 | | CRBR | RegisterOrder 56876308 15:48:26.304 | | CRBR | Правило 'Интервал условие 00:00:15 (64796970)' активировано. 15:48:26.306 | | CRBR | ReplaceOrder RuleWaitingActivated 56876308 15:48:26.315 | | CRBR | CancelOrder 56876308 15:48:26.425 | | CRBR | Правило 'Ошибка снятия заявки 56876308 (33156464)' активировано. 15:48:26.427 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Вы не можете снять данную заявку56876308 15:48:26.435 | | CRBR | Правило 'Ошибка снятия заявки 56876308 (33156464)' удалено. 15:48:26.455 | | CRBR | ex Транзакция 'CLASSCODE=SPBFUT; SECCODE=RIH2; TRANS_ID=56876309; ORDER_KEY=1404446085; ACTION=KILL_ORDER;' не была зарегистрирована. Причина 'Вы не можете снять данную заявку'.
15:48:41.316 | | CRBR | Правило 'Интервал условие 00:00:15 (64796970)' активировано. 15:48:41.316 | | CRBR | ReplaceOrder RuleWaitingActivated 56876308 15:48:41.318 | | CRBR | CancelOrder 56876308 15:48:41.417 | | CRBR | Правило 'Ошибка снятия заявки 56876308 (33156464)' активировано. 15:48:41.417 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Вы не можете снять данную заявку56876308 15:48:41.421 | | CRBR | Правило 'Ошибка снятия заявки 56876308 (33156464)' удалено. 15:48:41.422 | | CRBR | Правило 'Ошибка снятия заявки 56876308 (5923895)' активировано. 15:48:41.422 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Вы не можете снять данную заявку56876308 15:48:41.426 | | CRBR | Правило 'Ошибка снятия заявки 56876308 (5923895)' удалено. 15:48:41.447 | | CRBR | ex Транзакция 'CLASSCODE=SPBFUT; SECCODE=RIH2; TRANS_ID=56876310; ORDER_KEY=1404446085; ACTION=KILL_ORDER;' не была зарегистрирована. Причина 'Вы не можете снять данную заявку'.
15:48:56.317 | | CRBR | Правило 'Интервал условие 00:00:15 (64796970)' активировано. 15:48:56.317 | | CRBR | ReplaceOrder RuleWaitingActivated 56876308 15:48:56.318 | | CRBR | CancelOrder 56876308 15:48:56.414 | | CRBR | Правило 'Ошибка снятия заявки 56876308 (33156464)' активировано. 15:48:56.414 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Вы не можете снять данную заявку56876308 15:48:56.418 | | CRBR | Правило 'Ошибка снятия заявки 56876308 (33156464)' удалено. 15:48:56.418 | | CRBR | Правило 'Ошибка снятия заявки 56876308 (5923895)' активировано. 15:48:56.418 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Вы не можете снять данную заявку56876308 15:48:56.422 | | CRBR | Правило 'Ошибка снятия заявки 56876308 (5923895)' удалено. 15:48:56.423 | | CRBR | Правило 'Ошибка снятия заявки 56876308 (50510248)' активировано. 15:48:56.423 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Вы не можете снять данную заявку56876308 15:48:56.427 | | CRBR | Правило 'Ошибка снятия заявки 56876308 (50510248)' удалено. 15:48:56.448 | | CRBR | ex Транзакция 'CLASSCODE=SPBFUT; SECCODE=RIH2; TRANS_ID=56876311; ORDER_KEY=1404446085; ACTION=KILL_ORDER;' не была зарегистрирована. Причина 'Вы не можете снять данную заявку'.
|
Автор топика
|
|
|
Mikhail Sukhov
|
Дата: 12.03.2012
vader  Ещё один Лог, запись приведена от начала работы стратегии. У вас и по первому логу видно, что два правила создали. Ищите у себя ошибку.
|
|
|
|
vader
|
Дата: 12.03.2012
Дело в том, что правило CancelFailed создается только в методе ReplaceOrder, следовательно сколько вызовов ReplaceOrder, столько должно быть и срабатываний CancelFailed.
По каким признакам вы считаете что ошибка у меня? Я не говорю что ошибка именно у вас ,просто пытаюсь понять ,на основании чего вы считаете что ошыбка у меня. Может быть это поможет мне её найти.
|
Автор топика
|
|
|
Mikhail Sukhov
|
Дата: 12.03.2012
vader  Дело в том, что правило CancelFailed создается только в методе ReplaceOrder, следовательно сколько вызовов ReplaceOrder, столько должно быть и срабатываний CancelFailed.
По каким признакам вы считаете что ошибка у меня? Я не говорю что ошибка именно у вас ,просто пытаюсь понять ,на основании чего вы считаете что ошыбка у меня. Может быть это поможет мне её найти. Я увидел, что правило на одну и ту же сделку создано 2 раза. Это из лога видно?
|
|
|
|
vader
|
Дата: 12.03.2012
Мне, к сожаление не видно.
|
Автор топика
|
|
|
Mikhail Sukhov
|
Дата: 12.03.2012
vader  Мне, к сожаление не видно. Цитата: 15:48:56.414 | | CRBR | Правило 'Ошибка снятия заявки 56876308 (33156464)' активировано. 15:48:56.418 | | CRBR | Правило 'Ошибка снятия заявки 56876308 (5923895)' активировано.
Одна и та же заявка, но номера правил разные. Значит их несколько этих самых правил.
|
|
|
|
vader
|
Дата: 12.03.2012
|
|
|
|
Посмотрел. в последнем логе видно, что правило с номером 33156464 было активировано три раза, а 5923895 - дважды.
Обнаружил ещё одну вещь. Вставил перед и после создание правила вывод имен правил и их количества. Количество правил, как по логике и должнон быть тавно сначала три, потом 4. НоС каждым разом на попытку снять снятую заявку вызывается снаяала одно, потом 2, потом три правила. Где они?
19:14:04.278 | | CRBR | Стратегия запущена. 19:14:04.291 | | CRBR | CreateOrder OnStarting 19:14:04.395 | | CRBR | RegisterOrder 69180761 19:14:19.295 | | CRBR | Правило 'Интервал условие 00:00:15 (32460410)' активировано. 19:14:19.298 | | CRBR | ReplaceOrder RuleWaitingActivated 69180761 19:14:19.300 | | CRBR | правило Интервал условие 00:00:15 19:14:19.302 | | CRBR | правило Ошибка регистрации заявки 0 19:14:19.304 | | CRBR | правило Новые сделки заявки 0 19:14:19.306 | | CRBR | правило 3 19:14:19.309 | | CRBR | правило Интервал условие 00:00:15 19:14:19.311 | | CRBR | правило Ошибка регистрации заявки 0 19:14:19.313 | | CRBR | правило Новые сделки заявки 0 19:14:19.315 | | CRBR | правило Ошибка снятия заявки 69180761 19:14:19.317 | | CRBR | правило 4 19:14:19.320 | | CRBR | CancelOrder 69180761 19:14:19.549 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (15645912)' активировано. 19:14:19.552 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Вы не можете снять данную заявку 69180761 19:14:19.560 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False 19:14:19.570 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (15645912)' удалено. 19:14:19.586 | | CRBR | ex Транзакция 'CLASSCODE=SPBFUT; SECCODE=RIH2; TRANS_ID=69180762; ORDER_KEY=2715365411; ACTION=KILL_ORDER;' не была зарегистрирована. Причина 'Вы не можете снять данную заявку'. 19:14:19.587 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False 19:14:19.588 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False 19:14:34.307 | | CRBR | Правило 'Интервал условие 00:00:15 (32460410)' активировано. 19:14:34.307 | | CRBR | ReplaceOrder RuleWaitingActivated 69180761 19:14:34.310 | | CRBR | правило Интервал условие 00:00:15 19:14:34.311 | | CRBR | правило Ошибка регистрации заявки 0 19:14:34.312 | | CRBR | правило Новые сделки заявки 0 19:14:34.314 | | CRBR | правило 3 19:14:34.316 | | CRBR | правило Интервал условие 00:00:15 19:14:34.318 | | CRBR | правило Ошибка регистрации заявки 0 19:14:34.319 | | CRBR | правило Новые сделки заявки 0 19:14:34.321 | | CRBR | правило Ошибка снятия заявки 69180761 19:14:34.322 | | CRBR | правило 4 19:14:34.324 | | CRBR | CancelOrder 69180761 19:14:34.340 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (15645912)' активировано. 19:14:34.340 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Вы не можете снять данную заявку 69180761 19:14:34.342 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False 19:14:34.343 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (15645912)' удалено. 19:14:34.343 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (33579535)' активировано. 19:14:34.343 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Вы не можете снять данную заявку 69180761 19:14:34.344 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False 19:14:34.346 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (33579535)' удалено. 19:14:34.359 | | CRBR | ex Транзакция 'CLASSCODE=SPBFUT; SECCODE=RIH2; TRANS_ID=69180763; ORDER_KEY=2715365411; ACTION=KILL_ORDER;' не была зарегистрирована. Причина 'Вы не можете снять данную заявку'. 19:14:34.360 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False 19:14:34.361 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False 19:14:49.307 | | CRBR | Правило 'Интервал условие 00:00:15 (32460410)' активировано. 19:14:49.307 | | CRBR | ReplaceOrder RuleWaitingActivated 69180761 19:14:49.309 | | CRBR | правило Интервал условие 00:00:15 19:14:49.311 | | CRBR | правило Ошибка регистрации заявки 0 19:14:49.312 | | CRBR | правило Новые сделки заявки 0 19:14:49.315 | | CRBR | правило 3 19:14:49.317 | | CRBR | правило Интервал условие 00:00:15 19:14:49.318 | | CRBR | правило Ошибка регистрации заявки 0 19:14:49.320 | | CRBR | правило Новые сделки заявки 0 19:14:49.322 | | CRBR | правило Ошибка снятия заявки 69180761 19:14:49.324 | | CRBR | правило 4 19:14:49.326 | | CRBR | CancelOrder 69180761 19:14:49.539 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (15645912)' активировано. 19:14:49.539 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Вы не можете снять данную заявку 69180761 19:14:49.540 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False 19:14:49.541 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (15645912)' удалено. 19:14:49.541 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (33579535)' активировано. 19:14:49.541 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Вы не можете снять данную заявку 69180761 19:14:49.543 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False 19:14:49.544 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (33579535)' удалено. 19:14:49.544 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (7995840)' активировано. 19:14:49.544 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Вы не можете снять данную заявку 69180761 19:14:49.545 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False 19:14:49.547 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (7995840)' удалено. 19:14:49.560 | | CRBR | ex Транзакция 'CLASSCODE=SPBFUT; SECCODE=RIH2; TRANS_ID=69180764; ORDER_KEY=2715365411; ACTION=KILL_ORDER;' не была зарегистрирована. Причина 'Вы не можете снять данную заявку'. 19:14:49.561 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False 19:14:49.562 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False
|
Автор топика
|
|
|
vader
|
Дата: 13.03.2012
|
|
|
|
Вот проект, в котором можно воспроизвести ошибку. Код
var entityFactory = new EntityFactory();
var portfolio = entityFactory.CreatePortfolio("SPBFUT00000");
strategy = new TestOnceFailed(p.BestBid.Price)
{
Security = p,
Portfolio = portfolio,
Trader = MainWindow.Instance.Trader,
};
strategy.Start();
class TestOnceFailed : Strategy
{
private TimeSpan _waitingPeriod;
private Order _order;
private decimal _priceOfTask;
public TestOnceFailed(decimal priceOfOrder)
{
_priceOfTask = priceOfOrder;
_waitingPeriod = new TimeSpan(0, 0, 15);
}
protected override void OnStarting()
{
base.OnStarting();
((QuikTrader)Trader).IsAsyncMode = false;
RegisterTestOrder();
}
private void RegisterTestOrder()
{
_order = new Order
{
Portfolio = this.Portfolio,
Volume = 1,
Price = _priceOfTask - 300,
Security = this.Security,
Direction = OrderDirections.Buy,
};
this.When(_order.CancelFailed())
.Do(OnCancelFailed)
.Once();
CreateRuleWaiting();
RegisterOrder(_order);
CancelOrder();
}
private void OnCancelFailed(OrderFail orderFail)
{
string message = orderFail.Error.Message;
WriteDiagnostics("OnCancelFailed " + message + " " + orderFail.Order.TransactionId.ToString());
}
private StrategyRule CreateRuleWaiting()
{
StrategyRule rule = this.When(() => true, _waitingPeriod)
.Do(() => CancelOrder());
return rule;
}
public void CancelOrder()
{
WriteDiagnostics("CancelOrder");
try{
Trader.CancelOrder(_order);
}
catch(Exception ex) {
WriteDiagnostics("CancelOrder " + ex.Message);
}
}
protected void WriteDiagnostics(string message)
{
LogMessage logMessage = new LogMessage(this, DateTime.Now, ErrorTypes.None, message);
AddLog(logMessage);
string markInfo = this.Name.PadRight(5) + this.Security.Code.PadRight(5) + DateTime.Now.ToString() + " " + message;
System.Diagnostics.Debug.WriteLine(markInfo);
}
}
|
Автор топика
|
|