Спред между двумя фьючерсами

 

Всем, добрый день!

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

1) индикатор дико глючный, то отображается, то не отображается, то какую-то лабуду показывает (приходится нажимать обновить, и тогда вроде встает на место);

2) авторский алгоритм синхронизации цен двух фьючерсов: так как у фьючей частенько могут отсутствовать те или иные бары (из-за низкой ликвидности), то встала задача синхронизировать их бары, чтобы получить реальный спред между ними. Покопался на форуме и ничего по данной теме не нашёл. В итоге придумал такой способ: берём 4 таймсерии - время баров по инструменту №1, цены закрытия баров по инструменту №1,  время баров по инструменту №2, цены закрытия баров по инструменту №2. При указании одинакового количества баров в таймсериях времени и цен закрытия по одному инструменту они будут идентичны, у второго инструмента они естественно будут свои, но тоже идентичные (привязка время и цены закрытия). Остаётся только синхронизировать время одного инструмента относительно другого. Ниже пример построения спреда на основе данных инструмента №1: берем i-ую цену закрытия инструмента №1 и отнимаем от него такую цену инструмента №2, чей индекс равен индексу массива времени инструмента №2, чьё значение времени совпало с массивом по инструменту №1. Благодаря такому способу индикатор можно построить хоть на первом хоть на втором инструменте, а можно и на вообще левом (например кинуть на график РТС спред между Газпромом и Лукойлом).

   if(Flag==SincForIn1)									// Синхронизируем по первому инструменту.
      {
       while(i>=0)                                                			// Цикл перебора для расчета спреда для всех непосчитанных баров, от самого последнего i до нулевого.
         {
          SpreadBuffer[i]=closeIn1[i]-closeIn2[ArrayBsearch(timeIn2,timeIn1[i])]; 	// Расчет спреда (существуют различия в количесве баров двух инструментов, за основу берутся бары Инструмента №1)
          i--;                                                    			// Снижение индекса бара для перехода расчетов к следующему бару и так до нулевого включительно.
         }

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

Индикатор прикрепил к посту.

Заранее спасибо.

Файлы:
Spread.mq5  24 kb
 
iiivasyaiii:

Всем, добрый день!

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

1) индикатор дико глючный, то отображается, то не отображается, то какую-то лабуду показывает (приходится нажимать обновить, и тогда вроде встает на место);

2) авторский алгоритм синхронизации цен двух фьючерсов: так как у фьючей частенько могут отсутствовать те или иные бары (из-за низкой ликвидности), то встала задача синхронизировать их бары, чтобы получить реальный спред между ними. Покопался на форуме и ничего по данной теме не нашёл. В итоге придумал такой способ: берём 4 таймсерии - время баров по инструменту №1, цены закрытия баров по инструменту №1,  время баров по инструменту №2, цены закрытия баров по инструменту №2. При указании одинакового количества баров в таймсериях времени и цен закрытия по одному инструменту они будут идентичны, у второго инструмента они естественно будут свои, но тоже идентичные (привязка время и цены закрытия). Остаётся только синхронизировать время одного инструмента относительно другого. Ниже пример построения спреда на основе данных инструмента №1: берем i-ую цену закрытия инструмента №1 и отнимаем от него такую цену инструмента №2, чей индекс равен индексу массива времени инструмента №2, чьё значение времени совпало с массивом по инструменту №1. Благодаря такому способу индикатор можно построить хоть на первом хоть на втором инструменте, а можно и на вообще левом (например кинуть на график РТС спред между Газпромом и Лукойлом).

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

Индикатор прикрепил к посту.

Заранее спасибо.

Надо брать цены бид и аск для построения спреда. График по ласт рисуется, а это будет не верно.
 
Maxim Romanov:
Надо брать цены бид и аск для построения спреда. График по ласт рисуется, а это будет не верно.

Максим, спасибо за уделенное внимание моей проблеме.

Есть пара комментариев к вашему ответу:

1) Цены произошедших сделок (last) не рисуются, это не форекс. Если имели в виду что-то иное, поясните подробнее, пожалуйста.

