У вас не стоит Flash Player
Настройки
#81136 - Sun Jan 29 2017 04:21 PM Уточнение по работе с массивом данных
Paul Offline
stranger

Registered: Wed Jul 13 2016
Записи: 17
Доброго времени суток, уважаемые форумчане.
Планирую написать свой индикатор и прошу Вас помочь мне понять принцип работы с массивом данных.
Планирую использовать подключение через QUIK (вдруг это важно). smile
При использовании потоковых данных, например я ограничу число значений в массиве равную 500, пусть это будет цена закрытия и скрипт (индикатор) будет считать среднюю цену массива данных.
Меня интересуют следующие вопросы.
1. я правильно понимаю, что первые 500 значений заполнят массив "одним махом" сразу с начала работы скрипта (ибо, QUIK подгружает историю значений)?
2. Когда придет "новая цена" (появится новая цена закрытия) то она вытеснит из диапазона значений "цену" под номером 500 и скрипт выполнит расчет среднего значения с учетом значения "новой цены"?
3. "Новая цена" при этом займет значение под номером "0"?
Прошу не судить меня строго, я только учусь.
Заранее благодарю за содействие.

Наверх
#81137 - Mon Jan 30 2017 10:06 AM Re: Уточнение по работе с массивом данных [Re: Paul]
ViL Online   content
TSLab
Carpal Tunnel

Registered: Sun Oct 17 2010
Записи: 8133
При чем тут Quik не очень понятно, но в целом верно.
Если подключение QuikDDE, то данные придут из MFD, а не Quik.
Если подключение QuikLua, то данные придут из Quik и так как там нет истории, то они "начнут приходить".

Наверх
#81158 - Sun Feb 05 2017 03:55 PM Re: Уточнение по работе с массивом данных [Re: ViL]
Paul Offline
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]
Paul Offline
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]
jhgjrht Offline
writer

Registered: Sun Nov 21 2010
Записи: 428
Originally Posted By: Paul

Code:
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 - список, есть разница) не окажутся, их нужно скопировать. Видимо, поскольку Вы хотите сами указывать длину, копировать надо примерно так
Code:
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#.

Сразу напишу, что строчки
Code:
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]
Paul Offline
stranger

Registered: Wed Jul 13 2016
Записи: 17
jhgjrht, благодарю за содержательный ответ.
"матчасть" учу... просто трудно не программисту вникнуть сходу в C#...
Хотя в универе по TPascal все сам делал и на отлично...

Наверх
#81219 - Mon Feb 13 2017 03:30 PM Re: Уточнение по работе с массивом данных [Re: Paul]
Paul Offline
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]
Paul Offline
stranger

Registered: Wed Jul 13 2016
Записи: 17
Товарищи разработчики и эксперты TSlab. Прошу вашей помощи. Помогите ответом на вопрос (вопрос постом выше).

Наверх
#81253 - Thu Feb 16 2017 06:51 PM Re: Уточнение по работе с массивом данных [Re: Paul]
jhgjrht Offline
writer

Registered: Sun Nov 21 2010
Записи: 428
Не должен, но может, если очень хочется. smile
2й вариант ближе к текущей "реальности".

"Контракт" индикатора с программой заключается в строке (в Вашем случае):
public IList<double> Execute(IList<double> list1)
это значит, что программа дает индикатору список значений и ждет в ответ тоже список. Неявно подразумевается, что длины списков должны быть одинаковы.
Список каждый раз будет разным, но этого никто не гарантирует.
_________________________
Не пишите мне! Никому ничего делать не буду.

Наверх
#81257 - Fri Feb 17 2017 02:52 AM Re: Уточнение по работе с массивом данных [Re: jhgjrht]
Paul Offline
stranger

Registered: Wed Jul 13 2016
Записи: 17
jhgjrht, благодарю за содействие!
Я в бой, творить индикатор (возможно у меня еще появятся вопросы в будущем...)!

Наверх


Moderator:  ViL, sar