Общие ошибки
Atom Ответить
13.01.2012


Не хватает ветки форума, куда можно было бы писать об ошибках, не попадающих ни в одну из текущих категорий. Вот сейчас даже не знаю, куда было бы правильно сообщить об обнаруженной проблеме. Напишу сюда.

Обновился до последней версии. Такой код перестал работать:

Код

candleToken = candleManager.RegisterVolumeCandles(this.SelectedSecurity, 10000);

IEnumerable<Candle> tmpCandles = candleManager.GetVolumeCandles(this.SelectedSecurity, 10000);

error.png 65,1KB (0)

Теги:


Спасибо:




19 Ответов
Alexander

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


Это Стратегии и Алгоритмы. Именно эта тема является общей.

По проблеме - чему равен SelectedSecurity ну и полный Stack Trace конечно нужен.
Не в виде скриншота только, а ctr+c, ctr+v.
Спасибо:

Mikhail Sukhov

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


Не плохо бы стек трейс вставлять текстом. Можно даже без скрина.
Спасибо:

Daenur

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


Попробую собрать нужную информацию.

StackTrace:

Код

"   в System.Collections.Generic.Dictionary`2.FindEntry(TKey key)\r\n   в System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)\r\n   в Ecng.Collections.SynchronizedDictionary`2.TryGetValue(TKey key, TValue& value)\r\n   в Ecng.Collections.CollectionHelper.TryGetValue[TKey,TValue](IDictionary`2 dict, TKey key)\r\n   в Ecng.Collections.CollectionHelper.<>c__DisplayClass18`2.<TryGetValue>b__17(SynchronizedDictionary`2 d)\r\n   в Ecng.Collections.CollectionHelper.SyncGet[TCollection,TResult](TCollection collection, Func`2 func)\r\n   в Ecng.Collections.CollectionHelper.TryGetValue[TKey,TValue](SynchronizedDictionary`2 dict, TKey key)\r\n   в StockSharp.Algo.Candles.CandleContainer.GetCandles(CandleToken token)\r\n   в StockSharp.Algo.Candles.CandleHelper.#=qXPZdkiELNitOraCeUw3h6mbW_ZhW23wLr6MshczzY68=.#=qLfa4JiJMrbEqPJA6hzH2m608MOaOOijlarRl7Z$3aMk=(CandleToken #=q5u5aT6qdR2hDtsXOSvFynA==)\r\n   в StockSharp.Algo.Candles.CandleHelper.#=qO2oigosOfL6g_3qV9vlVxw==[TCandle,TResult](ICandleManager #=qjc3pxbiY4fMHarI0AUsnvw==, Security #=q$GFj7jGA1FP2qn_P0_CcWg==, Object #=qBUhgKrrw8a31HGATMnMQLw==, Func`2 #=qKEm1UAsHZ2xzYy7Y30K3HA==)\r\n   в StockSharp.Algo.Candles.CandleHelper.#=qukl$s6Y4xrx1F2ehBo526w==[TCandle](ICandleManager #=qoZcRJSbTGIM9712gDOua7Q==, Security #=qSfOAxa1CTSn$spwmQ2qHEQ==, Object #=qkqIAN2y3eo4tS4GHxBewHg==)\r\n   в StockSharp.Algo.Candles.CandleHelper.GetVolumeCandles(ICandleManager manager, Security security, Int32 volume)"


После вызова candleManager.GetVolumeCandles() и до момента ошибки стек вызовов такой:
Код

StockSharp.Algo.dll!StockSharp.Algo.Candles.CandleHelper.GetVolumeCandles(StockSharp.Algo.Candles.ICandleManager manager = {StockSharp.Algo.Candles.CandleManager}, StockSharp.BusinessEntities.Security security = {StockSharp.BusinessEntities.Security}, int volume = 10000) + 0x51 байт	

StockSharp.Algo.dll!StockSharp.Algo.Candles.CandleHelper.#=qukl$s6Y4xrx1F2ehBo526w==<StockSharp.Algo.Candles.VolumeCandle>(StockSharp.Algo.Candles.ICandleManager #=qoZcRJSbTGIM9712gDOua7Q== = {StockSharp.Algo.Candles.CandleManager}, StockSharp.BusinessEntities.Security #=qSfOAxa1CTSn$spwmQ2qHEQ== = {StockSharp.BusinessEntities.Security}, object #=qkqIAN2y3eo4tS4GHxBewHg== = 10000) + 0x10e байт	

StockSharp.Algo.dll!StockSharp.Algo.Candles.CandleHelper.#=qO2oigosOfL6g_3qV9vlVxw==<StockSharp.Algo.Candles.VolumeCandle,System.Collections.Generic.IEnumerable<StockSharp.Algo.Candles.VolumeCandle>>(StockSharp.Algo.Candles.ICandleManager #=qjc3pxbiY4fMHarI0AUsnvw== = {StockSharp.Algo.Candles.CandleManager}, StockSharp.BusinessEntities.Security #=q$GFj7jGA1FP2qn_P0_CcWg== = {StockSharp.BusinessEntities.Security}, object #=qBUhgKrrw8a31HGATMnMQLw== = 10000, System.Func<StockSharp.Algo.Candles.CandleToken,System.Collections.Generic.IEnumerable<StockSharp.Algo.Candles.VolumeCandle>> #=qKEm1UAsHZ2xzYy7Y30K3HA== = {Method = {System.Reflection.RuntimeMethodInfo}}) + 0xc6 байт	

StockSharp.Algo.dll!StockSharp.Algo.Candles.CandleHelper.#=qXPZdkiELNitOraCeUw3h6mbW_ZhW23wLr6MshczzY68=<StockSharp.Algo.Candles.VolumeCandle>.#=qLfa4JiJMrbEqPJA6hzH2m608MOaOOijlarRl7Z$3aMk=(StockSharp.Algo.Candles.CandleToken #=q5u5aT6qdR2hDtsXOSvFynA== = null) + 0x35 байт	

StockSharp.Algo.dll!StockSharp.Algo.Candles.CandleContainer.GetCandles(StockSharp.Algo.Candles.CandleToken token = null) + 0x38 байт	

Ecng.Collections.dll!Ecng.Collections.CollectionHelper.TryGetValue<StockSharp.Algo.Candles.CandleToken,StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ==>(Ecng.Collections.SynchronizedDictionary<StockSharp.Algo.Candles.CandleToken,StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ==> dict = {Ecng.Collections.SynchronizedDictionary<StockSharp.Algo.Candles.CandleToken,StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ==>}, StockSharp.Algo.Candles.CandleToken key = null) + 0x132 байт	

Ecng.Collections.dll!Ecng.Collections.CollectionHelper.SyncGet<Ecng.Collections.SynchronizedDictionary<StockSharp.Algo.Candles.CandleToken,StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ==>,StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ==>(Ecng.Collections.SynchronizedDictionary<StockSharp.Algo.Candles.CandleToken,StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ==> collection = {Ecng.Collections.SynchronizedDictionary<StockSharp.Algo.Candles.CandleToken,StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ==>}, System.Func<Ecng.Collections.SynchronizedDictionary<StockSharp.Algo.Candles.CandleToken,StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ==>,StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ==> func = {Method = {System.Reflection.RuntimeMethodInfo}}) + 0xda байт	

Ecng.Collections.dll!Ecng.Collections.CollectionHelper.TryGetValue<StockSharp.Algo.Candles.CandleToken,StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ==>.AnonymousMethod__17(Ecng.Collections.SynchronizedDictionary<StockSharp.Algo.Candles.CandleToken,StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ==> d = {Ecng.Collections.SynchronizedDictionary<StockSharp.Algo.Candles.CandleToken,StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ==>}) + 0x5d байт	

Ecng.Collections.dll!Ecng.Collections.CollectionHelper.TryGetValue<StockSharp.Algo.Candles.CandleToken,StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ==>(System.Collections.Generic.IDictionary<StockSharp.Algo.Candles.CandleToken,StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ==> dict = {Ecng.Collections.SynchronizedDictionary<StockSharp.Algo.Candles.CandleToken,StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ==>}, StockSharp.Algo.Candles.CandleToken key = null) + 0x92 байт	

Ecng.Collections.dll!Ecng.Collections.SynchronizedDictionary<StockSharp.Algo.Candles.CandleToken,StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ==>.TryGetValue(StockSharp.Algo.Candles.CandleToken key = null, out StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ== value = null) + 0xaa байт	

mscorlib.dll!System.Collections.Generic.Dictionary<StockSharp.Algo.Candles.CandleToken,StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ==>.TryGetValue(StockSharp.Algo.Candles.CandleToken key, out StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ== value = null) + 0x12 байт	

mscorlib.dll!System.Collections.Generic.Dictionary<StockSharp.Algo.Candles.CandleToken,StockSharp.Algo.Candles.CandleContainer.#=q4Qy0qedHXGsKO$J5dbXJIQ==>.FindEntry(StockSharp.Algo.Candles.CandleToken key) + 0x14a байт	


System.Diagnostics.StackFrame дает такую инфу:
Код

"InitCandleManager at offset 1348 in file:line:column <filename unknown>:0:0\r\n"



Если нужно еще что-то - выложу.

Да, по поводу темы понятно, буду туда выкладывать в дальнейшем.
SelectedSecurity - {Фьючерсный контракт SBRF-3.12@RTS} при подключении к Смарту или, например, RIH2 при подключении к КВИКу.
Роли не играет, ошибка все равно возникает.
Автор топика
Спасибо:

Alexander

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


Как candlemanager создаётся?
Какая версия S#? 4.0.15?

На это смотрели?
Спасибо:

Daenur

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


Код

...

trader = new QuikTrader(SelectedTerminal.FileName);
// или
trader = new SmartTrader(login, password, address);
trader.Connect();

...

candleManager = new CandleManager(trader);

...

switch (candleType)
{
	...

	case CandleTypes.Volume:
		candleToken = candleManager.RegisterVolumeCandles(SelectedSecurity, 10000);
	break;
}

...

IEnumerable<Candle> tmpCandles = candleManager.GetVolumeCandles(SelectedSecurity, 10000);


в промежутках ... несущественный код

Собственно, код и был взят изначально из примера. И не так давно работал, пока не обновился до последней версии, которая сейчас выложена. Обновлялся два-три дня назад, работаю с trunk веткой. Обновлялся полностью удалив старую папку и залив новую с сервера.
Если запускаю тот же код на версии, которая была до обновления (не знаю как проверить версию, просто перед обновлением сохранил всю папку) - все отлично исполняется, рисуются бары по объему каждые 10000.

А у вас все нормально отрабатывается, ошибка не воспроизводится?
Автор топика
Спасибо:

Daenur

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


Удалил все, заново забрал последнюю версию с сервера, создал тестовый проект - ошибка повторяется. Единственное - проверял на Смарте, т.к. КВИК сейчас вырублен, а к Смарту можно подключиться. Но и на КВИКе ошибка была.
Бумага выбирается первая попавшаяся.

Код проекта для проверки:

Код

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

using Ecng.Collections;
using Ecng.Common;
using Ecng.ComponentModel;
using Ecng.Xaml;

using StockSharp.Algo;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Logging;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Smart;
using StockSharp.Quik;
using StockSharp.Xaml;


namespace TestProject
{
	/// <summary>
	/// Логика взаимодействия для MainWindow.xaml
	/// </summary>
	public partial class MainWindow : Window
	{
		public BaseTrader trader;
		private CandleManager candleManager;
		private CandleToken candleToken;
		private Security selectedSecurity;

		public MainWindow()
		{
			InitializeComponent();

			// Вставить сюда сервер, логин и пароль
			System.Net.IPEndPoint address = Utils.CreateIPEndPoint("");
			string login = "";
			string password = "";

			trader = new SmartTrader(login, password, address);
			candleManager = new CandleManager(trader);

			trader.Connected += new Action(trader_Connected);
			trader.NewSecurities += new Action<IEnumerable<Security>>(trader_NewSecurities);
			trader.Connect();
		}

		private void trader_NewSecurities(IEnumerable<Security> tmpSecurities)
		{
			this.GuiAsync(() =>
			{
				// Выбираем первую бумагу
				if (trader.Securities.Count() > 0)
				{
					selectedSecurity = trader.Securities.ElementAt(0);

					//TimeSpan currentTimeFrame = TimeSpan.FromSeconds(60);
					//candleToken = candleManager.RegisterTimeFrameCandles(selectedSecurity, currentTimeFrame);

					candleToken = candleManager.RegisterVolumeCandles(selectedSecurity, 10000);

					try
					{
						//IEnumerable<Candle> tmpCandles = candleManager.GetTimeFrameCandles(selectedSecurity, currentTimeFrame);
						IEnumerable<Candle> tmpCandles = candleManager.GetVolumeCandles(selectedSecurity, 10000);
					}
					catch (Exception ex)
					{
						throw new Exception(ex.Message, ex);
					}
					finally
					{
						trader.StopExport();
						trader.Disconnect();
					}
				}
			});
		}
	}		private void trader_Connected()
		{
			this.GuiAsync(() =>
			{
				trader.StartExport();
			});
		}

		private void trader_NewSecurities(IEnumerable<Security> tmpSecurities)
		{
			this.GuiAsync(() =>
			{
				// Выбираем первую бумагу
				if (trader.Securities.Count() > 0)
				{
					selectedSecurity = trader.Securities.ElementAt(0);

					candleToken = candleManager.RegisterVolumeCandles(selectedSecurity, 10000);

					try
					{
						IEnumerable<Candle> tmpCandles = candleManager.GetVolumeCandles(selectedSecurity, 10000);
					}
					catch (Exception ex)
					{
						throw new Exception(ex.Message, ex);
					}
					finally
					{
						trader.StopExport();
						trader.Disconnect();
					}
				}
			});
		}
	}

	public class Utils
	{
		/// <summary>
		/// Создание IP адреса из строки
		/// </summary>
		/// <param name="endPoint">Адрес в формате 111.222.333.444:6789</param>
		/// <returns></returns>
		public static IPEndPoint CreateIPEndPoint(string endPoint)
		{
			IPAddress ip;
			int port;

			string[] ep = endPoint.Split(':');

			if (ep.Length != 2)
			{
				throw new FormatException("Invalid endpoint format");
			}

			if (IPAddress.TryParse(ep[0], out ip) == false)
			{
				throw new FormatException("Invalid ip-adress");
			}

			if (int.TryParse(ep[1], NumberStyles.None, NumberFormatInfo.CurrentInfo, out port) == false)
			{
				throw new FormatException("Invalid port");
			}

			return new System.Net.IPEndPoint(ip, port);
		}
	}
}

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

Alexander

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


Бага. Буду разбираться с чем связано.
В общем будет 4.0.16 с фиксом
Спасибо:

Alexander

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


Фикс готов, положил на codeplex в trunk.
Будет время - соберу архивы и выложу релиз.
Спасибо:

Daenur

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


Спасибо за оперативность, забираю!

Кстати, вопрос по выкладыванию. Немного доработал индикатор JurikMovingAverage, хочу его выложить. Могу прямо в trunk класть?
Автор топика
Спасибо:

Alexander

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


Daenur Перейти
Спасибо за оперативность, забираю!

Кстати, вопрос по выкладыванию. Немного доработал индикатор JurikMovingAverage, хочу его выложить. Могу прямо в trunk класть?


Нет, в dev.
В trunk - только баг-фиксы относящиеся к версии 4.0, в фиксах которых уверены.
Вся доработка и непосредственно разработка - в dev.

Будет готов 4.1 - будет мёрж dev с trunk.
Спасибо:

Daenur

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


Все ясно, спасибо.
Автор топика
Спасибо:

Alexander

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


Кстати, я там релиз уже выпустил с этим фиксом - 4.0.16 :)
Спасибо:

Daenur

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


Еще одна ошибка обнаружилась - если создать два раза QuikTrader, то на второй строке возникает ошибка "Элемент с тем же ключом уже был добавлен."

Код

QuikTrader qt = new QuikTrader();
QuikTrader qt1 = new QuikTrader(); 


StackTrace:
Код

"   в System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)\r\n   в System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)\r\n   в NDde.Advanced.DdeContext.DdeThread.Invoke(Delegate method, Object[] args)\r\n   в NDde.Advanced.DdeContext.Invoke(Delegate method, Object[] args)\r\n   в NDde.Advanced.DdeContext.Invoke(ThreadStart method)\r\n   в NDde.Server.DdeServer.Register()\r\n   в #=qLnhEF5Z48wRQ9u$AmcVUfEQZSUm6BLPcSO2O2yUGaXk=.#=qmkIiuhBdYh6_e2VQ9e6kVXycuGcKpHLIr5Z$LIgROwI=.#=qzPHdg7XAZqW0YyxFfJTwcw==()\r\n   в Ecng.Common.ThreadingHelper.<>c__DisplayClass10.<Thread>b__f()\r\n   в System.Threading.ThreadHelper.ThreadStart_Context(Object state)\r\n   в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)\r\n   в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)\r\n   в System.Threading.ThreadHelper.ThreadStart()"
Автор топика
Спасибо:

Alexander

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


Это не ошибка. Нельзя создать 2 QuikTrader с одним и тем же именем DDE сервера и Transaq2Quik библиотеки.
Передавайте в конструктор разные параметры.
Спасибо:

Daenur

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


Ок, а как тогда убить первый, чтоб создать потом второй?

Я создаю QuikTrader или SmartTrader в диалоговом окне, оно каждый раз создается заново, как понимаете. Допустим, сначала создал QuikTrader. Потом - SmartTrader (и в главном окне использовал уже его), на QuikTrader уже ссылок не осталось живых. Потом заново пытаюсь создать QuikTrader, и тут валится ошибка.

Несколько непривычно получать ошибку при создании нового объекта класса, с учетом того, что ссылка на старый давно не существует.
Автор топика
Спасибо:

Alexander

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


Daenur Перейти
Несколько непривычно получать ошибку при создании нового объекта класса, с учетом того, что ссылка на старый давно не существует.


Вы уверены что экспорт остановлен и GC (garbage collector) успешно сработал?
Как это проверяется и выполняется?

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

Daenur

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


Экспорт мог и не начинаться. Отдельного вызова GC тоже было недостаточно. Получилось избавиться от проблемы путем небольшого рефакторинга и ручного вычищения старого объекта. И только после этого можно создавать новый, не получая ошибку.

Код

if (this.trader != null)
{
	trader.Dispose();

	GC.Collect();
	GC.WaitForPendingFinalizers();
	GC.Collect();
}
Автор топика
Спасибо:

Mikhail Sukhov

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


Daenur Перейти
Ок, а как тогда убить первый, чтоб создать потом второй?


Dispose
Спасибо:

Daenur

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


Да, это понятно. Просто сначала подумал, что при создании что-то куда-то пишется или сохраняется, и потом когда новый объект создается, запись уже существует, вот и не может создаться заново. Поэтому и спрашивал про метод для очистки вероятных записей в каком-нибудь хранилище. Про очевидный вариант подумал во вторую очередь. :)
Автор топика
Спасибо:


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

loading
clippy