﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.ru/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.ru/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Не срабатывает правило при регистрации заявки</title>
  <id>~/topic/3323/ne-srabatyvaet-pravilo-pri-registratsii-zayavki/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-06-20T22:10:55Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=topic&amp;id=3323" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/posts/m/23630/</id>
    <title type="text">IvanV8: Коллеги, помогите добавляю правило при регистрации ордера. вот кусок кода var order = new Or...</title>
    <published>2013-01-28T05:22:39Z</published>
    <updated>2013-01-28T05:22:39Z</updated>
    <author>
      <name>Moadip</name>
      <uri>https://stocksharp.ru/users/5973/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(23627)" rel="nofollow" target="_blank"&gt;IvanV8&lt;/a&gt;:&lt;/strong&gt;
Коллеги, помогите
добавляю правило при регистрации ордера.
вот кусок кода&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;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(() =&amp;gt; System.Windows.Forms.MessageBox.Show( string.Format(&amp;quot;ОТКАЗ выставления  заявки: {0} инструмент={1},  количество={2}, цена={3} !!!!&amp;quot;,
order.Direction.ToString(), order.Security.Code, order.Volume, order.Price), &amp;quot;Ошибка регистрации&amp;quot;, MessageBoxButtons.OK, MessageBoxIcon.Error))
.Once()
.Apply();
_trader.RegisterOrder(order);&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 
&amp;gt; MessageBox не срабатывает. Также не срабатывает никакое другое действие, например вывод сообщения в окно RichTextBox
&amp;gt; В чем причина?
&amp;gt; Код вызывается в процедуре, в отдельной форме

В вашем случае вы в лямбде потеряли параметр, который будет передан в выражение:
```csharp

.Do(() =&amp;gt; {})

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Должно быть например так:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
.Do((orderFail) =&amp;gt; {})

&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;.Do(orderFail =&amp;gt; System.Windows.Forms.MessageBox.Show(string.Format(&amp;quot;ОТКАЗ выставления  заявки: {0} инструмент={1},  количество={2}, цена={3} !!!!&amp;quot;, orderFail.Order.Direction.ToString(), orderFail.Order.Security.Code, orderFail.Order.Volume, orderFail.Order.Price), &amp;quot;Ошибка регистрации&amp;quot;, MessageBoxButtons.OK, MessageBoxIcon.Error))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;И лучше вынести обработчик в отдельный именованный метод, для наглядности.
Вместо стандартного построения &lt;strong&gt;MessageBox&lt;/strong&gt; можно использовать &lt;strong&gt;MessageBoxBuilder&lt;/strong&gt;, который находится в &lt;strong&gt;Ecng.Xaml.dll&lt;/strong&gt;.
Вместо &lt;strong&gt;string.Format&lt;/strong&gt; можно использовать методы-расширения &lt;strong&gt;Put()&lt;/strong&gt; или &lt;strong&gt;PutEx()&lt;/strong&gt; класса &lt;strong&gt;StringHelper&lt;/strong&gt;, находится в &lt;strong&gt;Ecng.Common.dll&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;В итоге получаем следующее:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
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(&amp;quot;Ошибка регистрации&amp;quot;)
			.Text(&amp;quot;ОТКАЗ выставления  заявки: {Order.Direction} инструмент={Order.Security.Code},  количество={Order.Volume}, цена={Order.Price} !!!!&amp;quot;.PutEx(orderFail))
			.Owner(this)
			.Error()
			.Show();
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Если &lt;strong&gt;ruleRegisterFailed&lt;/strong&gt; дальше в коде нигде не планируется использовать, то можно сократить&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
  var ruleRegisterFailed = order.WhenRegisterFailed();
  ruleRegisterFailed
                    .Do(RegisterFail)
                    .Once() 
                    .Apply(); 

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;до:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
order
	.WhenRegisterFailed()
	.Do(RegisterFail)
	.Once()
	.Apply();

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;P.S.: Использовать &lt;strong&gt;MessageBox&lt;/strong&gt; не самое удачное решение.
Вместо это лучше использовать какой либо другой контрол для визуального мониторинга.
&lt;a href="http://www.stocksharp.com/doc/html/T_StockSharp_Xaml_Monitor.htm"&gt;Monitor&lt;/a&gt;
&lt;a href="http://www.stocksharp.com/doc/html/T_StockSharp_Xaml_MonitorWindow.htm"&gt;MonitorWindow&lt;/a&gt;
&lt;a href="http://www.stocksharp.com/doc/html/T_StockSharp_Xaml_LogControl.htm"&gt;LogControl&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Посмотреть как с ними работать можно или в примерах, или в справке - &lt;a href="http://www.stocksharp.com/doc/html/82437493-cd53-41eb-b756-d913af0f4f8e.htm"&gt;&lt;strong&gt;Логирование&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/23629/</id>
    <title type="text">.Apply(this); Если я верно помню нонешний синтаксис. </title>
    <published>2013-01-28T03:33:17Z</published>
    <updated>2013-01-28T03:33:17Z</updated>
    <author>
      <name>ra81</name>
      <uri>https://stocksharp.ru/users/16581/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;pre&gt;&lt;code class="language-csharp"&gt;.Apply(this);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Если я верно помню нонешний синтаксис.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/23628/</id>
    <title type="text">Обработчики событий в c# назначаются по-другому. </title>
    <published>2013-01-27T19:36:31Z</published>
    <updated>2013-01-27T19:36:31Z</updated>
    <author>
      <name>VassilSanych</name>
      <uri>https://stocksharp.ru/users/6491/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;p&gt;Обработчики событий в c# назначаются по-другому.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/23627/</id>
    <title type="text">Коллеги, помогите добавляю правило при регистрации ордера. вот кусок кода var order = new Order { Ty...</title>
    <published>2013-01-27T18:55:18Z</published>
    <updated>2013-01-27T18:55:18Z</updated>
    <author>
      <name>IvanV8</name>
      <uri>https://stocksharp.ru/users/6450/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;p&gt;Коллеги, помогите
добавляю правило при регистрации ордера.
вот кусок кода&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
 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(() =&amp;gt; System.Windows.Forms.MessageBox.Show( string.Format(&amp;quot;ОТКАЗ выставления  заявки: {0} инструмент={1},  количество={2}, цена={3} !!!!&amp;quot;,
                    order.Direction.ToString(), order.Security.Code, order.Volume, order.Price), &amp;quot;Ошибка регистрации&amp;quot;, MessageBoxButtons.OK, MessageBoxIcon.Error))
                    .Once() 
                    .Apply(); 
  _trader.RegisterOrder(order);


&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MessageBox не срабатывает. Также не срабатывает никакое другое действие, например вывод сообщения в окно RichTextBox
В чем причина?
Код вызывается в процедуре, в отдельной форме&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>