Каким должен быть стакан цен? - страница 13

 
Реter Konow:

1. Программа пишется на двух языках. Базовый язык MQL5, и поверх него, мой язык разметки. 

2. Распределяются также, как присылаются. В смысле, в нужные ячейки. Словами сложно обьяснить. Позже скину код. Конечно, там пришлось попотеть, чтобы данные попадали в нужные ячейки, но этот вопрос решен.

3. Да, буду добавлять всё что попросят и что имеет смысл и важность.

mql5 это хорошо, не будет проблем с совместимостью, и читаемостью кода
А как они присылаются, мы же не знаем, какой тип данных вы взяли за основу.
Поток, слепок, Json.
Если распределение по уровням сделано в цикле for, я бы отказался от циклов.
Любые циклы имеют время на обработку, а это задержка.
В стакане всего примерно 40 уровней цен, вверх вниз.
По этому я бы для каждого уровня прописал бы свою переменную с нужным значением, исключив цикл.

 
Roman:

mql5 это хорошо, не будет проблем с совместимостью, и читаемостью кода
А как они присылаются, мы же не знаем, какой тип данных вы взяли за основу.
Поток, слепок, Json.
Если распределение по уровням сделано в цикле for, я бы отказался от циклов.
Любые циклы имеют время на обработку, а это задержка.
В стакане всего примерно 40 уровней цен, вверх вниз.
По этому я бы для каждого уровня прописал бы свою переменную с нужным значением, исключив цикл.

Посмотрите код на предыдущей странице.

Я централизую приходящие данные относительно центральной ячейки стакана. Наиближайшая цена к аск ставится в ячейку в центре и далее наверх остальные цены в порядке увеличения. Тоже самое с ценой бид и их заявками.

 
Roman:

mql5 это хорошо, не будет проблем с совместимостью, и читаемостью кода
А как они присылаются, мы же не знаем, какой тип данных вы взяли за основу.
Поток, слепок, Json.
Если распределение по уровням сделано в цикле for, я бы отказался от циклов.
Любые циклы имеют время на обработку, а это задержка.
В стакане всего примерно 40 уровней цен, вверх вниз.
По этому я бы для каждого уровня прописал бы свою переменную с нужным значением, исключив цикл.

Я не знаю, как можно решить задачу распределения приходящих данных без цикла. Может подскажите?

Иногда приходит более 40 уровней цен. Некоторые не влазят в стакан. Поэтому, я сделал массив приемник в 100 ячеек. Хотя отобразить все в стакане нельзя, но затребовать из движка можно.

 
Roman:

...
По этому я бы для каждого уровня прописал бы свою переменную с нужным значением, исключив цикл.

Данные приходят в массив в порядке от самой высокой цены до самой низкой. При этом, количество данных не ограничено. Может прийти 60 цен с заявками, по 30 для каждой стороны, а может прийти 30 цен  и все с ценами выше аск или ниже бид. Поэтому, без цикла проблему не решить.

 
Реter Konow:

Данные приходят в массив в порядке от самой высокой цены до самой низкой. При этом, количество данных не ограничено. Может прийти 60 цен с заявками, по 30 для каждой стороны, а может прийти 30 цен  и все с ценами выше аск или ниже бид. Поэтому, без цикла проблему не решить.

Если в массиве не нарушается индексация пришедших элементов, то из массива брать каждый элемент без цикла и присваивать в свою переменную.
И уже каждую переменную с содержащим значением присваивать уровню ячейки.
А можно сразу каждый элемент массива присваивать уровню.
Тогда исключаем еще и переменные, но не инициализированные данные плохой тон в кодинге.

 

Ещё мысль пришла.
Пришедший массив разделить на два массива Bid и Ask
И подумать как задействовать функцию CopyArray()

Реализовав два способа, потом можно замерить скорость обработки.
И какой способ покажет лучший результат, тот и оставить.
 
Roman:

Если в массиве не нарушается индексация пришедших элементов, то из массива брать каждый элемент без цикла и присваивать в свою переменную.
И уже каждую переменную с содержащим значением присваивать уровню ячейки.
А можно сразу каждый элемент массива присваивать уровню.
Тогда исключаем еще и переменные, но не инициализированные данные плохой тон в кодинге.

Увы, в массиве нет упорядоченных цен и его индексация не указывает на конкретные ячейки стакана. Данные приходят от большей цены к меньшей, но на этом порядок заканчивается. Между ценами может быть один пункт, а может быть 10 или 153. Стакан показывает последние измененные объемы заявок на всем диапазоне на котором они находятся. Если на цену за 150 пунктов сверху от аск изменилось количество лимитных заявок, то она окажется в массиве. Поэтому, в массиве никакого порядка, кроме от большего к меньшему, нет и иначе как в цикле, данные не упорядочить.

 
Реter Konow:

Увы, в массиве нет индексации. Данные приходят от большей цены к меньшей, но на этом порядок заканчивается. Между ценами может быть один пункт, а может быть 10 или 153. Стакан показывает последние измененные объемы заявок на всем диапазоне на котором они находятся. Если на цену за 150 пунктов сверху от аск изменилось количество лимитных заявок, то она окажется в массиве. Поэтому, в массиве никакого порядка, кроме от большего к меньшему, нет и иначе как в цикле, данные не упорядочить.

Индексация по элементам массива есть в принимающем массиве.
Данные приходят от большей цены к меньшей, они же всегда упорядочены последовательно?
Вот и выбирайте любой нужный элемент из принимающего массива по индексу, но без цикла.
А если таким способом не возможно выловить лучший Bid/Ask из за меняющегося размера приходящих данных,
то наверно тогда надо подумать о CopyArray()

 
Roman:

Индексация по элементам массива есть в принимающем массиве.
Данные приходят от большей цены к меньшей, они же всегда упорядочены последовательно?
Вот и выбирайте любой нужный элемент из принимающего массива по индексу, но без цикла.

Упорядочены последовательно. Но:

  1. Данных может прийти больше чем ячеек стакана. 
  2. Между ценами нет четкого порядка. Может прийти одна цена выше аск и 7 цен ниже бид. 
  3. Между ценами могут быть неравномерные расстояния. Между первой и второй может быть 1 пункт, а между второй и третьей 18 пунктов или 1008 пунктов.
Поэтому, не сделав цикла, нельзя узнать какая цена самая близкая к аск, а какая к бид и следовательно, какая цена должна быть в центре стакана.  
 
Реter Konow:

Упорядочены последовательно. Но:

  1. Данных может прийти больше чем ячеек стакана. 
  2. Между ценами нет четкого порядка. Может прийти одна цена выше аск и 7 цен ниже бид. 
  3. Между ценами могут быть неравномерные расстояния. Между первой и второй может быть 1 пункт, а между второй и третьей 18 пунктов или 1008 пунктов.
Поэтому, не сделав цикла, нельзя узнать какая цена самая близкая к аск, а какая к бид и следовательно, какая цена должна быть в центре стакана.  

Откуда вы берёте такие кривые данные? ))

1. Определиться с чётким диапазоном выбирающих данных, к примеру 20 вверх, 20 вниз
    и выбираем только этот диапазон, а все что придёт больше нам не важно.

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

2. Если вы имеете ввиду порядок по расстоянию между уровнями пришедших цен, это расстояние вообще не важно, у нас есть индексация в принимающем массиве.

Причина обращения: