Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1792

 
Alexey Viktorov #:

No Makar, è così:

La funzione ObjectFind() restituisce il numero della finestra principale. E questo numero è 0. D'altra parte, 0 == false, quindi ne consegue che se la funzione restituisce 0, restituisce comunque false. Naturalmente, non lo userei perché se la funzione restituisce -1, cioè un errore, potremmo considerare la posizione dell'oggetto non nella finestra principale. Oltre a questo, non si sa mai quali correzioni saranno fatte...

Quindi non discutere e non studiare come fare...

La funzione ObjectFind() non restituisce il numero della finestra principale. Restituirà il numero di finestra in cui è stato trovato l'oggetto (0, 1, 2...) o -1 se l'oggetto non esiste.

Mi chiedo se "-1" è falso o vero.

Il tipo bool è usato per memorizzare i valori booleani true o false, con una rappresentazione numerica di 1 o 0 rispettivamente .
 
MakarFX #:

La funzione ObjectFind() non restituisce il numero della finestra principale. È il numero della finestra in cui si trova l'oggetto (0,1,2...) o -1 se non c'è nessun oggetto.

Stavo parlando del caso specifico in cui l'oggetto si trova nella finestra principale. Non discutere e non imparare a farlo...

 

MakarFX #:

Mi chiedo se "-1" è falso o vero?

Il tipo bool è destinato a memorizzare i valori logici true o false, la cui rappresentazione numerica è 1 o 0, rispettivamente .

falso è solo 0. Tutto il resto è vero

 
Alexey Viktorov #:

falso è solo 0. Tutto il resto è vero

"-1" è anche vero? Già controllato. In realtà solo "0" è falso
 
Alexey Viktorov #:

No Makar, è così:

La funzione ObjectFind() restituisce il numero della finestra principale. E questo numero è 0. D'altra parte, 0 == falso, quindi ne consegue che se la funzione restituisce 0, restituisce comunque falso. Naturalmente, non lo userei perché se la funzione restituisce -1, cioè un errore, potremmo considerare la posizione dell'oggetto non nella finestra principale. Oltre a questo, non si sa mai quali correzioni saranno fatte...

Quindi non discutere e non imparare a farlo...

Mi rendo conto che non si dovrebbe fare così, ma ho dovuto farlo per motivi di estetica (== 0 in ogni condizione sembra brutto). E ho bisogno solo dell'oggetto nella finestra principale.

 
Nerd Trader #:

So che non dovrei farlo, ma ho dovuto farlo per amore dell'estetica (== 0 in ogni condizione sembra brutto). E ho bisogno solo dell'oggetto nella finestra principale.

Poi fate come segue

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

se non c'è un oggetto, si ottiene "-1", cioè vero

 
Rielaborato con l'opzione ==0.

Problema: le linee gialle e grigie ("Stop Sell" e "not allowed") si creano costantemente e sfarfallano quando si preme il pulsante sul grafico. E ObjectCreate() restituisce costantemente true invece di false, cioè crea come se fosse in un'altra finestra e questo potrebbe spiegare lo sfarfallio... Ma la finestra è solo quella principale e non ci sono anomalie né con la linea verde ("Buy Stop") né con quella rossa ("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 #:

Poi fate come segue

se non c'è un oggetto, si ottiene "-1", cioè vero

Ho provato, devo solo cambiare i nomi degli oggetti (invertire) perché l'eccezione funzioni. Ma in questo modo non viene creata nessuna linea.

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

Ho provato, solo che devi cambiare il nome degli oggetti. Ma questo non crea nessuna linea.

Funziona per me e anche per voi, solo che il prezzo è "0".
 
MakarFX #:
Io l'ho creato e anche voi, solo che il prezzo è "0".
Sì infatti 8 pezzi, ma non è visibile sul grafico, il fatto che il prezzo sia 0 non importa, la linea si aggrappa ancora al cursore (lo segue)