Alexander
|
Дата: 13.01.2012
Это Стратегии и Алгоритмы. Именно эта тема является общей.
По проблеме - чему равен SelectedSecurity ну и полный Stack Trace конечно нужен. Не в виде скриншота только, а ctr+c, ctr+v.
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 13.01.2012
Не плохо бы стек трейс вставлять текстом. Можно даже без скрина.
|
|
Спасибо:
|
|
|
|
|
Daenur
|
Дата: 14.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
|
Дата: 15.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
|
Дата: 15.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 ![Перейти Перейти](https://stocksharp.ru/images/icon_latest_reply.gif) Спасибо за оперативность, забираю!
Кстати, вопрос по выкладыванию. Немного доработал индикатор JurikMovingAverage, хочу его выложить. Могу прямо в trunk класть? Нет, в dev. В trunk - только баг-фиксы относящиеся к версии 4.0, в фиксах которых уверены. Вся доработка и непосредственно разработка - в dev. Будет готов 4.1 - будет мёрж dev с trunk.
|
|
Спасибо:
|
|
|
|