Автор Тема: TradeStation 9.1 build 12880 (Update 29) + QuoteRoom  (Прочитано 48929 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн dim618

  • Сообщений: 16
    • Просмотр профиля
TradeStation 9.1 build 12880 (Update 29) + QuoteRoom
« Ответ #220 : 30 Октября 2024, 11:04:01 »
Получается, источник котировок QuoteRoom? Индикаторы исчезают или неправильно работают? В коде функции используются команды Print() - вывод информации в окно PrintLog? Индикатор выводит текст на диаграмму?


Да, источник QuoteRoom от Forexite версия 2018.04

Индикаторы исчезают или неправильно работают? - Да.

В коде функции используются команды Print() - вывод информации в окно PrintLog? - Нет.

Индикатор выводит текст на диаграмму? - Нет.


Индикаторы строят различные функции - скользящие, различные дискретные значения на основании баров старших уровней, собранных из баров текущего уровня.

Это значительно удобнее, нежели средствами ProSuite либо TS, вводить на каждый ТФ свои ряды данных в режиме Hidden и строить функции на них.

Оффлайн dim618

  • Сообщений: 16
    • Просмотр профиля
TradeStation 9.1 build 12880 (Update 29) + QuoteRoom
« Ответ #221 : 30 Октября 2024, 11:26:24 »
If the indicators are not private and confidential, maybe can post the EasyLanguage codes. I think everyone may be shooting blind.

I do not know whether this affects... Forexite QR just change their clock 1 hour this past Sunday.

Здравствуйте, csk. Я - Дмитрий.


Я написал о своей проблеме на форум сразу. А было это в понедельник.
А переход на зимнее время был в воскресенье. Следовательно, это ни при чём. (Утром в понедельник всё работало).


Я не буду показывать весь код, покажу центральное место, которое, возможно, и является самым уязвимым:

Цитировать
If (Year(Date[1]) = 01 and Year(Date) = 25) or
(Year(Date[1]) = 26 and Year(Date) = 50) or
(Year(Date[1]) = 51 and Year(Date) = 75) or
(Year(Date[1]) = 76 and Year(Date) = 100) or
(Year(Date[1]) = 101 and Year(Date) = 125) or
(Year(Date[1]) = 126 and Year(Date) = 150) or
(Year(Date[1]) = 151 and Year(Date) = 175) then begin ShY25 = ShY25 + 1; TrYYY25 = -1*TrYYY25; End;


If (Year(Date[1]) = 04 and Year(Date) = 05) or
(Year(Date[1]) = 09 and Year(Date) = 10) or
(Year(Date[1]) = 14 and Year(Date) = 15) or
(Year(Date[1]) = 19 and Year(Date) = 20) or
(Year(Date[1]) = 24 and Year(Date) = 25) or
(Year(Date[1]) = 29 and Year(Date) = 30) or
(Year(Date[1]) = 34 and Year(Date) = 35) or
(Year(Date[1]) = 39 and Year(Date) = 40) or
(Year(Date[1]) = 44 and Year(Date) = 45) or
(Year(Date[1]) = 49 and Year(Date) = 50) or
(Year(Date[1]) = 54 and Year(Date) = 55) or
(Year(Date[1]) = 59 and Year(Date) = 60) or
(Year(Date[1]) = 64 and Year(Date) = 65) or
(Year(Date[1]) = 69 and Year(Date) = 70) or
(Year(Date[1]) = 74 and Year(Date) = 75) or
(Year(Date[1]) = 79 and Year(Date) = 80) or
(Year(Date[1]) = 84 and Year(Date) = 85) or
(Year(Date[1]) = 89 and Year(Date) = 90) or
(Year(Date[1]) = 94 and Year(Date) = 95) or
(Year(Date[1]) = 99 and Year(Date) = 100) or
(Year(Date[1]) = 104 and Year(Date) = 105) or
(Year(Date[1]) = 109 and Year(Date) = 110) or
(Year(Date[1]) = 114 and Year(Date) = 115) or
(Year(Date[1]) = 119 and Year(Date) = 120) or
(Year(Date[1]) = 124 and Year(Date) = 125) or
(Year(Date[1]) = 129 and Year(Date) = 130) or
(Year(Date[1]) = 134 and Year(Date) = 135) or
(Year(Date[1]) = 139 and Year(Date) = 140) or
(Year(Date[1]) = 144 and Year(Date) = 145) or
(Year(Date[1]) = 149 and Year(Date) = 150) or
(Year(Date[1]) = 154 and Year(Date) = 155) or
(Year(Date[1]) = 159 and Year(Date) = 160) or
(Year(Date[1]) = 164 and Year(Date) = 165) or
(Year(Date[1]) = 169 and Year(Date) = 170) or
(Year(Date[1]) = 174 and Year(Date) = 175) or
(Year(Date[1]) = 179 and Year(Date) = 180) or
(Year(Date[1]) = 184 and Year(Date) = 185) or
(Year(Date[1]) = 189 and Year(Date) = 190) or
(Year(Date[1]) = 194 and Year(Date) = 195) or
(Year(Date[1]) = 199 and Year(Date) = 200) or
(Year(Date[1]) = 204 and Year(Date) = 205) or
(Year(Date[1]) = 209 and Year(Date) = 210) or
(Year(Date[1]) = 214 and Year(Date) = 215) or
(Year(Date[1]) = 219 and Year(Date) = 220) or
(Year(Date[1]) = 224 and Year(Date) = 225) then begin ShY5 = ShY5 + 1; TrYYY5 = -1*TrYYY5; End;

If Month(Date[1]) = 12 and Month(Date) = 1{Year(Date[1]) <> Year(Date)} then begin ShY = ShY + 1; TrYYY = -1*TrYYY; End;

If (Month(Date[1]) = 12 and Month(Date) = 1) or
(Month(Date[1]) = 3 and Month(Date) = 4) or
(Month(Date[1]) = 6 and Month(Date) = 7) or
(Month(Date[1]) = 9 and Month(Date) = 10) then begin ShQ = ShQ + 1; TrQ = -1*TrQ; End;

If Month(Date[1]) <> Month(Date) then begin ShM = ShM + 1; TrM = -1*TrM; {GlM = 43200;} End;



If (DayOfWeek(Date[1]) = Friday and DayOfWeek(Date) = Monday) or
(DayOfWeek(Date[1]) = Friday and DayOfWeek(Date) = Tuesday) or
(DayOfWeek(Date[1]) = Friday and DayOfWeek(Date) = Wednesday) or
(DayOfWeek(Date[1]) = Friday and DayOfWeek(Date) = Thursday) or
(DayOfWeek(Date[1]) = Friday and DayOfWeek(Date) = Friday) or
(DayOfWeek(Date[1]) = Thursday and DayOfWeek(Date) = Monday) or
(DayOfWeek(Date[1]) = Thursday and DayOfWeek(Date) = Tuesday) or
(DayOfWeek(Date[1]) = Thursday and DayOfWeek(Date) = Wednesday) then begin ShW = ShW + 1; TrW = -1*TrW; {GlW = 10080;} End;

If Date[1] <> Date then begin ShD = ShD + 1; TrD = -1*TrD; GlD = 1440; End;

If TimeToMinutes(Time) = 0 + BarInterval+DT
or TimeToMinutes(Time) = 240 + BarInterval+DT
or TimeToMinutes(Time) = 480 + BarInterval+DT
or TimeToMinutes(Time) = 720 + BarInterval+DT
or TimeToMinutes(Time) = 960 + BarInterval+DT
or TimeToMinutes(Time) = 1200 + BarInterval+DT
then begin Sh240 = Sh240 + 1; Tr240 = -1*Tr240; Gl240 = 240; End;

If FRACPortion((TimeToMinutes(Time)-BarInterval-DT)/120) = 0 then begin Sh120 = Sh120 + 1; Tr120 = -1*Tr120; Gl120 = 120; End;

If TimeToMinutes(Time) = 0 + BarInterval+DT
or TimeToMinutes(Time) = 60 + BarInterval+DT
or TimeToMinutes(Time) = 120 + BarInterval+DT
or TimeToMinutes(Time) = 180 + BarInterval+DT
or TimeToMinutes(Time) = 240 + BarInterval+DT
or TimeToMinutes(Time) = 300 + BarInterval+DT
or TimeToMinutes(Time) = 360 + BarInterval+DT
or TimeToMinutes(Time) = 420 + BarInterval+DT
or TimeToMinutes(Time) = 480 + BarInterval+DT
or TimeToMinutes(Time) = 540 + BarInterval+DT
or TimeToMinutes(Time) = 600 + BarInterval+DT
or TimeToMinutes(Time) = 660 + BarInterval+DT
or TimeToMinutes(Time) = 720 + BarInterval+DT
or TimeToMinutes(Time) = 780 + BarInterval+DT
or TimeToMinutes(Time) = 840 + BarInterval+DT
or TimeToMinutes(Time) = 900 + BarInterval+DT
or TimeToMinutes(Time) = 960 + BarInterval+DT
or TimeToMinutes(Time) = 1020 + BarInterval+DT
or TimeToMinutes(Time) = 1080 + BarInterval+DT
or TimeToMinutes(Time) = 1140 + BarInterval+DT
or TimeToMinutes(Time) = 1200 + BarInterval+DT
or TimeToMinutes(Time) = 1260 + BarInterval+DT
or TimeToMinutes(Time) = 1320 + BarInterval+DT
or TimeToMinutes(Time) = 1380 + BarInterval+DT then begin Sh60 = Sh60 + 1; Tr60 = -1*Tr60; Gl60 = 60; End;

If FRACPortion((TimeToMinutes(Time)-BarInterval-DT)/30) = 0 then begin Sh30 = Sh30 + 1; Tr30 = -1*Tr30; Gl30 = 30; End;

If FRACPortion((TimeToMinutes(Time)-BarInterval-DT)/15) = 0 then begin Sh15 = Sh15 + 1; Tr15 = -1*Tr15; Gl15 = 15; End;

If FRACPortion((TimeToMinutes(Time)-BarInterval-DT)/10) = 0 then begin Sh10 = Sh10 + 1; Tr10 = -1*Tr10; Gl10 = 10; End;

If FRACPortion((TimeToMinutes(Time)-BarInterval-DT)/5) = 0 then begin Sh5 = Sh5 + 1; Tr5 = -1*Tr5; Gl5 = 5; End;



If DataCompression = 4 then begin                                                                                                                                                                                  Sh1 = ShY5;  Sh2 = ShY;   Sh3 = ShQ;   Tr1 = TrYYY5;  Tr2 = TrYYY;   Tr3 = TrQ; End;

If DataCompression = 3 then begin                                                                                                                                                                                      Sh1 = ShY;   Sh2 = ShQ;   Sh3 = ShM;   Tr1 = TrYYY;   Tr2 = TrQ;   Tr3 = TrM; End;

If DataCompression = 2 or (DataCompression < 2 and  (BarInterval = 1439 or BarInterval = 720)  then begin                                                                             Sh1 = ShQ;   Sh2 = ShM;   Sh3 = ShW;   Tr1 = TrQ;   Tr2 = TrM;   Tr3 = TrW; End;

If DataCompression < 2 and (BarInterval = 480 or BarInterval = 360 or BarInterval = 288 or BarInterval = 240 or BarInterval = 180 or BarInterval = 160 or BarInterval = 144 or BarInterval = 120 or BarInterval = 96 or BarInterval = 90) then begin  Sh1 = ShM;   Sh2 = ShW;   Sh3 = ShD;   Tr1 = TrM;   Tr2 = TrW;   Tr3 = TrD; Glub3 = GlD; End;

If DataCompression < 2 and (BarInterval = 80 or BarInterval = 60 or BarInterval = 48 or BarInterval = 40 or BarInterval = 30 or BarInterval = 24) then begin                                                       Sh1 = ShW;   Sh2 = ShD;   Sh3 = Sh240; Tr1 = TrW;   Tr2 = TrD;   Tr3 = Tr240; Glub3 = Gl240; End;

If DataCompression < 2 and (BarInterval = 20 or BarInterval = 15 or BarInterval = 12 or BarInterval = 10 or BarInterval = 6)  then begin                                                                          Sh1 = ShD;   Sh2 = Sh240; Sh3 = Sh60;  Tr1 = TrD;   Tr2 = Tr240; Tr3 = Tr60; Glub3 = Gl60; End;

If DataCompression < 2 and (BarInterval = 5) then begin                                                                                                                                                            Sh1 = Sh240; Sh2 = Sh60;  Sh3 = Sh15;  Tr1 = Tr240; Tr2 = Tr60;  Tr3 = Tr15; Glub3 = Gl15; End;

If DataCompression < 2 and (BarInterval = 3) then begin                                                                                                                                                             Sh1 = Sh240; Sh2 = Sh60;  Sh3 = Sh15;  Tr1 = Tr240; Tr2 = Tr60;  Tr3 = Tr15; Glub3 = Gl15; End;

If DataCompression < 2 and (BarInterval = 2) then begin                                                                                                                                                             Sh1 = Sh240; Sh2 = Sh60;  Sh3 = Sh10;  Tr1 = Tr240; Tr2 = Tr60;  Tr3 = Tr10; Glub3 = Gl10; End;

If DataCompression < 2 and (BarInterval = 1) then begin                                                                                                                                                            Sh1 = Sh60;  Sh2 = Sh15;  Sh3 = Sh5;   Tr1 = Tr60;  Tr2 = Tr15;  Tr3 = Tr5; Glub3 = Gl5; End;


Оффлайн Станислав

  • Участник клуба
  • *
  • Сообщений: 183
    • Просмотр профиля
TradeStation 9.1 build 12880 (Update 29) + QuoteRoom
« Ответ #222 : 30 Октября 2024, 11:45:41 »
Для чего это всё делается - понятно...
"Индикаторы или исчезают или неправильно работают?" - это по отдельности! "Исчезают?" или "Неправильно работают?".
Если исчезают, то это одна проблема, а если неправильно работают, то это другая и тут надо смотреть, как в коде реализована логика вычисления старшей компрессии: при помощи массивов, векторов, словарей или PriceSeriesProvider. Хотя судя по части кода, всё намного "хитрее" :) Без рефакторинга это творение пока не понятно))


Получается, источник котировок QuoteRoom? Индикаторы исчезают или неправильно работают? В коде функции используются команды Print() - вывод информации в окно PrintLog? Индикатор выводит текст на диаграмму?


Да, источник QuoteRoom от Forexite версия 2018.04

Индикаторы исчезают или неправильно работают? - Да.

В коде функции используются команды Print() - вывод информации в окно PrintLog? - Нет.

Индикатор выводит текст на диаграмму? - Нет.


Индикаторы строят различные функции - скользящие, различные дискретные значения на основании баров старших уровней, собранных из баров текущего уровня.

Это значительно удобнее, нежели средствами ProSuite либо TS, вводить на каждый ТФ свои ряды данных в режиме Hidden и строить функции на них.

Оффлайн csk

  • Подписчик сайта
  • *
  • Сообщений: 140
    • Просмотр профиля
TradeStation 9.1 build 12880 (Update 29) + QuoteRoom
« Ответ #223 : 30 Октября 2024, 12:09:39 »
If the EasyLanguage codes are copied directly from PowerEditor and pasted here, then offhand on a quick glance there are syntax errors.


Цитировать
(Year(Date) [1]) = 126 and Year(Date) = 150) or

(Year(Date) [1]) = 29 and Year(Date) = 30) or

Оффлайн csk

  • Подписчик сайта
  • *
  • Сообщений: 140
    • Просмотр профиля
TradeStation 9.1 build 12880 (Update 29) + QuoteRoom
« Ответ #224 : 30 Октября 2024, 12:31:16 »
Цитировать
If DataCompression = 2 or (DataCompression < 2 and (BarInterval = 1439 or BarInterval = 720) then
   begin Sh1 = ShQ; Sh2 = ShM; Sh3 = ShW; Tr1 = TrQ; Tr2 = TrM; Tr3 = TrW;
   End;

Missing a closing bracket in the IF condition check.

Оффлайн csk

  • Подписчик сайта
  • *
  • Сообщений: 140
    • Просмотр профиля
TradeStation 9.1 build 12880 (Update 29) + QuoteRoom
« Ответ #225 : 30 Октября 2024, 12:33:42 »
Цитировать
If DataCompression < 2 and (BarInterval = 480 or BarInterval = 360 or BarInterval = 288 or BarInterval = 240 or BarInterval = 180 or BarInterval = 160 or BarInterval = 144 or BarInterval = 120 or BarInterval = 96 or BarInterval = 90) then begin Sh1 = Sh2; = ShW; Tr1

= TrM; Tr3 = TrD; (BarInterval = 80 or BarInterval = 60 or BarInterval = 48 or BarInterval = 40 or BarInterval = 30 or BarInterval = 24) then begin Sh1 = ShW; Sh2 = ShD; Sh3 = Sh240; Tr1 = TrW; Tr2 = TrD; Tr3 = Tr240; Glub3 = Gl240; End;

Syntax error somewhere in here.

Оффлайн csk

  • Подписчик сайта
  • *
  • Сообщений: 140
    • Просмотр профиля
TradeStation 9.1 build 12880 (Update 29) + QuoteRoom
« Ответ #226 : 30 Октября 2024, 12:39:34 »
I copied part by part of your codes, paste into PowerEditor, and remove everything between all the Begin and End. And VERIFY. These are the syntax errors. Try fix these and see whether it works.

Оффлайн dim618

  • Сообщений: 16
    • Просмотр профиля
TradeStation 9.1 build 12880 (Update 29) + QuoteRoom
« Ответ #227 : 30 Октября 2024, 12:40:44 »
Для чего это всё делается - понятно...
"Индикаторы или исчезают или неправильно работают?" - это по отдельности! "Исчезают?" или "Неправильно работают?".
Если исчезают, то это одна проблема, а если неправильно работают, то это другая и тут надо смотреть, как в коде реализована логика вычисления старшей компрессии: при помощи массивов, векторов, словарей или PriceSeriesProvider. Хотя судя по части кода, всё намного "хитрее" :) Без рефакторинга это творение пока не понятно))


В одних индикаторах, построенные скользящие - либо исчезают, либо строится их фрагмент, оборванный дней 100 назад (не помню точно) - это "исчезают".

Но есть индикатор, который "неправильно работает" - и он меня беспокоит больше всего.

Если для скользящих я построил эквиваленты (худшего качества), то неправильно работающий пришлось просто отключить.

Оффлайн dim618

  • Сообщений: 16
    • Просмотр профиля
TradeStation 9.1 build 12880 (Update 29) + QuoteRoom
« Ответ #228 : 30 Октября 2024, 12:54:39 »
If the EasyLanguage codes are copied directly from PowerEditor and pasted here, then offhand on a quick glance there are syntax errors.


Цитировать
(Year(Date) [1]) = 126 and Year(Date) = 150) or

(Year(Date) [1]) = 29 and Year(Date) = 30) or


Спасибо, уважаемый csk, что вы помогаете.

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

Сами индикаторы, конечно, полностью верифицированы и в ProSuite и в TS9.1.


Приведённые выше строки - это невинное пижонство: строительство 25-ти и 5-ти летних баров.

Здесь кто-то на форуме говорил, что у него есть история ДоуДжонса и S&P с начала 20-го века. - Вот, для такой большой глубины истории и предназначено вычисление таких длительных баров.

Оффлайн Станислав

  • Участник клуба
  • *
  • Сообщений: 183
    • Просмотр профиля
TradeStation 9.1 build 12880 (Update 29) + QuoteRoom
« Ответ #229 : 30 Октября 2024, 13:32:50 »
Код сложный и трудно ремонтируемый, найти ошибку с налёту не получится! По своему опыту, в больших кодах не всегда вылетает ошибка деления на нуль, TS продолжает расчёт, т.е. необходимопроверить все операции деления на переменную и возможность этой переменной принимать нулевые значения.По оформлению кода, некоторые заметки...
Ещё заметил TrW может быть < 0, а оно подкоренным бывает? Если да, то возможна арифметическая ошибка - извлечение корня из отрицательного числа.

**********************************************
было:
If (Year(Date[1]) = 01 and Year(Date) = 25) or
(Year(Date[1]) = 26 and Year(Date) = 50) or
(Year(Date[1]) = 51 and Year(Date) = 75) or
(Year(Date[1]) = 76 and Year(Date) = 100) or
(Year(Date[1]) = 101 and Year(Date) = 125) or
(Year(Date[1]) = 126 and Year(Date) = 150) or
(Year(Date[1]) = 151 and Year(Date) = 175) then begin ShY25 = ShY25 + 1; TrYYY25 = -1*TrYYY25; End;


стало: понятнее и ремонтопригоднее, но ещё понятнее будет оформить этот код в метод с понятным названием:


YYBgn = 25;
YYLen = 10;
For Value0 = 1 To YYLen Begin
   If Year(Date[1]) = YYBgn * (Value0 - 1) + 1 and Year(Date) = YYBgn * Value0
   Then Begin
      ShY25   = ShY25 + 1;
      TrYYY25 = -1*TrYYY25;
      Break;
   End;
End;

{
   проверка логики
   If Year(Date[1]) = 25 * (1 - 1) + 1 and Year(Date) = 25 * 1
   If Year(Date[1]) = 25 * (2 - 1) + 1 and Year(Date) = 25 * 2
   If Year(Date[1]) = 25 * (3 - 1) + 1 and Year(Date) = 25 * 3
}
**********************************************

было
If (Year(Date[1]) = 04 and Year(Date) = 05) or(Year(Date[1]) = 09 and Year(Date) = 10) or
(Year(Date[1]) = 14 and Year(Date) = 15) or
(Year(Date[1]) = 19 and Year(Date) = 20) or
(Year(Date[1]) = 24 and Year(Date) = 25) or
(Year(Date[1]) = 29 and Year(Date) = 30) or
(Year(Date[1]) = 34 and Year(Date) = 35) or
(Year(Date[1]) = 39 and Year(Date) = 40) or
(Year(Date[1]) = 44 and Year(Date) = 45) or
(Year(Date[1]) = 49 and Year(Date) = 50) or
(Year(Date[1]) = 54 and Year(Date) = 55) or
(Year(Date[1]) = 59 and Year(Date) = 60) or
(Year(Date[1]) = 64 and Year(Date) = 65) or
(Year(Date[1]) = 69 and Year(Date) = 70) or
(Year(Date[1]) = 74 and Year(Date) = 75) or
(Year(Date[1]) = 79 and Year(Date) = 80) or
(Year(Date[1]) = 84 and Year(Date) = 85) or
(Year(Date[1]) = 89 and Year(Date) = 90) or
(Year(Date[1]) = 94 and Year(Date) = 95) or
(Year(Date[1]) = 99 and Year(Date) = 100) or
(Year(Date[1]) = 104 and Year(Date) = 105) or
(Year(Date[1]) = 109 and Year(Date) = 110) or
(Year(Date[1]) = 114 and Year(Date) = 115) or
(Year(Date[1]) = 119 and Year(Date) = 120) or
(Year(Date[1]) = 124 and Year(Date) = 125) or
(Year(Date[1]) = 129 and Year(Date) = 130) or
(Year(Date[1]) = 134 and Year(Date) = 135) or
(Year(Date[1]) = 139 and Year(Date) = 140) or
(Year(Date[1]) = 144 and Year(Date) = 145) or
(Year(Date[1]) = 149 and Year(Date) = 150) or
(Year(Date[1]) = 154 and Year(Date) = 155) or
(Year(Date[1]) = 159 and Year(Date) = 160) or
(Year(Date[1]) = 164 and Year(Date) = 165) or
(Year(Date[1]) = 169 and Year(Date) = 170) or
(Year(Date[1]) = 174 and Year(Date) = 175) or
(Year(Date[1]) = 179 and Year(Date) = 180) or
(Year(Date[1]) = 184 and Year(Date) = 185) or
(Year(Date[1]) = 189 and Year(Date) = 190) or
(Year(Date[1]) = 194 and Year(Date) = 195) or
(Year(Date[1]) = 199 and Year(Date) = 200) or
(Year(Date[1]) = 204 and Year(Date) = 205) or
(Year(Date[1]) = 209 and Year(Date) = 210) or
(Year(Date[1]) = 214 and Year(Date) = 215) or
(Year(Date[1]) = 219 and Year(Date) = 220) or
(Year(Date[1]) = 224 and Year(Date) = 225) then begin ShY5 = ShY5 + 1; TrYYY5 = -1*TrYYY5; End;


стало: понятнее и ремонтопригоднее, но ещё понятнее будет оформить этот код в метод с понятным названием:


YYBgn = 04;
YYLen = 10;
For Value0 = 1 To YYLen Begin
   If Year(Date[1]) = YYBgn * Value0 + (Value0 - 1) and Year(Date) = YYBgn * Value0 + Value0
   Then Begin
      ShY5 = ShY5 + 1;
      TrYYY5 = -1*TrYYY5;
      Break;
   End;
End;

{
   проверка логики
   If Year(Date[1]) = YYBgn * 1 + (1 - 1) and Year(Date) = YYBgn * 1 + 1
   If Year(Date[1]) = YYBgn * 2 + (2 - 1) and Year(Date) = YYBgn * 2 + 2
   If Year(Date[1]) = YYBgn * 3 + (3 - 1) and Year(Date) = YYBgn * 3 + 3
}

************************************************************




If DataCompression = 4
then begin
   Sh1 = ShY5;
   Sh2 = ShY;
   Sh3 = ShQ;
   Tr1 = TrYYY5;
   Tr2 = TrYYY;
   Tr3 = TrQ;
End Else

If DataCompression = 3
then begin
   Sh1 = ShY;
   Sh2 = ShQ;
   Sh3 = ShM;
   Tr1 = TrYYY;
   Tr2 = TrQ;
   Tr3 = TrM;
End Else

If DataCompression = 2
then begin
   Sh1 = ShQ;
   Sh2 = ShM;
   Sh3 = ShW;
   Tr1 = TrQ;
   Tr2 = TrM;
   Tr3 = TrW;
End Else

If DataCompression < 2
then begin
   If BarInterval = 1439 or
      BarInterval = 720
   then begin
      Sh1 = ShQ;
      Sh2 = ShM;
      Sh3 = ShW;
      Tr1 = TrQ;
      Tr2 = TrM;
      Tr3 = TrW;
   End Else

   If BarInterval = 480 or
      BarInterval = 360 or
      BarInterval = 288 or
      BarInterval = 240 or
      BarInterval = 180 or
      BarInterval = 160 or
      BarInterval = 144 or
      BarInterval = 120 or
      BarInterval = 96 or
      BarInterval = 90
   then begin
      Sh1 = ShM;
      Sh2 = ShW;
      Sh3 = ShD;
      Tr1 = TrM;
      Tr2 = TrW;
      Tr3 = TrD;
      Glub3 = GlD;
   End Else

   If BarInterval = 80 or
      BarInterval = 60 or
      BarInterval = 48 or
      BarInterval = 40 or
      BarInterval = 30 or
      BarInterval = 24
   then begin
      Sh1 = ShW;
      Sh2 = ShD;
      Sh3 = Sh240;
      Tr1 = TrW;
      Tr2 = TrD;
      Tr3 = Tr240;
      Glub3 = Gl240;
   End Else

   If BarInterval = 20 or
      BarInterval = 15 or
      BarInterval = 12 or
      BarInterval = 10 or
      BarInterval = 6 
   then begin
      Sh1 = ShD;
      Sh2 = Sh240;
      Sh3 = Sh60;
      Tr1 = TrD;
      Tr2 = Tr240;
      Tr3 = Tr60;
      Glub3 = Gl60;
   End;

   If BarInterval = 5 then begin Sh1 = Sh240; Sh2 = Sh60;  Sh3 = Sh15;  Tr1 = Tr240; Tr2 = Tr60;  Tr3 = Tr15; Glub3 = Gl15; End Else
   If BarInterval = 3 then begin Sh1 = Sh240; Sh2 = Sh60;  Sh3 = Sh15;  Tr1 = Tr240; Tr2 = Tr60;  Tr3 = Tr15; Glub3 = Gl15; End Else
   If BarInterval = 2 then begin Sh1 = Sh240; Sh2 = Sh60;  Sh3 = Sh10;  Tr1 = Tr240; Tr2 = Tr60;  Tr3 = Tr10; Glub3 = Gl10; End Else
   If BarInterval = 1 then begin Sh1 = Sh60;  Sh2 = Sh15;  Sh3 = Sh5;   Tr1 = Tr60;  Tr2 = Tr15;  Tr3 = Tr5;  Glub3 = Gl5;  End;
End;


Логические узлы разделены "Else", с целью ускорения расчёта и его понятности...
В представленном куске кода, ошибку не нашёл...







Для чего это всё делается - понятно...
"Индикаторы или исчезают или неправильно работают?" - это по отдельности! "Исчезают?" или "Неправильно работают?".
Если исчезают, то это одна проблема, а если неправильно работают, то это другая и тут надо смотреть, как в коде реализована логика вычисления старшей компрессии: при помощи массивов, векторов, словарей или PriceSeriesProvider. Хотя судя по части кода, всё намного "хитрее" :) Без рефакторинга это творение пока не понятно))


В одних индикаторах, построенные скользящие - либо исчезают, либо строится их фрагмент, оборванный дней 100 назад (не помню точно) - это "исчезают".

Но есть индикатор, который "неправильно работает" - и он меня беспокоит больше всего.

Если для скользящих я построил эквиваленты (худшего качества), то неправильно работающий пришлось просто отключить.