UsilaDobry 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Дата: 01.05.2013
					
					
			
					 
					 
					
	
			Увидел в Вас в примере код свойства: Код
private bool NoActiveOrders
 {  get { return Orders.Count(o => o.State != OrderStates.Done) == 0 && PendingOrders.Count() == 0; } }
 Я бы его написал вот так Код
private bool NoActiveOrders { get { return Orders.Count(o => o.State == OrderStates.Active) == 0; } }
 А в чем замысел?
			
			
			
			
		
  
				 | 
			
			
				| 
					
				 | 
				
					
	
		| 
			Спасибо:
		 | 
		
		
			 
		 | 
	 
 
				 | 
			
			
				| 
					
				 | 
			
		
			
  | 
		
			
				
					UsilaDobry 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Дата: 21.05.2013
					
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
								 
							 | 
						 
					 
			
					 
					 
					
	
			Что-то я не пойму, как мне коллекцию свечей из метода GetHistoryCandles(); передать в метод ProcessCandle(CandleSeries series, Candle candle)?.. В уроке метод Draw(Candle), принимает только свечи, а у меня при выводе на график ProcessCandle(CandleSeries series, Candle candle) принимает еще и серию свечей... В моем варианте использовать метод  GetHistoryCandles() не получится? Код
private void ChartButton_Click(object sender, RoutedEventArgs e)
        {
                
                if (TpTimeFrame.Value == null)
                {
                    MessageBox.Show("Введите значение таймфрейм");
                    return;
                }
                
                var timeFrame = TpTimeFrame.Value.Value.TimeOfDay;
                
                GetHistoryCandles();???????
                
                RunProcessGetCandles(timeFrame);
                ChartButton.Content = "Очистить график";
         }
        /// <summary>
        /// Исторические свечки
        /// </summary>
        /// <returns>Коллекция свечей</returns>
        private IEnumerable<Candle> GetHistoryCandles()
        {
            try
            {
                if (SourceHistoryComboBox.SelectedIndex == 0)
                {
                   //закачка с сайта финама
                   return Finam.History.GetHistoryCandles(
                       ConnectionInterface.SelectedSecurity,
                       TpTimeFrame.Value.Value.TimeOfDay,
                       BeginDataPicker.SelectedDate.Value,
                       EndDataPicker.SelectedDate.Value);
                }
                else
                return new Candle[0];
            }
            catch (Exception ex)
            {
                MessageBox.Show("Unable to retrive historical candles. " + ex.Message);
                return new Candle[0];
            }
        }
         
        /// <summary>
        /// Метод инициирования среды для получения свечей и дальнейшей отрисовки
        /// </summary>
        /// <param name="timeFrame">Тайм-фрейм для свечей</param>
        private void RunProcessGetCandles(TimeSpan timeFrame)
        {
            _candleManager = new CandleManager(ConnectionInterface.SafeConnection.Trader);
            var security = ConnectionInterface.SelectedSecurity;
            var series = new CandleSeries(typeof(TimeFrameCandle), security, timeFrame);
            series.WorkingTime.Times[0].Min = TimeSpan.FromHours(0);
            series.WorkingTime.Times[0].Max = TimeSpan.FromHours(23);
            
            _candleManager.Processing += ProcessCandle;
            
            _candleManager.Start(series);
        }
        private void ProcessCandle(CandleSeries series, Candle candle)
        {
            try
            {
                if (candle.State == CandleStates.Finished)
                {
                    var valueSar = _chartParabolicElement.Indicator.Process(new CandleIndicatorValue(candle) { IsFinal = true });
                    var valueBb = _chartBollingerElement.Indicator.Process(new CandleIndicatorValue(candle) { IsFinal = true });
                    this.GuiAsync(() => Chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
                {
                    {_chartCandleElement, candle},
                    {_chartParabolicElement, new ChartIndicatorValue(_chartParabolicElement.Indicator, valueSar)},
                    {_chartBollingerElement, new ChartIndicatorValue(_chartBollingerElement.Indicator, valueBb)}
                }));
                }
                else
                {
                    this.GuiAsync(() => Chart.ProcessCandle(_chartCandleElement, candle));
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.ToString());
            }
        }
  
			
			
			
			
		
 
				 | 
			
			
				| 
					
				 | 
				
					
	
		| 
			Спасибо:
		 | 
		
		
			 
		 | 
	 
 
				 | 
			
			
				| 
					
				 | 
			
		
			
  | 
		
			
				
					IvanB 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Дата: 21.05.2013
					
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
								 
							 | 
						 
					 
			
					 
					 
					
	
			UsilaDobry Что-то я не пойму, как мне коллекцию свечей из метода GetHistoryCandles(); передать в метод ProcessCandle(CandleSeries series, Candle candle)?.. В уроке метод Draw(Candle), принимает только свечи, а у меня при выводе на график ProcessCandle(CandleSeries series, Candle candle) принимает еще и серию свечей... В моем варианте использовать метод  GetHistoryCandles() не получится? Код
