Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 727

 
Vitaly Muzichenko:

Подскажите, каким образом выделить объект при создании, и чтоб больше он не терял выделение, ну и не выделялся сам, когда пользователь уберёт выделение. В четвёртом это было просто, в пятом это не работает.

Было так и работало отменно:

void SetHLine(...,double p,bool sel) {
  if(ObjectFind(chart_ID,nm)!=0) {
    ObjectCreate(chart_ID,nm,OBJ_HLINE,0,0,0);
    ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);
    ...
  }
   ObjectSetDouble(chart_ID,nm,OBJPROP_PRICE,p);
}

Как видно, при создании сразу можем выделить, или не выделить создаваемый объект и он больше изменяться не будет и к нему нет обращения, но вот в пятом такое не проходит, создаёт без выделения.

Как сделать в mql5 так, чтоб можно было выделить объект при создании, ну и дальше уже ним управлять вручную, когда нужно - выделять/не выделять 

OBJPROP_SELECTABLE
 

Ну так и есть, но значок не выделяется

void SetArrow(string nm,string tooltxt="",datetime t=0,double p=0,color col=clrRed,long type=0) {
if(ObjectFind(0,nm)!=0) {
    ObjectCreate(0,nm,type==0?OBJ_ARROW_BUY:OBJ_ARROW_SELL,0,0,0);
    ObjectSetInteger(0,nm,OBJPROP_COLOR,col);
    ObjectSetInteger(0,nm,OBJPROP_SELECTED,true);
    ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,true);
    ObjectSetInteger(0,nm,OBJPROP_HIDDEN,false);
    ObjectSetString(0,nm,OBJPROP_TOOLTIP,tooltxt);
   }
    ObjectSetDouble(0,nm,OBJPROP_PRICE,p);
    ObjectSetInteger(0,nm,OBJPROP_TIME,t);
}
 
Vitaly Muzichenko:

Ну так и есть, но значок не выделяется

void SetArrow(string nm,string tooltxt="",datetime t=0,double p=0,color col=clrRed,long type=0) {
if(ObjectFind(0,nm)!=0) {
    ObjectCreate(0,nm,type==0?OBJ_ARROW_BUY:OBJ_ARROW_SELL,0,0,0);
    ObjectSetInteger(0,nm,OBJPROP_COLOR,col);
    ObjectSetInteger(0,nm,OBJPROP_SELECTED,true);
    ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,true);
    ObjectSetInteger(0,nm,OBJPROP_HIDDEN,false);
    ObjectSetString(0,nm,OBJPROP_TOOLTIP,tooltxt);
   }
    ObjectSetDouble(0,nm,OBJPROP_PRICE,p);
    ObjectSetInteger(0,nm,OBJPROP_TIME,t);
}

Всё выделяется:

Выделение 

Файлы:
OBJ_ARROW.mq5  22 kb
 
Vladimir Karputov:

Всё выделяется:

 

Блин, Я правил одну функцию, а проверял другую, всё работает. Спасибо! Пойду спать)
 

Заметил странную особенность, если прописать так, то линии не выделяет при создании

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);
ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);

А вот если наоборот, то проблем с выделением нет:

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);
ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);

Почему-то от замены слагаемых, сумма меняется?

 
Vitaly Muzichenko:

Заметил странную особенность, если прописать так, то линии не выделяет при создании

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);
ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);

А вот если наоборот, то проблем с выделением нет:

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);
ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);

Почему-то от замены слагаемых, сумма меняется?

Видимо, когда 

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);

последняя команда, чарт обновляется 

 
Vitaly Muzichenko:

Заметил странную особенность, если прописать так, то линии не выделяет при создании

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);
ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);

А вот если наоборот, то проблем с выделением нет:

ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);
ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);

Почему-то от замены слагаемых, сумма меняется?

Изначально наверное при создании объекта ему устанавливается свойство по умолчанию как невыделяемое.

Далее вы его выделяете (но объект не выделяемый), соответственно, ничего не выделяется

Затем вы ему задаёте свойство возможности выделения. Но "поздно пить боржоми" ...
 

Ну так вот полный код:

void SetVLine(long chart_ID=0,string nm="nm",datetime tm=0,int wd=1,int st=0,color cl=clrRed,
                                             string tooltxt="",bool sel=false,bool back=false) {
if(ObjectFind(chart_ID,nm)<0) {
    ObjectCreate(chart_ID,nm,OBJ_VLINE,0,tm,0);
    ObjectSetInteger(chart_ID,nm,OBJPROP_TIME,tm);
    ObjectSetInteger(chart_ID,nm,OBJPROP_BACK,back);
    ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);
    ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,sel);
  // ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,true);
    ObjectSetString(chart_ID,nm,OBJPROP_TOOLTIP,tooltxt);
    ObjectSetInteger(chart_ID,nm,OBJPROP_COLOR,cl);
    ObjectSetInteger(chart_ID,nm,OBJPROP_WIDTH,wd);
    ObjectSetInteger(chart_ID,nm,OBJPROP_STYLE,st);
   }
}

Да, перепроверил на всех типах объектов, и нужно первым ставить "SELECTABLE", а потом уже "SELECTED

Спасибо за участие и помощь в решении! 

 
В МетаТрэйдере5 есть возможность с генерировать советник из 3 блоков. 1блок выдает сигналы от индикатора или от нескольких индикаторов. 2 блок трейлинги. 3 блок риски.

Подскажите пожалуйста  1. можно ли в 1 блок добавить пользовательские индикаторы? Если да , то как это сделать?

                                       2. можно ли подправить код так чтобы сделки открывались в обе стороны( сейчас например если открылась сделка на покупку, сделка на продажу не открывается пока не закроется сделка на покупку)
 
Комментарии, не относящиеся к этой теме, были перенесены в "Вопросы от начинающих MQL4 MT4 MetaTrader 4".
Причина обращения: