29 в 1. Или снова о формализации сигналов индикаторов.

 

Уже давно интересовал этот вопрос о реализации формального вывода сигналов индикаторов

более компактным и главное эргономичным способом...

На выходных нашлось немного времени и кое что состряпал.


Вроде всё идёт пока нормально, за мелкими непонятками.

Одна из таких.

Порой бывает что этот цикл "отрабатывает" трижды.

Что проявляется в виде увеличения значения переменных в тири раза и трижды "прострочен" коммент на графике.

for(i=0; i<ArraySize(ibuff); i++)
{
Rekom(i);
ibuff[i]=zn;
komm=komm+(i+1)+". "+name+" "+OpOver(zn)+"\n";
//Alert(i,". name=",name," = zn=",zn);
}
//---
Comment(komm);
//---
for(i=0; i<ArraySize(ibuff); i++)
{
if(ibuff[i]==-1) u++;
if(ibuff[i]==0) b++;
if(ibuff[i]==1) s++;
}

но больше всего тупит почему не появляется обьект...

fntsize=8+MathAbs(b-s);
if(b>s && b>0) {Label("BUY ("+b+" против "+s+" из "+(u+b+s)+")",fntsize,Green);}
if(b<s && s>0) {Label("SELL ("+s+" против "+b+" из "+(u+b+s)+")",fntsize,Red);}


код полностью, пока черновой вариант:

Файлы:
 

Привет)

Удалите из функции start ObjectsDeleteAll(); , тогда Label появится.

Хорошая задумка!

Удачи!

 
Dm_35 >>:

Привет)

Удалите из функции start ObjectsDeleteAll(); , тогда Label появится.

Хорошая задумка!

Удачи!

Я проще поступил...

Поместил все лейбы в одну функцию.

void LabeLine(int u, int b, int s, int mn=0)
{
int i, styd=30, fnts=35, sizer=7;
string txt=".", rek="назаборе";
color cv=Blue;
//---
int start=20; 
for(i=0; i<u; i++)
   {
   ObjectCreate("bs_u_"+i,OBJ_LABEL, 0, 0, 0);
   ObjectSet("bs_u_"+i,OBJPROP_BACK,1);
   ObjectSet("bs_u_"+i,OBJPROP_CORNER,3);
   ObjectSet("bs_u_"+i,OBJPROP_XDISTANCE,start+(i*sizer));
   ObjectSet("bs_u_"+i,OBJPROP_YDISTANCE,styd);
   ObjectSetText("bs_u_"+i, txt, fnts, "Tahoma", Blue);
   }
//---
int startb=start+(i*sizer);
for(i=0; i<b; i++)
   {
   ObjectCreate("bs_b_"+i,OBJ_LABEL, 0, 0, 0);
   ObjectSet("bs_b_"+i,OBJPROP_BACK,1);
   ObjectSet("bs_b_"+i,OBJPROP_CORNER,3);
   ObjectSet("bs_b_"+i,OBJPROP_XDISTANCE,startb+(i*sizer));
   ObjectSet("bs_b_"+i,OBJPROP_YDISTANCE,styd);
   ObjectSetText("bs_b_"+i, txt, fnts, "Tahoma", YellowGreen);
   }
//---
int starts=startb+(i*sizer);
for(i=0; i<s; i++)
   {
   ObjectCreate("bs_s_"+i,OBJ_LABEL, 0, 0, 0);
   ObjectSet("bs_s_"+i,OBJPROP_BACK,1);
   ObjectSet("bs_s_"+i,OBJPROP_CORNER,3);
   ObjectSet("bs_s_"+i,OBJPROP_XDISTANCE,starts+(i*sizer));
   ObjectSet("bs_s_"+i,OBJPROP_YDISTANCE,styd);
   ObjectSetText("bs_s_"+i, txt, fnts, "Tahoma", Red);
   }
//---
if(b>s && b>0) {rek="BUY"; cv=Green;} 
if(b<s && s>0) {rek="SELL"; cv=Red;} 
   {
   ObjectCreate("bs_r",OBJ_LABEL, 0, 0, 0);
   ObjectSet("bs_r",OBJPROP_BACK,1);
   ObjectSet("bs_r",OBJPROP_CORNER,3);
   ObjectSet("bs_r",OBJPROP_XDISTANCE,20);
   ObjectSet("bs_r",OBJPROP_YDISTANCE,styd+10);
   ObjectSetText("bs_r", rek, fnts*2, "Tahoma", cv);
   }
}
 
Dm_35 >>:

Удалите из функции start ObjectsDeleteAll(); , тогда Label появится.

Угу. Щаз.

Там строчку надо расскомментировать.

.

void Label(string txt, int fnts, color cv=Blue)
{
  //ObjectCreate("bs_",OBJ_LABEL, 0, 0, 0); <--- вот эту, закомментировано именно создание
ObjectSet("bs_",OBJPROP_BACK,1);
ObjectSet("bs_",OBJPROP_CORNER,3);
ObjectSet("bs_",OBJPROP_XDISTANCE,10);
ObjectSet("bs_",OBJPROP_YDISTANCE,70);
ObjectSetText("bs_", txt, fnts, "Tahoma", cv);
}
.
И лично я бы всунул WindowRedraw

if(b>s && b>0) {Label("BUY ("+b+" против "+s+" из "+(u+b+s)+")",fntsize,Green);}
if(b<s && s>0) {Label("SELL ("+s+" против "+b+" из "+(u+b+s)+")",fntsize,Red);}
WindowRedraw(); <--- сюда

 
jartmailru >>:

Угу. Щаз.

Там строчку надо расскомментировать.

О! точно...

Глаз-алмаз.

Блин, обыскался, а оно то всё на виду... ;)


С перерисовкой вроде проблем нет, потому и не пихал.

А так знаю я енту функцию... знаю...

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