private void ChartButton_Click(object sender, RoutedEventArgs e)
        {
                
                if (TpTimeFrame.Value == null)
                {
                    MessageBox.Show("Введите значение таймфрейм");
                    return;
                }
                
                var timeFrame = TpTimeFrame.Value.Value.TimeOfDay;
                
                GetHistoryCandles();???????
                
                RunProcessGetCandles(timeFrame);
                ChartButton.Content = "Очистить график";
         }
        /// <summary>
        /// Исторические свечки
        /// </summary>
        /// <returns>Коллекция свечей</returns>
        private IEnumerable<Candle> GetHistoryCandles()
        {
            try
            {
                if (SourceHistoryComboBox.SelectedIndex == 0)
                {
                   //закачка с сайта финама
                   return Finam.History.GetHistoryCandles(
                       ConnectionInterface.SelectedSecurity,
                       TpTimeFrame.Value.Value.TimeOfDay,
                       BeginDataPicker.SelectedDate.Value,
                       EndDataPicker.SelectedDate.Value);
                }
                else
                return new Candle[0];
            }
            catch (Exception ex)
            {
                MessageBox.Show("Unable to retrive historical candles. " + ex.Message);
                return new Candle[0];
            }
        }
         
        /// <summary>
        /// Метод инициирования среды для получения свечей и дальнейшей отрисовки
        /// </summary>
        /// <param name="timeFrame">Тайм-фрейм для свечей</param>
        private void RunProcessGetCandles(TimeSpan timeFrame)
        {
            _candleManager = new CandleManager(ConnectionInterface.SafeConnection.Trader);
            var security = ConnectionInterface.SelectedSecurity;
            var series = new CandleSeries(typeof(TimeFrameCandle), security, timeFrame);
            series.WorkingTime.Times[0].Min = TimeSpan.FromHours(0);
            series.WorkingTime.Times[0].Max = TimeSpan.FromHours(23);
            
            _candleManager.Processing += ProcessCandle;
            
            _candleManager.Start(series);
        }
        private void ProcessCandle(CandleSeries series, Candle candle)
        {
            try
            {
                if (candle.State == CandleStates.Finished)
                {
                    var valueSar = _chartParabolicElement.Indicator.Process(new CandleIndicatorValue(candle) { IsFinal = true });
                    var valueBb = _chartBollingerElement.Indicator.Process(new CandleIndicatorValue(candle) { IsFinal = true });
                    this.GuiAsync(() => Chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
                {
                    {_chartCandleElement, candle},
                    {_chartParabolicElement, new ChartIndicatorValue(_chartParabolicElement.Indicator, valueSar)},
                    {_chartBollingerElement, new ChartIndicatorValue(_chartBollingerElement.Indicator, valueBb)}
                }));
                }
                else
                {
                    this.GuiAsync(() => Chart.ProcessCandle(_chartCandleElement, candle));
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.ToString());
            }
        }
  Можно сделать так: Код
foreach (var candle in GetHistoryCandles())
{
   ProcessCandle(null, candle);
}
 В методе ProcessCandle Вы не используете аргумент CandleSeries series, можно подписаться на получение свечей так: series.ProcessCandle += ProcessCandle; в место этого: _candleManager.Processing += ProcessCandle; и изменить заголовок метода: private void ProcessCandle(Candle candle) тогда получать свечи можно так: Код
foreach (var candle in GetHistoryCandles())
{
   ProcessCandle(candle);
}
 
			
			
			
			
		
 
				 | 
			
			
				| 
					
				 | 
				
					
				 | 
			
			
				| 
					
				 | 
			
		
			
  | 
		
			
				
					UsilaDobry 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Дата: 23.05.2013
					
					
			
					 
					 
					
	
			IvanB В методе ProcessCandle Вы не используете аргумент CandleSeries series, можно подписаться на получение свечей так: series.ProcessCandle += ProcessCandle; в место этого: _candleManager.Processing += ProcessCandle; и изменить заголовок метода: private void ProcessCandle(Candle candle) тогда получать свечи можно так: Код
foreach (var candle in GetHistoryCandles())
{
   ProcessCandle(candle);
}
  Может в таком случае можно не использовать foreach, а сделать как в видео-уроке Код
GetHistoryCandles().ForEach(ProcessCandle); 
 но я не могу этого сейчас испробовать, поскольку срок на демосервер истек, а новые ключи вчера получил, но они не прокатывают. Написал письмо в техподдержку Квика, пока молчат... Процесс остановился [biggrin]  Наконец-то подключили... Проверил, такой вариант работает, но график индикаторов выводит не корректно...
			
			
			
			
		
  
				 | 
			
			
				| 
					
				 | 
				
					
	
		| 
			Спасибо:
		 | 
		
		
			 
		 | 
	 
 
				 | 
			
			
				| 
					
				 | 
			
		
			
  | 
		
			
				
					UsilaDobry 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Дата: 24.05.2013
					
					
			
					 
					 
					
	
			И таким способом Код
