﻿<?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">Cобытия по изменению состояния ордеров приходят только в режиме эмуляции</title>
  <id>~/topic/3414/cobytiya-po-izmeneniyu-sostoyaniya-orderov-prihodyat-tolko-v-rezhime-ehmulyatsii/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-06-15T18:38:04Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=topic&amp;id=3414" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/posts/m/24167/</id>
    <title type="text">Несколько замечаний по коду. Если оставляю #define EMULATOR сделки совершаются и событие стратегии O...</title>
    <published>2013-02-22T14:42:05Z</published>
    <updated>2016-08-16T00:12:02Z</updated>
    <author>
      <name>Moadip</name>
      <uri>https://stocksharp.ru/users/5973/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;p&gt;Несколько замечаний по коду.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Если оставляю #define EMULATOR сделки совершаются и событие стратегии OrderChanged срабатывает в лог попадает сообщение &amp;quot;состояние ордера изменилось&amp;quot;.
Если на реальном Quik (снят комментарий с
#undef EMULATOR) то сделки совершаются но событие OrderChanged не срабатывает.
Как то сложно, да и лениво каждый раз комментить/раскомментить директивы препроцессора.
Объявите поле _trader типа ITrader.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
private ITrader _trader;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Добавьте на форму ComboBox с двумя Item. Что нибудь типа:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
&amp;lt;ComboBox Name=&amp;quot;cmbTrader&amp;quot; &amp;gt;
	&amp;lt;ComboBoxItem Content=&amp;quot;Эмуляция&amp;quot; /&amp;gt;
	&amp;lt;ComboBoxItem Content=&amp;quot;Реал&amp;quot; /&amp;gt;
&amp;lt;/ComboBox&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;И потом в коде, в зависимости от того что выбранно создавать или QuikTrader или RTET&lt;QuikTrader&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
//Выбор шлюза
switch (cmbTrader.SelectedIndex)
{
	case 0:
		_trader= new RealTimeEmulationTrader&amp;lt;QuikTrader&amp;gt;(new QuikTrader(QuikTerminal.GetDefaultPath()));
		break;

	case 1:
		_trader = new QuikTrader(QuikTerminal.GetDefaultPath())
		break;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Рекомендую прочитать &lt;a href="http://stocksharp.com/forum/360/Sozdaniie-robotov-s-pomoshch-iu-S---Vviedieniie/"&gt;серию статей&lt;/a&gt; от &lt;strong&gt;FinDirector&lt;/strong&gt;, почерпнете для себя много интересного.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
_trader = new QuikTrader(QuikTerminal.GetDefaultPath()){ IsAsyncMode = true, SupportManualOrders = false };
_trader.IsAsyncMode = true;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;В инициализаторе уже задано значение св-ва IsAsyncMode, нет смысла делать это еще раз.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
 Status.Text = &amp;quot;Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.&amp;quot; + System.Convert.ToString(trade.Id) + System.Convert.ToString(trade.Price) +
 System.Convert.ToString(trade.Security.Code) + System.Convert.ToString(trade.Volume) + System.Convert.ToString(trade.Time);

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Можно заменить на&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
Status.Text = &amp;quot;Сделка {Id} по цене {Price} по бумаге {Security.Code} по объему {Volume} в {Time}.&amp;quot;.PutEx(trade)

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Запуск/остановка экспорта&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
        private void StartDde()
        {
            _trader.StartExport();
            _isDdeStarted = true;
        }
 
        private void StopDde()
        {
            _trader.StopExport();
            _isDdeStarted = false;
        }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Если на экспорт запускаются все таблицы StartExport(), то нет смысла потом перечислять какие именно надо таблицы остановить.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
                //ниже две сторчки для работы на эмуляторе
                    _trader.UnderlyingTrader.StopExport(new[] { _trader.UnderlyingTrader.SecuritiesTable, _trader.UnderlyingTrader.MyTradesTable, _trader.UnderlyingTrader.EquityPositionsTable,
                        _trader.UnderlyingTrader.EquityPortfoliosTable, _trader.UnderlyingTrader.OrdersTable });
                 #else
                    _trader.StopExport(new[] { _trader.SecuritiesTable, _trader.MyTradesTable, _trader.EquityPositionsTable,
                        _trader.EquityPortfoliosTable, _trader.OrdersTable });
                #endif

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Проще вызвать StopDde() или напрямую _trader.StopExport();&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
 
 
            base.OnClosing(e);
            if (_trader != null)
            {
                //_candleManager.Stop(_series);  //????????
                _trader.UnRegisterMarketDepth(_strategy.Security);
                _strategy.Stop();
                Status.Text = &amp;quot;Стоп&amp;quot;;
                // останавливаем экспорт по DDE
                #if EMULATOR
                //ниже две сторчки для работы на эмуляторе
                    _trader.UnderlyingTrader.StopExport(new[] { _trader.UnderlyingTrader.SecuritiesTable, _trader.UnderlyingTrader.MyTradesTable, _trader.UnderlyingTrader.EquityPositionsTable,
                        _trader.UnderlyingTrader.EquityPortfoliosTable, _trader.UnderlyingTrader.OrdersTable });
                 #else
                    _trader.StopExport(new[] { _trader.SecuritiesTable, _trader.MyTradesTable, _trader.EquityPositionsTable,
                        _trader.EquityPortfoliosTable, _trader.OrdersTable });
                #endif
 
                if (_trader.IsConnected) _trader.Disconnect();
                //_trader.Dispose();
 
                CfgFile.WriteParam(&amp;quot;Portfolio&amp;quot;, Portfolios.SelectedItem.ToString());
                CfgFile.WriteParam(&amp;quot;Security&amp;quot;, Securities1.SelectedItem.ToString());
 
            }
            base.OnClosing(e);
        }

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Дублируется base.OnClosing(e); Не смертельно, но все же.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
            //это надо для того чтобы на фьючах рабтали заявки по рынку.
            this.Security.MaxPrice = 1000000;
            this.Security.MinPrice = 0;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Сначала подумал что в этом причина почему не срабатывает событие NewMyTrade, т.к. не совершается сделка.
По идее не должно работать. Должно прийти сообщение об ошибке, что то типа цена ордера вне диапазона.
Чтобы были цены планок лучше добавить соответствующие колонки в квик таблице &amp;quot;Инструменты&amp;quot; и потом добавить их в коде. &lt;a href="http://" rel="nofollow" target="_blank"&gt;Экспорт доп. колонок&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Потом увидел что ценник выставляется по другому&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;_price = Security.BestBid.Price - Security.MinStepSize;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;И методы BuyAtmarket и SellAtMarket не используются.
Да и вы пишете что сделки совершаются.&lt;/p&gt;
&lt;p&gt;Тогда не понятно в чем может быть причина.&lt;/p&gt;
&lt;p&gt;Попробуйте максимально упростить код, чтобы проверить отрабатывает ли событие NewMyTrade. Один шлюз, минимум кода в стратегии.
Попробуйте на последней сборке с codeplex, возможно причина в S#.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/24244/</id>
    <title type="text">Похоже у вас не логируются исключения фоновых потоков. Это можно делать например так: using System; ...</title>
    <published>2013-02-26T12:53:53Z</published>
    <updated>2013-02-26T12:53:53Z</updated>
    <author>
      <name>VassilSanych</name>
      <uri>https://stocksharp.ru/users/6491/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;p&gt;Похоже у вас не логируются исключения фоновых потоков.
Это можно делать например так:&lt;/p&gt;
&lt;div class="spoiler"&gt;
&lt;pre&gt;&lt;code class="language-xml"&gt;&amp;lt;Application x:Class=&amp;quot;Robot.App&amp;quot;
             xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;
             xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;
             StartupUri=&amp;quot;MainWindow.xaml&amp;quot; Startup=&amp;quot;Application_Startup_1&amp;quot;
						 DispatcherUnhandledException=&amp;quot;Application_DispatcherUnhandledException&amp;quot; Exit=&amp;quot;Application_Exit_1&amp;quot; &amp;gt;
    &amp;lt;Application.Resources&amp;gt;
         
    &amp;lt;/Application.Resources&amp;gt;
&amp;lt;/Application&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;using System;
using System.Globalization;
using System.Security.Principal;
using System.Threading;
using System.Windows;
using System.Windows.Threading;
using Ecng.Collections;
using StockSharp.Logging;
using StockSharp.Xaml;

namespace Robot
{
	/// &amp;lt;summary&amp;gt;
	/// Interaction logic for App.xaml
	/// &amp;lt;/summary&amp;gt;
	public partial class App : ILogReceiver
	{
		private void CurrentDomain_UnhandledException
			(object sender, UnhandledExceptionEventArgs e)
		{
			var ex = (Exception) e.ExceptionObject;
			this.AddErrorLog(ex.ToString());

			if (Current == null) return;
			if (
				Current.Dispatcher.Invoke(() =&amp;gt; MessageBox.Show(
					ex.ToString(), &amp;quot;Ошибка&amp;quot;,
					MessageBoxButton.OKCancel, MessageBoxImage.Error) == MessageBoxResult.Cancel)
				)
				Current.Shutdown();
		}

		private void Application_Startup_1(object sender, StartupEventArgs e)
		{
			AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

			LogManager = new LogManager();
			LogManager.Sources.Add(this);

			var fileListener = new FileLogListener(
				string.Format(CultureInfo.InvariantCulture, &amp;quot;{0:yyyyMMdd}.txt&amp;quot;, DateTime.Today));
			fileListener.Append = true;
			LogManager.Listeners.Add(fileListener);

			this.AddInfoLog(&amp;quot;Запуск UI робота&amp;quot;);

			//if (!string.IsNullOrEmpty(Settings.GoogleLogin))
			//{
			//		var smsListener = new SmsLogListener(Settings.GoogleLogin, Settings.GooglePassword);
			//		smsListener.Filters.Add(LogListener.AllErrorFilter);
			//		LogManager.Listeners.Add(smsListener);
			//}


			//Monitor = new MonitorWindow();
			//Monitor.Show();
			//LogManager.Listeners.Add(new GuiLogListener(Monitor));

			CheckAdministrator();

		}

		public static LogManager LogManager { get; private set; }
		public static MonitorWindow Monitor { get; private set; }


		private void Application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
		{
			var ex = e.Exception;
			this.AddErrorLog(ex.ToString());
			e.Handled = true;

			if (Current == null) return;
			if (
				Current.Dispatcher.Invoke(() =&amp;gt; MessageBox.Show(
					ex.ToString(), &amp;quot;Ошибка&amp;quot;,
					MessageBoxButton.OKCancel, MessageBoxImage.Error) == MessageBoxResult.Cancel)
				)
				Current.Shutdown();
		}

		#region ILogReceiver

		public DateTime CurrentTime
		{
			get { return LoggingHelper.Now; }
		}

		public INotifyList&amp;lt;ILogSource&amp;gt; Childs
		{
			get { return null; }
		}

		private readonly Guid _id = Guid.NewGuid();

		public Guid Id
		{
			get { return _id; }
		}

		public event Action&amp;lt;LogMessage&amp;gt; Log;

		public string Name
		{
			get { return ToString(); }
		}

		public ILogSource Parent
		{
			get { return null; }
		}

		public LogLevels LogLevel
		{
			get { return LogLevels.Debug; }
			set { }
		}

		public void Dispose()
		{
		}

		private void RaiseLog(LogMessage logMessage)
		{
			if (Log != null)
				Log(logMessage);
		}

		public void AddLog(LogMessage logMessage)
		{
			RaiseLog(logMessage);
		}

		#endregion

		private void CheckAdministrator()
		{
			var identity = WindowsIdentity.GetCurrent();
			if (identity == null) throw new InvalidOperationException(&amp;quot;Couldn't get the current user identity&amp;quot;);
			var principal = new WindowsPrincipal(identity);

			// Check if this user has the Administrator role. If they do, return immediately.
			// If UAC is on, and the process is not elevated, then this will actually return false.
			var isBuiltInAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);

			if (!isBuiltInAdmin)
			{
				var exMessage = &amp;quot;Робот запущен не под Администратором&amp;quot;;
				this.AddErrorLog(exMessage);
				MessageBox.Show(
					exMessage, &amp;quot;Ошибка&amp;quot;,
					MessageBoxButton.OK, MessageBoxImage.Error);
				Shutdown();
			}
		}

		private void Application_Exit_1(object sender, ExitEventArgs e)
		{
			this.AddInfoLog(&amp;quot;Выключение UI робота&amp;quot;);
			Thread.Sleep(500);
		}
	}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/24239/</id>
    <title type="text">Понял, сам дурак. Просто давно завис в облигациях РБК. Валяются в портфеле. А в таблицах (сделок, за...</title>
    <published>2013-02-26T11:19:47Z</published>
    <updated>2013-02-26T11:48:33Z</updated>
    <author>
      <name>kahuna</name>
      <uri>https://stocksharp.ru/users/16705/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&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/24240/</id>
    <title type="text">Включил фильтр на таблицу позиции по бумагам. Оставил одни фьючи. Ура. Все заработало. События на ко...</title>
    <published>2013-02-26T11:47:49Z</published>
    <updated>2013-02-26T11:47:49Z</updated>
    <author>
      <name>kahuna</name>
      <uri>https://stocksharp.ru/users/16705/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&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/24237/</id>
    <title type="text">Может это как то проясняет дело. Простейший код в котором просто соединение с Quik выдает страную ош...</title>
    <published>2013-02-26T10:50:01Z</published>
    <updated>2013-02-26T10:50:01Z</updated>
    <author>
      <name>kahuna</name>
      <uri>https://stocksharp.ru/users/16705/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;p&gt;Может это как то проясняет дело. Простейший код в котором просто соединение с Quik
выдает страную ошибку про какой-то инструмент[blink]&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Diagnostics;
using MessageBox = System.Windows.MessageBox;
using System.Threading;
using System.Linq;
using System.Xml;
using Ecng.Common;
using Ecng.Collections;
using Ecng.Xaml;
using Ecng.ComponentModel;

using StockSharp.BusinessEntities;
using StockSharp.Algo.Reporting;
using StockSharp.Quik;
using StockSharp.Algo;
using StockSharp.Xaml;
using StockSharp.Logging;
using StockSharp.Algo.Testing;

namespace test
{
    /// &amp;lt;summary&amp;gt;
    /// Логика взаимодействия для MainWindow.xaml
    /// &amp;lt;/summary&amp;gt;

    public partial class MainWindow : Window
   {
        private QuikTrader _trader;
        private LogManager _logManager;

        public MainWindow()
        {
            InitializeComponent();

            _logManager = new LogManager();
            var fileListener = new FileLogListener(&amp;quot;{0}_{1:00}_{2:00}.txt&amp;quot;.Put(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day));
            _logManager.Listeners.Add(fileListener);

            _trader = new QuikTrader(QuikTerminal.GetDefaultPath()){ IsAsyncMode = true, SupportManualOrders = false };

            _trader.LogLevel = LogLevels.Debug;
            _logManager.Sources.Add(_trader);

                    _trader.Connected += () =&amp;gt;
                     {
                         _trader.AddDebugLog(&amp;quot;Соединились&amp;quot;);
                     };

                    _trader.Connect();
                    

                    while (!_trader.IsConnected) { }
                    _trader.StartExport();
  
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ошибка в лог валится такая:&lt;em&gt;2013/02/26 14:43:51.544|Debug  |QuikTrader|Соединились
2013/02/26 14:43:53.367|Error  |QuikTrader|System.InvalidOperationException: Инструмент с кодом RU000A0JPWC3 для бумажной позиции не найден.
в StockSharp.Quik.QuikTrader.#=qjrOBFov$lIae$ZMCQLx7P1fQAe2X2s16$DxZRnv$aqU=.#=qjGe1xZF5fvarq_$jrR3XCQ==(IList&lt;code&gt;1 #=qKG6nGjj9uhl1Ndb5IDukAw==, Func&lt;/code&gt;2 #=qdrbWxV4uORvFCQd5d$c6og==)
в #=qU8C8kAMUmJ0kPIeEJrF68f3NMymXDukMNgL4Dc7ffmr7PRgVzknJ3atY_n0PucT4.#=qB09_IBYvsxLb_dLzMi2NWQ==(DdeTable #=qOgXoydWCvsq2gXlddKoo0w==, IList&lt;code&gt;1 #=qMeYWUEb44NrXcAvbPuNfiQ==, Action&lt;/code&gt;2 #=qolGBgTssErk3vXo538xxsQ==, Action`1 #=qIfmNdbFGgLtG9ybpXuosbQ==, Boolean #=qe3W9$GyIKMHUi59wvLuQeA==)
2013/02/26 14:43:53.441|       |QuikTrader|Экспорт запущен.&lt;/em&gt;
Мистика. [cursing]&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/24213/</id>
    <title type="text">VassilSanych: kahuna: И следующий код никогда не исполняется (то что внутри цикла foreach) хотя орде...</title>
    <published>2013-02-25T10:36:13Z</published>
    <updated>2013-02-25T10:36:13Z</updated>
    <author>
      <name>kahuna</name>
      <uri>https://stocksharp.ru/users/16705/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(24171)" rel="nofollow" target="_blank"&gt;VassilSanych&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(24158)" rel="nofollow" target="_blank"&gt;kahuna&lt;/a&gt;:&lt;/strong&gt;
И следующий код никогда не исполняется (то что внутри цикла foreach)
хотя ордера выставляются.
Попробуйте всё-таки вставить строчку логирования перед foreach.
Возможно всё-таки косяк с фильтром.
Говоря о заявке в памяти, я подразумевал, что, может быть, лучше проверять какие-нибудь скалярные свойства ордеров, а не ссылки на объекты.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;Попробовал поставил, выполнение до цикла просто не доходит. Не вызывается совсем этот обработчик события NewMyTrades.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/24171/</id>
    <title type="text">kahuna: И следующий код никогда не исполняется (то что внутри цикла foreach) хотя ордера выставляютс...</title>
    <published>2013-02-23T09:11:35Z</published>
    <updated>2013-02-23T09:11:50Z</updated>
    <author>
      <name>VassilSanych</name>
      <uri>https://stocksharp.ru/users/6491/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(24158)" rel="nofollow" target="_blank"&gt;kahuna&lt;/a&gt;:&lt;/strong&gt;
И следующий код никогда не исполняется (то что внутри цикла foreach)
хотя ордера выставляются.
Попробуйте всё-таки вставить строчку логирования перед foreach.
Возможно всё-таки косяк с фильтром.
Говоря о заявке в памяти, я подразумевал, что, может быть, лучше проверять какие-нибудь скалярные свойства ордеров, а не ссылки на объекты.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/24170/</id>
    <title type="text">Попробуйте максимально упростить код, чтобы проверить отрабатывает ли событие NewMyTrade. Один шлюз,...</title>
    <published>2013-02-22T19:05:59Z</published>
    <updated>2013-02-22T19:11:28Z</updated>
    <author>
      <name>kahuna</name>
      <uri>https://stocksharp.ru/users/16705/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Попробуйте максимально упростить код, чтобы проверить отрабатывает ли событие NewMyTrade. Один шлюз, минимум кода в стратегии.
Попробуйте на последней сборке с codeplex, возможно причина в S#.
Попробовл без изменения кода перейти на 4.1.8 , стало еще веселее, теперь Positions не показывается и в режиме эмулятора. То есть событие OrderChanged тоже не прилетает.
Verifier про настройку Quik говорит - все в порядке.
Упростил код. Дальше уже кажется некуда.  Картина сохранилась. [confused]
основной:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms;
using System.Drawing;
using System.Diagnostics;
using MessageBox = System.Windows.MessageBox;
using System.Threading;
using System.Linq;
using System.Xml;
using Xceed.Wpf.Toolkit;

using Ecng.Common;
using Ecng.Collections;
using Ecng.Xaml;
using Ecng.ComponentModel;

using StockSharp.BusinessEntities;
using StockSharp.Algo.Reporting;
using StockSharp.Quik;
using StockSharp.Algo;
using StockSharp.Algo.Candles;
using StockSharp.Xaml;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Indicators.Trend;
using StockSharp.Logging;
using StockSharp.Algo.Testing;

namespace test
{
    /// &amp;lt;summary&amp;gt;
    /// Логика взаимодействия для MainWindow.xaml
    /// &amp;lt;/summary&amp;gt;

    public partial class MainWindow : Window
   {




        private RealTimeEmulationTrader&amp;lt;QuikTrader&amp;gt; _trader;
        //private QuikTrader _trader;


        public static MarketDepth _depth;
        private tryStrategy _strategy;
        private MonitorWindow monitor;
        private LogManager _logManager;
        private String DefSecurity = &amp;quot;RIH3@RTS&amp;quot;;
        private String DefPortfolio = &amp;quot;SPBFUTXXXX&amp;quot;;


        public static bool tryBuy = false;
        public static bool trySell = false;



        public MainWindow()
        {

            InitializeComponent();

            monitor = new MonitorWindow();
            monitor.Show();
            _logManager = new LogManager();
            //var fileListener = new FileLogListener(&amp;quot;{0}_{1:00}_{2:00}.txt&amp;quot;.Put(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day));
            //logManager.Listeners.Add(fileListener);
            _logManager.Listeners.Add(new GuiLogListener(monitor));


        }

        private void Connect_Click(object sender, RoutedEventArgs e)
        {


            if (_trader == null || !_trader.IsConnected)
            {
                if (_trader == null)
                {
                    if (QuikTerminal.GetDefaultPath().IsEmpty())
                    {
                        MessageBox.Show(this, &amp;quot;Путь к Quik не выбран.&amp;quot;);
                        return;
                    }
                    Status.Text = &amp;quot;Connecting with Quck. Please wait&amp;quot;;

                    _trader = new RealTimeEmulationTrader&amp;lt;QuikTrader&amp;gt;(new QuikTrader(QuikTerminal.GetDefaultPath()) { IsAsyncMode = true, SupportManualOrders = false });
                     //   _trader = new QuikTrader(QuikTerminal.GetDefaultPath()){ IsAsyncMode = true, SupportManualOrders = false };


                        _trader.Connected += () =&amp;gt;
                         {

                             // подписываемся на событие появление инструментов
                             _trader.NewSecurities += securities =&amp;gt; this.GuiAsync(() =&amp;gt;
                             {
                                 Securities1.ItemsSource = _trader.Securities;

                                 int i = 0;
                                 foreach (Object item in Securities1.Items)
                                 {
                                     Securities1.SelectedIndex = i;
                                     if (item.ToString().Equals(DefSecurity))
                                     {
                                         break;
                                     }
                                     i++;
                                 }
                                 // если инструмент и стакан уже появились 
                                 if (Securities1.SelectedItem != null)
                                 {
                                    Status.Text = &amp;quot;Инструмент появился.&amp;quot;;
                                 }

                             });
                             _trader.NewPortfolios += portfolios =&amp;gt; this.GuiAsync(() =&amp;gt;
                             {
                                 Portfolios.ItemsSource = _trader.Portfolios;

                                 int i = 0;
                                 foreach (Object item in Portfolios.Items)
                                 {
                                     Portfolios.SelectedIndex = i;
                                     if (item.ToString().Equals(DefPortfolio))
                                     {
                                         break;
                                     }
                                     i++;
                                 }
                             });


                             // подписываемся на событие появления моих новых сделок
                             _trader.NewMyTrades += myTrades =&amp;gt; this.GuiAsync(() =&amp;gt;
                             {
                                 if (_strategy != null)
                                 {
                                     // найти те сделки, которые совершила стратегия 
                                     //myTrades = myTrades.Where(t =&amp;gt; _strategy.Orders.Any(o =&amp;gt; o == t.Order));
                                     myTrades = myTrades.Where(t =&amp;gt; _trader.Orders.Any(o =&amp;gt; o == t.Order));
                                 }
                                 foreach (var myTrade in myTrades)
                                 {
                                    var trade = myTrade.Trade;
                                    Status.Text = &amp;quot;Сделка {Id} по цене {Price} по бумаге {Security.Code} по объему {Volume} в {Time}.&amp;quot;.PutEx(trade);
                                 }
                             });
                             

                             // подписываемся на событие обновления стакана
                             _trader.MarketDepthsChanged += depths =&amp;gt; this.GuiAsync(() =&amp;gt;
                             {
                                 if (_depth == null &amp;amp;&amp;amp; DefSecurity != null)
                                 {
                                     _depth = depths.FirstOrDefault(d =&amp;gt; d.Security.Equals( (Security) this.Securities1.SelectedItem ));
                                     while (_depth == null) ;
                                         Status.Text = &amp;quot;Стакан появился.&amp;quot;;
                                 }
                             });


                         };//КОНЕЦ _trader.Conected

                    _trader.ConnectionError += ex =&amp;gt;
                            {
                                if (ex != null)
                                    this.GuiAsync(() =&amp;gt; MessageBox.Show(this, ex.ToString()));
                            };

                    this.GuiAsync(() =&amp;gt;
                            {
                                Connect.IsEnabled = false;
                                Report.IsEnabled = true;
                            });

                    // подписываемся на событие о неудачной регистрации заявок 
                    this._trader.OrdersRegisterFailed += OrdersFailed;
                    // подписываемся на событие о неудачном снятии заявок 
                    this._trader.OrdersCancelFailed += OrdersFailed;

                    // подписываемся на событие о неудачной регистрации стоп-заявок 
                    this._trader.StopOrdersRegisterFailed += OrdersFailed;
                    // подписываемся на событие о неудачном снятии стоп-заявок 
                    this._trader.StopOrdersCancelFailed += OrdersFailed;

                    // запускаем экспорт по DDE
                    _trader.Connect();
                    

                    while (!_trader.IsConnected) { }
                    Status.Text = &amp;quot;Connected with Quik terminal&amp;quot;;
                    StartDde();

                    #if EMULATOR
                        _trader.UnderlyingTrader.LogLevel = LogLevels.Debug;
                        _logManager.Sources.Add(_trader.UnderlyingTrader);
                    #else
                        _trader.LogLevel = LogLevels.Debug;
                        _logManager.Sources.Add(_trader);
                    #endif
                }
                else
                    _trader.Disconnect();
            }
        }

        private void OrdersFailed(IEnumerable&amp;lt;OrderFail&amp;gt; fails)
        {
            this.GuiAsync(() =&amp;gt;
            {
                foreach (var fail in fails)
                    MessageBox.Show(this, fail.Error.ToString(), &amp;quot;Ошибка регистрации заявки&amp;quot;);
            });
        }

        private void StartDde()
		{
			_trader.StartExport();
   		}

	private void StopDde()
		{
			_trader.StopExport();
		}

        private void OnStrategyPropertyChanged(object sender, PropertyChangedEventArgs e)
		{
            _trader.AddInfoLog(&amp;quot;OnStrategyPropertyChanged&amp;quot;);
			this.GuiAsync(() =&amp;gt;
			{
				//Status.Content = _strategy.ProcessState;
                Status.Text = _strategy.ProcessState.ToString();
                PnL.Content = _strategy.PnLManager.PnL;
                Slippage.Content = _strategy.SlippageManager.Slippage;
				Position.Content = _strategy.PositionManager.Position;
                Latency.Content = _strategy.Latency;
			});
		}


        private void SwitchOn_Click(object sender, RoutedEventArgs e)
        {

            if (_strategy == null )
            {

                // создаем торговую стратегию, 
                _strategy = new tryStrategy()
                {
                    Volume = 1,     
                    Security = (Security)this.Securities1.SelectedItem,
                    Portfolio = (Portfolio)this.Portfolios.SelectedItem,
                    Trader = _trader
                };
                _strategy.PropertyChanged += OnStrategyPropertyChanged;
                _logManager.Sources.Add(_strategy);



                if (_strategy.ProcessState == ProcessStates.Stopped)
                {
                    // запускаем процесс получения стакана, необходимый для работы алгоритма котирования
                    _trader.RegisterMarketDepth((Security)this.Securities1.SelectedItem);
                    _strategy.Start();
                    Status.Text = &amp;quot;Старт&amp;quot;;
                }
                else
                {
                    _trader.UnRegisterMarketDepth((Security)this.Securities1.SelectedItem);
                    _strategy.Stop();
                    Status.Text = &amp;quot;Стоп&amp;quot;;
                }
            }
        }

        

        private void Report_Click(object sender, RoutedEventArgs e)
        {
            
            // сгерерировать отчет по прошедшему тестированию
			new ExcelStrategyReport(_strategy, &amp;quot;try.xls&amp;quot;).Generate();

			// открыть отчет
			Process.Start(&amp;quot;try.xls&amp;quot;);
        }



        private void button2_Click(object sender, RoutedEventArgs e)
        {
            tryBuy = true;
            trySell = false;

        }

        private void button3_Click(object sender, RoutedEventArgs e)
        {
            tryBuy = false;
            trySell = true;           
        }

        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {


            if (_trader != null)
            {
                _trader.UnRegisterMarketDepth(_strategy.Security);
                _strategy.Stop();
                Status.Text = &amp;quot;Стоп&amp;quot;;
                // останавливаем экспорт по DDE
                StopDde();

                if (_trader.IsConnected) _trader.Disconnect();
                //_trader.Dispose();

            }
            base.OnClosing(e);
        }

    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;для стратегии:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using Ecng.Collections;
using Ecng.Common;
using StockSharp.Algo;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Indicators.Trend;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Logging;
using StockSharp.Quik;





namespace test
{


        /// &amp;lt;summary&amp;gt; 
        /// Стратегия для проверки работы коннектора. Ручной запуск трейдов по состоянию cтатических 
        /// переменных базового окна tryBuy или trySell, там они меняются кнопками.
        /// &amp;lt;/summary&amp;gt; 
    public class tryStrategy :  Strategy //
        {
        private Order myOrder;

        public tryStrategy() { }

		protected override void OnStarted()
		{

            Security
                .WhenChanged()
                .Do(TryMakeTrade).Apply(this); //когда меняется цена по инструменту проверяем &amp;quot;не выставить ли ордер&amp;quot;
            
            //следующие события должны бы выполняться но не выполняются с чем и боремся
            this.WhenNewMyTrades().Do(OnNewOrderTrades).Apply(this);
            this.WhenOrderChanged().Do( ()=&amp;gt;
                { 
                    this.write(&amp;quot;состояние ордера изменилось&amp;quot;);
                }).Apply(this);
            this.WhenError().Do(() =&amp;gt;
            {
                this.write(&amp;quot;прилетела ошибка&amp;quot;);
            }).Apply(this);

            this.WhenOrderRegistered().Do(() =&amp;gt;
            {
                this.write(&amp;quot;зарегистрирован ордер&amp;quot;);
            }).Apply(this);

            this.WhenPnLChanged().Do(() =&amp;gt;
            {
                this.write(&amp;quot;профит.лосс сменился&amp;quot;);
            }).Apply(this);
            this.WhenWarning().Do(() =&amp;gt;
            {
                this.write(&amp;quot;желтая карточка&amp;quot;);
            }).Apply(this);

			base.OnStarted();
		}



         /// &amp;lt;summary&amp;gt;
        /// проверяем условия и пытаемся выполнить трейд
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;candle&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
        private void TryMakeTrade()
        {

            // если наша стратегия в процессе остановки
            if (ProcessState == ProcessStates.Stopping)
            {
                // отменяем активные заявки
                CancelActiveOrders();
                return;
            }


            if (test.MainWindow._depth != null) //стакан работает?
            {

                if ( test.MainWindow.tryBuy )
                {
                    this.write(&amp;quot;buy Volume=&amp;quot; + Volume.ToString());
                    decimal _price = Security.BestAsk.Price + Security.MinStepSize;
                    myOrder = this.CreateOrder(OrderDirections.Buy, _price, Volume);
                    RegisterOrder(myOrder);
                    test.MainWindow.tryBuy = false;
                }
                if (test.MainWindow.trySell)
                {
                    this.write(&amp;quot;sell Volume=&amp;quot; + Volume.ToString());
                    decimal _price = Security.BestBid.Price - Security.MinStepSize;
                    myOrder = this.CreateOrder(OrderDirections.Sell, _price, Volume);
                    RegisterOrder(myOrder);
                    test.MainWindow.trySell = false;
                }


            } //end if __depth
        }


        private void OnNewOrderTrades(IEnumerable&amp;lt;MyTrade&amp;gt; trades)
        {
            this.write(&amp;quot;новый трейд&amp;quot;);
        }


        public void write(String mes)
        {
            LogMessage logMessage = new LogMessage(this, DateTime.Now, LogLevels.Info, mes);
            RaiseLog(logMessage);
        }
 
    }
}


&lt;/code&gt;&lt;/pre&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/24162/</id>
    <title type="text">Когда переключаюсь с эмулятора на реальный QuikTrader. Что подразумевается под &amp;quot;переключением&amp;quot;? Как ...</title>
    <published>2013-02-22T11:36:28Z</published>
    <updated>2013-02-22T12:10:10Z</updated>
    <author>
      <name>kahuna</name>
      <uri>https://stocksharp.ru/users/16705/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Когда переключаюсь с эмулятора на реальный QuikTrader.
Что подразумевается под &amp;quot;переключением&amp;quot;? Как вы это делаете, опишите подробнее, желательно с примером кода.
Если оставляю #define EMULATOR сделки совершаются и событие стратегии OrderChanged срабатывает в лог попадает сообщение &amp;quot;состояние ордера изменилось&amp;quot;.&lt;br /&gt;
не показывает Status.Text = _strategy.ProcessState.ToString();
не показывает PnL.Content = _strategy.PnLManager.PnL;
не показывает Slippage.Content = _strategy.SlippageManager.Slippage;
&lt;strong&gt;показывает Position.Content = _strategy.PositionManager.Position;&lt;/strong&gt;
не показываетLatency.Content = _strategy.Latency;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Если на реальном Quik (снят комментарий с
#undef EMULATOR) то сделки совершаются но событие OrderChanged не срабатывает.
не показывает Status.Text = _strategy.ProcessState.ToString();
не показывает PnL.Content = _strategy.PnLManager.PnL;
не показывает Slippage.Content = _strategy.SlippageManager.Slippage;
не показывает Position.Content = _strategy.PositionManager.Position;
не показывает Latency.Content = _strategy.Latency;&lt;/p&gt;
&lt;p&gt;Основной код:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
#define EMULATOR
//#undef EMULATOR

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms;
using System.Drawing;
using System.Diagnostics;
using MessageBox = System.Windows.MessageBox;
using System.Threading;
using System.Linq;
using System.Xml;
using Xceed.Wpf.Toolkit;

using Ecng.Common;
using Ecng.Collections;
using Ecng.Xaml;
using Ecng.ComponentModel;

using StockSharp.BusinessEntities;
using StockSharp.Algo.Reporting;
using StockSharp.Quik;
using StockSharp.Algo;
using StockSharp.Algo.Candles;
using StockSharp.Xaml;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Indicators.Trend;
using StockSharp.Logging;
using StockSharp.Algo.Testing;

namespace tryBot1
{
    /// &amp;lt;summary&amp;gt;
    /// Логика взаимодействия для MainWindow.xaml
    /// &amp;lt;/summary&amp;gt;

    public partial class MainWindow : Window
   {


        private ConfigFile CfgFile;

#if EMULATOR
        private RealTimeEmulationTrader&amp;lt;QuikTrader&amp;gt; _trader;
#else
        private QuikTrader _trader;
#endif

        public static MarketDepth _depth;
        private tryStrategy _strategy;
        private bool _isDdeStarted;
        private MonitorWindow monitor;
        private LogManager _logManager;

        public static bool tryBuy = false;
        public static bool trySell = false;



        public MainWindow()
        {

            InitializeComponent();

            CfgFile = new ConfigFile(&amp;quot;c:\\tryBot1\\&amp;quot;,&amp;quot;config.cfg&amp;quot;);
            monitor = new MonitorWindow();
            monitor.Show();
            _logManager = new LogManager();
            //var fileListener = new FileLogListener(&amp;quot;{0}_{1:00}_{2:00}.txt&amp;quot;.Put(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day));
            //logManager.Listeners.Add(fileListener);
            _logManager.Listeners.Add(new GuiLogListener(monitor));


        }

        private void Connect_Click(object sender, RoutedEventArgs e)
        {
            //устанвавливаем элемент ComboBox на значение по умолчанию
            //прочитанное ранее из config.cnf
            String DefSecurity = CfgFile.ReadParam(&amp;quot;Security&amp;quot;);
            String DefPortfolio = CfgFile.ReadParam(&amp;quot;Portfolio&amp;quot;);
            //КОНЕЦ- устанвавливаем элемент ComboBox на значение по умолчанию
            //прочитанное ранее из config.cnf
            int i = 0;
            if (_trader == null || !_trader.IsConnected)
            {
                if (_trader == null)
                {
                    if (QuikTerminal.GetDefaultPath().IsEmpty())
                    {
                        MessageBox.Show(this, &amp;quot;Путь к Quik не выбран.&amp;quot;);
                        return;
                    }
                    Status.Text = &amp;quot;Connecting with Quck. Please wait&amp;quot;;

                    #if EMULATOR
                        _trader = new RealTimeEmulationTrader&amp;lt;QuikTrader&amp;gt;(new QuikTrader(QuikTerminal.GetDefaultPath()));
                    #else
                        _trader = new QuikTrader(QuikTerminal.GetDefaultPath()){ IsAsyncMode = true, SupportManualOrders = false };
                        _trader.IsAsyncMode = true;
                    #endif

                        _trader.Connected += () =&amp;gt;
                         {


                             _trader.NewSecurities += securities =&amp;gt; this.GuiAsync(() =&amp;gt;
                                {
                                    Securities1.ItemsSource = _trader.Securities;

                                    i = 0;
                                    foreach (Object item in Securities1.Items)
                                    {
                                        Securities1.SelectedIndex = i;
                                        if (item.ToString().Equals(DefSecurity))
                                        {
                                            break;
                                        }
                                        i++;
                                    }
                                    // если инструмент и стакан уже появились 
                                     if (Securities1.SelectedItem != null)
                                    {
                                        Status.Text = &amp;quot;Инструмент появился.&amp;quot;;

                                    }

                                });
                             _trader.NewPortfolios += portfolios =&amp;gt; this.GuiAsync(() =&amp;gt;
                                 {
                                     Portfolios.ItemsSource = _trader.Portfolios;

                                     i = 0;
                                     foreach (Object item in Portfolios.Items)
                                     {
                                         Portfolios.SelectedIndex = i;
                                         if (item.ToString().Equals(DefPortfolio))
                                         {
                                             break;
                                         }
                                         i++;
                                     }
                                 });

                             // подписываемся на событие появления моих новых сделок
                             
                             _trader.NewMyTrades += myTrades =&amp;gt; this.GuiAsync(() =&amp;gt;
                             {
                                 if (_strategy != null)
                                 {
                                     // найти те сделки, которые совершила стратегия 
                                     myTrades = myTrades.Where(t =&amp;gt; _strategy.Orders.Any(o =&amp;gt; o == t.Order));

                                     //_trades.Trades.AddRange(myTrades);
                                 }
                                 foreach (var myTrade in myTrades)
                                 {
                                     var trade = myTrade.Trade;
                                     Status.Text = &amp;quot;Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.&amp;quot; + System.Convert.ToString(trade.Id) + System.Convert.ToString(trade.Price) +
                                     System.Convert.ToString(trade.Security.Code) + System.Convert.ToString(trade.Volume) + System.Convert.ToString(trade.Time);
                                 }
                             });
                             

                             // подписываемся на событие обновления стакана
                             _trader.MarketDepthsChanged += depths =&amp;gt; this.GuiAsync(() =&amp;gt;
                             {
                                 if (_depth == null &amp;amp;&amp;amp; Securities1.SelectedItem != null)
                                 {
                                     _depth = depths.FirstOrDefault(d =&amp;gt; d.Security.Equals( (Security)Securities1.SelectedItem ));


                                     while (_depth == null) ;
                                           Status.Text = &amp;quot;Стакан появился.&amp;quot;;
                                 }
                             });


                         };//КОНЕЦ _trader.Conected

                    _trader.ConnectionError += ex =&amp;gt;
                            {
                                if (ex != null)
                                    this.GuiAsync(() =&amp;gt; MessageBox.Show(this, ex.ToString()));
                            };

                    this.GuiAsync(() =&amp;gt;
                            {
                                Connect.IsEnabled = false;
                                ExportDde.IsEnabled = true;
                                Report.IsEnabled = true;
                            });

                    // подписываемся на событие о неудачной регистрации заявок 
                    this._trader.OrdersRegisterFailed += OrdersFailed;
                    // подписываемся на событие о неудачном снятии заявок 
                    this._trader.OrdersCancelFailed += OrdersFailed;

                    // подписываемся на событие о неудачной регистрации стоп-заявок 
                    this._trader.StopOrdersRegisterFailed += OrdersFailed;
                    // подписываемся на событие о неудачном снятии стоп-заявок 
                    this._trader.StopOrdersCancelFailed += OrdersFailed;

                    // запускаем экспорт по DDE
                    _trader.Connect();

                    while (!_trader.IsConnected) { }
                    Status.Text = &amp;quot;Connected with Quik terminal&amp;quot;;
                    StartDde();

                    #if EMULATOR
                    _trader.UnderlyingTrader.LogLevel = LogLevels.Debug;
                    _logManager.Sources.Add(_trader.UnderlyingTrader);
                    #else
                      _trader.LogLevel = LogLevels.Debug;
                      _logManager.Sources.Add(_trader);
                    #endif
                }
                else
                    _trader.Disconnect();
            }
        }

        private void OrdersFailed(IEnumerable&amp;lt;OrderFail&amp;gt; fails)
        {
            this.GuiAsync(() =&amp;gt;
            {
                foreach (var fail in fails)
                    MessageBox.Show(this, fail.Error.ToString(), &amp;quot;Ошибка регистрации заявки&amp;quot;);
            });
        }

        private void StartDde()
		{
			_trader.StartExport();
			_isDdeStarted = true;
   		}

		private void StopDde()
		{
			_trader.StopExport();
			_isDdeStarted = false;
		}

        private void OnStrategyPropertyChanged(object sender, PropertyChangedEventArgs e)
		{
			this.GuiAsync(() =&amp;gt;
			{
				//Status.Content = _strategy.ProcessState;
                Status.Text = _strategy.ProcessState.ToString();
                PnL.Content = _strategy.PnLManager.PnL;
                Slippage.Content = _strategy.SlippageManager.Slippage;
				Position.Content = _strategy.PositionManager.Position;
                Latency.Content = _strategy.Latency;
			});
		}


        private void SwitchOn_Click(object sender, RoutedEventArgs e)
        {

            if (_strategy == null )
            {

                // создаем торговую стратегию, 
                _strategy = new tryStrategy()
                {
                    Volume = 1,     
                    Security = (Security)Securities1.SelectedItem,
                    Portfolio = (Portfolio)Portfolios.SelectedItem,
                    Trader = _trader
                };
                _strategy.PropertyChanged += OnStrategyPropertyChanged;
                _logManager.Sources.Add(_strategy);



                if (_strategy.ProcessState == ProcessStates.Stopped)
                {
                    // запускаем процесс получения стакана, необходимый для работы алгоритма котирования
                    _trader.RegisterMarketDepth(_strategy.Security);
                    _strategy.Start();
                    Status.Text = &amp;quot;Старт&amp;quot;;
                }
                else
                {
                    _trader.UnRegisterMarketDepth(_strategy.Security);
                    _strategy.Stop();
                    Status.Text = &amp;quot;Стоп&amp;quot;;
                }
            }
        }

        
        private void ExportDde_Click(object sender, RoutedEventArgs e)
        {
            if (_isDdeStarted)
				StopDde();
			else
				StartDde();
        }
        


        private void Report_Click(object sender, RoutedEventArgs e)
        {
            
            // сгерерировать отчет по прошедшему тестированию
			new ExcelStrategyReport(_strategy, &amp;quot;try.xls&amp;quot;).Generate();

			// открыть отчет
			Process.Start(&amp;quot;try.xls&amp;quot;);
        }



        private void button2_Click(object sender, RoutedEventArgs e)
        {
            tryBuy = true;
            trySell = false;

        }

        private void button3_Click(object sender, RoutedEventArgs e)
        {
            tryBuy = false;
            trySell = true;           
        }

        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {


            base.OnClosing(e);
            if (_trader != null)
            {
                //_candleManager.Stop(_series);  //????????
                _trader.UnRegisterMarketDepth(_strategy.Security);
                _strategy.Stop();
                Status.Text = &amp;quot;Стоп&amp;quot;;
                // останавливаем экспорт по DDE
                #if EMULATOR
                //ниже две сторчки для работы на эмуляторе
                    _trader.UnderlyingTrader.StopExport(new[] { _trader.UnderlyingTrader.SecuritiesTable, _trader.UnderlyingTrader.MyTradesTable, _trader.UnderlyingTrader.EquityPositionsTable,
                        _trader.UnderlyingTrader.EquityPortfoliosTable, _trader.UnderlyingTrader.OrdersTable });
                 #else
                    _trader.StopExport(new[] { _trader.SecuritiesTable, _trader.MyTradesTable, _trader.EquityPositionsTable,
                        _trader.EquityPortfoliosTable, _trader.OrdersTable });
                #endif

                if (_trader.IsConnected) _trader.Disconnect();
                //_trader.Dispose();

                CfgFile.WriteParam(&amp;quot;Portfolio&amp;quot;, Portfolios.SelectedItem.ToString());
                CfgFile.WriteParam(&amp;quot;Security&amp;quot;, Securities1.SelectedItem.ToString());

            }
            base.OnClosing(e);
        }

    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Код стратегии (выставляет ордера по нажатии кнопок в форме ) :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using Ecng.Collections;
using Ecng.Common;
using StockSharp.Algo;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Indicators.Trend;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Logging;
using StockSharp.Quik;





namespace tryBot1
{


        /// &amp;lt;summary&amp;gt; 
        /// Стратегия для проверки работы коннектора. Ручной запуск трейдов по состоянию cтатических 
        /// переменных базового окна tryBuy или trySell, там они меняются кнопками.
        /// &amp;lt;/summary&amp;gt; 
    public class tryStrategy :  Strategy //
        {
        private DateTime StartTime = DateTime.Now;
        private Order myOrder;
        public decimal _StopLoss = 200; //strategy stop loss
        public decimal _TakeProfit = 700; //strategy stop loss



        public tryStrategy() { }

		protected override void OnStarted()
		{

            Security
                .WhenChanged()
                .Do(TryMakeTrade).Apply(this); //когда меняется цена по инструменту проверяем &amp;quot;не выставить ли ордер&amp;quot;
            
            //следующие события должны бы выполняться но не выполняются с чем и боремся
            this.WhenNewMyTrades().Do(OnNewOrderTrades).Apply(this);
            this.WhenOrderChanged().Do( ()=&amp;gt;
                { 
                    this.write(&amp;quot;состояние ордера изменилось&amp;quot;);
                }).Apply(this);

            //это надо для того чтобы на фьючах рабтали заявки по рынку. 
            this.Security.MaxPrice = 1000000;
            this.Security.MinPrice = 0;

			base.OnStarted();
		}



         /// &amp;lt;summary&amp;gt;
        /// проверяем условия и пытаемся выполнить трейд
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;candle&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
        private void TryMakeTrade()
        {

            // если наша стратегия в процессе остановки
            if (ProcessState == ProcessStates.Stopping)
            {
                // отменяем активные заявки
                CancelActiveOrders();
                return;
            }


            if (tryBot1.MainWindow._depth != null)
            {

                if ( tryBot1.MainWindow.tryBuy )
                {
                    //отменяем все несработавшие
                        foreach (Strategy s in this.ChildStrategies)
                        {
                            s.CancelActiveOrders();
                        }
                        this.CancelActiveOrders();

                    this.write(&amp;quot;buy Volume=&amp;quot; + Volume.ToString());
                    decimal _price = Security.BestAsk.Price + Security.MinStepSize;
                    myOrder = this.CreateOrder(OrderDirections.Buy, _price, Volume);
                    RegisterOrder(myOrder);
                    tryBot1.MainWindow.tryBuy = false;
                }
                if (tryBot1.MainWindow.trySell)
                {
                    //отменяем все несработавшие
                        foreach (Strategy s in this.ChildStrategies)
                        {
                            s.CancelActiveOrders();
                        }
                        this.CancelActiveOrders();

                    this.write(&amp;quot;sell Volume=&amp;quot; + Volume.ToString());
                    decimal _price = Security.BestBid.Price - Security.MinStepSize;
                    myOrder = this.CreateOrder(OrderDirections.Sell, _price, Volume);
                    RegisterOrder(myOrder);
                    tryBot1.MainWindow.trySell = false;
                }

                foreach (Strategy s in this.ChildStrategies)
                {
                    s.Security.MaxPrice = 1000000;
                    s.Security.MinPrice = 0;
                }
            } //end if __depth
        }


        private void OnNewOrderTrades(IEnumerable&amp;lt;MyTrade&amp;gt; trades)
        {
            this.write(&amp;quot;новый трейд&amp;quot;);
            /*
            // для каждой сделки добавляем защитную пару стратегии 
            var protectiveStrategies = trades.Select(t =&amp;gt;
            {
                // выставляет тейк-профит в 40 пунктов 
                var takeProfit = new TakeProfitStrategy(t, _TakeProfit);

                // выставляет стоп-лосс в 20 пунктов 
                var stopLoss = new StopLossStrategy(t, _StopLoss);
                return new TakeProfitStopLossStrategy(takeProfit, stopLoss);
            });
            protectiveStrategies.ForEach( strategy =&amp;gt; this.ChildStrategies.Add(strategy) );
            */
        }


        /*
        override protected void OnNewMyTrades(IEnumerable&amp;lt;MyTrade&amp;gt; trades)
        {
            foreach(MyTrade trd in trades)
            {
            this.write(&amp;quot;Trade time=&amp;quot; + trd.Trade.Time);
            }

            //aprotect.ProcessNewMyTrades(trades);
            base.OnNewMyTrades(trades);
        }*/

        public void write(String mes)
        {
            LogMessage logMessage = new LogMessage(this, DateTime.Now, LogLevels.Info, mes);
            RaiseLog(logMessage);
        }
 
    }
}


&lt;/code&gt;&lt;/pre&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/24164/</id>
    <title type="text">VassilSanych: kahuna: _strategy.Orders.Any(o =&amp;gt; o == t.Order)) Не уверен, что NewMyTrades и _strateg...</title>
    <published>2013-02-22T11:51:15Z</published>
    <updated>2013-02-22T11:51:15Z</updated>
    <author>
      <name>kahuna</name>
      <uri>https://stocksharp.ru/users/16705/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(24160)" rel="nofollow" target="_blank"&gt;VassilSanych&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(24158)" rel="nofollow" target="_blank"&gt;kahuna&lt;/a&gt;:&lt;/strong&gt;
_strategy.Orders.Any(o =&amp;gt; o == t.Order))
Не уверен, что NewMyTrades и _strategy ссылаются на одни и те же экземпляры объектов заявок в памяти.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;Откуда то срисовал.
Поменял на _trader.Orders.Any(o =&amp;gt; o == t.Order),
но все равно результат тот же,
так как само событие NewMyTrades не вызывается.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/24160/</id>
    <title type="text">kahuna: _strategy.Orders.Any(o =&amp;gt; o == t.Order)) Не уверен, что NewMyTrades и _strategy ссылаются на...</title>
    <published>2013-02-22T06:55:05Z</published>
    <updated>2013-02-22T06:55:43Z</updated>
    <author>
      <name>VassilSanych</name>
      <uri>https://stocksharp.ru/users/6491/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(24158)" rel="nofollow" target="_blank"&gt;kahuna&lt;/a&gt;:&lt;/strong&gt;
_strategy.Orders.Any(o =&amp;gt; o == t.Order))
Не уверен, что NewMyTrades и _strategy ссылаются на одни и те же экземпляры объектов заявок в памяти.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/24158/</id>
    <title type="text">например событие strategy.OrderChanged. И следующий код никогда не исполняется (то что внутри цикла ...</title>
    <published>2013-02-21T20:35:33Z</published>
    <updated>2013-02-21T21:27:19Z</updated>
    <author>
      <name>kahuna</name>
      <uri>https://stocksharp.ru/users/16705/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;p&gt;например событие strategy.OrderChanged.&lt;/p&gt;
&lt;p&gt;И следующий код никогда не исполняется (то что внутри цикла foreach)
хотя ордера выставляются.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;_trader.NewMyTrades += myTrades =&amp;gt; this.GuiAsync(() =&amp;gt;
      {
        if (_strategy != null)
        {
          // найти те сделки, которые совершила стратегия 
          myTrades = myTrades.Where(t =&amp;gt; _strategy.Orders.Any(o =&amp;gt; o == t.Order));

          _trades.Trades.AddRange(myTrades);
        }
        foreach (var myTrade in myTrades)
        {
          var trade = myTrade.Trade;
          Status.Text = &amp;quot;Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.&amp;quot; + 
          System.Convert.ToString(trade.Id) + System.Convert.ToString(trade.Price) +
          System.Convert.ToString(trade.Security.Code) + 
          System.Convert.ToString(trade.Volume) + System.Convert.ToString(trade.Time);
         }
       });
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;такое впечатление что у меня событийная модель не работает.&lt;/p&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/24159/</id>
    <title type="text">Когда переключаюсь с эмулятора на реальный QuikTrader. Что подразумевается под &amp;quot;переключением&amp;quot;? Как ...</title>
    <published>2013-02-21T21:26:36Z</published>
    <updated>2013-02-21T21:26:36Z</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;Когда переключаюсь с эмулятора на реальный QuikTrader.
Что подразумевается под &amp;quot;переключением&amp;quot;? Как вы это делаете, опишите подробнее, желательно с примером кода.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/24155/</id>
    <title type="text">kahuna: события изменения состояния не вызываются, На слух как-то плохо воспринимается. </title>
    <published>2013-02-21T18:17:36Z</published>
    <updated>2013-02-21T18:17:36Z</updated>
    <author>
      <name>VassilSanych</name>
      <uri>https://stocksharp.ru/users/6491/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(24153)" rel="nofollow" target="_blank"&gt;kahuna&lt;/a&gt;:&lt;/strong&gt;
события изменения состояния не вызываются,
На слух как-то плохо воспринимается.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/24153/</id>
    <title type="text">S# 4.1.6 Работа с Quik. Брокер Уралсиб. В режиме RealTimeEmlationTrader ордера выставляются, и инфор...</title>
    <published>2013-02-21T16:14:45Z</published>
    <updated>2013-02-21T17:51:27Z</updated>
    <author>
      <name>kahuna</name>
      <uri>https://stocksharp.ru/users/16705/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;p&gt;S# 4.1.6
Работа с Quik. Брокер Уралсиб.
В режиме RealTimeEmlationTrader
ордера выставляются,
и информация о их выполнении поступает в лог,
strategy.PositionManager.Position показывает позицию.&lt;/p&gt;
&lt;p&gt;Когда переключаюсь с эмулятора на реальный QuikTrader.
Ордер выставляется, но похоже события изменения состояния не вызываются,
соответственно strategy.PositionManager.Position показывает 0.
Может кто подать идею, в какой стороне мне копать?&lt;/p&gt;
&lt;p&gt;И при работе через эмулятор похоже часть событий не активируется
по крайней мере NewMyTrade, но так как strategy.PositionManager.Position
обновляется работать можно.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>