Вопросы новичка в S# (Закрыта)
Atom
01.12.2010


ttt

Фотография
Добрый день.
Очень понравилась идея использования Вашей библиотеки для реализации роботов.
Подскажите, пожалуйста:
1) Как идентифицировать заявку?
//например, выставляю заявку buy RIZ0 4 контракта по цене 160500. Каким образом далее смогу ее отслеживать?
Вариант с использованием таблицы сделок не подходит - необходимо реализовать контроль исполнения заявок пользуясь исключительно информацией из таблицы заявок.
С языком C# только начал разбираться, возможно поэтому не нашел в представленных в дистрибутиве S# проектах примеров контроля состояния заявки по ее уникальному признаку.
2) Верно ли я понимаю суть работы с Квиком: для реализации автономного робота необходимо организовать два потока на C#:
- первый: выполняет функции получения данных из Квика через DDE сервер (используя библиотеку S#);
- второй: непосредственно реализует алгоритм выставления и снятия заявок.
Можно ли обойтись одним потоком?

Теги:


Спасибо: Николай_Флёров




506 Ответов
<< < 15 16 17 18 19  > >>
Alexander

Фотография
Дата: 22.07.2011


Pavel-NS Перейти
Alexander Перейти

Блокирует коллекцию для изменения и запускает передаваемую функцию над коллекцией.


Спасибо за ответ.
А есть ли где более полная документация, чем chm-файл??
Не нашёл какой-либо информации по "ecng" пространству имён ни в доках, а также при просмотре из студии нет никаких комментариев.


Ecng никак не комментирован пока, да.
Полнее чем в chm в любом случае нет - это полная дока которая строится по комментариям.
Спасибо:

vader

Фотография
Дата: 25.07.2011


Подскажите ,пожалуйста.
Пытаюсь создать событийную стратегию и почему-то не происходит действия, активизирующееся при наступлении условия.
Условие добавляется в список правил. Пробовал разные условия, результат нулевой.
Результат проверки Verifir – все в порядке.
версия библиотеки - 3.2.5
Код

public class ConservativeRegime : Strategy
	{
		public ConservativeRegime(bool bBuy, decimal priceOfOrder, decimal dPrice, int division)
			: base()
		{
			_bBuy = bBuy;
			_priceOfOrder = priceOfOrder;
			_dPrice = dPrice;
			_division = division;
			
			_order = new Order
			{
				Portfolio = this.Portfolio,
				Volume =  this.Volume,
				Price = _priceOfOrder,
				Security = this.Security,
				Direction =  OrderDirections.Buy,
			};
			
			
		}
		
				
		protected override void OnRunning()
		{
			StrategyRule strR =  this
				.When(this.Security.BestAskPriceLess(_priceOfOrder))
				.Do(SimpleRegOrd);
			
			base.OnRunning();
			
			foreach(StrategyRule r in this.Rules){
				MessageBox.Show(r.ToString());
			}
		}
		
		private void SimpleRegOrd()
		{
			MessageBox.Show("SimpleRegOrd");
			this.RegisterOrder(_order);
		}


		private bool _bBuy;
		private decimal _priceOfOrder;
		private decimal _dPrice;
		private int _division;
		
		private Order _order;
	}
Спасибо:

Alexander

Фотография
Дата: 25.07.2011


vader Перейти
Подскажите ,пожалуйста.
Пытаюсь создать событийную стратегию и почему-то не происходит действия, активизирующееся при наступлении условия.
Условие добавляется в список правил. Пробовал разные условия, результат нулевой.
Результат проверки Verifir – все в порядке.
версия библиотеки - 3.2.5
Код

public class ConservativeRegime : Strategy
	{
		public ConservativeRegime(bool bBuy, decimal priceOfOrder, decimal dPrice, int division)
			: base()
		{
			_bBuy = bBuy;
			_priceOfOrder = priceOfOrder;
			_dPrice = dPrice;
			_division = division;
			
			_order = new Order
			{
				Portfolio = this.Portfolio,
				Volume =  this.Volume,
				Price = _priceOfOrder,
				Security = this.Security,
				Direction =  OrderDirections.Buy,
			};
			
			
		}
		
				
		protected override void OnRunning()
		{
			StrategyRule strR =  this
				.When(this.Security.BestAskPriceLess(_priceOfOrder))
				.Do(SimpleRegOrd);
			
			base.OnRunning();
			
			foreach(StrategyRule r in this.Rules){
				MessageBox.Show(r.ToString());
			}
		}
		
		private void SimpleRegOrd()
		{
			MessageBox.Show("SimpleRegOrd");
			this.RegisterOrder(_order);
		}


		private bool _bBuy;
		private decimal _priceOfOrder;
		private decimal _dPrice;
		private int _division;
		
		private Order _order;
	}


Запускаете экспорт стакана?
Спасибо:

vader

Фотография
Дата: 26.07.2011


Да, запускаю.
Я вставил такой код, чтобы убедится что стратегия получает данные.
Код

protected override void OnRunning()
		{
			...			
			base.OnRunning();
			
			MessageBox.Show(Security.BestAsk.Price.ToString());
			...

	         }
Спасибо:

Alexander

Фотография
Дата: 26.07.2011


vader Перейти
Да, запускаю.
Я вставил такой код, чтобы убедится что стратегия получает данные.
Код

protected override void OnRunning()
		{
			...			
			base.OnRunning();
			
			MessageBox.Show(Security.BestAsk.Price.ToString());
			...

	         }


Поля Security, Portfolio в конструкторе не проинициализированны.
Вы их должны устанавливать уже после вызова конструктора. Значит у заявки в конструкторе этих данных нет - можете проверить в OnRunning и заодно переместить создание заявки туда.
Спасибо:

vader

Фотография
Дата: 26.07.2011


я инициалезирую эти поля так
Код

_consStrategy = new ConservativeRegime( _bBuy, _priceOfOrder, _dPrice, _division)
					{
						Volume = _nLot,
						Security = _security,
						Portfolio = _portfolio,
					};

Я сделал проверку, все на месте
Код

protected override void OnRunning()
		{
			StrategyRule strR =  this
				.When(this.Security.BestAskPriceLess(_priceOfOrder))
				.Do(SimpleRegOrd);
			
			base.OnRunning();
			
			MessageBox.Show("Security= " + this.Security.ToString());
			MessageBox.Show("Portfolio= " + this.Portfolio.ToString());
			
			foreach(StrategyRule r in this.Rules){
				MessageBox.Show(r.ToString());
			}
		}

Ведь вопрос не в том ,что он заявку не создает,а в том, что он нужный метод (SimpleRegOrd) не вызывает.
Спасибо:

Alexander

Фотография
Дата: 26.07.2011


vader Перейти
я инициалезирую эти поля так
Код

_consStrategy = new ConservativeRegime( _bBuy, _priceOfOrder, _dPrice, _division)
					{
						Volume = _nLot,
						Security = _security,
						Portfolio = _portfolio,
					};

Я сделал проверку, все на месте
Код

protected override void OnRunning()
		{
			StrategyRule strR =  this
				.When(this.Security.BestAskPriceLess(_priceOfOrder))
				.Do(SimpleRegOrd);
			
			base.OnRunning();
			
			MessageBox.Show("Security= " + this.Security.ToString());
			MessageBox.Show("Portfolio= " + this.Portfolio.ToString());
			
			foreach(StrategyRule r in this.Rules){
				MessageBox.Show(r.ToString());
			}
		}

Ведь вопрос не в том ,что он заявку не создает,а в том, что он нужный метод (SimpleRegOrd) не вызывает.



Вначале вызывается конструктор, потом происходит инициализация полей.
Когда вы создаёте заявку - у вас там используется:
Код
Portfolio = this.Portfolio,
Security = this.Security,

Оба этих поля = null.

Не верите - распечатайте

Код
			MessageBox.Show("Security= " + _order.Security.ToString());
			MessageBox.Show("Portfolio= " + _order.Portfolio.ToString());


:)

Необходимо вначале это исправить.
Спасибо:

vader

Фотография
Дата: 26.07.2011


перенес создание заявки в OnRunning
Все равно ничего не происходит.
Код

protected override void OnRunning()
		{
			_order = new Order
			{
				Portfolio = this.Portfolio,
				Volume =  this.Volume,
				Price = _priceOfOrder,
				Security = this.Security,
				Direction =  OrderDirections.Buy,
			};
			
			StrategyRule strR =  this
				.When(this.Security.BestAskPriceLess(_priceOfOrder))
				.Do(SimpleRegOrd);
			
			base.OnRunning();
			
			MessageBox.Show("Security= " + this.Security.ToString());
			MessageBox.Show("Portfolio= " + this.Portfolio.ToString());
			
			foreach(StrategyRule r in this.Rules){
				MessageBox.Show(r.ToString());
			}
		}
Спасибо:

Alexander

Фотография
Дата: 26.07.2011


Чему равно _priceOfOrder, как изменяется Security.BestAsk.Price?
Спасибо:

vader

Фотография
Дата: 26.07.2011


_priceOfOrder - ввожу вручную, сталю такой, чтобы скорее испольнилось условие.
Как пример. Если лучшая продажа 198645, то ставлю 198630.

Security.BestAsk.Price не использую сейчас. Я выводил это ,чтобы убедится, что стратегия получает данные.
Спасибо:

Alexander

Фотография
Дата: 26.07.2011


vader Перейти
_priceOfOrder - ввожу вручную, сталю такой, чтобы скорее испольнилось условие.
Как пример. Если лучшая продажа 198645, то ставлю 198630.

Security.BestAsk.Price не использую сейчас. Я выводил это ,чтобы убедится, что стратегия получает данные.


Вроде нашёл багу.
Вообще надо передавать не цену, а сдвиг цены - в % или в пунктах.

Поправлю документацию и код.
Спасибо:

vader

Фотография
Дата: 26.07.2011


Alexander, прошу вас , дайте пожалуйста работоспособный пример событийной стратегии, в котором поковырятся можно, потому что тяжело разобраться, из-за чего программа не работает так как надо.
Спасибо:

Alexander

Фотография
Дата: 26.07.2011


vader Перейти
Alexander, прошу вас , дайте пожалуйста работоспособный пример событийной стратегии, в котором поковырятся можно, потому что тяжело разобраться, из-за чего программа не работает так как надо.


напишите, к примеру, When(Security.SecurityNewTrades()).Do(blabla)

То что выше - я уже написал - была ошибка, исправляю.
Спасибо:

vader

Фотография
Дата: 26.07.2011


попробовал вот так - не работает
Код

StrategyRule strR =  this
				.When(StrategyRuleConditionHelper.BestAskPriceLess(this.Security, new Unit(5)))
				.Do(SimpleRegOrd);
			
			base.OnRunning();

И ещё. Мне удалось вызвать метод, в котором должна происходить регистрация заявки ,но заявка в квике не появилась.
Код

private void SimpleRegOrd()
		{
			MessageBox.Show("SimpleRegOrd");
			this.RegisterOrder(_order);
		}


И так тоже не работает
Код

StrategyRule strR =  this
				.When(Security.SecurityNewTrades())
				.Do(SimpleRegOrd);
			
			base.OnRunning();
Спасибо:

Alexander

Фотография
Дата: 26.07.2011


vader Перейти
попробовал вот так - не работает
Код

StrategyRule strR =  this
				.When(StrategyRuleConditionHelper.BestAskPriceLess(this.Security, new Unit(5)))
				.Do(SimpleRegOrd);
			
			base.OnRunning();

И ещё. Мне удалось вызвать метод, в котором должна происходить регистрация заявки ,но заявка в квике не появилась.
Код

private void SimpleRegOrd()
		{
			MessageBox.Show("SimpleRegOrd");
			this.RegisterOrder(_order);
		}


И так тоже не работает
Код

StrategyRule strR =  this
				.When(Security.SecurityNewTrades())
				.Do(SimpleRegOrd);
			
			base.OnRunning();



Первое не работает я уже написал почему - бага найдена, исправил, будет в 3.2.6
Второе - выведите все поля заявки перед регистрацией чтоб было понятно где проблема. Заявки у остальных регистрируется нормально.
Третье - что значит тоже не работает? SimpleRegOrd вызывается? Новые сделки по инструменту приходят?

ProcessDataError что-нибудь выдаёт?
Спасибо: vader

vader

Фотография
Дата: 28.07.2011


спасибо за советы.
Проблема была в том, что я не инициалезировал Trader, ни у стратегии ни у заявки.
ProcessDataError ничего не выдавал.

Заметил такую проблему, что часто если при работе стратегии произошла проограмная ошибка, то простостртегия останавливается и никак не сигналезирует об ошибке. Что очень не удобно.
Можно ли как-то сделать ,чтобы визуально были видны ошибки?
Спасибо:

Alexander

Фотография
Дата: 28.07.2011


vader Перейти
спасибо за советы.
Проблема была в том, что я не инициалезировал Trader, ни у стратегии ни у заявки.
ProcessDataError ничего не выдавал.

Заметил такую проблему, что часто если при работе стратегии произошла проограмная ошибка, то простостртегия останавливается и никак не сигналезирует об ошибке. Что очень не удобно.
Можно ли как-то сделать ,чтобы визуально были видны ошибки?


Перехватывайте ProcessDataError и исключения.
Спасибо:

vader

Фотография
Дата: 28.07.2011


ProcessDataError молчит.
В каких местах перехватывать исключения?
Спасибо:

Alexander

Фотография
Дата: 28.07.2011


vader Перейти
ProcessDataError молчит.
В каких местах перехватывать исключения?


При вызове методов Stock#
Спасибо:

vader

Фотография
Дата: 28.07.2011


При тестировании на учебном счете Quik-Junior, на площадке ММВБ, не выполняется условие на появление новых сделок (StrategyNewMyTrades), когда происходит сделка. При этом если работать на игровой секции FORTS, все условия выполняются. ProcessDataError ничего не выдает.
Как это можно поправить?
S# 3.2.5
Спасибо:

Roman0

Фотография
Дата: 29.07.2011


Подскажите, пожалуйста, можно ли динамически задавать название таблицы в [DdeCustomTable("вот это название")] (пример)? Вроде бы нельзя, т.к. по поводу атрибутов много ограничений, но может быть все-таки как-то можно? Смысл в том, чтобы брать исторические данные из соответствующей таблицы, название которой состоит из инструмента и таймфрейма и таким образом контролировать то, что получает программа. Наверное можно это все выводить в саму таблицу, но в таком случае как-то не очень рационально получается. Спасибо.
Спасибо:

Maxim K.

Фотография
Дата: 29.07.2011


Теоретически вроде можно с помощью рефлекции что-нибудь такое замутить, но на практике - я думаю врядли стоит тратить на это время - придется MSIL курить, а он не так бодр как c#. Хотя если набор колонок у вас всегда постоянный, а меняется только название таблицы, то наверное будет проще намного.
Спасибо: Roman0

Alex Ander

Фотография
Дата: 30.07.2011


Roman0 Перейти
Подскажите, пожалуйста, можно ли динамически задавать название таблицы в [DdeCustomTable("вот это название")] (пример)? Вроде бы нельзя, т.к. по поводу атрибутов много ограничений, но может быть все-таки как-то можно? Смысл в том, чтобы брать исторические данные из соответствующей таблицы, название которой состоит из инструмента и таймфрейма и таким образом контролировать то, что получает программа. Наверное можно это все выводить в саму таблицу, но в таком случае как-то не очень рационально получается. Спасибо.


Я убрал этот атрибут и задаю название таблицы в конструкторе.

Код
                
DdeCustomTable _tableRI = new DdeCustomTable(typeof(QuikCandle), "RIU1 1H");
DdeCustomTable _tableGZ = new DdeCustomTable(typeof(QuikCandle), "GZU1 1H");


В таблицу и класс QuikCandle добавил еще одну колонку с названием инструмента.
Спасибо: Roman0

Roman0

Фотография
Дата: 30.07.2011


Alex Ander Перейти
Roman0 Перейти
Подскажите, пожалуйста, можно ли динамически задавать название таблицы в [DdeCustomTable("вот это название")] (пример)? Вроде бы нельзя, т.к. по поводу атрибутов много ограничений, но может быть все-таки как-то можно? Смысл в том, чтобы брать исторические данные из соответствующей таблицы, название которой состоит из инструмента и таймфрейма и таким образом контролировать то, что получает программа. Наверное можно это все выводить в саму таблицу, но в таком случае как-то не очень рационально получается. Спасибо.


Я убрал этот атрибут и задаю название таблицы в конструкторе.

Код
                
DdeCustomTable _tableRI = new DdeCustomTable(typeof(QuikCandle), "RIU1 1H");
DdeCustomTable _tableGZ = new DdeCustomTable(typeof(QuikCandle), "GZU1 1H");


В таблицу и класс QuikCandle добавил еще одну колонку с названием инструмента.

Большое спасибо! На конструкторы даже не посмотрел... Smile
Спасибо:

freelancer

Фотография
Дата: 02.08.2011


А как узнать текущую сумму на ФОРТС ? С учетом вариационной маржи ?

SelectedPortfolio.ExtensionInfo[DdeDerivativePortfolioColumns.CurrentLimitPositionsPrice] вызывает исключение (ключ не найден)
Спасибо:
<< < 15 16 17 18 19  > >>

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

loading
clippy