Объект OBJ_FIBOFAN

 
"Жить захочешь - не так раскорячишься" (с) "Особенности национальной охоты"


Не являюсь поклонником Фибо-функций и никогда ими вообще не занимался. Но вот тут попросили - http://forum.alpari-idc.ru/viewtopic.php?p=401194#401194, глянул код и решил сделать. В итоге ковырялся около часа пока не разобрался.
Почему-то количество уровней Фибо-веера равно нулю, если не задать явно.

Первый вариант работает:
ObjectCreate(fibo,OBJ_FIBOFAN,0,Time[x1],y1,Time[x2],y2); ObjectSet(fibo,OBJPROP_COLOR,DodgerBlue); ObjectSet(fibo,OBJPROP_STYLE,STYLE_DOT); Print("Количество индексов Fibo1 до установки=",ObjectGet(fibo,OBJPROP_FIBOLEVELS)); ObjectSet(fibo,OBJPROP_FIBOLEVELS,4); Print("Количество индексов Fibo1=",ObjectGet(fibo,OBJPROP_FIBOLEVELS)); Print("Ошибка количества индексов Fibo1=",GetLastError()); if(!ObjectSet(fibo,OBJPROP_FIRSTLEVEL+0,0.382)) Print("Ошибка установки уровня 1 Fibo1 ",GetLastError()); if(!ObjectSet(fibo,OBJPROP_FIRSTLEVEL+1,0.50)) Print("Ошибка установки уровня 2 Fibo1 ",GetLastError()); if(!ObjectSet(fibo,OBJPROP_FIRSTLEVEL+2,0.618)) Print("Ошибка установки уровня 3 Fibo1 ",GetLastError()); if(!ObjectSet(fibo,OBJPROP_FIRSTLEVEL+3,0.854)) Print("Ошибка установки уровня 4 Fibo1 ",GetLastError()); ObjectSetFiboDescription( fibo, 0,"38.2"); ObjectSetFiboDescription( fibo, 1,"50.0"); ObjectSetFiboDescription( fibo, 2,"61.8"); ObjectSetFiboDescription( fibo, 3,"85.4");


Второй не работает:
ObjectCreate(fibo2,OBJ_FIBOFAN,0,Time[x2],y2,Time[x3],y3); ObjectSet(fibo2,OBJPROP_COLOR,Yellow); ObjectSet(fibo2,OBJPROP_STYLE,STYLE_DOT); Print("Количество индексов Fibo2=",ObjectGet(fibo2,OBJPROP_FIBOLEVELS)); Print("Ошибка количества индексов Fibo2=",GetLastError()); if(!ObjectSet(fibo2,OBJPROP_FIRSTLEVEL+3,0.854)) Print("Ошибка установки уровня 3 Fibo2"); ObjectSetFiboDescription( fibo2, 3,"85.4");


Лог соотвествующий:
2006.04.01 04:08:13 rvmFractalsLevel AUDUSD,H1: Ошибка устано
Файлы:
fibo.jpg  41 kb
 
Код переделанного индикатора. Мне кажется , такое поведение объекта не является задуманным.
Файлы:
 
Да, чуть не забыл сказать. Простое задание количества уровней/индексов в Веере не помогает, в этом случае все уровни по умолчанию убиваются. ТО есть, такой код
ObjectCreate(fibo2,OBJ_FIBOFAN,0,Time[x2],y2,Time[x3],y3); ObjectSet(fibo2,OBJPROP_COLOR,Yellow); ObjectSet(fibo2,OBJPROP_STYLE,STYLE_DOT); ObjectSet(fibo2,OBJPROP_FIBOLEVELS,4); Print("Количество индексов Fibo2=",ObjectGet(fibo2,OBJPROP_FIBOLEVELS)); Print("Ошибка количества индексов Fibo2=",GetLastError()); if(!ObjectSet(fibo2,OBJPROP_FIRSTLEVEL+3,0.854)) Print("Ошибка установки уровня 3 Fibo2"); ObjectSetFiboDescription( fibo2, 3,"85.4");


приводит к таким последствиям. Необходимо проходить все уровни явно.
Файлы:
fibo2.jpg  49 kb
 
У всех фибо-объектов так. По умолчанию 0 уровней.
Если же объект будет перерисован (или сам, или с помощью ObjectsRedraw), то вместо 0 возникнет умолчательное значение количества уровней (для веера - 3) и этим уровням будут присвоены умолчательные значения.
Первый вариант правильно написан. Принцип умолчания очень вреден, необходимо самостоятельно управлять всеми свойствами
Причина обращения: