Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1792

 
Alexey Viktorov #:

Non Makar, ça ressemble à ça :

La fonction ObjectFind() renvoie le numéro de la fenêtre principale. Et ce nombre est 0. D'autre part, 0 == false, il s'ensuit que si la fonction renvoie 0, elle renvoie toujours false. Bien sûr, je ne l'utiliserais pas car si la fonction renvoie -1, c'est-à-dire une erreur, on peut considérer que l'emplacement de l'objet n'est pas dans la fenêtre principale. En plus de cela, vous ne savez jamais quelles corrections seront apportées...

Alors ne discutez pas et n'étudiez pas comment faire...

La fonction ObjectFind() ne renvoie pas le numéro de la fenêtre principale. Il retournera le numéro de la fenêtre où l'objet a été trouvé (0, 1, 2...) ou -1 si l'objet n'existe pas.

Je me demande si "-1" est faux ou vrai.

Letype bool est utilisé pour stocker les valeurs booléennes true ou false, avec une représentation numérique de 1 ou 0 respectivement .
 
MakarFX #:

La fonction ObjectFind() ne renvoie pas le numéro de la fenêtre principale. C'est le numéro de la fenêtre où l'objet est trouvé (0,1,2...) ou -1 s'il n'y a pas d'objet.

Je parlais du cas spécifique où l'objet est situé dans la fenêtre principale. Ne discutez pas et n'apprenez pas à le faire...

 

MakarFX #:

Je me demande si "-1" est faux ou vrai ?

Le type bool est destiné à stocker les valeurs logiques true ou false, dont la représentation numérique est 1 ou 0, respectivement .

faux est seulement 0. Tout le reste est vrai

 
Alexey Viktorov #:

faux est seulement 0. Tout le reste est vrai

"-1" est également vrai ? Déjà vérifié. Vraiment, seul "0" est faux
 
Alexey Viktorov #:

Non Makar, ça ressemble à ça :

La fonction ObjectFind() renvoie le numéro de la fenêtre principale. Et ce nombre est 0. D'autre part, 0 == false, il s'ensuit que si la fonction renvoie 0, elle renvoie toujours false. Bien sûr, je ne l'utiliserais pas car si la fonction renvoie -1, c'est-à-dire une erreur, on peut considérer que l'emplacement de l'objet n'est pas dans la fenêtre principale. En plus de cela, on ne sait jamais quelles corrections seront apportées...

Alors ne discutez pas et n'apprenez pas à le faire...

Je sais que vous ne devriez pas le faire, mais j'ai dû le faire pour des raisons esthétiques (== 0 dans toutes les conditions, c'est laid). Et je n'ai besoin que de l'objet dans la fenêtre principale.

 
Nerd Trader #:

Je sais que je ne devrais pas faire ça, mais je devais le faire pour des raisons esthétiques (== 0 dans toutes les conditions, c'est laid). Et je n'ai besoin que de l'objet dans la fenêtre principale.

Ensuite, faites ce qui suit

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

s'il n'y a pas d'objet, vous obtiendrez "-1", c'est-à-dire vrai.

 
Retravaillé avec l'option ==0.

Problème : Les lignes jaunes et grises ("Stop Sell" et "not allowed") sont constamment créées et clignotent lorsque le bouton est pressé sur le graphique. Et ObjectCreate() renvoie constamment true au lieu de false, c'est-à-dire qu'il crée comme dans une autre fenêtre, ce qui pourrait expliquer le scintillement... Mais la fenêtre n'est que la fenêtre principale et il n'y a pas d'anomalies avec la ligne verte ("Buy Stop") ainsi qu'avec la ligne rouge ("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 #:

Ensuite, faites ce qui suit

s'il n'y a pas d'objet, vous obtenez "-1", c'est-à-dire vrai

J'ai essayé, je dois juste changer les noms des objets (inverser) pour que l'exception fonctionne. Mais de cette façon, aucune ligne n'est créée du tout.

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

J'ai essayé, seulement vous devez changer le nom des objets. Mais cela ne crée aucune ligne du tout.

Cela fonctionne pour moi et pour vous aussi, seulement le prix est "0".
 
MakarFX #:
Je l'ai créé et vous aussi, seulement le prix est "0".
Oui en effet 8 pièces, mais ce n'est pas visible sur le graphique, le fait que le prix soit à 0 n'a pas d'importance, la ligne s'accroche toujours au curseur (le suit)
Raison: