Помогите прописать событие.
Atom
23.10.2012
Кудрев


Добрый день ребята. Кто нибудь может помочь прописать событие. Чтобы на мою заявку как только она исполнена выставлялась профит и стоп заявка.


private void OnNewOrderTrades(IEnumerable<MyTrade> trades)
{
    // для каждой сделки добавляем защитную пару стратегии 
    var protectiveStrategies = trades.Select(t =>
    {
        // выставляет тейк-профит в 40 пунктов 
        var takeProfit = new TakeProfitStrategy(t, 40);

        // выставляет стоп-лосс в 20 пунктов 
        var stopLoss = new StopLossStrategy(t, 20);

        return new TakeProfitStopLossStrategy(trade, takeProfit, stopLoss);
    });

    ChildStrategies.AddRange(protectiveStrategies);
}


Код я взял с примера а куда событие прописать и как не могу додумать.

// создаем шлюз к Quik-у var trader = new QuikTrader(@"Ваш путь к Квик директории"); // подписываемся на событие успешного подключения // все действия необходимо производить только после подключения trader.Connected += () => { Console.WriteLine("Подключение было произведено успешно.");

// извещаем об успешном соединении
waitHandle.Set();

};

Console.WriteLine("Производим подключение...");

trader.Connect();

// дожидаемся события об успешном соединении waitHandle.WaitOne(); trader.NewPortfolios += portfolios => { if (_portfolio == null) { // находим нужный портфель и присваиваем его переменной _portfolio _portfolio = portfolios.FirstOrDefault(p => p.Name == account);

    if (_portfolio != null)
    {
        Console.WriteLine("Портфель {0} появился.", account);

        // если инструмент и стакан уже появились, 
        // то извещаем об этом основной поток для выставления заявки 
        if (_lkoh != null && _depth != null)
            waitHandle.Set();
    }
}

}; // подписываемся на событие появление инструментов trader.NewSecurities += securities => { if (_riz2 == null) { // находим Лукойл и присваиваем ее переменной ртс _riz2 = securities.FirstOrDefault(sec => sec.Code == secCode);

    if (_riz != null)
    {
        Console.WriteLine("Инструмент ртс появился.");

        // запускаем экспорт стакана
        trader.RegisterQuotes(_riz2);

        if (_portfolio != null)
            waitHandle.Set();
    }
}

}; // подписываемся на событие появления моих новых сделок trader.NewMyTrades += myTrades => { foreach (var myTrade in myTrades) { var trade = myTrade.Trade; Console.WriteLine("Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.", trade.Id, trade.Price, trade.Security.Code, trade.Volume, trade.Time);

}

};

// подписываемся на событие обновления стакана trader.MarketDepthsChanged += depths => { if (_depth == null && _riz2 != null) { _depth = depths.FirstOrDefault(d => d.Security == _riz2);

    if (_depth != null)
    {
        Console.WriteLine("Стакан ртс появился.");

        // если портфель уже появился, то извещаем об этом основной поток для выставления заявки 
        if (_portfolio != null)
            waitHandle.Set();
    }
}

}; Console.WriteLine("Дожидаемся появления в программе инструмента ртс и портфеля {0}...".Put(account));

// запускаем экспорт по DDE trader.StartExport(new[]{ trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable, trader.EquityPortfoliosTable, trader.OrdersTable });


Теги:


Спасибо:


OvcharenkoVI

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


Пожалуйста, в сообщении оформляйте код с подсветкой C#...

Спасибо:

Moadip

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


В примере SampleConsoleесть такой кусок кода:


						while (true)
						{
							var mid = _lkoh.BestPair.SpreadPrice / 2;

							// если спред вышел за пределы нашего диапазона
							if	(
									((firstMid + firstMid * delta) <= mid) ||
									((firstMid - firstMid * delta) >= mid)
								)
							{
								var order = new Order
								{
									Portfolio = _portfolio,
									Price = _lkoh.ShrinkPrice(_lkoh.BestBid.Price + mid),
									Security = _lkoh,
									Volume = 1,
									Direction = OrderDirections.Buy,
								};
								trader.RegisterOrder(order);
								Console.WriteLine("Заявка {0} зарегистрирована.", order.Id);
								break;
							}
							else
								Console.WriteLine("Текущее значение середины спреда {0:0.##}", _lkoh.BestBid.Price + mid);

							// ждем 1 секунду
							Thread.Sleep(1000);
						}

