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


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

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

Теги:


Спасибо:




3 Ответов
VassilSanych

Фотография
Дата: 27.01.2013
Ответить


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

ra81

Фотография
Дата: 28.01.2013
Ответить


Код
.Apply(this);

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

Moadip

Фотография
Автор статей Программист
Дата: 28.01.2013
Ответить


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


В вашем случае вы в лямбде потеряли параметр, который будет передан в выражение:
Код

.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

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


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy