Индекс за пределами диапазона

Автор: Door

Индекс за пределами диапазона - Fri Nov 26 2010 01:33 AM

01:07:22.94 System.ArgumentOutOfRangeException: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Имя параметра: index
в System.ThrowHelper.ThrowArgumentOutOfRangeException()
в System.SZArrayHelper.get_Item[T](Int32 index)
в TSLab.User.Script.<>c__DisplayClass9.<Execute>b__7()
в TSLab.DataSource.ObjectsCacheBase`3.Get(TKey name, CacheObjectMaker`1 maker)
в TSLab.ScriptEngine.BaseTemplateContext.GetData(String handlerName, String[] parameters, CacheObjectMaker`1 maker)
в TSLab.User.Script.Execute(IContext context, ISecurity var0)

До сегодняшнего дня использовал только часовые данные, скачанные с Финама. Сегодня решил попробовать пятиминутки, и вот такое сообщение выпадает в программе при попытке выполнить скрипт. Если честно, то я не понимаю, что мне этим хочет сказать программа). Сразу оговорюсь, что данные скачивал с теми же параметрами, что и часовые, и как рекомендовано в другой ветке форума (где я и хотел открыть новоую тему, но там нет такой кнопки), с той лишь разницей, что изменил таймфрейм на 5мин. Вопрос: что означает это сообщение и как с этим бороться?
Автор: Door

Re: Индекс за пределами диапазона - Fri Nov 26 2010 12:12 PM

Пожалуй я понял, в чем тут дело
Автор: Door

Re: Индекс за пределами диапазона - Mon Nov 29 2010 05:05 PM

И все же хочу вернуться к данному вопросу. В прошлый раз я просто сдвинул "Дату от" на несколько месяцев вперед и ошибка перестала выскакивать? Сегодня же это предупреждение стало вновь выскакивать, причем сузил на пятиминутках диапазон выборки до 10 дней? Бесполезно? Что я неправильно делаю?
Автор: Nektodron

Re: Индекс за пределами диапазона - Mon Nov 29 2010 06:42 PM

У вас формулы используются? Используется в них [i-1]?
Автор: Door

Re: Индекс за пределами диапазона - Mon Nov 29 2010 06:55 PM

Ответ ДА на оба вопроса
Автор: Vladimir /

Re: Индекс за пределами диапазона - Mon Nov 29 2010 09:57 PM

начинать с 1
Автор: Door

Re: Индекс за пределами диапазона - Tue Nov 30 2010 12:17 AM

Ясно, спасибо
Автор: Door

Re: Индекс за пределами диапазона - Mon Dec 13 2010 05:48 PM

Originally Posted By: Vladimir /
начинать с 1

Простите, что поднимаю тему заново. Вернулся к этому скрипку и опять та же проблема. "Начинать с 1" Вы имели ввиду настройку скрипта "Торговать с (бар)"? Я понял именно так, но, видимо, не верно понял, т.к. изменение этой настройки мне не помогло. Так о чем же Вы говорили?
Автор: Nektodron

Re: Индекс за пределами диапазона - Mon Dec 13 2010 06:16 PM

имелось в виду в формуле изменить параметр "Начинать с"
Автор: Door

Re: Индекс за пределами диапазона - Mon Dec 13 2010 06:53 PM

Ага, вот теперь получилось. Но чтобы вслепую не использовать этот параметр, можно где-то подробнее почитать о его предназначении и на что он вообще влияет?
Автор: ViL

Re: Индекс за пределами диапазона - Mon Dec 13 2010 07:05 PM

Это просто. "Начинать с" - означает с какого индекса начинать расчет. Если в блоке формула используете [i-5]. То начинать с 5. Если в блоке есть [i-1] То начинать с 1.
Автор: Door

Re: Индекс за пределами диапазона - Mon Dec 13 2010 07:17 PM

Спасибо. Теперь буду знать
Автор: ViL

Re: Индекс за пределами диапазона - Mon Dec 13 2010 07:19 PM

Если в блоке используется и [i-5] и [i-1], то начинать с 5.
Автор: Door

Re: Индекс за пределами диапазона - Mon Dec 13 2010 07:27 PM

Это я понял). Ориентируемся на максимальное значение
Автор: SPLsd

Re: Индекс за пределами диапазона - Mon Dec 13 2010 08:29 PM

Originally Posted By: ViL
Если в блоке используется и [i-5] и [i-1], то начинать с 5.

У меня в формуле i-3, ставлю начинать с 1, всё равно работает smile.
Автор: ViL

Re: Индекс за пределами диапазона - Mon Dec 13 2010 10:19 PM

Не должно ... smile
Автор: SPLsd

Re: Индекс за пределами диапазона - Mon Dec 13 2010 10:23 PM

Originally Posted By: ViL
Не должно ... smile

Пашет, даже ошибки не выдаёт. smile
Автор: Nektodron

Re: Индекс за пределами диапазона - Mon Dec 13 2010 10:38 PM

Если формула используется для расчетов выхода из позиции, то считается она соответственно только при наличии позиции, поэтому и ошибок нет, т.к. позиции редко на 5м баре открываются.
Автор: SPLsd

Re: Индекс за пределами диапазона - Mon Dec 13 2010 10:50 PM

Originally Posted By: Nektodron
Если формула используется для расчетов выхода из позиции, то считается она соответственно только при наличии позиции, поэтому и ошибок нет, т.к. позиции редко на 5м баре открываются.

Да, тоже так подумал, так как формула начинает пахать только после разгона.
Автор: Klever

Re: Индекс за пределами диапазона - Wed Oct 05 2011 03:43 PM

Камрады!!!

Спасайте!

Такая же фигня и этим "Индекс за пределами диапазона", всё ясно со значением с которого нужно начинать, но у меня ошибка возникает при добавлении второго блока логическая формула (вынесении условия в отдельный блок), поясню:

если все условия затолкать в один блок разделив символом "&&" то типа всё работает, но для дебагинга (срабатывает вход, хотя фактически, визуально наблюдаем, что это доп.условие не выполнено) я решил вынести open[i+1]<close[i+1] в отдельный блок,
и вот на него и ругается прога...
задрался уже, матерю TSL на чем свет стоит... smile

Автор: ViL

Re: Индекс за пределами диапазона - Wed Oct 05 2011 04:19 PM

i+1 это заглядывание в будущее, программа должна выдавать сообщение на такую запись.
А то, что нет никаких сообщений, если записать все в одном блоке - вот это уже ошибка. smile
Автор: Klever

Re: Индекс за пределами диапазона - Thu Oct 06 2011 09:32 AM

Пасиба огроменное!
Сделал то что хотел, тока вот число прибыльных сделок упало до 48% с 98% (при удержании один бар), разрушил грааль своими руками, не сохранив предыдущую версию grin
Автор: Klever

Re: Индекс за пределами диапазона - Thu Oct 06 2011 09:55 AM

Мда, жырный глюк TSL однако... видимо и правда заглядывание в будущее судя по точке входа на закрытии [i]-го бара и выполнении условия [i+1]-го, правда 98% угаданых вернуть не смог, не всё смог воспроизвести, а вот 73% получилось, то то я думаю эквити такая красивая :)))
Автор: agor

Re: Индекс за пределами диапазона - Mon Nov 07 2011 11:39 AM

У меня в формулах не используется [i-1], тем не менее появляется сообщение:

11:36:50.86 System.ArgumentOutOfRangeException: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Имя параметра: index
в System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
в System.ThrowHelper.ThrowArgumentOutOfRangeException()
в System.SZArrayHelper.get_Item[T](Int32 index)
в TSLab.User.Script.Execute(IContext context, ISecurity var1, ISecurity var3)

В чем может быть дело?

P.S.: При этом ошибка то возникает, то нет.
Автор: Nektodron

Re: Индекс за пределами диапазона - Tue Nov 08 2011 12:42 AM

У вас в скрипте используется две бумаги. Возможно, вторая бумага не выбрана, либо по ней нет данных.
Автор: ViL

Re: Индекс за пределами диапазона - Tue Nov 08 2011 01:37 AM

Либо вторая бумага - индекс.
Автор: WinEasily

Re: Индекс за пределами диапазона - Wed Jul 25 2012 08:25 PM

Похожая проблема Скрипт работает потом зависает
Перед запуском скрипта
20:23:29.50 120 System.NullReferenceException: В экземпляре объекта не задана ссылка на объект.
в TSLab.Samples.Class_Rt.Execute(IContext ctx, ISecurity source1)
в TSLab.User.Script.Execute(IContext context, ISecurity Source1)

После остановки скрипта
20:25:20.08 100 Скрипт: 'Option01' System.ArgumentOutOfRangeException: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Имя параметра: index
в System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
в System.ThrowHelper.ThrowArgumentOutOfRangeException()
в System.Collections.Generic.List`1.get_Item(Int32 index)
в TSLab.Samples.Class_Rt.Execute(IContext ctx, ISecurity source1)
в TSLab.User.Script.Execute(IContext context, ISecurity Source1)
Автор: ViL

Re: Индекс за пределами диапазона - Wed Jul 25 2012 09:29 PM

Несколько инструментов используете? Попробуйте снять флаг Пересчет по каждому инструменту. Если среди инструментов есть индекс, обычно это помогает.
Автор: WinEasily

Re: Индекс за пределами диапазона - Thu Jul 26 2012 08:22 AM

Используется один инструмент, на реальном рынке.

Было ...
ISecurityRt secRt = sec as ISecurityRt;
if (!secRt.Positions.IsRealtime) return;

Поменял на

/// Торговля.
if (!sec.Positions.IsRealtime) return;
{

int i = sec.Bars.Count - 1;
if (i < 0) return;
IList<IQueueData> buyQueue = sec.GetBuyQueue(i);//получаем биржевой стакан
IList<IQueueData> sellQueue = sec.GetSellQueue(i);//получаем биржевой стакан

ISecurityRt secRt = sec as ISecurityRt;
if (secRt == null) return;
...
}
Перестало выдавать ошибку. В чем причина не понял...

Но ошибка про индекс осталась

08:57:52.29 100 Скрипт: 'Option01' System.ArgumentOutOfRangeException: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Имя параметра: index
в System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
в System.ThrowHelper.ThrowArgumentOutOfRangeException()
в System.Collections.Generic.List`1.get_Item(Int32 index)
в TSLab.Samples.Class_Rt.Execute(IContext ctx, ISecurity sec)
в TSLab.User.Script.Execute(IContext context, ISecurity sec)

Индекс используется только один раз вверху по тексту...
Возможно что-то не правильно здесь

//пробегаемся по всем исполненным лимитникам-нам
foreach (IOrder order in secRt.Orders)
if (order.OrderType == TSLab.DataSource.OrderType.Limit)
{
//ордер не исполнился ожидаем исполнения
if (!order.IsExecuted) return;
}

хотя закоментировав строку ошибка осталась...

Ошибка нашлась
double baseActive = Math.Round((buyQueue[0].Price + sellQueue[0].Price) / 2);

при использовании buyQueue[0].Price или sellQueue[0].Price возникает ошибка с индексом

Как ее решить?
Автор: WinEasily

Re: Индекс за пределами диапазона - Thu Jul 26 2012 12:04 PM

При работе со стаканом возникает ошибка указанная в предыдущем посте

т.е. использование
sec.GetBuyQueue(0)[0].Price и sec.GetSellQueue(0)[0].Price
вызывает ошибку индекса
использование их аналога ошибки не вызывает
secRt.FinInfo.Bid.Value и secRt.FinInfo.Ask.Value

просьба к разработчикам разъяснить возможно я неверно работаю со стаканом?
Автор: Gji

Re: Индекс за пределами диапазона - Thu Jul 26 2012 12:28 PM

Originally Posted By: WinEasily
т.е. использование
sec.GetBuyQueue(0)[0].Price и sec.GetSellQueue(0)[0].Price
вызывает ошибку индекса
Ну размер возвращаемых массивов надо все же проверять, стакан может быть и пустым:
IList<IQueueData> buyQueue = sec.GetBuyQueue(i);
if (buyQueue != null && buyQueue.Count > 0)
{
buyQueue[0].Price ....
}
Автор: WinEasily

Re: Индекс за пределами диапазона - Thu Jul 26 2012 02:04 PM

Да отлично все работает замечательно.

Но осталась третья проблема. Скрипт зависает после нескольких шагов. Ошибок явных нет. Которые были все решены.
куда копать?
Автор: Gji

Re: Индекс за пределами диапазона - Thu Jul 26 2012 02:17 PM

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

Re: Индекс за пределами диапазона - Thu Jul 26 2012 05:45 PM

Скрипт проработал 1 час 16 минут и завис. Интервал обсчета 2 сек. Скрипт выполнился 2280 раз и после этого завис. Это дело в скрипте или что-то еще не пойму?
Автор: WinEasily

Re: Индекс за пределами диапазона - Thu Jul 26 2012 06:15 PM

Вот кусок лога в момент зависания

18:10:16.07[11]DEBUG:New RealtimePositionList was created for RTS-9.12
18:10:16.07[11]INFO :RTS-9.12:FORTS Фьючерсы: Orders has been updated for Option01. 0 active orders, 0 total
18:10:16.07[11]INFO :RTS-9.12:FORTS Фьючерсы: Orders has been updated for Option01. 0 active orders, 0 total
18:10:16.07[11]INFO :100:Info:Script:(Script:Option01):Скрипт: 'Option01' Скрипт выполнен успешно за 3мс. (14436 баров, время 26.07.2012 18:10:16)
18:10:16.07[11]INFO :Скрипт выполнен успешно за 3мс. (14436 баров, время 26.07.2012 18:10:16)
18:10:16.07[11]INFO :RTS-9.12:FORTS Фьючерсы: Orders has been updated for Option01. 0 active orders, 0 total
18:10:18.07[9]DEBUG:New RealtimePositionList was created for RTS-9.12
18:10:18.07[9]INFO :RTS-9.12:FORTS Фьючерсы: Orders has been updated for Option01. 0 active orders, 0 total
18:10:18.07[9]INFO :RTS-9.12:FORTS Фьючерсы: Orders has been updated for Option01. 0 active orders, 0 total
18:10:18.07[9]INFO :100:Info:Script:(Script:Option01):Скрипт: 'Option01' Скрипт выполнен успешно за 4мс. (14437 баров, время 26.07.2012 18:10:18)
18:10:18.07[9]INFO :Скрипт выполнен успешно за 4мс. (14437 баров, время 26.07.2012 18:10:18)
18:10:18.18[9]INFO :RTS-9.12:FORTS Фьючерсы: Orders has been updated for Option01. 0 active orders, 0 total
18:11:54.52[9]WARN :Can't map source 'sec' for script 'Option01'!
18:11:54.52[9]DEBUG:Скрипт: 'Option01' run=True:True dateFrom='26.07.2012 0:00:00' dateTo='27.07.2012 0:00:04' mx=0 Interval=2S RecalcInterval=INTERVAL LimitType=LimitInLots Limit=0 Slip=0 Slip%=0 OpenPositionNoSlippage=False TakeProfitNoSlippage=False InvalidStopsByMarket=True ByMarketAsLimt=True AutoEntryBars=0 AutoCloseBars=0
18:11:54.52[9]DEBUG:State 15. Detach update to 'RTS-9.12:FORTS Фьючерсы'
18:11:54.52[9]DEBUG:State 16. Initialization is started.
18:11:54.57[1]INFO :100:Info:Script:(Script:Option01):Скрипт: 'Option01' остановлен
18:11:54.57[1]INFO :остановлен
18:11:55.74[9]DEBUG:State 16, Adding 0 trades to RTS-9.12:FORTS Фьючерсы. startTime=07/26/2012 18:11:58 endTime=07/27/2012 00:00:04
18:11:55.74[9]DEBUG:State 16, UpdateData finished to RTS-9.12:FORTS Фьючерсы. bars=14486
18:11:56.19[9]DEBUG:New RealtimePositionList was created for RTS-9.12
18:11:56.19[9]INFO :RTS-9.12:FORTS Фьючерсы: Orders has been updated for Option01. 0 active orders, 0 total
18:11:56.19[9]DEBUG:State 16. Initialization is stopped.
18:11:56.19[9]INFO :RTS-9.12:FORTS Фьючерсы: Orders has been updated for Option01. 0 active orders, 0 total
18:11:56.19[9]INFO :100:Info:Script:(Script:Option01):Скрипт: 'Option01' Скрипт выполнен успешно за 8мс. (14486 баров, время 26.07.2012 18:11:56)
18:11:56.19[9]INFO :Скрипт выполнен успешно за 8мс. (14486 баров, время 26.07.2012 18:11:56)
18:11:56.19[9]INFO :RTS-9.12:FORTS Фьючерсы: Orders has been updated for Option01. 0 active orders, 0 total
18:12:15.98[9]DEBUG:Disconnect by user

Прошу помощи разработчиков...
Автор: WinEasily

Re: Индекс за пределами диапазона - Thu Jul 26 2012 06:47 PM

Произошло следующее. Выполнялся скрипт. Во время выполнения в оболочке TSLab внизу время остановилось и вместе с ним завис скрипт. После перезапуска скрипт зависает при первом прогоне ...
Автор: SupportTSLab

Re: Индекс за пределами диапазона - Thu Jul 26 2012 07:03 PM

Просьба выслать лог и линк на форум на http://support.tslab.ru/
Автор: WinEasily

Re: Индекс за пределами диапазона - Fri Jul 27 2012 08:37 AM

С зависанием разобрался. TSLab виснет при отключении дисплея (энергопотребление).
Спасибо за помощь Gji.

Но есть вопрос. Ночью произошло отключение от брокера.
00:29:56.79 4 Ошибка при подключении к провайдеру данных 'Solid'
00:29:56.79 2 Вы отсоединились от провайдера данных 'Solid'
00:29:56.79 3 Соединение с провайдером данных 'Solid' потеряно
00:29:56.76 2 Вы отсоединились от провайдера данных 'Solid'
23:50:04.87 100 Скрипт: 'Option01' Скрипт выполнен успешно за 2мс. (22633 баров, время 26.07.2012 23:49:58)

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

Re: Индекс за пределами диапазона - Fri Jul 27 2012 09:05 AM

В Менеджере провайдера данных настройте Расписание. Сервера на ночь отключаются как правило.
Автор: WinEasily

Re: Индекс за пределами диапазона - Tue Jul 31 2012 07:35 AM

Originally Posted By: ViL
Несколько инструментов используете? Попробуйте снять флаг Пересчет по каждому инструменту. Если среди инструментов есть индекс, обычно это помогает.


Как бороться с зависаниями скрипта? Ошибки не выдаются. Любая серьезная модификация приводит к проблеме зависания. Начал использовать несколько инструментов, флаг снял, но зависания продолжаются. Как добиться надежности и стабильности, ведь любая ошибка (в том числе и зависания) приносит реальные, а не виртуальные убытки?
Автор: SupportTSLab

Re: Индекс за пределами диапазона - Tue Jul 31 2012 09:17 AM

Какая у Вас машина? Опишите конфигурацию.
Автор: WinEasily

Re: Индекс за пределами диапазона - Mon Aug 06 2012 04:52 PM

Скорее всего вы правы это что-то с компьютером.

Есть еще один вопрос пытаюсь использовать Стоимость шага цены для фьючерсов и опционов. но secRt.FinInfo.StepPrice.HasValue выдает False можно как либо еще получить Стоимость шага...
Автор: Nektodron

Re: Индекс за пределами диапазона - Mon Aug 06 2012 07:11 PM

Это поле заполняется только при прямом доступе к бирже, ни один брокер не передаёт эту информацию.
Автор: Konstantin_A

Re: Индекс за пределами диапазона - Tue Aug 15 2017 12:03 PM

Добрый день, появляется аналогичная ошибка
System.ArgumentOutOfRangeException: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Имя параметра: index
в System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
в System.Collections.Generic.List`1.get_Item(Int32 index)
в FirstStr_1.FirstStr_1.Execute(IContext ctx, ISecurity source) в c:\Users\Creep\Documents\SharpDevelop Projects\WealthLab\kl\Si-TS.cs:строка 50

Вот сам код со строкой 50:
namespace FirstStr_1
{
public class FirstStr_1 : IExternalScript
{
public IPosition LastActivePosition=null;
public OptimProperty _QBar = new OptimProperty(100, 70, 150, 5);
public OptimProperty _Period = new OptimProperty(100, 50, 200, 5);

public virtual void Execute(IContext ctx, ISecurity source)
{

int FirstValidValue=10;
int EnterKontrakt=1;
int QBar=_QBar;
double SL=0.2;
int Period=_Period;

bool signalBuy;
bool signalShort;

FirstValidValue=Math.Max(FirstValidValue,Period);

IList<double> SMAFilter=ctx.GetData("SMAFilter", new[] {Period.ToString()},
delegate {return Series.SMA(source.ClosePrices, Period); });

IList<double> RaznSMA=new List<double>(source.Bars.Count);

for(int bar = 150; bar < source.Bars.Count; bar++)
{
double nRaznSMA=source.ClosePrices[0]-source.ClosePrices[0];
nRaznSMA=SMAFilter[bar]-SMAFilter[bar-1];
RaznSMA.Add(nRaznSMA);
}

IList<double> SummSMA=new List<double>(source.Bars.Count);

for(int bar = 150; bar < source.Bars.Count; bar++)
{
double nSummSMA =source.ClosePrices[0]-source.ClosePrices[0];
nSummSMA=RaznSMA[bar]+RaznSMA[bar-1];//эта строка 50
SummSMA.Add(nSummSMA);
}

Подскажите, пожалуйста, что делать?