[Bug] в Strategy.MyTrades не попадает сделка
Atom Ответить
04.08.2011


обнаружил такую вещь.
Примерно в 10% случаев в список Strategy.MyTrades не попадают сделки.
Полностью это заметил в таком коде
Код

private void WaitMyTradesComplement()
		{
			while(true){
				if(IsLastTradeByOrderInList()){
					break;
				}
				Thread.Sleep(1000);
			}
		}
private bool IsLastTradeByOrderInList()
		{
			if(MyTrades.Count > 0
			   && MyTrades[MyTrades.Count-1].Order.Id == _order.Id
			   && MyTrades[MyTrades.Count-1].Order.IsMatched()){
				//MessageBox.Show("true");
				return true;
			}
			string ids = "";
			foreach(MyTrade p in MyTrades){
				ids += p.Trade.Id.ToString() + " ";
			}
			int a = 0;
			a++;
			MessageBox.Show(ids);
			return false;
		}

Этот метод перезапускается до тех пор ,пока не вернёт true.
Время от времени он выдает что список пуст, это происходит после первой сделки
т.е. правило When(StrategyRuleConditionHelper.Matched(_order)) сработало, а список не пополнился.
Метод вызывается с задержкой в 1 секунду , и в случае бажного поведения из цикла не выходит и выдает пустые MessageBox.
ProcessDataError ничего не выдает.

Теги:


Спасибо:




11 Ответов
President

Фотография
Благотворитель
Дата: 04.08.2011
Ответить


у вас ведь не бесконечно он мессаджбоксы выводит - а один-два раза на ордер?
если так, то я думаю это значит что в 10% случаев сначала происходит событие StrategyRuleConditionHelper.Matched(_order) и только потом через некоторое время прилетают трейды.
Спасибо:

vader

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


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

President

Фотография
Благотворитель
Дата: 04.08.2011
Ответить


поставьте брекпоинт и посмотрите какое условие не выполняется.
или у вас _order уже сменился или ордер полностью не выполнился или ваш трейд прилетел не относящийся к этому ордеру или еще чтонибудь :)
Спасибо:

vader

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


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

private void WaitMyTradesComplement()
		{
			//MessageBox.Show(_nMyTrades.ToString() + " " + this.MyTrades.Count.ToString());
			while(true){
					if(_nMyTrades != this.MyTrades.Count){
					_nMyTrades = this.MyTrades.Count;
					break;
				}
				Thread.Sleep(1000);
			}
		}

_nMyTrades = 0;
Автор топика
Спасибо:

vader

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


К сожадению эта проблема в 3.2.6 продолжается.
часто бывает так ,что после первой сделки список сделок остается совершенно пустым.
Автор топика
Спасибо:

Sergey Masyura

Фотография
Автор статей
Дата: 05.08.2011
Ответить


vader Перейти
К сожадению эта проблема в 3.2.6 продолжается.
часто бывает так ,что после первой сделки список сделок остается совершенно пустым.


Какой коннектор?
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 05.08.2011
Ответить


vader Перейти
К сожадению эта проблема в 3.2.6 продолжается.
часто бывает так ,что после первой сделки список сделок остается совершенно пустым.


Если эта ошибка, то проблема скорее всего не в S# и новые версии вряд ли исправят.
Спасибо:

vader

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


sergey.masyura Перейти
vader Перейти
К сожадению эта проблема в 3.2.6 продолжается.
часто бывает так ,что после первой сделки список сделок остается совершенно пустым.


Какой коннектор?

quik
Автор топика
Спасибо:

vader

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


Взял пример SampleSMA, заменил стратегию СМА на свою. Ошибка осталась. Время от времени сделки не попадают в список.
что посоветуете проверить?
Автор топика
Спасибо:

vader

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


Логика у меня очень простая, и я невижу в ней ошибок, тем более ,что она в болшем числе случаев работает правильно.
Но я понимаю ,что возможно ошибка в ней.
Код

protected override void OnStarting()
		{
			
			this.NewMyTrades += mytrades => {
				MessageBox.Show("Event");
			};
			
			_order = new Order
			{
				Portfolio = this.Portfolio,
				Volume =  _partOfLot,
				Price = _priceOfOrder,
				Security = this.Security,
				Direction = this._direction,
				Trader = this.Trader,
			};
			this.RegisterOrder(_order);
			
			this
				.When(StrategyRuleConditionHelper.Matched(_order))
				.Do(RegisterNext)
				.Once();
			
			base.OnStarting();
		}
		
		private void RegisterNext()
		{
			i++;
			
			WaitMyTradesComplement();
			
			_order = new Order
			{
				Portfolio = this.Portfolio,
				Volume =  vol,
				Price = _newPrice,
				Security = this.Security,
				Direction =  this._direction,
				Trader = this.Trader,
			};

			this.RegisterOrder(_order);
			this
				.When(StrategyRuleConditionHelper.Matched(_order))
				.Do(RegisterNext)
				.Once();
		}
		
		private void WaitMyTradesComplement()
		{
			while(true){
				if(IsLastTradeByOrderInList()){
					//if(_nMyTrades != this.MyTrades.Count){
					_nMyTrades = this.MyTrades.Count();
					break;
				}
				Thread.Sleep(1000);
			}
		}
		
		private bool IsLastTradeByOrderInList()
		{
			if(MyTrades.Count() > 0
			   && MyTrades.Last().Order.Id == _order.Id
			   && MyTrades.Last().Order.IsMatched()){
				return true;
			}
			string ids = "Список всех моих сделок по " +  Portfolio.ToString()
				+ " " + Trader.ToString() + " " + this.Security + " ";
			foreach(MyTrade p in MyTrades){
				ids += p.Trade.Id.ToString() + " ";
			}
			MessageBox.Show(ids);
			return false;
		}


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

President

Фотография
Благотворитель
Дата: 16.08.2011
Ответить


vader,
1.поставьте брекпоинт перед выводом мессаджбокса и поизучайте что у вас в списке ордеров и что в списке трейдов
2.сделайте вывод логов а не мессадж-бокса - если они у вас выледают один-за-другим то сомневаюсь что вы успеваете изучить отладочную информацию из них - а тогда какой в них толк?
Спасибо:


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

loading
clippy