Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1792

 
Alexey Viktorov #:

Nein, Makar, es sieht so aus:

Die Funktion ObjectFind() gibt die Nummer des Hauptfensters zurück. Und diese Zahl ist 0. Andererseits ist 0 == false. Daraus folgt, dass die Funktion, wenn sie 0 zurückgibt, immer noch false zurückgibt. Natürlich würde ich dies nicht verwenden, denn wenn die Funktion -1 zurückgibt, d. h. einen Fehler, können wir davon ausgehen, dass sich das Objekt nicht im Hauptfenster befindet. Und außerdem weiß man nie, welche Korrekturen vorgenommen werden...

Also streiten Sie nicht und lernen Sie nicht, wie man es macht...

Die Funktion ObjectFind() gibt die Nummer des Hauptfensters nicht zurück. Es wird die Nummer des Fensters zurückgegeben, in dem das Objekt gefunden wurde (0, 1, 2...) oder -1, wenn das Objekt nicht existiert.

Ich frage mich, ob "-1" falsch oder richtig ist.

Der Typ bool wird verwendet, um die booleschen Werte true oder false zu speichern , mit einer numerischen Darstellung von 1 bzw. 0 .
 
MakarFX #:

Die Funktion ObjectFind() gibt die Nummer des Hauptfensters nicht zurück. Es ist die Nummer des Fensters, in dem das Objekt gefunden wurde (0,1,2...) oder -1, wenn es kein Objekt gibt.

Ich habe über den speziellen Fall gesprochen, in dem sich das Objekt im Hauptfenster befindet. Streiten Sie nicht und lernen Sie nicht, wie man es macht...

 

MakarFX #:

Ich frage mich, ob "-1" falsch oder richtig ist?

Der Typ bool ist für die Speicherung der booleschen Werte true oder false vorgesehen , deren numerische Darstellung 1 bzw. 0 ist .

false ist nur 0. Alles andere ist true.

 
Alexey Viktorov #:

false ist nur 0. Alles andere ist true.

"-1" ist auch wahr? Bereits überprüft. In Wirklichkeit ist nur "0" falsch
 
Alexey Viktorov #:

Nein, Makar, es sieht so aus:

Die Funktion ObjectFind() gibt die Nummer des Hauptfensters zurück. Und diese Zahl ist 0. Andererseits ist 0 == false. Daraus folgt, dass die Funktion, wenn sie 0 zurückgibt, immer noch false zurückgibt. Natürlich würde ich dies nicht verwenden, denn wenn die Funktion -1 zurückgibt, d. h. einen Fehler, können wir davon ausgehen, dass sich das Objekt nicht im Hauptfenster befindet. Und außerdem weiß man nie, welche Korrekturen vorgenommen werden...

Also streiten Sie nicht und lernen Sie nicht, wie man es macht...

Mir ist klar, dass man das nicht tun sollte, aber ich musste es aus ästhetischen Gründen tun (== 0 in jedem Zustand sieht hässlich aus). Und ich brauche nur das Objekt im Hauptfenster.

 
Nerd Trader #:

Ich weiß, ich sollte das nicht tun, aber ich musste es aus ästhetischen Gründen tun (== 0 in jedem Zustand sieht hässlich aus). Und ich brauche nur das Objekt im Hauptfenster.

Gehen Sie dann wie folgt vor

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

wenn es kein Objekt gibt, erhalten Sie "-1", d.h. true

 
Überarbeitet mit der Option ==0.

Problem: Gelbe und graue Linien ("Stop Sell" und "not allowed") werden ständig erzeugt und flackern, wenn die Schaltfläche im Chart gedrückt wird. Und ObjectCreate() gibt ständig true statt false zurück, d.h. es erstellt wie in einem anderen Fenster und das könnte das Flackern erklären... Aber das Fenster ist nur das Hauptfenster und es gibt keine Anomalien sowohl bei der grünen Linie ("Buy Stop") als auch bei der roten Linie ("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 #:

Gehen Sie dann wie folgt vor

Wenn es kein Objekt gibt, erhalten Sie "-1", d.h. wahr.

Ich habe es versucht, ich muss nur die Objektnamen ändern (invertieren), damit die Ausnahme funktioniert. Auf diese Weise entstehen aber überhaupt keine Linien.

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

Ich habe es ausprobiert, man muss nur den Namen der Objekte ändern. Dabei entstehen aber überhaupt keine Linien.

Es funktioniert für mich und für Sie auch, nur der Preis ist "0".
 
MakarFX #:
Ich habe es erstellt und Sie auch, nur der Preis ist "0".
Ja, in der Tat 8 Stück, aber es ist nicht sichtbar auf dem Diagramm, die Tatsache, dass der Preis ist 0 spielt keine Rolle, die Linie noch klammert sich an den Cursor (folgt ihm)
Grund der Beschwerde: