IvanV8:
Коллеги, помогите
добавляю правило при регистрации ордера.
вот кусок кода
var order = new Order
{
Type = OrderTypes.Limit,
ExpiryDate = now + new TimeSpan(1, 0, 0, 0), // срок ордера - день
Trader = _trader,
Portfolio = portfolio,
Security = security,
Volume = quantaty,
Price = selected_p.securities[i].order_price,
Direction = d
};
//регистрируем ордер
var ruleRegisterFailed = order.WhenRegisterFailed();
ruleRegisterFailed
.Do(() => System.Windows.Forms.MessageBox.Show( string.Format("ОТКАЗ выставления заявки: {0} инструмент={1}, количество={2}, цена={3} !!!!",
order.Direction.ToString(), order.Security.Code, order.Volume, order.Price), "Ошибка регистрации", MessageBoxButtons.OK, MessageBoxIcon.Error))
.Once()
.Apply();
_trader.RegisterOrder(order);
>
> MessageBox не срабатывает. Также не срабатывает никакое другое действие, например вывод сообщения в окно RichTextBox
> В чем причина?
> Код вызывается в процедуре, в отдельной форме
В вашем случае вы в лямбде потеряли параметр, который будет передан в выражение:
```csharp
.Do(() => {})
Должно быть например так:
.Do((orderFail) => {})
.Do(orderFail => System.Windows.Forms.MessageBox.Show(string.Format("ОТКАЗ выставления заявки: {0} инструмент={1}, количество={2}, цена={3} !!!!", orderFail.Order.Direction.ToString(), orderFail.Order.Security.Code, orderFail.Order.Volume, orderFail.Order.Price), "Ошибка регистрации", MessageBoxButtons.OK, MessageBoxIcon.Error))
И лучше вынести обработчик в отдельный именованный метод, для наглядности.
Вместо стандартного построения MessageBox можно использовать MessageBoxBuilder, который находится в Ecng.Xaml.dll.
Вместо string.Format можно использовать методы-расширения Put() или PutEx() класса StringHelper, находится в Ecng.Common.dll.
В итоге получаем следующее:
var order = new Order
{
Type = OrderTypes.Limit,
ExpiryDate = now + new TimeSpan(1, 0, 0, 0), // срок ордера - день
Trader = _trader,
Portfolio = portfolio,
Security = security,
Volume = quantaty,
Price = selected_p.securities[i].order_price,
Direction = d
};
//регистрируем ордер
var ruleRegisterFailed = order.WhenRegisterFailed();
ruleRegisterFailed
.Do(RegisterFail)
.Once()
.Apply();
_trader.RegisterOrder(order);
private void RegisterFail(OrderFail orderFail)
{
new MessageBoxBuilder()
.Caption("Ошибка регистрации")
.Text("ОТКАЗ выставления заявки: {Order.Direction} инструмент={Order.Security.Code}, количество={Order.Volume}, цена={Order.Price} !!!!".PutEx(orderFail))
.Owner(this)
.Error()
.Show();
}
Если ruleRegisterFailed дальше в коде нигде не планируется использовать, то можно сократить
var ruleRegisterFailed = order.WhenRegisterFailed();
ruleRegisterFailed
.Do(RegisterFail)
.Once()
.Apply();
до:
order
.WhenRegisterFailed()
.Do(RegisterFail)
.Once()
.Apply();
P.S.: Использовать MessageBox не самое удачное решение.
Вместо это лучше использовать какой либо другой контрол для визуального мониторинга.
Monitor
MonitorWindow
LogControl
Посмотреть как с ними работать можно или в примерах, или в справке - Логирование.