#81136 - Sun Jan 29 2017 04:21 PM
Уточнение по работе с массивом данных
|
stranger
Registered: Wed Jul 13 2016
Записи: 17
|
Доброго времени суток, уважаемые форумчане. Планирую написать свой индикатор и прошу Вас помочь мне понять принцип работы с массивом данных. Планирую использовать подключение через QUIK (вдруг это важно). При использовании потоковых данных, например я ограничу число значений в массиве равную 500, пусть это будет цена закрытия и скрипт (индикатор) будет считать среднюю цену массива данных. Меня интересуют следующие вопросы. 1. я правильно понимаю, что первые 500 значений заполнят массив "одним махом" сразу с начала работы скрипта (ибо, QUIK подгружает историю значений)? 2. Когда придет "новая цена" (появится новая цена закрытия) то она вытеснит из диапазона значений "цену" под номером 500 и скрипт выполнит расчет среднего значения с учетом значения "новой цены"? 3. "Новая цена" при этом займет значение под номером "0"? Прошу не судить меня строго, я только учусь. Заранее благодарю за содействие.
|
Наверх
|
|
|
|
#81158 - Sun Feb 05 2017 03:55 PM
Re: Уточнение по работе с массивом данных
[Re: ViL]
|
stranger
Registered: Wed Jul 13 2016
Записи: 17
|
ViL, спасибо за разъяснение по QuikDDE, я не знал этого. Я вообще пробую создать "кубик", пробую в SharpDevelop 5.1 (ибо бесплато и не надо ничего "крякать"). Подскажите, пожалуйста, если у меня будет считываться массив данных по QuikDDE и значений в нем будет 10000 (например, где 1-ое значение это "старая цена", а 10000-ое "новая цена") то как мне понять какие значения массива QuikDDE (с 1 по 500 или с 500 по 1 или с 9501 по 10000 или с 10000 по 9501) будет обрабатывать мой "кубик" из 500-та значений? начало кубика планирую взять с русалго:
using System; using System.Collections.Generic; using TSLab.Script.Handlers;
namespace MyCube1.Handlers.Public { [HandlerCategory("MyCube")] [HandlerName("MyCube1test")] public class MyCube1test : ITwoSourcesHandler, IStreamHandler, IDoubleInputs, IDoubleReturns { private int _depth;
[HandlerParameter(Name = "Длина массива", Default = "500")] public int Depth { get { return _depth; } set { if (value < 3) throw new Exception("Значение Depth не может быть меньше 3.");
_depth = value; } }
public IList<double> Execute(IList<double> list1) { var cnt = list1.Count; var values = new double[cnt];
// Массив, по которым считается среднее значение. var input1 = new double[Depth];
|
Наверх
|
|
|
|
#81212 - Sat Feb 11 2017 07:42 PM
Re: Уточнение по работе с массивом данных
[Re: ViL]
|
stranger
Registered: Wed Jul 13 2016
Записи: 17
|
Видимо я как-то запутанно задал свой вопрос раз никто не отвечает... Попробую перефразировать. Допустим данные о цене поступают по подключению QuikDDE и в массиве поступающих данных 1000 значений. Предположим, что значение номер "0"=1, значение номер "1"=2, "2"=3, "3"=4...."998"=999, "999"=1000. И эти данные поступают потоком и поступают они одно за другим. Вопрос №1: какое значение массива данных заходит в "кубик" индикатора "первым", "0"-ое или "999"-ое? Вопрос №2: "0"-ое или "999"-ое значение входящего потока данных является "новой"/"актуальной" ценой по инструменту? Затем когда поток данных поступает в "кубик" то в "кубике" создается свой собственный массив данных из 500-та значений который используется для вычисления в индикаторе (далее по тексту - "массив индикатора"). Вопрос №3: какую цену в "массиве индикатора" будет содержать значение "0", 1, 500, 501 или 1000? Понимание этих вопросов очень важно для описания "матиматики" в "кубике". Заранее благодарю.
|
Наверх
|
|
|
|
#81213 - Sun Feb 12 2017 12:39 AM
Re: Уточнение по работе с массивом данных
[Re: Paul]
|
writer
Registered: Sun Nov 21 2010
Записи: 428
|
public IList<double> Execute(IList<double> list1)
{
var cnt = list1.Count;
var values = new double[cnt];
// Массив, по которым считается среднее значение.
var input1 = new double[Depth];
Код Вашего индикатора обрывается на операторе new. Этот оператор лишь выделяет запрошенное количество памяти и инициализирует ее нулями. Другие значения там (в переменной input1) сами по себе не появятся, их туда нужно будет скопировать. Значения передаются в Ваш индикатор в списке list1. И приходят они одновременно, сразу списком. Программа подчитает с диска историю, дождется новой свечи и т.п., заполнит список и даст его Вашему индикатору, вызвав функцию Execute. При появлении следующей свечи все это повторится. 1. значения в этом списке представлены с увеличением времени, т.е. по мере увеличения индекса элемента списка увеличивается и дата\время с которой он ассоциирован. Например, значение элемента list1[0] - соответствует времени 10:00, а list1[1] - 10:01. и т.д. 2. Самое новое значение в конце списка, т.е. в элементе list1[ list1.Count-1 ] 3. В каком порядке скопируете, в таком и будут. Повторю, сами по себе значения в новом массиве (new double[Depth] - это массив, а IList<double> list1 - список, есть разница) не окажутся, их нужно скопировать. Видимо, поскольку Вы хотите сами указывать длину, копировать надо примерно так
int count = Math.Min( Depth, list1.Count );
for (int i = Depth - count, b = list1.Count - count; i < count; i++, b++)
input1[ i ] = list1[ b ];
Выглядит сложно и непонятно (даже мне сложно, навскидку, такое написать)? Используйте простые готовые примеры, коих предостаточно на форуме. Нелишне Вам будет и почитать какой-нибудь учебник по языку C#. Сразу напишу, что строчки
public class MyCube1test : ITwoSourcesHandler, IStreamHandler, IDoubleInputs, IDoubleReturns
и
public IList<double> Execute(IList<double> list1)
не соответствуют друг-другу. Пишите проще, например
public class MyCube1test : IDouble2DoubleHandler
|
Наверх
|
|
|
|
#81214 - Sun Feb 12 2017 08:11 AM
Re: Уточнение по работе с массивом данных
[Re: jhgjrht]
|
stranger
Registered: Wed Jul 13 2016
Записи: 17
|
jhgjrht, благодарю за содержательный ответ. "матчасть" учу... просто трудно не программисту вникнуть сходу в C#... Хотя в универе по TPascal все сам делал и на отлично...
|
Наверх
|
|
|
|
#81219 - Mon Feb 13 2017 03:30 PM
Re: Уточнение по работе с массивом данных
[Re: Paul]
|
stranger
Registered: Wed Jul 13 2016
Записи: 17
|
Уважаемые форумчане, доброго времени суток. проанализировав полученную информацию, у меня все же осталось недопонимание... Прошу, объясните мне, не могу до конца осознать как поступают данные о цене инструмента от поставщика в "кубик". есть, по моему пониманию, два варианта, хотя я могу заблуждаться. 1 вариант - данные о цене инструмента поступают в виде массива данных, допустим с историей за 1 год, порядка 4050 значений единоразово, а затем в режиме онлайн при появлении новой свечи к массиву добавляется 1 значение, затем еще одно и т.д. в итоге весь массив входящих данных храниться где-то в памяти компьютера клиента биржи и по одном значению ему дописываются новые цены к существующему массиву. И "кубик-индикатор" тоже будет вынужден "хранить" ранее полученные значения и прибавлять по одному новому значению каждый заданный промежуток времени.... 2 вариант - данные о цене инструмента поступают в виде массива данных, допустим с историей за 1 год, порядка 4050 значений единоразово,а затем в режиме онлайн при появлении новой свечи старый массив удаляется и единоразово поступает новый массив из 4051 значения и т.д. И "кубик-индикатор" не будет ничего "хранить", а просто будет при поступлении нового массива работать с ним, понимая что последнее значение массива это новая цена...
Нужно понять, должен ли "кубик-индикатор" хранить и накапливать поступающие данные самостоятельно.
Отредактировано Paul (Tue Feb 14 2017 02:41 AM)
|
Наверх
|
|
|
|
#81252 - Thu Feb 16 2017 03:58 PM
Re: Уточнение по работе с массивом данных
[Re: Paul]
|
stranger
Registered: Wed Jul 13 2016
Записи: 17
|
Товарищи разработчики и эксперты TSlab. Прошу вашей помощи. Помогите ответом на вопрос (вопрос постом выше).
|
Наверх
|
|
|
|
#81253 - Thu Feb 16 2017 06:51 PM
Re: Уточнение по работе с массивом данных
[Re: Paul]
|
writer
Registered: Sun Nov 21 2010
Записи: 428
|
Не должен, но может, если очень хочется. 2й вариант ближе к текущей "реальности". "Контракт" индикатора с программой заключается в строке (в Вашем случае): public IList<double> Execute(IList<double> list1) это значит, что программа дает индикатору список значений и ждет в ответ тоже список. Неявно подразумевается, что длины списков должны быть одинаковы. Список каждый раз будет разным, но этого никто не гарантирует.
_________________________
Не пишите мне! Никому ничего делать не буду.
|
Наверх
|
|
|
|
#81257 - Fri Feb 17 2017 02:52 AM
Re: Уточнение по работе с массивом данных
[Re: jhgjrht]
|
stranger
Registered: Wed Jul 13 2016
Записи: 17
|
jhgjrht, благодарю за содействие! Я в бой, творить индикатор (возможно у меня еще появятся вопросы в будущем...)!
|
Наверх
|
|
|
|
|
|