﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Полезные функции</title>
  <id>~/topic/1672/poleznye-funktsii/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-04T09:32:45Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=1672" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/8978/</id>
    <title type="text">Всем доброго времени суток! Ради интереса и для обмена опытом написания роботов/приводов под Stock# ...</title>
    <published>2011-06-17T13:36:23Z</published>
    <updated>2011-06-17T14:15:10Z</updated>
    <author>
      <name>Артем_2</name>
      <uri>https://stocksharp.com/users/27723/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Всем доброго времени суток! &lt;br /&gt;Ради интереса и для обмена опытом написания роботов/приводов под Stock# решил открыть небольшую темку на форуме. Сюда  выложу некоторые процедуры и функции, которые использую в своем приводе. Возможно, кто-то почерпнет для себя нечто интересное или готов предложить свои варианты. Программирую на C# не так давно, поэтому код не претендует на нобелевскую премию...&lt;br /&gt;&lt;br /&gt;1) Процедура для запска Квика с последующей автризацией StartQuikConnection()&lt;br /&gt;2) Функция для проверки настроек таблиц&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

#region QUIK CONNECTION

        public static Ecng.Trading.Quik.QuikTrader Trader;

        private static Ecng.Trading.Algo.Strategies.StrategyManager StrategyManager;

        public delegate void Connected_EventHandler(Boolean IsOK);
        public static event Connected_EventHandler Connected;

        public static Boolean IsTraderConnected
        {
            get
            {
                if (Trader == null || !Trader.IsConnected)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
        }


        private static System.Threading.AutoResetEvent _OnTerminalConnectedWaitHandle;
        public static void StartQuikConnection()
        {
            if (IsTraderConnected)
            {
                Globals.Сообщить(&amp;quot;Подключение уже активно!&amp;quot;, Globals.СтатусСообщения.Инфо);
            }
            else
            {
                //System.Threading.ManualResetEvent waitHandle_ЗапускТерминала = new System.Threading.ManualResetEvent(false);

                if (!StartTerminal())
                { return; }

                //waitHandle_ЗапускТерминала.WaitOne(60000);
                /////////////////////////////////////////////////
                try
                {
                    if (!IsTraderConnected)
                    {
                        _OnTerminalConnectedWaitHandle = new System.Threading.AutoResetEvent(false);

                        if (Trader == null) //Если null, регистрируем новый trader
                        {
                            Trader = new Ecng.Trading.Quik.QuikTrader(_QuikPath);
                            Trader.IsAsyncMode = false;

                            Trader.ConnectionError += OnTraderConnectionError;

                            //подписываемся на событие успешного подключения
                            //все действия необходимо производить только после подключения
                            Trader.Connected += OnTraderConnected;

                            Trader.Connect();

                        }
                        else
                        {
                            Trader.Reconnect();

                        }

                        _OnTerminalConnectedWaitHandle.WaitOne(10000);
                    }

                }
                catch (Exception e)
                {
                    OnConnect(false);

                    if (Trader != null)
                    {
                        Trader.Dispose();
                        Trader = null;
                    }
                    MessageBox.Show(&amp;quot;Ошибка при подключении к Quik: &amp;quot; + &amp;#39;\n&amp;#39; + e.Message, &amp;quot;Подключение к QUIK!&amp;quot;, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
        private static Boolean StartTerminal()
        {
            try
            {
                Ecng.Trading.Quik.QuikTerminal terminal = QuikTerminal.DefaultTerminal;

                if (terminal == null || !terminal.IsConnected)
                {
                    Globals.Состояние(&amp;quot;Подключение к Quik...&amp;quot;);

                    terminal = QuikTerminal.Get(_QuikPath);

                    if (!terminal.IsLaunched)
                    {
                        Globals.Сообщить(&amp;quot;Запускаем Quik &amp;lt;&amp;quot; + DateTime.Now.ToString(&amp;quot;dd.MM.yyyy HH:mm:ss&amp;quot;) + &amp;quot;&amp;gt;&amp;quot;, Globals.СтатусСообщения.Инфо);

                        terminal.Launch();

                        Globals.Сообщить(&amp;quot;Quik запущен &amp;lt;&amp;quot; + DateTime.Now.ToString(&amp;quot;dd.MM.yyyy HH:mm:ss&amp;quot;) + &amp;quot;&amp;gt;&amp;quot;, Globals.СтатусСообщения.Инфо);
                    }

                }
                else
                {
                    Globals.Сообщить(&amp;quot;Найден запущенный Quik&amp;quot;, Globals.СтатусСообщения.Инфо);
                }

                if (terminal == null)
                {
                    return false;
                }

                if (!terminal.IsConnected)
                {
                    terminal.Login(_QuikLogin, _QuikPassword);

                    Globals.Сообщить(&amp;quot;Авторизация произведена&amp;quot;, Globals.СтатусСообщения.Инфо);
                }

                Globals.Состояние(&amp;quot;&amp;quot;);

                return true;

            }
            catch (Exception e)
            {
                Globals.Состояние(&amp;quot;&amp;quot;);

                Globals.Сообщить(&amp;quot;Ошибка запуска QUIK: &amp;quot; + e.Message, Globals.СтатусСообщения.Важное);

                return false;
            }
        }

        private static void OnConnect(Boolean IsOK)
        {
            if (Connected != null) Connected(IsOK);

        }

        public static Boolean CheckDDE()
        {
            StartQuikConnection();
            if (IsTraderConnected)
            {
                return CheckDDE_OnConnected();
            }
            else
            {
                return false;
            }
        }
        private static Boolean CheckDDE_OnConnected()
        {
            Boolean _resault = true;
            Trader.ProcessDataError += OnTraderProcessDataError;
            try
            {
                var _errors = Trader.Terminal.GetTableSettings();

                foreach (var _err in _errors)
                {
                    Globals.СтатусСообщения _статус = Globals.СтатусСообщения.Обычное;

                    if (_err.IsCritical)
                    {
                        _статус = Globals.СтатусСообщения.Важное;
                        _resault = false;
                    }

                    Globals.Сообщить(_err.Error.Message, _статус);
                }
            }
            catch
            {
                _resault = false;
            }
            finally
            {
                Trader.ProcessDataError -= OnTraderProcessDataError;
            }

            return _resault;
        }

        #region STATIC ОБРАБОТЧИНИК СОБЫТИЙ

        private static void OnTraderConnected()
        {
            _OnTerminalConnectedWaitHandle.Set();
            Globals.Сообщить(&amp;quot;Подключение было произведено успешно!&amp;quot;, Globals.СтатусСообщения.Инфо);
            OnConnect(true);
        }

        private static void OnTraderConnectionError(Exception e)
        {
            Globals.Сообщить(&amp;quot;Ошибка при подключении к Quik: &amp;quot; + e.Message, Globals.СтатусСообщения.Важное);
            OnConnect(false);
        }

        private static void OnTraderProcessDataError(Exception e)
        {
            Globals.Сообщить(&amp;quot;Ошибка при получении/обработке данных с сервера Quik: &amp;quot; + e.Message, Globals.СтатусСообщения.Важное);
        }&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.com/posts/m/8983/</id>
    <title type="text">Спасибо! Исправился...)))</title>
    <published>2011-06-17T14:13:56Z</published>
    <updated>2011-06-17T14:14:11Z</updated>
    <author>
      <name>Артем_2</name>
      <uri>https://stocksharp.com/users/27723/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Спасибо! Исправился...)))</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/8981/</id>
    <title type="text">3) Функция получения последней сделки по исполненной заявке. Нужна т.к. в момент изменения статуса з...</title>
    <published>2011-06-17T13:47:52Z</published>
    <updated>2011-06-17T14:12:47Z</updated>
    <author>
      <name>Артем_2</name>
      <uri>https://stocksharp.com/users/27723/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">3) Функция получения последней сделки по исполненной заявке. Нужна т.к. в момент изменения статуса заявки на Done, всех сделок по заявке может еще не быть...&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

public Ecng.Trading.BusinessEntities.MyTrade GetLastDoneTrade(String Sender_method, Ecng.Trading.BusinessEntities.Order Order)
        {
            IEnumerable&amp;lt;Ecng.Trading.BusinessEntities.MyTrade&amp;gt; _order_trades = null;

            int _counter = 0;
            while (_counter &amp;lt; 1000)
            {
                _counter++;
                _order_trades = Trader.MyTrades.Where(t =&amp;gt; t.Order.Id == Order.Id);
                int _volume = _order_trades.Sum(o =&amp;gt; o.Trade.Volume);
                if (_volume == Order.Volume)
                {
                    break;
                }
                else
                {
                    System.Threading.Thread.Sleep(100);
                }

            }

            if (_order_trades != null &amp;amp;&amp;amp; _order_trades.Count() &amp;gt; 0)
            {
                long _last_trade_ID = (long)_order_trades.Max(t =&amp;gt; t.Trade.Id);
             
                return _order_trades.Where(m =&amp;gt; m.Trade.Id == _last_trade_ID).FirstOrDefault();
            }
            else
            {
                return Trader.MyTrades.Where(t =&amp;gt; t.Order.Id == Order.Id).LastOrDefault();
            }
           
        }
&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.com/posts/m/8979/</id>
    <title type="text">2_ Функция для добавления произвольных данных на график amChart public DataSet DrawCustomData(String...</title>
    <published>2011-06-17T13:39:33Z</published>
    <updated>2011-06-17T14:12:25Z</updated>
    <author>
      <name>Артем_2</name>
      <uri>https://stocksharp.com/users/27723/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">2_ Функция для добавления произвольных данных на график amChart&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

 public DataSet DrawCustomData(String dataName, DateTime time, decimal value, CustomDataProperties properties, Boolean isOverite)
        {
            if (dataName == null || dataName == &amp;quot;&amp;quot;) throw new ArgumentNullException(&amp;quot;DataName&amp;quot;);
            if (time == null || time == default(DateTime)) throw new ArgumentNullException(&amp;quot;time&amp;quot;);
            if (properties == null) throw new ArgumentNullException(&amp;quot;properties&amp;quot;);
            if (properties.Graph == null) throw new ArgumentNullException(&amp;quot;properties.Graph&amp;quot;);

            string _title = dataName;

            dataName = dataName.ReplaceNotNameSymbols(&amp;quot;_&amp;quot;);

            var _data_set = _stockChart.DataSets.Where(ds =&amp;gt; ds.Name == dataName).FirstOrDefault();
           
            if (_data_set == null)
            {
                _data_set = new DataSet() { Name = dataName, Title = _title, ShortTitle = properties.ShortTitle, StartDate = ChartControl.DataSets[0].StartDate };
                ChartControl.DataSets.Add(_data_set);

                Graph _graph = properties.Graph;
                _graph.DataSet = _data_set;
                _data_set.Tag = _graph;
                _mainChart.Graphs.Add(_graph);
            }

            if (isOverite)
            {
                _data_set.Items.RemoveWhere(i =&amp;gt; i.Date == time);
            }

            DataItem _item = new DataItem();
            _item.Value = (double)value;
            _item.Date = time;
            _data_set.Items.Add(_item);

            TryScrollToEnd(time);
            
            return _data_set;
        }
&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.com/posts/m/8982/</id>
    <title type="text">Всем доброго времени суток! Ради интереса и для обмена опытом написания роботов/приводов под Stock# ...</title>
    <published>2011-06-17T13:55:24Z</published>
    <updated>2011-06-17T13:55:24Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Артем_2 &lt;a href="https://stocksharp.com/posts/m/8978/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Всем доброго времени суток! &lt;br /&gt;Ради интереса и для обмена опытом написания роботов/приводов под Stock# решил открыть небольшую темку на форуме.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Еще б неплохо использовать теги для кода.&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

public class SampleHighlight
{
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>