2) бид и аск это конечно хорошо, но это на порядок сложнее. Пробовал написать на них две доп линии для основного спреда, типа спред покупки и спред продажи. И даже один раз получилось (он кстати долго так рисовался), но потом, я что-то поменял в коде, и он у меня пропал и так больше и не появлялся)) если нужно, то могу скинуть и его код. И самый главный недостаток бид и акса: если мне не изменяет память то данные биду и аску хранятся за последние 2000 тиков, поэтому долгой истории на нём не поанализировать.

Поэтому, давайте, пожалуйста, для начала разберемся с построением спреда между двух инструментов на ценах закрытия. Всё-таки верен мой подход по синхронизации цен двух инструментов при помощи функции ArrayBsearch() или есть более простой метод?

 
iiivasyaiii:

Максим, спасибо за уделенное внимание моей проблеме.

Есть пара комментариев к вашему ответу:

1) Цены произошедших сделок (last) не рисуются, это не форекс.

С такими знаниями вам рановато писать такие индикаторы.

 
iiivasyaiii:

Всем, добрый день!

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

1) индикатор дико глючный, то отображается, то не отображается, то какую-то лабуду показывает (приходится нажимать обновить, и тогда вроде встает на место);

2) авторский алгоритм синхронизации цен двух фьючерсов: так как у фьючей частенько могут отсутствовать те или иные бары (из-за низкой ликвидности), то встала задача синхронизировать их бары, чтобы получить реальный спред между ними. Покопался на форуме и ничего по данной теме не нашёл. В итоге придумал такой способ: берём 4 таймсерии - время баров по инструменту №1, цены закрытия баров по инструменту №1,  время баров по инструменту №2, цены закрытия баров по инструменту №2. При указании одинакового количества баров в таймсериях времени и цен закрытия по одному инструменту они будут идентичны, у второго инструмента они естественно будут свои, но тоже идентичные (привязка время и цены закрытия). Остаётся только синхронизировать время одного инструмента относительно другого. Ниже пример построения спреда на основе данных инструмента №1: берем i-ую цену закрытия инструмента №1 и отнимаем от него такую цену инструмента №2, чей индекс равен индексу массива времени инструмента №2, чьё значение времени совпало с массивом по инструменту №1. Благодаря такому способу индикатор можно построить хоть на первом хоть на втором инструменте, а можно и на вообще левом (например кинуть на график РТС спред между Газпромом и Лукойлом).

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

Индикатор прикрепил к посту.

Заранее спасибо.

Добрый день!

1. Нужно писать в раздел "Биржевой трейдинг"

2. Синхронизировать 2 фьючерса по барам не получится.

Нужно брать за основу бары одного из фьючерсов (лучше наиболее ликвидного SBRF 9.20)

3. Для полноты картины спреда необходимо брать не close, а тики и синхронизировать их с барами выбранного за основной фьючерс.

4. Чтобы пересчет был быстрый, нужно запоминать последнюю рассчитанную позицию.

Пример кода пересчета спрэда с синхронизацией времени бара

int pr_pos = 0;
            int sec_pos = 0;
            bool is_found;
            int pr_mem = 0;
            int sec_mem = 0;
            for(int i = 0; i < a_bars; i++)
            {
              is_found = false;
              while(pr_pos < pr_cnt) 
              {
                if((ulong(data_time[i].time) <= ulong(pr_ticks[pr_pos].time)) &&
                   (ulong(data_time[i].time) + 60 > ulong(pr_ticks[pr_pos].time)))
                {
                  pr_mem = pr_pos;
                  while(sec_pos < sec_cnt) 
                  {
                    if((ulong(data_time[i].time) <= ulong(sec_ticks[sec_pos].time)) &&
                       (ulong(data_time[i].time) + 60 > ulong(sec_ticks[sec_pos].time)))
                    {
                      is_found = true;
                      sec_mem = sec_pos;
                      if((sec_ticks[sec_pos].bid > 0.0) && (pr_ticks[pr_pos].ask > 0.0) &&
                         (sec_ticks[sec_pos].ask > 0.0) && (pr_ticks[pr_pos].bid > 0.0))
                      {
                        data_time[i].hi_value = sec_ticks[sec_pos].bid - pr_ticks[pr_pos].ask;
                        data_time[i].low_value = sec_ticks[sec_pos].ask - pr_ticks[pr_pos].bid;
                      }
                      break;
                    }
                    sec_pos++;
                  }
                  break;
                }
                pr_pos++;
              }
              if(is_found == false)
              {
                pr_pos = pr_mem;
                sec_pos = sec_mem;
              }
            }
 
Alexey Viktorov:

С такими знаниями вам рановато писать такие индикаторы.

Ну раз вы такой умный, то может подскажете, как синхронизировать два ценовых ряда по ценам закрытия ;)

 
prostotrader:

Добрый день!

1. Нужно писать в раздел "Биржевой трейдинг"

2. Синхронизировать 2 фьючерса по барам не получится.

Нужно брать за основу бары одного из фьючерсов (лучше наиболее ликвидного SBRF 9.20)

3. Для полноты картины спреда необходимо брать не close, а тики и синхронизировать их с барами выбранного за основной фьючерс.

4. Чтобы пересчет был быстрый, нужно запоминать последнюю рассчитанную позицию.

Пример кода пересчета спрэда с синхронизацией времени бара

Простотрейдер, большое спасибо вам за совет! Решение интересное, сейчас попробую, потом отпишусь.

 
iiivasyaiii:

Ну раз вы такой умный, то может подскажете, как синхронизировать два ценовых ряда по ценам закрытия ;)

Вам же все написали уже по сути вопроса. Нельзя строить спред по ценам сделок (а тем более по ценам закрытия!), так как в медленной ноге сделок может и не быть длительное время и, даже если они и будут, они будут несинхронизированны с ценами сделок быстрой ноги. Т.е. ценность такой информации равна нулю. Актуальные цены бид и аск в стакане есть всегда (или почти всегда), именно их и надо анализировать. 

 
iiivasyaiii:

Максим, спасибо за уделенное внимание моей проблеме.

Есть пара комментариев к вашему ответу:

1) Цены произошедших сделок (last) не рисуются, это не форекс. Если имели в виду что-то иное, поясните подробнее, пожалуйста.

2) бид и аск это конечно хорошо, но это на порядок сложнее. Пробовал написать на них две доп линии для основного спреда, типа спред покупки и спред продажи. И даже один раз получилось (он кстати долго так рисовался), но потом, я что-то поменял в коде, и он у меня пропал и так больше и не появлялся)) если нужно, то могу скинуть и его код. И самый главный недостаток бид и акса: если мне не изменяет память то данные биду и аску хранятся за последние 2000 тиков, поэтому долгой истории на нём не поанализировать.

Поэтому, давайте, пожалуйста, для начала разберемся с построением спреда между двух инструментов на ценах закрытия. Всё-таки верен мой подход по синхронизации цен двух инструментов при помощи функции ArrayBsearch() или есть более простой метод?

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

Добрый день!

1. Нужно писать в раздел "Биржевой трейдинг"

2. Синхронизировать 2 фьючерса по барам не получится.

Нужно брать за основу бары одного из фьючерсов (лучше наиболее ликвидного SBRF 9.20)

3. Для полноты картины спреда необходимо брать не close, а тики и синхронизировать их с барами выбранного за основной фьючерс.

4. Чтобы пересчет был быстрый, нужно запоминать последнюю рассчитанную позицию.

Пример кода пересчета спрэда с синхронизацией времени бара

Простотрейдер, добрый день! Подскажите, пожалуйста, по вашему коду не совсем уловил: 

1) Вы использовали функцию CopyTicksRange или CopyTicks? 

2) В описании данных функций указано, что они могут копировать не более 2000 тиков, получается такой индикатор не сможет анализировать более дальнюю историю? 

 
Dmi3:

Вам же все написали уже по сути вопроса. Нельзя строить спред по ценам сделок (а тем более по ценам закрытия!), так как в медленной ноге сделок может и не быть длительное время и, даже если они и будут, они будут несинхронизированны с ценами сделок быстрой ноги. Т.е. ценность такой информации равна нулю. Актуальные цены бид и аск в стакане есть всегда (или почти всегда), именно их и надо анализировать. 

Ребят, да я не спорю, что по заявкам точнее (хотя когда у меня недолгое время работал индикатор показывающий три спреда: ласт, аск-бид и бид-аск, то ласт большую часть времени ходил между последними двумя, что говорит о том, что на ликвидных инструментах спред по ласт в целом адекватный). 

Давайте тогда разберемся как синхронизацию по аск/бид провести по возможности наименее ресурсозатратно и желательно с глубокой историей.

Вот например простотрейдер предложил интересный вариант (выше).

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