MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1792

 
Alexey Viktorov #:

No Makar、こんな感じです。

ObjectFind()関数は、メインウィンドウの番号を返します。そして、この数値は0です。一方、0==falseなので、関数が0を返してもfalseを返すということになります。もちろん、この関数が-1、つまりエラーを返した場合、オブジェクトの位置がメインウィンドウにないと考えることができるので、私はこれを使いません。そのうえ、どんな修正が入るかわからない...。

だから、議論しないで、やり方を勉強しないで...。

ObjectFind()関数は、メインウィンドウの番号を返しません。オブジェクトが見つかったウィンドウの数(0、1、2...)、またはオブジェクトが存在しない場合は-1を返します。

1 "は嘘なのか本当なのか。

bool型は 真偽 値を格納するために使用さ れ、 それぞれ 1 と 0 の数値表現と なる。
 
MakarFX #:

ObjectFind()関数は、メインウィンドウの番号を返しません。オブジェクトが見つかったウィンドウの数(0,1,2...)、またはオブジェクトがない場合は-1です。

オブジェクトがメインウィンドウにある場合の具体的な話をしました。議論しないで、勉強しないで...。

 

MakarFX #:

1」は嘘なのか本当なのか、気になりますね。

bool型は 真偽 値を格納 するためのものであり、 その数値表現はそれぞれ 1 と 0 である。

falseは0のみ、それ以外はすべてtrue

 
Alexey Viktorov #:

falseは0のみ、それ以外はすべてtrue

"-1 " もそうなんですか? すでに確認済み。本当に "0 "だけが偽
 
Alexey Viktorov #:

No Makar、こんな感じです。

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()は常にfalseではなくtrueを返すので、あたかも別のウィンドウで作成したようになり、それがちらつきを説明できるかもしれません...。しかし、ウィンドウはメインのみで、緑の線(「Buy Stop」)にも、赤い線(「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 #:

そして、次のようにします。

オブジェクトがない場合は"-1",すなわち "true "を返します。

試してみたところ、オブジェクト名を変える(反転させる)だけで例外が成立するようです。しかし、この方法では線がまったくできません。

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であることは重要ではなく、ラインはまだカーソルにしがみついています(それに従う)。