takeprofit & stoploss
Atom
11.01.2012
tmt


[biggrin] я наверное уже замучал))
Вот из этого примера http://www.stocksharp.co...7-985a-1654e8d9cfc1.htm не понятно мне, сл и тп для общей позиции устанавливается? (просто когда ставим там сл и тп, мы нигде не упоминаем longPos)
И есть ли где рабочий пример, так проще понять.

Теги:


Спасибо:


< 1 2 3 4 5  >
Alexander

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


Советую хотя бы раз прочитать документацию. Количество подобных вопросов уменьшится. :)
В документации и примерах есть как именно инициализировать, создавать и запускать стратегию.
Спасибо:

tmt

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


А где мне искать, какой шлюз? я почитал, и в примерах шлюз создается
Код
var trader = new SmartTrader(login, password, ip)
а инициализация вроде как понятно. как ее делать..
<имя класса> <объект> = new <класс>
Спасибо:

BigBen

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


Для начала, в посте http://stocksharp.com/posts/m/15613/
buy _strategy = new buy();
_strategy.Start();

находятся внутри бесконечного цикла
while (true)

Эачем?
Спасибо:

tmt

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


BigBen
Для начала, в посте http://stocksharp.com/posts/m/15613/
buy _strategy = new buy();
_strategy.Start();

находятся внутри бесконечного цикла
while (true)

Эачем?

Из цикла я давно убрал, поставил перед (да и цикл думаю можно убрать, если класс будет повторяться)
Спасибо:

BigBen

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


Не знаю, как в последней версии программы, но по тексту в http://stocksharp.com/posts/m/15613/ не видно, чтобы вызывался метод OnStarting(), т.е. отсутствует

protected override void OnStarting()
{
.........................................................
}
Спасибо:

tmt

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


BigBen
Не знаю, как в последней версии программы, но по тексту в http://stocksharp.com/posts/m/15613/ не видно, чтобы вызывался метод OnStarting(), т.е. отсутствует

protected override void OnStarting()
{
.........................................................
}


protected ProcessResults OnProcess() тоже не было у меня.. А что то должно быть в этом OnStarting()
Ниже код последней версии

И спасибо большое что помогаешь!


Код
namespace SampleSmartConsole
{
	using System;
    using System.Net;
	using System.Linq;
	using System.Threading;
    using System.Collections.Generic;

	using Ecng.Collections;
	using Ecng.Common;

	using StockSharp.BusinessEntities;
	using StockSharp.Smart;
	using StockSharp.Algo;
    using StockSharp.Algo.Strategies;

	class Program
	{
		private static Security _instrument;
		private static Portfolio _portfolio;
        private static MarketDepth _depth;
        private static Position _position;
        //private static buy _strategy;

        public class buy : Strategy
        {

            protected override void OnStarting()
            {
                //OpenPosition(); тут вобщем какие то действия при старте (в примере вроде как машки рисует или какие то значения присваивает)
                base.OnStarting();
            }

            protected ProcessResults OnProcess()
            {
                OpenPosition(); //а это уже процесс работы стратегии
                return ProcessResults.Continue;
            }

            public void OpenPosition()
            {
                var objem = _position.CurrentValue;
                if (objem == 0)
                {
                    // создаем заявку для открытия длинной позиции
                    //var longPos = this.BuyAtMarket();
                    var longPos = new Order
                    {
                        Portfolio = _portfolio,
                        Price = _instrument.ShrinkPrice(_instrument.BestAsk.Price),
                        Security = _instrument,
                        Volume = 1,
                        Direction = OrderDirections.Sell,
                    };

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

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

            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(takeProfit, stopLoss);
                });

                ChildStrategies.AddRange(protectiveStrategies);
            }
        }

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

				//Console.Write("Введите логин: ");
				//var login = Console.ReadLine();
                var login = "ST12858";

				//Console.Write("Введите пароль: ");
				//var password = Console.ReadLine();
                var password = "8YDJ7E";

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

                IPAddress ipadress = IPAddress.Parse("95.131.26.246");
                IPEndPoint ip = new IPEndPoint(ipadress, 8090);
                
