新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1792

 
Alexey Viktorov #:

不,马卡,它看起来是这样的。

ObjectFind()函数返回主窗口的编号。而这个数字是0。另一方面,0 == false,因此,如果该函数返回0,它仍然返回false。当然,我不会使用这个方法,因为如果该函数返回-1,即一个错误,我们可能会认为该对象的位置不在主窗口。除此之外,你永远不知道会有什么修复措施......

所以不要争论,不要研究如何做......

ObjectFind()函数并不返回主窗口的编号。它将返回找到该对象的窗口数(0、1、2...),如果该对象不存在,则返回-1。

我想知道"-1 "是假的还是真的。

bool类型 用于 存储布尔值 truefalse ,其数字表示分别为1或0
 
MakarFX #:

ObjectFind()函数并不返回主窗口的编号。它是发现对象的窗口数(0,1,2...),如果没有对象则为-1。

我说的是对象位于主窗口的特定情况。不要争论,不要学习如何做...

 

MakarFX #:

我想知道"-1 "是假的还是真的?

bool类型 旨在存储布尔值 truefalse ,其数字表示分别为1或0

假的只有0,其他都是真的

 
Alexey Viktorov #:

假的只有0,其他都是真的

"-1 " 也是真的? 已经检查过了。真的只有 "0 "是假的
 
Alexey Viktorov #:

不,马卡,它看起来是这样的。

ObjectFind()函数返回主窗口的编号。而这个数字是0。另一方面,0 == false,因此,如果该函数返回0,它仍然返回false。当然,我不会使用这个方法,因为如果该函数返回-1,即一个错误,我们可能会认为该对象的位置不在主窗口。除此之外,你永远不知道会有什么修复措施......

所以不要争论,不要学习如何做......

我知道你不应该这样做,但为了美观,我不得不这样做(==0在每个条件下看起来都很难看)。而且我只需要主窗口中的对象。

 
Nerd Trader #:

我知道我不应该这样做,但为了美观,我不得不这样做(==0在每个条件下都看起来很丑)。而且我只需要主窗口中的对象。

然后做以下工作

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

如果没有对象,你会得到"-1",也就是真。

 
用选项==0进行了重做。

问题:黄线和灰线("Stop Sell "和 "not allowed")在图表上按下按钮 时不断产生并闪烁。而且ObjectCreate()经常返回true而不是false,也就是说,它创建时就像在另一个窗口中一样,这可以解释闪烁的原因......但该窗口只是主窗口,绿线("买入止损")和红线("止损")都没有出现异常。

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 #:

然后做以下工作

如果没有对象,你会得到"-1",即真。

我已经试过了,我只需要改变对象的名称(反转),就可以使例外情况生效。但这种方式根本不会产生任何线条。

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

我已经试过了,只是你必须改变对象的名称。但这根本不会产生任何线条。

它对我有用,对你也有用,只是价格是 "0"。
 
MakarFX #:
我已经创建了它,你也是,只是价格是 "0"。
是的,确实是8块,但在图表上看不到,价格为0的事实并不重要,线条仍然紧贴光标(跟随它)。
原因: