﻿<?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-04-07T20:54:01Z</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;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Цитата:&lt;/span&gt;&lt;div class="innerquote"&gt;Если оставляю #define EMULATOR сделки совершаются и событие стратегии OrderChanged срабатывает в лог попадает сообщение &amp;quot;состояние ордера изменилось&amp;quot;. &lt;br /&gt;Если на реальном Quik (снят комментарий с&lt;br /&gt;#undef EMULATOR) то сделки совершаются но событие OrderChanged не срабатывает.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Как то сложно, да и лениво каждый раз комментить/раскомментить директивы препроцессора.&lt;br /&gt;Объявите поле _trader типа ITrader.&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

private ITrader _trader;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Добавьте на форму ComboBox с двумя Item. Что нибудь типа:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;И потом в коде, в зависимости от того что выбранно создавать или QuikTrader или RTET&amp;lt;QuikTrader&amp;gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Рекомендую прочитать &lt;a href="http://stocksharp.com/forum/360/Sozdaniie-robotov-s-pomoshch-iu-S---Vviedieniie/" title="http://stocksharp.com/forum/360/Sozdaniie-robotov-s-pomoshch-iu-S---Vviedieniie/"&gt;серию статей&lt;/a&gt; от &lt;b&gt;FinDirector&lt;/b&gt;, почерпнете для себя много интересного.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

_trader = new QuikTrader(QuikTerminal.GetDefaultPath()){ IsAsyncMode = true, SupportManualOrders = false };
_trader.IsAsyncMode = true;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;В инициализаторе уже задано значение св-ва IsAsyncMode, нет смысла делать это еще раз.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Можно заменить на&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

Status.Text = &amp;quot;Сделка {Id} по цене {Price} по бумаге {Security.Code} по объему {Volume} в {Time}.&amp;quot;.PutEx(trade)
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Запуск/остановка экспорта&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

        private void StartDde()
        {
            _trader.StartExport();
            _isDdeStarted = true;
        }
 
        private void StopDde()
        {
            _trader.StopExport();
            _isDdeStarted = false;
        }&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Если на экспорт запускаются все таблицы StartExport(), то нет смысла потом перечислять какие именно надо таблицы остановить.&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Проще вызвать StopDde() или напрямую _trader.StopExport();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Дублируется base.OnClosing(e); Не смертельно, но все же.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

            //это надо для того чтобы на фьючах рабтали заявки по рынку.
            this.Security.MaxPrice = 1000000;
            this.Security.MinPrice = 0;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Сначала подумал что в этом причина почему не срабатывает событие NewMyTrade, т.к. не совершается сделка. &lt;br /&gt;По идее не должно работать. Должно прийти сообщение об ошибке, что то типа цена ордера вне диапазона.&lt;br /&gt;Чтобы были цены планок лучше добавить соответствующие колонки в квик таблице &amp;quot;Инструменты&amp;quot; и потом добавить их в коде. &lt;a target="_blank" rel="nofollow" href="https://stocksharp.ru/away/?u=AQAAAAAAAAB9IU5EfsQFXLuKkrNTufYd" title="http://"&gt;Экспорт доп. колонок&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Потом увидел что ценник выставляется по другому&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
_price = Security.BestBid.Price - Security.MinStepSize;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;И методы BuyAtmarket и SellAtMarket не используются.&lt;br /&gt;Да и вы пишете что сделки совершаются.&lt;br /&gt;&lt;br /&gt;Тогда не понятно в чем может быть причина.&lt;br /&gt;&lt;br /&gt;Попробуйте максимально упростить код, чтобы проверить отрабатывает ли событие NewMyTrade. Один шлюз, минимум кода в стратегии.&lt;br /&gt;Попробуйте на последней сборке с codeplex, возможно причина в S#.</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;br /&gt;Это можно делать например так:&lt;br /&gt;&lt;div class='spoilertitle'&gt;&lt;input type='button' value='Показать спойлер' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_fb62b6666bcb4d079acd480268eb7213');" title='Показать спойлер' /&gt;&lt;/div&gt;&lt;div class='spoilerbox' id='spolier_fb62b6666bcb4d079acd480268eb7213' style='display:none'&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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&amp;#39;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;/pre&gt;
&lt;/div&gt;&lt;/div&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">Понял, сам дурак. Просто давно завис в облигациях РБК. Валяются в портфеле. А в таблицах (сделок, заявок и т.п) облигации отфильтрованы.</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;br /&gt;Ура. Все заработало.&lt;br /&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">Может это как то проясняет дело. Простейший код в котором просто соединение с Quik&lt;br /&gt;выдает страную ошибку про какой-то инструмент[blink]&lt;br /&gt; &lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Ошибка в лог валится такая:&lt;em&gt;&lt;br /&gt;2013/02/26 14:43:51.544|Debug  |QuikTrader|Соединились&lt;br /&gt;2013/02/26 14:43:53.367|Error  |QuikTrader|System.InvalidOperationException: Инструмент с кодом RU000A0JPWC3 для бумажной позиции не найден.&lt;br /&gt;   в StockSharp.Quik.QuikTrader.#=qjrOBFov$lIae$ZMCQLx7P1fQAe2X2s16$DxZRnv$aqU=.#=qjGe1xZF5fvarq_$jrR3XCQ==(IList`1 #=qKG6nGjj9uhl1Ndb5IDukAw==, Func`2 #=qdrbWxV4uORvFCQd5d$c6og==)&lt;br /&gt;   в #=qU8C8kAMUmJ0kPIeEJrF68f3NMymXDukMNgL4Dc7ffmr7PRgVzknJ3atY_n0PucT4.#=qB09_IBYvsxLb_dLzMi2NWQ==(DdeTable #=qOgXoydWCvsq2gXlddKoo0w==, IList`1 #=qMeYWUEb44NrXcAvbPuNfiQ==, Action`2 #=qolGBgTssErk3vXo538xxsQ==, Action`1 #=qIfmNdbFGgLtG9ybpXuosbQ==, Boolean #=qe3W9$GyIKMHUi59wvLuQeA==)&lt;br /&gt;2013/02/26 14:43:53.441|       |QuikTrader|Экспорт запущен.&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;Мистика. [cursing] </content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/24213/</id>
    <title type="text">И следующий код никогда не исполняется (то что внутри цикла 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;div class="quote"&gt;&lt;span class="quotetitle"&gt;VassilSanych &lt;a href="https://stocksharp.ru/posts/m/24171/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;kahuna &lt;a href="https://stocksharp.ru/posts/m/24158/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;И следующий код никогда не исполняется (то что внутри цикла foreach)&lt;br /&gt;хотя ордера выставляются.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Попробуйте всё-таки вставить строчку логирования перед foreach.&lt;br /&gt;Возможно всё-таки косяк с фильтром.&lt;br /&gt;Говоря о заявке в памяти, я подразумевал, что, может быть, лучше проверять какие-нибудь скалярные свойства ордеров, а не ссылки на объекты.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Попробовал поставил, выполнение до цикла просто не доходит. Не вызывается совсем этот обработчик события NewMyTrades.&lt;br /&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">И следующий код никогда не исполняется (то что внутри цикла 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;div class="quote"&gt;&lt;span class="quotetitle"&gt;kahuna &lt;a href="https://stocksharp.ru/posts/m/24158/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;И следующий код никогда не исполняется (то что внутри цикла foreach)&lt;br /&gt;хотя ордера выставляются.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Попробуйте всё-таки вставить строчку логирования перед foreach.&lt;br /&gt;Возможно всё-таки косяк с фильтром.&lt;br /&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;div class="quote"&gt;&lt;span class="quotetitle"&gt;Цитата:&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;Попробуйте максимально упростить код, чтобы проверить отрабатывает ли событие NewMyTrade. Один шлюз, минимум кода в стратегии.&lt;br /&gt;Попробуйте на последней сборке с codeplex, возможно причина в S#.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Попробовл без изменения кода перейти на 4.1.8 , стало еще веселее, теперь Positions не показывается и в режиме эмулятора. То есть событие OrderChanged тоже не прилетает.&lt;br /&gt;Verifier про настройку Quik говорит - все в порядке.&lt;br /&gt;Упростил код. Дальше уже кажется некуда.  Картина сохранилась. [confused] &lt;br /&gt;основной:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;для стратегии:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&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;div class="quote"&gt;&lt;span class="quotetitle"&gt;Moadip &lt;a href="https://stocksharp.ru/posts/m/24159/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Цитата:&lt;/span&gt;&lt;div class="innerquote"&gt;Когда переключаюсь с эмулятора на реальный QuikTrader.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Что подразумевается под &amp;quot;переключением&amp;quot;? Как вы это делаете, опишите подробнее, желательно с примером кода.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Если оставляю #define EMULATOR сделки совершаются и событие стратегии OrderChanged срабатывает в лог попадает сообщение &amp;quot;состояние ордера изменилось&amp;quot;.        &lt;br /&gt;не показывает Status.Text = _strategy.ProcessState.ToString(); &lt;br /&gt;не показывает PnL.Content = _strategy.PnLManager.PnL; &lt;br /&gt;не показывает Slippage.Content = _strategy.SlippageManager.Slippage; &lt;br /&gt;&lt;b&gt;показывает Position.Content = _strategy.PositionManager.Position;&lt;/b&gt;&lt;br /&gt;не показываетLatency.Content = _strategy.Latency; &lt;br /&gt;			&lt;br /&gt;&lt;br /&gt;Если на реальном Quik (снят комментарий с &lt;br /&gt;#undef EMULATOR) то сделки совершаются но событие OrderChanged не срабатывает.&lt;br /&gt; не показывает Status.Text = _strategy.ProcessState.ToString();&lt;br /&gt; не показывает PnL.Content = _strategy.PnLManager.PnL; &lt;br /&gt; не показывает Slippage.Content = _strategy.SlippageManager.Slippage; &lt;br /&gt; не показывает Position.Content = _strategy.PositionManager.Position; &lt;br /&gt; не показывает Latency.Content = _strategy.Latency; &lt;br /&gt;&lt;br /&gt;Основной код: &lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Код стратегии (выставляет ордера по нажатии кнопок в форме ) :&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&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">_strategy.Orders.Any(o =&amp;gt; o == t.Order)) Не уверен, что NewMyTrades и _strategy ссылаются на одни и ...</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;div class="quote"&gt;&lt;span class="quotetitle"&gt;VassilSanych &lt;a href="https://stocksharp.ru/posts/m/24160/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;kahuna &lt;a href="https://stocksharp.ru/posts/m/24158/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;_strategy.Orders.Any(o =&amp;gt; o == t.Order))&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Не уверен, что NewMyTrades и _strategy ссылаются на одни и те же экземпляры объектов заявок в памяти.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Откуда то срисовал. &lt;br /&gt;Поменял на _trader.Orders.Any(o =&amp;gt; o == t.Order),&lt;br /&gt;но все равно результат тот же,&lt;br /&gt;так как само событие NewMyTrades не вызывается.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/24160/</id>
    <title type="text">_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;div class="quote"&gt;&lt;span class="quotetitle"&gt;kahuna &lt;a href="https://stocksharp.ru/posts/m/24158/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;_strategy.Orders.Any(o =&amp;gt; o == t.Order))&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Не уверен, что NewMyTrades и _strategy ссылаются на одни и те же экземпляры объектов заявок в памяти.</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">например событие strategy.OrderChanged.&lt;br /&gt;&lt;br /&gt;И следующий код никогда не исполняется (то что внутри цикла foreach)&lt;br /&gt;хотя ордера выставляются.&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;такое впечатление что у меня событийная модель не работает.&lt;br /&gt; &lt;br /&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;div class="quote"&gt;&lt;span class="quotetitle"&gt;Цитата:&lt;/span&gt;&lt;div class="innerquote"&gt;Когда переключаюсь с эмулятора на реальный QuikTrader.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Что подразумевается под &amp;quot;переключением&amp;quot;? Как вы это делаете, опишите подробнее, желательно с примером кода.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/24155/</id>
    <title type="text">события изменения состояния не вызываются, На слух как-то плохо воспринимается. </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;div class="quote"&gt;&lt;span class="quotetitle"&gt;kahuna &lt;a href="https://stocksharp.ru/posts/m/24153/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;события изменения состояния не вызываются,&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;На слух как-то плохо воспринимается.&lt;br /&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">S# 4.1.6&lt;br /&gt;Работа с Quik. Брокер Уралсиб.&lt;br /&gt;В режиме RealTimeEmlationTrader &lt;br /&gt;ордера выставляются,&lt;br /&gt;и информация о их выполнении поступает в лог,&lt;br /&gt;strategy.PositionManager.Position показывает позицию.&lt;br /&gt; &lt;br /&gt;Когда переключаюсь с эмулятора на реальный QuikTrader.&lt;br /&gt;Ордер выставляется, но похоже события изменения состояния не вызываются,&lt;br /&gt;соответственно strategy.PositionManager.Position показывает 0.&lt;br /&gt;Может кто подать идею, в какой стороне мне копать?&lt;br /&gt;&lt;br /&gt;И при работе через эмулятор похоже часть событий не активируется&lt;br /&gt;по крайней мере NewMyTrade, но так как strategy.PositionManager.Position &lt;br /&gt;обновляется работать можно.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>