Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1792

 
Alexey Viktorov #:

Não Makar, é o que parece:

A função ObjectFind() retorna o número da janela principal. E este número é 0. Por outro lado, 0 == falso, portanto, se a função retorna 0, ela ainda retorna falso. Claro, eu não usaria isto porque se a função retornar -1, ou seja, um erro, podemos considerar a localização do objeto não na janela principal. Além disso, nunca se sabe que consertos serão feitos...

Portanto, não discuta e não estude como fazer isso...

A função ObjectFind() não retorna o número da janela principal. Ele retornará o número de janelas onde um objeto foi encontrado (0, 1, 2...) ou -1 se nenhum objeto foi encontrado.

Pergunto-me se "-1" é falso ou verdadeiro.

O tipo bool é usado para armazenar os valores booleanos verdadeiros ou falsos, com uma representação numérica de 1 ou 0 respectivamente .
 
MakarFX #:

A função ObjectFind() não retorna o número da janela principal. É o número de janelas onde o objeto é encontrado (0,1,2...) ou -1 se não houver objeto.

Eu estava falando de um caso específico onde o objeto está localizado na janela principal. Não discuta e não aprenda a fazer isso...

 

MakarFX #:

Eu me pergunto se "-1" é falso ou verdadeiro?

O tipo bool é destinado a armazenar os valores booleanos verdadeiros ou falsos, cuja representação numérica é 1 ou 0, respectivamente .

falso é apenas 0. Tudo o resto é verdade

 
Alexey Viktorov #:

falso é apenas 0. Tudo o resto é verdade

"-1" também é verdade? Já verificado. Realmente apenas "0" é falso
 
Alexey Viktorov #:

Não Makar, é o que parece:

A função ObjectFind() retorna o número da janela principal. E este número é 0. Por outro lado, 0 == falso, portanto, se a função retorna 0, ela ainda retorna falso. Claro, eu não usaria isto porque se a função retornar -1, ou seja, um erro, podemos considerar a localização do objeto não na janela principal. Além disso, nunca se sabe que consertos serão feitos...

Portanto, não discuta e não aprenda a fazer isso...

Percebo que você não deveria fazer isso, mas tive que fazê-lo por uma questão de estética (=== 0 em todas as condições parece feio). E eu só preciso do objeto na janela principal.

 
Nerd Trader #:

Eu sei que não deveria fazer isso, mas tive que fazer por uma questão de estética (=== 0 em todas as condições parece feio). E eu só preciso do objeto na janela principal.

Em seguida, faça o seguinte

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

se não houver nenhum objeto, você receberá "-1", ou seja, verdadeiro

 
Retrabalhada com opção ==0.

Problema: As linhas amarelas e cinzas ("Stop Sell" e "not allowed") são constantemente criadas e cintilantes quando o botão é pressionado na tabela. E ObjectCreate() retorna constantemente verdadeiro ao invés de falso, ou seja, cria como se estivesse em outra janela e isso poderia explicar a cintilação... Mas a janela é apenas a principal e não há anomalias com a linha verde ("Buy Stop"), assim como com a vermelha ("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 #:

Em seguida, faça o seguinte

se não houver nenhum objeto, você recebe "-1", ou seja, verdadeiro

Eu tentei, só preciso mudar os nomes dos objetos (inverter) para que a exceção funcione. Mas desta forma as linhas não são criadas de forma alguma.

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

Eu tentei, só você tem que mudar o nome dos objetos. Mas isto não cria nenhuma linha.

Funciona para mim e para você também, apenas o preço é "0".
 
MakarFX #:
Eu o criei e você também, apenas o preço é "0".
Sim, de fato 8 peças, mas não é visível no gráfico, o fato de que o preço é 0 não importa, a linha ainda se apega ao cursor (segue-o)