← Zurück

Не срабатывает правило при регистрации заявки

Коллеги, помогите добавляю правило при регистрации ордера. вот кусок кода


 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 В чем причина? Код вызывается в процедуре, в отдельной форме

War dieses Thema hilfreich?

Thema teilen

Kommentare (3)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

VassilSanych
VassilSanych

Обработчики событий в c# назначаются по-другому.

ra81
ra81
.Apply(this);

Если я верно помню нонешний синтаксис.

Moadip
Moadip

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

Посмотреть как с ними работать можно или в примерах, или в справке - Логирование.