Код сложный и трудно ремонтируемый, найти ошибку с налёту не получится! По своему опыту, в больших кодах не всегда вылетает ошибка деления на нуль, TS продолжает расчёт, т.е. необходимопроверить все операции деления на переменную и возможность этой переменной принимать нулевые значения.По оформлению кода, некоторые заметки...
**********************************************
было:
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;
If BarInterval = 3 then begin Sh1 = Sh240; Sh2 = Sh60; Sh3 = Sh15; Tr1 = Tr240; Tr2 = Tr60; Tr3 = Tr15; Glub3 = Gl15; End;
If BarInterval = 2 then begin Sh1 = Sh240; Sh2 = Sh60; Sh3 = Sh10; Tr1 = Tr240; Tr2 = Tr60; Tr3 = Tr10; Glub3 = Gl10; End;
If BarInterval = 1 then begin Sh1 = Sh60; Sh2 = Sh15; Sh3 = Sh5; Tr1 = Tr60; Tr2 = Tr15; Tr3 = Tr5; Glub3 = Gl5; End;
End;
Логические узлы разделены "Else", с целью ускорения расчёта и его понятности...
В представленном куске кода, ошибку не нашёл...
Для чего это всё делается - понятно...
"Индикаторы или исчезают или неправильно работают?" - это по отдельности! "Исчезают?" или "Неправильно работают?".
Если исчезают, то это одна проблема, а если неправильно работают, то это другая и тут надо смотреть, как в коде реализована логика вычисления старшей компрессии: при помощи массивов, векторов, словарей или PriceSeriesProvider. Хотя судя по части кода, всё намного "хитрее" Без рефакторинга это творение пока не понятно))
В одних индикаторах, построенные скользящие - либо исчезают, либо строится их фрагмент, оборванный дней 100 назад (не помню точно) - это "исчезают".
Но есть индикатор, который "неправильно работает" - и он меня беспокоит больше всего.
Если для скользящих я построил эквиваленты (худшего качества), то неправильно работающий пришлось просто отключить.
Станислав, прекрасно!
Да, конечно, так проще и лаконичнее.
Но когда я писал код, мне важно было всё видеть в явном виде. А потом - переделывать и упрощать было неохота. (Копи-паст работающий блок в следующий индикатор - и точка.)))
Меня удивляет (я снова повторю), что полный снос и установка TS9.1 заново, и замена всей папки Tradestation9.1 на диске С из заархивированной работающей полностью исправно резервной копии - не исправило ситуацию!!!
Вот это удивительно!!!
Получается, поломка вышла за пределы директорий Tradestation 9.1 и поселилась где-то в самой Виндоус 7 64 !!!
Чувствую, мне нужно будет сносить всю Винду и всё устанавливать заново!!!
Либо изменить ProSuite2000i, как это объяснено в соответствующей ветке - и вернуться в неё...
Мистика какая-то...