Полезные функции
Atom
17.06.2011


Всем доброго времени суток!
Ради интереса и для обмена опытом написания роботов/приводов под Stock# решил открыть небольшую темку на форуме. Сюда выложу некоторые процедуры и функции, которые использую в своем приводе. Возможно, кто-то почерпнет для себя нечто интересное или готов предложить свои варианты. Программирую на C# не так давно, поэтому код не претендует на нобелевскую премию...

1) Процедура для запска Квика с последующей автризацией StartQuikConnection()
2) Функция для проверки настроек таблиц

Код

#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.Сообщить("Подключение уже активно!", 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("Ошибка при подключении к Quik: " + '\n' + e.Message, "Подключение к QUIK!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
        private static Boolean StartTerminal()
        {
            try
            {
                Ecng.Trading.Quik.QuikTerminal terminal = QuikTerminal.DefaultTerminal;

                if (terminal == null || !terminal.IsConnected)
                {
                    Globals.Состояние("Подключение к Quik...");

                    terminal = QuikTerminal.Get(_QuikPath);

                    if (!terminal.IsLaunched)
                    {
                        Globals.Сообщить("Запускаем Quik <" + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss") + ">", Globals.СтатусСообщения.Инфо);

                        terminal.Launch();

                        Globals.Сообщить("Quik запущен <" + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss") + ">", Globals.СтатусСообщения.Инфо);
                    }

                }
                else
                {
                    Globals.Сообщить("Найден запущенный Quik", Globals.СтатусСообщения.Инфо);
                }

                if (terminal == null)
                {
                    return false;
                }

                if (!terminal.IsConnected)
                {
                    terminal.Login(_QuikLogin, _QuikPassword);

                    Globals.Сообщить("Авторизация произведена", Globals.СтатусСообщения.Инфо);
                }

                Globals.Состояние("");

                return true;

            }
            catch (Exception e)
            {
                Globals.Состояние("");

                Globals.Сообщить("Ошибка запуска QUIK: " + 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.Сообщить("Подключение было произведено успешно!", Globals.СтатусСообщения.Инфо);
            OnConnect(true);
        }

        private static void OnTraderConnectionError(Exception e)
        {
            Globals.Сообщить("Ошибка при подключении к Quik: " + e.Message, Globals.СтатусСообщения.Важное);
            OnConnect(false);
        }

        private static void OnTraderProcessDataError(Exception e)
        {
            Globals.Сообщить("Ошибка при получении/обработке данных с сервера Quik: " + e.Message, Globals.СтатусСообщения.Важное);
        }

Теги:


Спасибо: T100


Артем_2

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


2_ Функция для добавления произвольных данных на график amChart
Код

 public DataSet DrawCustomData(String dataName, DateTime time, decimal value, CustomDataProperties properties, Boolean isOverite)
        {
            if (dataName == null || dataName == "") throw new ArgumentNullException("DataName");
            if (time == null || time == default(DateTime)) throw new ArgumentNullException("time");
            if (properties == null) throw new ArgumentNullException("properties");
            if (properties.Graph == null) throw new ArgumentNullException("properties.Graph");

            string _title = dataName;

            dataName = dataName.ReplaceNotNameSymbols("_");

            var _data_set = _stockChart.DataSets.Where(ds => 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 => i.Date == time);
            }

            DataItem _item = new DataItem();
            _item.Value = (double)value;
            _item.Date = time;
            _data_set.Items.Add(_item);

            TryScrollToEnd(time);
            
            return _data_set;
        }
Спасибо:

Артем_2

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


3) Функция получения последней сделки по исполненной заявке. Нужна т.к. в момент изменения статуса заявки на Done, всех сделок по заявке может еще не быть...
Код

public Ecng.Trading.BusinessEntities.MyTrade GetLastDoneTrade(String Sender_method, Ecng.Trading.BusinessEntities.Order Order)
        {
            IEnumerable<Ecng.Trading.BusinessEntities.MyTrade> _order_trades = null;

            int _counter = 0;
            while (_counter < 1000)
            {
                _counter++;
                _order_trades = Trader.MyTrades.Where(t => t.Order.Id == Order.Id);
                int _volume = _order_trades.Sum(o => o.Trade.Volume);
                if (_volume == Order.Volume)
                {
                    break;
                }
                else
                {
                    System.Threading.Thread.Sleep(100);
                }

            }

            if (_order_trades != null && _order_trades.Count() > 0)
            {
                long _last_trade_ID = (long)_order_trades.Max(t => t.Trade.Id);
             
                return _order_trades.Where(m => m.Trade.Id == _last_trade_ID).FirstOrDefault();
            }
            else
            {
                return Trader.MyTrades.Where(t => t.Order.Id == Order.Id).LastOrDefault();
            }
           
        }
Спасибо:

Mikhail Sukhov

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


Артем_2 Перейти
Всем доброго времени суток!
Ради интереса и для обмена опытом написания роботов/приводов под Stock# решил открыть небольшую темку на форуме.


Еще б неплохо использовать теги для кода.
Код

public class SampleHighlight
{
}
Спасибо:

Артем_2

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


Спасибо! Исправился...)))
Спасибо:


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

loading
clippy