Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1792

 
Alexey Viktorov #:

No Makar, se ve así:

La función ObjectFind() devuelve el número de la ventana principal. Y este número es 0. Por otro lado, 0 == false, por lo que se deduce que si la función devuelve 0, sigue devolviendo false. Por supuesto, yo no usaría esto porque si la función devuelve -1, es decir, un error, podemos considerar que la ubicación del objeto no está en la ventana principal. Además, nunca se sabe qué arreglos se harán...

Así que no discutas y no estudies cómo hacerlo...

La función ObjectFind() no devuelve el número de la ventana principal. Devolverá el número de ventana donde se encontró un objeto (0, 1, 2...) o -1 si no se encontró ningún objeto.

Me pregunto si "-1" es falso o verdadero.

El tipo bool se utiliza para almacenar los valores booleanos true o false, con una representación numérica de 1 o 0 respectivamente .
 
MakarFX #:

La función ObjectFind() no devuelve el número de la ventana principal. Es el número de ventana donde se encuentra el objeto (0,1,2...) o -1 si no hay objeto.

Me refería al caso concreto en el que el objeto se encuentra en la ventana principal. No discutas y no aprendas a hacerlo...

 

MakarFX #:

Me pregunto si "-1" es falso o verdadero.

El tipo bool está destinado a almacenar los valores booleanos true o false, cuya representación numérica es 1 o 0, respectivamente .

falso es sólo 0. Todo lo demás es verdadero

 
Alexey Viktorov #:

falso es sólo 0. Todo lo demás es verdadero

¿"-1" también es cierto? Ya lo he comprobado. Realmente sólo el "0" es falso
 
Alexey Viktorov #:

No Makar, se ve así:

La función ObjectFind() devuelve el número de la ventana principal. Y este número es 0. Por otro lado, 0 == false, por lo que se deduce que si la función devuelve 0, sigue devolviendo false. Por supuesto, yo no usaría esto porque si la función devuelve -1, es decir, un error, podemos considerar que la ubicación del objeto no está en la ventana principal. Además, nunca se sabe qué arreglos se harán...

Así que no discutas y no aprendas a hacerlo...

Me doy cuenta de que no se debe hacer así, pero tuve que hacerlo por la estética (== 0 en todas las condiciones se ve feo). Y sólo necesito el objeto en la ventana principal.

 
Nerd Trader #:

Sé que no debería hacerlo, pero tuve que hacerlo por estética (== 0 en todas las condiciones se ve feo). Y sólo necesito el objeto en la ventana principal.

A continuación, haga lo siguiente

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

si no hay objeto, obtendrá "-1", es decir, verdadero

 
Rehecho con la opción ==0.

Problema: Las líneas amarillas y grises ("Stop Sell" y "not allowed") se crean constantemente y parpadean cuando se pulsa el botón en el gráfico. Y ObjectCreate() devuelve constantemente true en lugar de false, es decir, se crea como en otra ventana y eso podría explicar el parpadeo... Pero la ventana es sólo la principal y no hay anomalías tanto con la línea verde ("Buy Stop") como con la roja ("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 #:

A continuación, haga lo siguiente

si no hay objeto, se obtiene "-1", es decir, verdadero

Lo he probado, sólo tengo que cambiar los nombres de los objetos (invertir) para que la excepción funcione. Pero de esta manera no se crean líneas en absoluto.

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

Lo he probado, sólo que hay que cambiar el nombre de los objetos. Pero esto no crea ninguna línea en absoluto.

A mí me funciona y a ti también, sólo que el precio es "0".
 
MakarFX #:
Yo lo tengo creado y tú también, sólo que el precio es "0".
Sí efectivamente 8 piezas, pero no es visible en el gráfico, el hecho de que el precio sea 0 no importa, la línea sigue aferrada al cursor (lo sigue)