				using (var waitHandle = new AutoResetEvent(false))
				{
					// создаем шлюз к Smart-у
					using (var trader = new SmartTrader(login, password, ip))
					{
						// подписываемся на событие успешного подключения
						// все действия необходимо производить только после подключения
						trader.Connected += () =>
						{
							Console.WriteLine("Подключение было произведено успешно.");

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

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

						trader.Connect();

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

						// подписываемся на все портфели-счета
						trader.NewPortfolios += portfolios =>
						{
							// необходимое условие работы в SmartCOM
							portfolios.ForEach(trader.RegisterPortfolio);

							if (_portfolio == null)
							{
								_portfolio = portfolios.FirstOrDefault(p => p.Name == account);

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

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

						// подписываемся на событие появление инструментов
                        trader.NewPositions += positions =>
                        {
                            if (_position == null)
                            {
                                _position = positions.FirstOrDefault();
                                //_position = positions.FirstOrDefault(sec => sec.Security.Code == secCode);
                                if (_position != null)
                                {
                                    Console.WriteLine("Информация о портфеле появилась.");
                                    if (_portfolio != null && _depth != null && _instrument != null)
                                        waitHandle.Set();
                                }
                            }
                        };
						trader.NewSecurities += securities =>
						{
							if (_instrument == null)
							{
                                // находим инструмент и присваиваем ее переменной _instrument
                                _instrument = securities.FirstOrDefault(sec => sec.Code == secCode && sec.Type == SecurityTypes.Future);

								if (_instrument != null)
								{
									Console.WriteLine("Инструмент появился.");
                                    trader.RegisterQuotes(_instrument); // запускаем экспорт стакана
                                    if (_portfolio != null && _depth != null && _position != null)
										waitHandle.Set();
								}
							}
						};

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

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

                                    if (_portfolio != null && _position != 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);
							}
						};
                        
						Console.WriteLine("Дожидаемся появления в программе инструмента и портфеля {0}...".Put(account));

						// запускаем экспорт по инструментам и портфелям
						trader.StartExport();

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

						trader.SecuritiesChanged += securities =>
						{
							// если инструмент хоть раз изменился (по нему пришли актуальные данные)
							if (securities.Contains(_instrument))
								waitHandle.Set();
						};

						Console.WriteLine("Дожидаемся обновления данных по инструменту...");

						// запускаем обновление по инструменту
						trader.RegisterSecurity(_instrument);
						waitHandle.WaitOne();

						// запоминаем первоначальное значение середины спреда
                        var totb = _depth.TotalBidsVolume;
                        var tota = _depth.TotalAsksVolume;

                        int maxaskv = 0;
                        int maxbidv = 0;
                        int maxaskp = 0;
                        int maxbidp = 0;
                        var asks = _depth.Asks;
                        var bids = _depth.Bids;
                        for (int i = 0; i < 50; i++)
                        {
                            if (asks[i].Volume > maxaskv) { maxaskv = (int)asks[i].Volume; maxaskp = (int)asks[i].Price; }
                            if (bids[i].Volume > maxbidv) { maxbidv = (int)bids[i].Volume; maxbidp = (int)bids[i].Price; }
                        }
                        Console.WriteLine("maxask {0}", maxaskv);
                        Console.WriteLine("maxbid {0}", maxbidv);

						if (_instrument.BestBid == null)
							throw new Exception("Нет лучшего бида для котировки.");

                        Console.WriteLine("общий объем bid {0}", totb);
                        Console.WriteLine("общий объем ask {0}", tota);

                        buy _strategy = new buy();
                        _strategy.Start();


                        for (int i = 0; i <= 50; i++)
                        {
                            var objem = _position.CurrentValue;
                            Console.WriteLine("открытые позиции {0}", objem);

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

						// останавливаем экспорт
						trader.StopExport();
                        Console.WriteLine("StopExport");
                        Console.ReadKey();
					}
				}
			}
			catch (Exception ex)
			{
				Console.WriteLine(ex);
                Console.WriteLine("catch");
                Console.ReadKey();
			}
		}
	}
}
Спасибо:

BigBen

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


Почитай про событийную модель, там и пример есть
http://stocksharp.com/do...0-aba8-0d4b93dea60e.htm
Спасибо:

fau

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


а почему у вас в процедуре OpenPosition регистрация заявки после ожидания сделок по ней?
Спасибо:

tmt

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


fau
а почему у вас в процедуре OpenPosition регистрация заявки после ожидания сделок по ней?

Я взял консольный пример и из него пытаюсь сделать нужное мне, ну и собственно учусь, как это сделать (возможно там куча ошибок, но я с такими простыми разобраться не мог... И спасибо за замечание!)

BigBen, Я походу разобрался! по крайней мере ошибки при запуске нету, посмотрим через пол часика, откроет ли он позицию (ну и собственно СЛ и ТП)
Спасибо:

tmt

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


В общем вот так сделал

Код
            protected override void OnStarting()
            {
                this
            .When(base.Security.Changed())
            .Do(OpenPosition);
                //OpenPosition();
                base.OnStarting();
            }

            /*protected ProcessResults OnProcess()
            {
                OpenPosition();
                return ProcessResults.Continue;
            }*/


теперь выводит


на 262 строке _strategy.Start();
а 30 строка. там this из процедуры OnStarting()

Вобщем думаю что проблема с правилами для стратегии.. щас почитаю в докуметакции про правила
Спасибо:
< 1 2 3 4 5  >

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

loading
clippy