← 戻る

[Bug] в Strategy.MyTrades не попадает сделка

обнаружил такую вещь. Примерно в 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
President

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

vader
vader 著者

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

President
President

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

vader
vader 著者

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


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
vader 著者

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

Sergey Masyura
Sergey Masyura

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

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

Mikhail Sukhov
Mikhail Sukhov

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

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

vader
vader 著者

sergey.masyura:

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

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

vader
vader 著者

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

vader
vader 著者

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


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
President

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