Помогите прописать событие.
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 =>


Ругаеться

Ошибка 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<TResult>" не содержит определения для "ForEach" и не был найден метод расширения "ForEach", принимающий тип "System.Linq.IQueryable<TResult>" в качестве первого аргумента (возможно, пропущена директива 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 =>


Ругаеться

Ошибка 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<TResult>" не содержит определения для "ForEach" и не был найден метод расширения "ForEach", принимающий тип "System.Linq.IQueryable<TResult>" в качестве первого аргумента (возможно, пропущена директива 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