Если посмотреть в документаци Тейк-профит и Стоп-лосс


public class MyStrategy : Strategy
{
    public void OpenPosition()
    {
        // создаем заявку для открытия длинной позиции 
        var longPos = this.BuyAtMarket();

        // регистрируем правило, отслеживающее появление новых сделок по заявке
        longPos
            .WhenNewTrades()
            .Do(OnNewOrderTrades)
            .Apply(this);

        // отправляем заявку на регистрацию
        RegisterOrder(longPos);
    }
}

То видно, что для вновь созданной заявки используется правило WhenNewTrades при срабатывании которого выполняется метод OnNewOrderTrades

Делаем по аналогии, только вместо именованного метода будет использоватся лямбда выражение.


						while (true)
						{
							var mid = _lkoh.BestPair.SpreadPrice / 2;

							// если спред вышел за пределы нашего диапазона
							if	(
									((firstMid + firstMid * delta) <= mid) ||
									((firstMid - firstMid * delta) >= mid)
								)
							{
								var order = new Order
								{
									Portfolio = _portfolio,
									Price = _lkoh.ShrinkPrice(_lkoh.BestBid.Price + mid),
									Security = _lkoh,
									Volume = 1,
									Direction = OrderDirections.Buy,
								};

								order
									.WhenNewTrades()
									.Do(trades =>
											{
                                                ...
											})
									.Apply();

								trader.RegisterOrder(order);
								Console.WriteLine("Заявка {0} зарегистрирована.", order.Id);
								break;
							}
							else
								Console.WriteLine("Текущее значение середины спреда {0:0.##}", _lkoh.BestBid.Price + mid);

							// ждем 1 секунду
							Thread.Sleep(1000);
						}

Теперь "наполним" его логикой.[smile]


						while (true)
						{
							var mid = _lkoh.BestPair.SpreadPrice / 2;

							// если спред вышел за пределы нашего диапазона
							if	(
									((firstMid + firstMid * delta) <= mid) ||
									((firstMid - firstMid * delta) >= mid)
								)
							{
								var order = new Order
								{
									Portfolio = _portfolio,
									Price = _lkoh.ShrinkPrice(_lkoh.BestBid.Price + mid),
									Security = _lkoh,
									Volume = 1,
									Direction = OrderDirections.Buy,
								};

								order
									.WhenNewTrades()
									.Do(trades =>
											{
												// для каждой сделки добавляем защитную пару стратегии 
												var protectiveStrategies = trades.Select(t =>
												{
													// выставляет тейк-профит в 40 пунктов 
													var takeProfit = new TakeProfitStrategy(t, 40);

													// выставляет стоп-лосс в 20 пунктов 
													var stopLoss = new StopLossStrategy(t, 20);

													return new TakeProfitStopLossStrategy(takeProfit, stopLoss) { Trader = trader, Portfolio = _portfolio, Security = _lkoh };
												});

												// запускаем каждую стратегию
												protectiveStrategies.ForEach(strategy => strategy.Start());
											})
									.Apply();

								trader.RegisterOrder(order);
								Console.WriteLine("Заявка {0} зарегистрирована.", order.Id);
								break;
							}
							else
								Console.WriteLine("Текущее значение середины спреда {0:0.##}", _lkoh.BestBid.Price + mid);

							// ждем 1 секунду
							Thread.Sleep(1000);
						}

В примере, который в документации, protectiveStrategiesдобавляется в качестве дочерней. Поэтому каждую отдельную стратегию не надо инициализировать(передавать шлюз, портфель, инструмент, и т.д.) - все берется из родительской. И запускать через метод Start().


ChildStrategies.AddRange(protectiveStrategies);

В нашем случае, родительской нет(protectiveStrategiesсама ей является). Поэтому инициализируем и запускаем.


TakeProfitStopLossStrategy(takeProfit, stopLoss) { Trader = trader, Portfolio = _portfolio, Security = _lkoh };

...

strategy.Start()

Как то так. Вроде должно работать.[biggrin]

Спасибо: Sergey Masyura

Кудрев

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


На это выражение

> .Do(trades =>

{
  // для каждой сделки добавляем защитную пару стратегии
  var protectiveStrategies = trades.Select(t =></mark>

Ругаеться

Ошибка 1 Делегат "System.Action" не принимает "1" аргументов C:\Users\admin\Desktop\Новая папка\Samples\Quik\SampleConsole\Program.cs 174 41 SampleConsole

Ошибка 2 "StockSharp.Algo.MarketRule<StockSharp.BusinessEntities.Order,System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.MyTrade>>" не содержит определения для "Select" и не был найден метод расширения "Select", принимающий тип "StockSharp.Algo.MarketRule<StockSharp.BusinessEntities.Order,System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.MyTrade>>" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку) C:\Users\admin\Desktop\Новая папка\Samples\Quik\SampleConsole\Program.cs 177 72 SampleConsole

И на это выражение

// запускаем каждую стратегию protectiveStrategies.ForEach(strategy => strategy.Start());

Ошибка 3 "System.Linq.IQueryable" не содержит определения для "ForEach" и не был найден метод расширения "ForEach", принимающий тип "System.Linq.IQueryable" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку) C:\Users\admin\Desktop\Новая папка\Samples\Quik\SampleConsole\Program.cs 189 66 SampleConsole

Вот весь код программы

[list=1][*][list][*]namespace SampleConsole
{
    using System;
    using System.Linq;
    using System.Threading;

    using Ecng.Common;

    using StockSharp.BusinessEntities;
    using StockSharp.Quik;
    using StockSharp.Algo;
    using StockSharp.Algo.Strategies;

    class Program
    {
        private static Security _lkoh;
        private static Portfolio _portfolio;
        private static MarketDepth _depth;

        static void Main()
        {
            try
            {
                // для теста выбираем бумагу Лукойл
                const string secCode = "LKOH";

                var quikPath = QuikTerminal.GetDefaultPath();

                if (quikPath.IsEmpty())
                {
                    Console.WriteLine("Не найден ни один запущенный Quik");
                    return;
                }

                Console.WriteLine("Запущенный Quik найден по пути " + quikPath);

                Console.Write("Введите код клиента, через который будет выставлена заявка: ");
                var account = Console.ReadLine();

                using (var waitHandle = new AutoResetEvent(false))
                {
                    // создаем шлюз к Quik-у
                    using (var trader = new QuikTrader(quikPath))
                    {
                        // необходимо раскомментировать, если идет работа с РТС Стандарт
                        //trader.FormatTransaction += builder => builder.RemoveInstruction(TransactionBuilder.ExecutionCondition);

                        // подписываемся на событие успешного подключения
                        // все действия необходимо производить только после подключения
                        trader.Connected += () =>
                        {
                            Console.WriteLine("Подключение было произведено успешно.");

                            // извещаем об успешном соединени
                            waitHandle.Set();
                        };

                        Console.WriteLine("Производим подключение...");

                        trader.Connect();

                        // дожидаемся события об успешном соединении
                        waitHandle.WaitOne();

                        trader.NewPortfolios += portfolios =>
                        {
                            if (_portfolio == null)
                            {
                                // находим нужный портфель и присваиваем его переменной _portfolio
                                _portfolio = portfolios.FirstOrDefault(p => p.Name == account);

                                if (_portfolio != null)
                                {
                                    Console.WriteLine("Портфель {0} появился.", account);

                                    // если инструмент и стакан уже появились,
                                    // то извещаем об этом основной поток для выставления заявки
                                    if (_lkoh != null && _depth != null)
                                        waitHandle.Set();
                                }
                            }
                        };

                        // подписываемся на событие появление инструментов
                        trader.NewSecurities += securities =>
                        {
                            if (_lkoh == null)
                            {
                                // находим Лукойл и присваиваем ее переменной lkoh
                                _lkoh = securities.FirstOrDefault(sec => sec.Code == secCode);

                                if (_lkoh != null)
                                {
                                    Console.WriteLine("Инструмент Лукойл появился.");

                                    // запускаем экспорт стакана
                                    trader.RegisterMarketDepth(_lkoh);

                                    if (_portfolio != null && _depth != null)
                                        waitHandle.Set();
                                }
                            }
                        };

                        // подписываемся на событие появления моих новых сделок
                        trader.NewMyTrades += myTrades =>
                        {
                            foreach (var myTrade in myTrades)
                            {
                                var trade = myTrade.Trade;
                                var takeProfit = new TakeProfitStrategy(myTrade, 0.5);
                                var stopLoss = new StopLossStrategy(myTrade, 0.3);
                                Console.WriteLine("Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.", trade.Id, trade.Price, trade.Security.Code, trade.Volume, trade.Time);
                            }
                        };

                        // подписываемся на событие обновления стакана
                        trader.MarketDepthsChanged += depths =>
                        {
                            if (_depth == null && _lkoh != null)
                            {
                                _depth = depths.FirstOrDefault(d => d.Security == _lkoh);

                                if (_depth != null)
                                {
                                    Console.WriteLine("Стакан Лукойла появился.");

                                    // если портфель и инструмент уже появился, то извещаем об этом основной поток для выставления заявки
                                    if (_portfolio != null && _lkoh != null)
                                        waitHandle.Set();
                                }
                            }
                        };

                        Console.WriteLine("Дожидаемся появления в программе инструмента Лукойл и портфеля {0}...".Put(account));

                        // запускаем экспорт по DDE
                        trader.StartExport(new[]{ trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable,
						                   trader.EquityPortfoliosTable, trader.OrdersTable });

                        // дожидаемся появления портфеля и инструмента
                        waitHandle.WaitOne();

                        // 0.1% от изменения цены
                        const decimal delta = 0.001m;

                        // запоминаем первоначальное значение середины спреда
                        var firstMid = _lkoh.BestPair.SpreadPrice / 2;
                        if (_lkoh.BestBid == null)
                            throw new Exception("Нет лучшего бида для котировки.");

                        Console.WriteLine("Первоначальное значение середины спреда {0:0.##}", _lkoh.BestBid.Price + firstMid);
                        while (true)
                        {
                            var mid = _lkoh.BestPair.SpreadPrice / 2;

                            // если спред вышел за пределы нашего диапазона
                            if (
                                ((firstMid + firstMid * delta) <= mid) ||
                                ((firstMid - firstMid * delta) >= mid)
                                )
                            {
                                var order = new Order
                                {
                                    Portfolio = _portfolio,
                                    Price = _lkoh.ShrinkPrice(_lkoh.BestBid.Price + mid),
                                    Security = _lkoh,
                                    Volume = 1,
                                    Direction = OrderDirections.Buy,
                                };

                                order
                                    .WhenNewTrades()
                                    .Do(trades =>
                                        {
                                            // для каждой сделки добавляем защитную пару стратегии
                                            var protectiveStrategies = trades.Select(t =>
                                                {
                                                    // выставляет тейк-профит в 40 пунктов
                                                    var takeProfit = new TakeProfitStrategy(t, 40);

                                                    // выставляет стоп-лосс в 20 пунктов
                                                    var stopLoss = new StopLossStrategy(t, 20);

                                                    return new TakeProfitStopLossStrategy(takeProfit, stopLoss) { Trader = trader, Portfolio = _portfolio, Security = _lkoh };
                                                });

                                            // запускаем каждую стратегию
                                            protectiveStrategies.ForEach(strategy => strategy.Start());
                                        })

                                .Apply();

                                trader.RegisterOrder(order);
                                Console.WriteLine("Заявка {0} зарегистрирована.", order.Id);
                                break;
                            }
                            else
                                Console.WriteLine("Текущее значение середины спреда {0:0.##}", _lkoh.BestBid.Price + mid);

                            // ждем 1 секунду
                            Thread.Sleep(1000);

                        }
                    }
                }
            }
            finally
            {
            }
        }
    }
}[/list][/list]
Спасибо:

Alexander

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


Обращайтесь в нашу техническую поддержку, там вам компетентно помогут.

Спасибо:

Кудрев

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


Так я обучение не проходил у вас. Мне не помогут наверно.

Спасибо:

Alexander

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


Я про это. Помогут всем.

Спасибо:

Moadip

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


На это выражение

> .Do(trades =>

{
  // для каждой сделки добавляем защитную пару стратегии
  var protectiveStrategies = trades.Select(t =></mark>

Ругаеться

Ошибка 1 Делегат "System.Action" не принимает "1" аргументов C:\Users\admin\Desktop\Новая папка\Samples\Quik\SampleConsole\Program.cs 174 41 SampleConsole

Ошибка 2 "StockSharp.Algo.MarketRule<StockSharp.BusinessEntities.Order,System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.MyTrade>>" не содержит определения для "Select" и не был найден метод расширения "Select", принимающий тип "StockSharp.Algo.MarketRule<StockSharp.BusinessEntities.Order,System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.MyTrade>>" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку) C:\Users\admin\Desktop\Новая папка\Samples\Quik\SampleConsole\Program.cs 177 72 SampleConsole

И на это выражение

// запускаем каждую стратегию protectiveStrategies.ForEach(strategy => strategy.Start());

Ошибка 3 "System.Linq.IQueryable" не содержит определения для "ForEach" и не был найден метод расширения "ForEach", принимающий тип "System.Linq.IQueryable" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку) C:\Users\admin\Desktop\Новая папка\Samples\Quik\SampleConsole\Program.cs 189 66 SampleConsole

Проверил, все компилится и запускается.

Ошибка 1: Не понятно почему ругается. Ошибка 2: Не находит метод расширение Select, но вроде как у вас System.Linq подключен.

using System.Linq;

Ошибка 3: Не находит метод расширение ForEach, надо добавить пространство имен

using Ecng.Collections;

Предварительно подключив к проекту ecng.collections.dll, если не подключена.

Спасибо: Sergey Masyura

Кудрев

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


Вот код

namespace SampleConsole
{
    using System;
    using System.Linq;
    using System.Threading;

    using Ecng.Common;
    using Ecng.Collections;


    using StockSharp.BusinessEntities;
    using StockSharp.Quik;
    using StockSharp.Algo;
    using StockSharp.Algo.Strategies;

    class Program
    {
        private static Security RIZ2;
        private static Portfolio _portfolio;
        private static MarketDepth _depth;

        static void Main()
        {
            try
            {
                // для теста выбираем бумагу РТС
                const string secCode = "RIZ2";

                var quikPath = QuikTerminal.GetDefaultPath();

                if (quikPath.IsEmpty())
                {
                    Console.WriteLine("Не найден ни один запущенный Quik");
                    return;
                }

                Console.WriteLine("Запущенный Quik найден по пути " + quikPath);

                Console.Write("Введите код клиента, через который будет выставлена заявка: ");
                var account = Console.ReadLine();

                using (var waitHandle = new AutoResetEvent(false))
                {
                    // создаем шлюз к Quik-у
                    using (var trader = new QuikTrader(quikPath))
                    {
                        // необходимо раскомментировать, если идет работа с РТС Стандарт
                        //trader.FormatTransaction += builder => builder.RemoveInstruction(TransactionBuilder.ExecutionCondition);

                        // подписываемся на событие успешного подключения
                        // все действия необходимо производить только после подключения
                        trader.Connected += () =>
                        {
                            Console.WriteLine("Подключение было произведено успешно.");

                            // извещаем об успешном соединени
                            waitHandle.Set();
                        };

                        Console.WriteLine("Производим подключение...");

                        trader.Connect();

                        // дожидаемся события об успешном соединении
                        waitHandle.WaitOne();

                        trader.NewPortfolios += portfolios =>
                        {
                            if (_portfolio == null)
                            {
                                // находим нужный портфель и присваиваем его переменной _portfolio
                                _portfolio = portfolios.FirstOrDefault(p => p.Name == account);

                                if (_portfolio != null)
                                {
                                    Console.WriteLine("Портфель {0} появился.", account);

                                    // если инструмент и стакан уже появились,
                                    // то извещаем об этом основной поток для выставления заявки
                                    if (RIZ2 != null && _depth != null)
                                        waitHandle.Set();
                                }
                            }
                        };

                        // подписываемся на событие появление инструментов
                        trader.NewSecurities += securities =>
                        {
                            if (RIZ2 == null)
                            {
                                // находим РТС и присваиваем ее переменной riz2
                                RIZ2 = securities.FirstOrDefault(sec => sec.Code == secCode);

                                if (RIZ2 != null)
                                {
                                    Console.WriteLine("Инструмент ртс появился.");

                                    // запускаем экспорт стакана
                                    trader.RegisterMarketDepth(RIZ2);

                                    if (_portfolio != null && _depth != null)
                                        waitHandle.Set();
                                }
                            }
                        };

                        // подписываемся на событие появления моих новых сделок
                        trader.NewMyTrades += myTrades =>
                        {
                            foreach (var myTrade in myTrades)
                            {
                                var trade = myTrade.Trade;
                                Console.WriteLine("Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.", trade.Id, trade.Price, trade.Security.Code, trade.Volume, trade.Time);
                            }
                        };

                        // подписываемся на событие обновления стакана
                        trader.MarketDepthsChanged += depths =>
                        {
                            if (_depth == null && RIZ2 != null)
                            {
                                _depth = depths.FirstOrDefault(d => d.Security == RIZ2);

                                if (_depth != null)
                                {
                                    Console.WriteLine("Стакан РТС появился.");

                                    // если портфель и инструмент уже появился, то извещаем об этом основной поток для выставления заявки
                                    if (_portfolio != null && RIZ2 != null)
                                        waitHandle.Set();
                                }
                            }
                        };

                        Console.WriteLine("Дожидаемся появления в программе инструмента РТС и портфеля {0}...".Put(account));

                        // запускаем экспорт по DDE
                        trader.StartExport(new[]{ trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable,
						                   trader.EquityPortfoliosTable, trader.OrdersTable });

                        // дожидаемся появления портфеля и инструмента
                        waitHandle.WaitOne();

                        var order = new Order
                        {
                            Portfolio = _portfolio,
                            Price = RIZ2.ShrinkPrice(RIZ2.BestBid.Price + 0),
                            Security = RIZ2,
                            Volume = 1,
                            Direction = OrderDirections.Buy,
                        };

                        order
                            .WhenNewTrades()
                            .Do(trades =>
                            {
                                // для каждой сделки добавляем защитную пару стратегии
                                var protectiveStrategies = trades.Select(t =>
                                {
                                    // выставляет тейк-профит в 40 пунктов
                                    var takeProfit = new TakeProfitStrategy(t, 40);

                                    // выставляет стоп-лосс в 20 пунктов
                                    var stopLoss = new StopLossStrategy(t, 40);

                                    return new TakeProfitStopLossStrategy(takeProfit, stopLoss) { Trader = trader, Portfolio = _portfolio, Security = RIZ2 };
                                });
                            });
                    }
                }
            }
            finally
            {
            }
        }
    }
}

Вроде прописал чтобы на мою сделку открывались зашитные заявки а они не появляються. Пробую в Квик-юниор. Что делать не знаю.

Спасибо:

Alexander

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


Ответ давал выше. Обратиться в техническую поддержку.

Спасибо:


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

loading
clippy