foreach (var candle in GetHistoryCandles())
{
   ProcessCandle(null, candle);
}
 и таким способом Код
GetHistoryCandles().ForEach(ProcessCandle); 
 история выводится корректно, и свечи и индикаторы, но склейка получается неправильная... например при выводе реальной свечи на 10 минутном графике после свечи 12:10 рисуется свеча 12:45, потом после Finished становится свечой 12:20. Также в месте склейки искажаются индикаторы...На истории индикаторы переходят из одного дня в другой плавно, а в месте склейки идёт явный разрыв значений... Что можно придумать...?
			 
			
			
			
		
 
				 | 
			
			
				| 
					
				 | 
				
					
	
		| 
			Спасибо:
		 | 
		
		
			 
		 | 
	 
 
				 | 
			
			
				| 
					
				 | 
			
		
			
  | 
		
			
				
					IvanB 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Дата: 24.05.2013
					
					
			
					 
					 
					
	
			UsilaDobry И таким способом Код
foreach (var candle in GetHistoryCandles())
{
   ProcessCandle(null, candle);
}
 и таким способом Код
GetHistoryCandles().ForEach(ProcessCandle); 
 история выводится корректно, и свечи и индикаторы, но склейка получается неправильная... например при выводе реальной свечи на 10 минутном графике после свечи 12:10 рисуется свеча 12:45, потом после Finished становится свечой 12:20. Также в месте склейки искажаются индикаторы...На истории индикаторы переходят из одного дня в другой плавно, а в месте склейки идёт явный разрыв значений... Что можно придумать...?  Если учесть то, что в демо квике данные поступают со сдвигом во времени, и учесть что исторические данные мы качаем реальные, которые были, то тогда становится понятно почему склейка получается "кривая". Т.е. причина в демо данных, которые никак не состыкуются с реальной историей.
			
			
			
			
		
  
				 | 
			
			
				| 
					
				 | 
				
					
				 | 
			
			
				| 
					
				 | 
			
		
			
  | 
		
			
				
					pft_man 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Дата: 25.05.2013
					
					
			
					 
					 
					
	
			А какие ещё темы есть в SciChart.ChartTheme, кроме ExpressionDark? Я искал в документации и на форуме, но ничего не нашёл.
			
			
			
			
		
 
				 | 
			
			
				| 
					
				 | 
				
					
	
		| 
			Спасибо:
		 | 
		
		
			 
		 | 
	 
 
				 | 
			
			
				| 
					
				 | 
			
		
			
  | 
		
			
				
					UsilaDobry 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Дата: 26.05.2013
					
					
			
					 
					 
					
	
			pft_man А какие ещё темы есть в SciChart.ChartTheme, кроме ExpressionDark? Я искал в документации и на форуме, но ничего не нашёл.  Доступные темы: ExpressionLight, ExpressionDark, BlackSteel, BrightSpark, Chrome, Electric, Oscilloscope
			
			
			
			
		
  
				 | 
			
			
				| 
					
				 | 
				
					
	
		| 
			Спасибо:
		 | 
		
		
			 
		 | 
	 
 
				 | 
			
			
				| 
					
				 | 
			
		
			
  | 
		
			
				
					pft_man 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Дата: 26.05.2013
					
					
			
					 
					 
					
	
			Спасибо.
			
			
			
			
		
 
				 | 
			
			
				| 
					
				 | 
				
					
	
		| 
			Спасибо:
		 | 
		
		
			 
		 | 
	 
 
				 | 
			
			
				| 
					
				 | 
			
		
			
  | 
		
			
				
					pft_man 
					 
					 
					 
					 
					
					
						
						
					 
				 | 
				
					Дата: 27.05.2013
					
					
			
					 
					 
					
	
			А как нарисовать на графике свой трейлинг-стоп так, чтобы он ещё и на истории показывался? В Wealth-Lab для этого существует метод PlotStops(), который просто рисует стопы, а я рассчитываю сами значения стопов.
  Единственный вариант - сделать свой индикатор, рассчитывающий трейлинг-стоп, так? Такой индикатор будет иметь значение IsFormed, когда есть позиция. То есть он привязан к стратегии. Как лучше это в коде организовать? 
  И есть ли свойство у ChartIndicatorElement, позволяющее рисовать не линии, а точки, например. Если нет, то как можно это сделать? 
			
			
			
			
		
 
				 | 
			
			
				| 
					
				 | 
				
					
	
		| 
			Спасибо:
		 | 
		
		
			 
		 | 
	 
 
				 | 
			
			
				| 
					
				 |