Дочерние стратегии StopLoss и TakeProfit.

Дочерние стратегии StopLoss и TakeProfit.


Добрый день! Пытаюсь выставить заявки типа стоп лимит и тейк профит так:

                var order = new Order()
                {
                    Type = OrderTypes.Market,
                    Direction = isShortLessThenLong ? Sides.Sell : Sides.Buy,
                    Volume = Position == 0 ? Volume : Volume * 2,
                };
                order.WhenNewTrade(Connector).Do((trade) =>
                    {
                            var takeProfit = new TakeProfitStrategy(trade, 20);
                            var stopLoss = new StopLossStrategy(trade, 10);
                            var protectiveStrategies = new TakeProfitStopLossStrategy(takeProfit, stopLoss);
                            ChildStrategies.Add(protectiveStrategies);
                    })
                    .Apply(this);

                RegisterOrder(order);

Как только приходит сделка сразу же исполняется отложенный ордер. В примере SampleQuik при выставлении стоп заявки таблица стоп заявок пишет "Ошибка". Как правильно выставлять стопы и тейки?

И еще вопрос. С помощью какого элемента графики рисовать стопы на графике? Пробовал рисовать LineElement но исключение пишет что элемент поддерживается.




Thanks:


< 1 2 3  >
Константин

Avatar
Date: 3/26/2018
Reply


Для стопов и тейков есть элемент для отрисовки на графике?

Thanks:

Support

Avatar
Date: 3/27/2018
Reply


Добрый день

График не зависит от типов торговых данных. Вы можете изобразить ваши заявки любым подходящим элементом графика. Например уровнями http://doc.stocksharp.ru/html/T_StockSharp_Xaml_Charting_ChartOrderElement.htm Наш пример SampleActiveOrders демонстрирует работу с данным элементом.

Thanks:

Константин

Avatar
Date: 4/11/2018
Reply


SampleActiveOrders это немного не то. Вот так можно ли как то рисовать?

Thanks:

Support

Avatar
Date: 4/12/2018
Reply


Добрый день

Вы можете использовать маркер заявок. Пример использования показан в SampleChartActiveOrders

79f0ac5f8fd5d57e2febe73ccdd8e5fd.png

Thanks:

Константин

Avatar
Date: 4/12/2018
Reply


Здравствуйте! Я смотрел этот пример. Я же написал что это немного не то. Если я буду использовать трейлинг то на истории я не смогу видеть как он смещался. SampleChartActiveOrders показывает просто уровни. На скрине выше видно как стоп смещается. Может можно использовать значения не привязанные к ордерам? Рисовать ломаную линию на графике указав координаты оси X (время) и оси Y (цена).

Thanks:

Support

Avatar
Date: 4/13/2018
Reply


Все элементы графика не привязаны к торговым объектам. Вы можете выбрать подходящий элемент и рисовать на графике в произвольном стиле.

Thanks:

Константин

Avatar
Date: 6/3/2018
Reply


Добрый день! Я не понимаю как можно рисовать в произвольном стиле. Метод добавления данных на график (ChartDrawData.Add();) принимает аргумент типа IIndicatorValue. Перегрузки с аргументом типа decimal нет. При попытке передать decimal выбрасывает исключение, при чем ошибки уровня компиляции нет. Скрин: https://yadi.sk/i/UCLUsVhF3WxFnE Пробовал создать класс реализующий интерфейс IIndicatorValue, но так и не понял куда передать нужное значение. Код:

