Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1792

 
Alexey Viktorov #:

Нет Макар, это выглядет так:

Функция ObjectFind() возвращает номер главного окна. А этот номер равен 0. С другой стороны 0 == false, отсюда следует что если функция вернула 0, то это всё-равно что вернула false. Конечно это применять я-бы не стал, если вдруг функция вернёт -1, то-есть ошибка, то можно считать расположение объекта не в главном окне. Да плюс ко всему мало-ли какие исправления внесут…

В общем не спорь и не учись так делать…

Функция ObjectFind() возвращает не номер главного окна. А номер окна где объект найден(0,1,2...) или -1 если объекта нет.

Интересно "-1" - это false или true?

Тип bool предназначен для хранения логических значений true (истина) или false (ложь), числовое представление которых 1 или 0 соответственно.
 
MakarFX #:

Функция ObjectFind() возвращает не номер главного окна. А номер окна где объект найден(0,1,2...) или -1 если объекта нет.

Я говорил о конкретном случае где объект расположен в главном окне. Не спорь и не учись так делать…

 

MakarFX #:

Интересно "-1" - это false или true?

Тип bool предназначен для хранения логических значений true (истина) или false (ложь), числовое представление которых 1 или 0 соответственно.

false это только 0. Всё остальное true

 
Alexey Viktorov #:

false это только 0. Всё остальное true

"-1" тоже true?  Уже проверил. Действительно только "0" - false
 
Alexey Viktorov #:

Нет Макар, это выглядет так:

Функция ObjectFind() возвращает номер главного окна. А этот номер равен 0. С другой стороны 0 == false, отсюда следует что если функция вернула 0, то это всё-равно что вернула false. Конечно это применять я-бы не стал, если вдруг функция вернёт -1, то-есть ошибка, то можно считать расположение объекта не в главном окне. Да плюс ко всему мало-ли какие исправления внесут…

В общем не спорь и не учись так делать…

Осознаю что так делать не стоит, но пришлось ради эстетики (== 0 в каждом условии по уродски выглядит). И мне объект нужен только в главном окне.

 
Nerd Trader #:

Осознаю что так делать не стоит, но пришлось ради эстетики (== 0 в каждом условии по уродски выглядит). И мне объект нужен только в главном окне.

Тогда сделай так

if(ObjectFind("Buy Stop") || ObjectFind("not allowed"))

если объекта нет, то получишь "-1", т.е. true

 
Переделал с вариантом ==0.

Проблема: постоянно создаются и мерцают  желтые и серые линии  ("Stop Sell" и "not allowed") при нажатой кнопке на графике. Причем ObjectCreate() постоянно возвращает true а не false, то есть оно создаёт как будто в другое окно и этим можно было бы объяснить мерцание... но окно только главное и с зеленой линией ("Buy Stop") аномалий не наблюдается как и с красной ("Stop Loss").

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
    datetime static dt          = 0;
    double   static price       = 0;
    int      static window      = 0;
    string   static line_name;

  if(id==CHARTEVENT_OBJECT_CLICK){
    ...
    //Нажатие на SO в зависимоти от расположения панели создаёт линию
    if(sparam=="Button Stop Order"){
      if(panel_position == 1 || panel_position == 2){
        line_name = "Buy Stop";
        CreateLine(line_name, clrGreen);
      }
      if(panel_position == 3 || panel_position == 4){
        line_name = "Sell Stop";
        CreateLine(line_name, clrYellow);
      }
    }
    //Нажатие на линию удаляет её и создаёт красную
    if(sparam=="Buy Stop" || sparam=="Sell Stop"){
      ObjectDelete(line_name);
      line_name = "Stop Loss";
      CreateLine(line_name, clrRed);
    }
    //Нажатие на красной линии удаляет её и отжимает кнопку
    if(sparam=="Stop Loss"){
      ObjectDelete(line_name);
      button_name = "Button Stop Order";
      ms=GetMicrosecondCount();
    }
  }
  //Если кнопка SO нажата, то линия будет следовать за курсором
  if(ObjectGetInteger(0,"Button Stop Order",OBJPROP_STATE)){
    int x = (int)lparam;
    int y = (int)dparam;
    //Переведём координаты X, Y в дату и время
    if(ChartXYToTimePrice(0,x,y,window,dt,price)){
      //Линия меняет цвет с зелёного на желтый
      if(price < Bid){
        if(ObjectFind("Buy Stop") == window || ObjectFind("not allowed") == window){
          ObjectDelete(line_name);
          line_name = "Sell Stop";
          CreateLine(line_name, clrYellow);
        }      
      }
      //Линия меняет цвет с желтого на зелёный
      if(price > Ask){
        if(ObjectFind("Sell Stop") == window || ObjectFind("not allowed") == window){
          ObjectDelete(line_name);
          line_name = "Buy Stop";
          CreateLine(line_name, clrGreen);
        }
      }
      //Линия меняет цвет на серый если в зоне спреда
      if(price > Bid && price < Ask){
        if(ObjectFind("Buy Stop") == window || ObjectFind("Sell Stop") == window){
          ObjectDelete(line_name);
          line_name = "not allowed";
          CreateLine(line_name, clrGray);
        }
      }
      //Прикрепляем линию к курсору
      if(id == CHARTEVENT_MOUSE_MOVE)
        if(ObjectMove(0,line_name,0,0,price))
          ChartRedraw(0);
    }
  }else if(ObjectFind(line_name) == window) Print(ObjectDelete(line_name));
  //Если нажать Esc то удалится линия и кнопка отожмется
  if(id == CHARTEVENT_KEYDOWN && lparam == 27){
      button_name = "Button Stop Order";
      ms=GetMicrosecondCount();
  }
}
//----------------------------------------------------------------------
void CreateLine(const string name, const color clr)
{
  Print(ObjectCreate(0, name, OBJ_HLINE, 0,0,0));
  ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
  ObjectSetInteger(0, name, OBJPROP_STYLE, 3); 
}
 
MakarFX #:

Тогда сделай так

если объекта нет, то получишь "-1", т.е. true

Я пробовал, только нужно поменять название объектов (инверсировать), чтоб исключение работало. Но так вообще линии не создаются.

if(ObjectFind("Sell Stop") || ObjectFind("Stop Loss")){
  ObjectDelete(line_name);
  line_name = "Sell Stop";
  CreateLine(line_name, clrYellow);
} 
 
Nerd Trader #:

Я пробовал, только нужно поменять название объектов. Но так вообще линии не создаются.

у меня создается и у тебя тоже, только цена "0"
 
MakarFX #:
у меня создается и у тебя тоже, только цена "0"
Да действительно аж 8 штук, но на графике не видно, то что цена 0 не важно, линия все равно цепляется к курсору (следует за ним)
Причина обращения: