エキスパートアドバイザー - 雑多な質問 - ページ 25

 

ドラッグ終了後、以下のコードでOBJPROP_SELECTEDを" false "にしてみましたが、効果がありません。

どうすれば解決できますか?

if(id==CHARTEVENT_OBJECT_DRAG)
  {
   SL_TPdrags();

   Sleep(1000);
   drag_onoff=false; // OBJPROP_SELECTED
  }

よろしくお願いします。

 
CHARTEVENT_OBJECT_DRAGを 使用したことがないのが残念です。
 
Marco vd Heijden:
CHARTEVENT_OBJECT_DRAGを 使ったことがないのですが、どうすればいいですか?
OK!とにかくありがとうございます!
 

結局、「OBJ_RECTANGLE」と「OBJ_TEXT」が見つかりましたが、「OBJ_LABEL」と「OBJ_RECTANGLE_LABEL」の代わりに、どちらもビッドラインの移動に使えるのではないかと考えています。

Q: では、ビッドラインを一緒に移動するのに非常に便利なオブジェクトは何ですか?

有益なコメントをお待ちしています。
良い週末をお過ごしください。

 

ID

説明

OBJ_VLINE

縦線

OBJ_HLINE

水平線

OBJ_TREND

トレンド線

OBJ_TRANDBYANGLE

角度によるトレンドライン

OBJ_CYCLES

サイクル線

OBJ_ARROWED_LINE

矢印線

OBJ_CHANNEL

等距離チャンネル

obj_stddevchannel

標準偏差チャンネル

OBJ_REGRESSION

線形回帰チャンネル

OBJ_PITCHFORK

アンドリュースピッチフォーク

OBJ_GANNLINE

ギャンライン

OBJ_GANNFAN

ギャンファン

OBJ_GANNGRID

ギャングリッド

OBJ_FIBO

フィボナッチ・リトレースメント

OBJ_FIBOTIMES

フィボナッチタイムゾーン

OBJ_FIBOFAN

フィボナッチファン

OBJ_FIBOARC

フィボナッチ・アーク

OBJ_FIBOCANNEL

フィボナッチチャンネル

OBJ_EXPANSION

フィボナッチ拡張

OBJ_ELLIOTWAVE5

エリオットモチーフ波

OBJ_ELLIOTWAVE3

エリオット修正波(Elliott Correction Wave)

OBJ_RECTANGLE

矩形波

OBJ_TRIANGLE

三角形

OBJ_ELLIPSE

楕円

OBJ_ARROW_THUMB_UP

サムズアップ

矢印とサムネイルの組み合わせ

サムズダウン

OBJ_ARROW_UP(矢印

矢印の上

OBJ_ARROW_DOWN(矢印ダウン

矢印の下

OBJ_ARROW_STOP

ストップサイン

OBJ_ARROW_CHECK(チェック

チェックサイン

OBJ_ARROW_LEFT_PRICE(レフトプライスラベル

左プライスラベル

矢印ラベル

右の価格表示

OBJ_ARROW_BUY

買いサイン

OBJ_ARROW_SELL (売り)

売りサイン

OBJ_ARROW

矢印

OBJ_TEXT

テキスト

OBJ_LABEL

ラベル

OBJ_BUTTON

ボタン

OBJ_CHART

チャート

OBJ_BITMAP

ビットマップ

OBJ_BITMAP_LABEL

ビットマップラベル

OBJ_EDIT

編集

OBJ_EVENT

経済カレンダーのイベントに対応する "Event "オブジェクト

OBJ_RECTANGLE_LABEL

カスタムグラフィカルインターフェースを作成・設計するための "Rectangle label "オブジェクト。


一緒に動くとはどういう意味ですか?

 
Max Enrik:

ドラッグ終了後、以下のコードでOBJPROP_SELECTEDを" false "にしてみましたが、効果がありません。

どうすれば解決できますか?

if(id==CHARTEVENT_OBJECT_DRAG)
  {
   SL_TPdrags();

   Sleep(1000);
   drag_onoff=false; // OBJPROP_SELECTED
  }

事前にありがとうございます。

あなたがさらに上のスパラムをテストしていない限り、そのコードは、オブジェクトがドラッグされたときにトリガーされます。 いずれにしても オブジェクトがドラッグされたときにトリガーされます。

私のオリジナルのコードです。

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
  {
   if(id==CHARTEVENT_OBJECT_DRAG && sparam=="line") // the chart event of dragging the line
 
Marco vd Heijden

私はすでにあなたの偉大な例の一つCrossHair.mq4を知っている/読みました。
しかし、私はLabel, RectLabel ObjectsにBid priceを与えるのに苦労しています。私はLabel, RectLabel ObjectsをBid Lineと一緒に動かそうとしているのです。

私はちょうどイメージのようなものが必要です、添付ファイルをご覧ください。

よろしくお願いします。

ファイル:
 

固定サイズのオブジェクトの場合。OBJ_BUTTON,OBJ_RECTANGLE_LABEL と OBJ_EDIT, プロパティ OBJPROP_XDISTANCE と OBJPROP_YDISTANCE はチャートコーナー (OBJPROP_CORNER) に対してオブジェクトの左上点の位置を設定し、そこからXとY座標がピクセルでカウントされることになります。

//+------------------------------------------------------------------+
//|                                                    rectangle.mq4 |
//|      Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
//--- create rectangle
   RectangleCreate(0,"Rectangle",0,0,0);  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   RectanglePointChange(0,"Rectangle",0,TimeCurrent(),Ask);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Create rectangle by the given coordinates                        |
//+------------------------------------------------------------------+
bool RectangleCreate(const long            chart_ID=0,        // chart's ID
                     const string          name="Rectangle",  // rectangle name
                     const int             sub_window=0,      // subwindow index
                     datetime              time1=0,           // first point time
                     double                price1=0,          // first point price
                     datetime              time2=0,           // second point time
                     double                price2=0,          // second point price
                     const color           clr=clrRed,        // rectangle color
                     const ENUM_LINE_STYLE style=STYLE_SOLID, // style of rectangle lines
                     const int             width=1,           // width of rectangle lines
                     const bool            fill=false,        // filling rectangle with color
                     const bool            back=false,        // in the background
                     const bool            selection=true,    // highlight to move
                     const bool            hidden=true,       // hidden in the object list
                     const long            z_order=0)         // priority for mouse click
  {
//--- set anchor points' coordinates if they are not set
   ChangeRectangleEmptyPoints(time1,price1,time2,price2);
//--- reset the error value
   ResetLastError();
//--- create a rectangle by the given coordinates
   if(!ObjectCreate(chart_ID,name,OBJ_RECTANGLE,sub_window,time1,price1,time2,price2))
     {
      Print(__FUNCTION__,
            ": failed to create a rectangle! Error code = ",GetLastError());
      return(false);
     }
//--- set rectangle color
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- set the style of rectangle lines
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- set width of the rectangle lines
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- display in the foreground (false) or background (true)
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- enable (true) or disable (false) the mode of highlighting the rectangle for moving
//--- when creating a graphical object using ObjectCreate function, the object cannot be
//--- highlighted and moved by default. Inside this method, selection parameter
//--- is true by default making it possible to highlight and move the object
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- hide (true) or display (false) graphical object name in the object list
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- set the priority for receiving the event of a mouse click in the chart
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- successful execution
   return(true);
  }
//+------------------------------------------------------------------+
//| Move the rectangle anchor point                                  |
//+------------------------------------------------------------------+
bool RectanglePointChange(const long   chart_ID=0,       // chart's ID
                          const string name="Rectangle", // rectangle name
                          const int    point_index=0,    // anchor point index
                          datetime     time=0,           // anchor point time coordinate
                          double       price=0)          // anchor point price coordinate
  {
//--- if point position is not set, move it to the current bar having Bid price
   if(!time)
      time=TimeCurrent();
   if(!price)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- reset the error value
   ResetLastError();
//--- move the anchor point
   if(!ObjectMove(chart_ID,name,point_index,time,price))
     {
      Print(__FUNCTION__,
            ": failed to move the anchor point! Error code = ",GetLastError());
      return(false);
     }
//--- successful execution
   return(true);
  }
//+------------------------------------------------------------------+
//| Check the values of rectangle's anchor points and set default    |
//| values for empty ones                                            |
//+------------------------------------------------------------------+
void ChangeRectangleEmptyPoints(datetime &time1,double &price1,
                                datetime &time2,double &price2)
  {
//--- if the first point's time is not set, it will be on the current bar
   if(!time1)
      time1=TimeCurrent();
//--- if the first point's price is not set, it will have Bid value
   if(!price1)
      price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- if the second point's time is not set, it is located 9 bars left from the second one
   if(!time2)
     {
      //--- array for receiving the open time of the last 10 bars
      datetime temp[10];
      CopyTime(Symbol(),Period(),time1,10,temp);
      //--- set the second point 9 bars left from the first one
      time2=temp[0];
     }
//--- if the second point's price is not set, move it 300 points lower than the first one
   if(!price2)
      price2=price1-300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
  }
//+------------------------------------------------------------------+
 
honest_knave:

あなたがさらに上のスパラムをテストしていない限り、そのコードは、ときにトリガーされます どれでも オブジェクトがドラッグされたときにトリガーされます。
私のオリジナルのコードです。

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
  {
   if(id==CHARTEVENT_OBJECT_DRAG && sparam=="line") // the chart event of dragging the line
私はすでに以下のコードのようにしようとしました。
if(id==CHARTEVENT_OBJECT_DRAG && sparam=="#"+IntegerToString(OrderTicket())+"-TP")
  {
// here was my functions
  }

それは私への応答ではありません。

---

しかし、私は以下のようなコードを使用して、私のためにあなたのコードを少し変更した - そしてそれは私が望むものの私のために完全に動作します。今のところ、私は何の問題にも直面していない。
私は間違っているのでしょうか?

if(id==CHARTEVENT_OBJECT_DRAG){}

すべてのベスト。

 

もしかしたら、これが参考になるかもしれません。

これをチャートに追加して見てください。

  • 線が移動するたびにアラートが表示される(新しい価格も表示)。
  • 線が移動してから アラートが出るまでの間に遅れはない。
  • 他のものが動いてもアラートは出ない。
  • 線が実際に移動している間、アラートは出ない。

#property strict
#property indicator_chart_window

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   ObjectCreate(0,"MyLine",OBJ_HLINE,0,0,Bid);
   ObjectSetInteger(0,"MyLine",OBJPROP_SELECTED,true);
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(0,"MyLine");  
  }

//+------------------------------------------------------------------+
//| OnChartEvent()                                                   |

//+------------------------------------------------------------------+
void
OnChartEvent(const int id,
                  const long& lparam,
                  const double& dparam,
                  const string& sparam)
  {
   if(id==CHARTEVENT_OBJECT_DRAG && sparam=="MyLine")
     {
      double price=ObjectGetDouble(0,"MyLine",OBJPROP_PRICE,0);
      Alert("MyLine moved! New price is " + DoubleToStr(price,_Digits));
     }
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

   return(rates_total);
  }