public partial class MainWindow : Window
    {
        private readonly QuikTrader _trader;
        private Security _security;
        public static CandleManager CandleManager { get; private set; }
        public static CandleSeries Series { get; private set; }
        public CandleSeries CandleSeries { get; private set; }
        public ChartCandleElement ChartCandleElement { get; private set; }
        public ChartIndicatorElement Line { get; private set; }
        public bool IsRealtiem { get; private set; }
        public TimeSpan TimeFrame => TimeSpan.FromMinutes(1);
        public MainWindow()
        {
            InitializeComponent();
            _trader = new QuikTrader();
            _trader.NewSecurity += security =>
            {
                if (security.Id == "SBER@QJSIM" && _security == null)
                {
                    _security = security;
                    Start();
                }
            };
            _trader.Connect();

        }

        private void Start()
        {
            if (CandleManager == null) CandleManager = new CandleManager(_trader);
            if (CandleSeries == null) CandleSeries = new CandleSeries(typeof(TimeFrameCandle), _security, TimeFrame);

            this.GuiAsync(() =>
            {
                InitCart();
                StartButton.IsEnabled = StopButton.IsEnabled = true;
            });
        }

        public void InitCart()
        {
            Chart.ClearAreas();

            var area = new ChartArea();
            var yAxis = area.YAxises.First();
            yAxis.AutoRange = true;
            Chart.IsAutoScroll = true;
            Chart.ShowOverview = true;
            Chart.AddArea(area);
            ChartCandleElement = new ChartCandleElement();
            Chart.AddElement(area, ChartCandleElement);
            Line = new ChartIndicatorElement(){DrawStyle = ChartIndicatorDrawStyles.Line};
            Chart.AddElement(area, Line);
        }

        private void DisplayNewMarketData(CandleSeries candleSeries, Candle candle)
        {
            IsRealtiem = candle.OpenTime + TimeFrame >= DateTimeOffset.Now || IsRealtiem;

            var chartDrawData = new ChartDrawData();
            var group = chartDrawData.Group(candle.OpenTime);
            group.Add(ChartCandleElement, candle);
            group.Add(Line, 221.1m); // Добавляем данные для отрисовки 
            if (IsRealtiem || candle.State == CandleStates.Finished)
                Chart.Draw(chartDrawData);
        }

        private void StartButton_Click(object sender, RoutedEventArgs e)
        {
            CandleManager.Processing += DisplayNewMarketData;
            CandleManager.Start(CandleSeries);
        }

        private void StopButton_Click(object sender, RoutedEventArgs e)
        {
            CandleManager.Processing -= DisplayNewMarketData;
            CandleManager.Stop(CandleSeries);
            IsRealtiem = false;
            InitCart();
        }
    }
Thanks:

Support

Avatar
Date: 6/6/2018
Reply


Добрый день

Есть два варианта: 1) Подобрать подходящий графически индикатор и передавать в него значения. В этом варианте вы контролируете что именно рисовать. 2) Изменить существующий индикатор путём переопределение интерфейса IIndicatorPainter. В этом варианте вы контролируете как именно рисовать данные.

Thanks:

Константин

Avatar
Date: 6/7/2018
Reply


Про IIndicatorPainter не понял. Как можно переопределить интерфейс? Да и интерфейса такого я не нашел. Есть IChartIndicatorPainter. Вы его имели в виду? То есть для того что бы рисовать индикатор так, как мне нужно мне надо создать класс реализующий IChartIndicatorPainter, а затем экземпляр этого класса передать в ChartIndicatorElement.IndicatorPainter? Верно? Если да то можно ли где то посмотреть реализацию такого класса? Не очень понятно как реализовывать методы этого интерфейса.

Thanks:

Support

Avatar
Date: 6/8/2018
Reply


Добрый день

Ниже реализация отрисовщика для индикатора Ишимоку

namespace StockSharp.Xaml.Charting.IndicatorPainters
{
	using System;
	using System.Collections.Generic;
	using System.ComponentModel.DataAnnotations;
	using System.Windows.Media;

	using Ecng.Serialization;
	using Ecng.Xaml;

	using StockSharp.Algo.Indicators;
	using StockSharp.Localization;

	/// <summary>
	/// The renderer for <see cref="Ichimoku"/>.
	/// </summary>
	[Indicator(typeof(Ichimoku))]
	public class IchimokuPainter : BaseChartIndicatorPainter
	{
		private ChartIndicatorElement _tenkan;
		private ChartIndicatorElement _kijun;
		private ChartIndicatorElement _senkouA;
		private ChartIndicatorElement _chinkou;

		/// <summary>
		/// <see cref="Ichimoku.Tenkan"/> line color.
		/// </summary>
		[Display(
			ResourceType = typeof(LocalizedStrings),
			Name = LocalizedStrings.Str2039Key,
			Description = LocalizedStrings.Str2040Key)]
		public Color TenkanColor { get; set; } = Colors.Red;

		/// <summary>
		/// <see cref="Ichimoku.Kijun"/> line color.
		/// </summary>
		[Display(
			ResourceType = typeof(LocalizedStrings),
			Name = LocalizedStrings.Str2041Key,
			Description = LocalizedStrings.Str2042Key)]
		public Color KijunColor { get; set; } = Colors.Blue;

		/// <summary>
		/// <see cref="Ichimoku.SenkouA"/> line color.
		/// </summary>
		[Display(
			ResourceType = typeof(LocalizedStrings),
			Name = LocalizedStrings.Str2043Key,
			Description = LocalizedStrings.Str2044Key)]
		public Color SenkouAColor { get; set; } = Colors.SandyBrown;

		/// <summary>
		/// <see cref="Ichimoku.SenkouB"/> line color.
		/// </summary>
		[Display(
			ResourceType = typeof(LocalizedStrings),
			Name = LocalizedStrings.Str2045Key,
			Description = LocalizedStrings.Str2046Key)]
		public Color SenkouBColor { get; set; } = Colors.Thistle;

		/// <summary>
		/// <see cref="Ichimoku.Chinkou"/> line color.
		/// </summary>
		[Display(
			ResourceType = typeof(LocalizedStrings),
			Name = LocalizedStrings.Str2047Key,
			Description = LocalizedStrings.Str2048Key)]
		public Color ChinkouColor { get; set; } = Colors.Green;

		/// <summary>
		/// To initialize renderer.
		/// </summary>
		/// <returns>Graphical data.</returns>
		public override IEnumerable<ChartIndicatorElement> Init()
		{
			InnerElements.Clear();

			InnerElements.Add(_tenkan = new ChartIndicatorElement
			{
				DrawStyle = ChartIndicatorDrawStyles.Line,
				Color = TenkanColor,
				StrokeThickness = BaseElement.StrokeThickness,
				Title = LocalizedStrings.Str764
			});

			InnerElements.Add(_kijun = new ChartIndicatorElement
			{
				DrawStyle = ChartIndicatorDrawStyles.Line,
				Color = KijunColor,
				StrokeThickness = BaseElement.StrokeThickness,
				Title = LocalizedStrings.Str765
			});

			InnerElements.Add(_senkouA = new ChartIndicatorElement
			{
				DrawStyle = ChartIndicatorDrawStyles.Band,
				Color = SenkouAColor,
				AdditionalColor = SenkouBColor,
				StrokeThickness = BaseElement.StrokeThickness,
				Title = LocalizedStrings.Str767
			});

			InnerElements.Add(_chinkou = new ChartIndicatorElement
			{
				DrawStyle = ChartIndicatorDrawStyles.Line,
				Color = ChinkouColor,
				StrokeThickness = BaseElement.StrokeThickness,
				Title = LocalizedStrings.Str768
			});

			return InnerElements;
		}

		/// <summary>
		/// To process new values.
		/// </summary>
		/// <param name="time">The time stamp of the new data generation.</param>
		/// <param name="value">Indicator values.</param>
		/// <param name="draw">The method of value drawing on the chart.</param>
		public override void ProcessValues(DateTimeOffset time, IIndicatorValue value, DrawHandler draw)
		{
			if (!value.IsFormed)
			{
				draw(_tenkan, 0, double.NaN);
				draw(_kijun, 0, double.NaN);
				draw(_senkouA, 0, double.NaN, double.NaN);
				draw(_chinkou, 0, double.NaN);
			}
			else
			{
				var values = value.GetSimpleValues();
				var ind = (Ichimoku)value.Indicator;

				draw.TryDraw(_tenkan, 0, values[ind.Tenkan]);
				draw.TryDraw(_kijun, 0, values[ind.Kijun]);
				draw.TryDraw(_senkouA, 0, values[ind.SenkouA], values[ind.SenkouB]);
				draw(_chinkou, 0, double.NaN);
				draw.TryDraw(_chinkou, ind.Kijun.Length, values[ind.Chinkou]);
			}
		}

		#region IPersistable

		/// <summary>
		/// Load settings.
		/// </summary>
		/// <param name="storage">Settings storage.</param>
		public override void Load(SettingsStorage storage)
		{
			TenkanColor = storage.GetValue<SettingsStorage>(nameof(TenkanColor)).ToColor();
			KijunColor = storage.GetValue<SettingsStorage>(nameof(KijunColor)).ToColor();
			SenkouAColor = storage.GetValue<SettingsStorage>(nameof(SenkouAColor)).ToColor();
			SenkouBColor = storage.GetValue<SettingsStorage>(nameof(SenkouBColor)).ToColor();
			ChinkouColor = storage.GetValue<SettingsStorage>(nameof(ChinkouColor)).ToColor();
		}

		/// <summary>
		/// Save settings.
		/// </summary>
		/// <param name="storage">Settings storage.</param>
		public override void Save(SettingsStorage storage)
		{
			storage.SetValue(nameof(TenkanColor), TenkanColor.ToStorage());
			storage.SetValue(nameof(KijunColor), KijunColor.ToStorage());
			storage.SetValue(nameof(SenkouAColor), SenkouAColor.ToStorage());
			storage.SetValue(nameof(SenkouBColor), SenkouBColor.ToStorage());
			storage.SetValue(nameof(ChinkouColor), ChinkouColor.ToStorage());
		}

		#endregion
	}
}
Thanks:
< 1 2 3  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy