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

 

こんにちは。

コードのコンパイルは、コード自体に設定できるのか、教えてください。ありがとうございます。

 

ホイールをクリックしたときに、マウスのパラメータと4桁の値札をコメントに表示しています。

ホイールを押している間はカーソルの後ろにマーカーが走るのですが、LCでマウスを押す前にホイールを離すと同じことが起こせません。

これを理解するのを助けてください。


//+------------------------------------------------------------------+ 
//| Expert initialization function                                   | 
//+------------------------------------------------------------------+ 
void OnInit() 
  { 
//--- включение сообщений о перемещении мыши по окну чарта 
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1); 
//--- принудительное обновление свойств графика гарантирует готовность к обработке событий 
   ChartRedraw(); 
  } 
//+------------------------------------------------------------------+ 
//| MouseState                                                       | 
//+------------------------------------------------------------------+ 

string xlabel="Bid";
input color xcolor = clrCrimson;

string MouseState(uint state) 
  { 
   string res; 
   res+="\nML: "   +(((state& 1)== 1)?"DN":"UP");   // mouse left 
   res+="\nMR: "   +(((state& 2)== 2)?"DN":"UP");   // mouse right  
   res+="\nMM: "   +(((state&16)==16)?"DN":"UP");   // mouse middle 
   res+="\nMX: "   +(((state&32)==32)?"DN":"UP");   // mouse first X key 
   res+="\nMY: "   +(((state&64)==64)?"DN":"UP");   // mouse second X key 
   res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP");   // shift key 
   res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP");   // control key 
   res+="\nBID" + DoubleToString(SymbolInfoDouble(Symbol(), SYMBOL_BID), _Digits-1);
   return(res); 
  }
   
//+------------------------------------------------------------------+ 
//| ChartEvent function                                              | 
//+------------------------------------------------------------------+ 
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) 
  { 
  
int x=(int)lparam; 
int y=(int)dparam; 
datetime dt    =0; 
double   price =0;
int      window=0;

   if(id==CHARTEVENT_MOUSE_MOVE) 
      Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam)); 

   if(sparam =="16")
      {
         
      if(!ObjectCreate(0, xlabel, OBJ_LABEL,0, 0, 0));
      //ObjectCreate(0, xlabel, OBJ_LABEL,0, 0, 0);
      ObjectSetInteger(0, xlabel, OBJPROP_XDISTANCE, 100);
           ObjectSetInteger(0, xlabel, OBJPROP_YDISTANCE, dparam+7);
      ChartXYToTimePrice(0,x,y,window,dt,price);
      ObjectSetString(0, xlabel, OBJPROP_TEXT, DoubleToString(price, _Digits-1));
      }
      
      
  /*  while(sparam !="1")
      {
         ObjectMove(0,xlabel,0,lparam,dparam+7);      
      }
  */
  }
  
void OnDeinit(const int reason) 
   { 
      Comment("");
      ObjectDelete(0,xlabel);
   } 
 
psyman:

ホイールをクリックしたときに、マウスのパラメータと4桁の値札をコメントに表示しています。

ホイールを押している間はカーソルの後ろにマーカーが走るのですが、LKでマウスを押す前にホイールを 離すと同じことが起こせません。

削る
// if(sparam =="16")

 
Taras Slobodyanik:

削る
// if(sparam =="16")


そうすると、マーカーは常に画面に表示されますが、ホイールを押したときだけ表示させたいのです。



追記

あなたの回答は私に正しい考えを与えてくれました、ありがとうございます:-)

 
psyman:

ホイールをクリックしたときに、マウスのパラメータと4桁の値札をコメントに表示しています。

ホイールを押している間はカーソルの後ろにマーカーが走るのですが、LKでマウスを押す前にホイールを離すと同じことが起こせません。

これを理解するのを助けてください。


if(label)
{
   //применение изменяющихся параметров(перемещение и прочее)
}
if(sparam =="16")
{
   label = true;
   //создание метки и настройка неизменяющихся параметров метки
}
if(sparam =="1") // или какой там символ у ЛК мыши
{
   label = false;
   //удаление/скрытие метки, если нужно
}

ラベルがbool型

 
Ilya Prozumentov:

ラベルがbool型

ラベルを作成する前に移動することは可能ですか?


画面の右側にラベルを置きたいのですが、これはOnCalculateで計算されます。

int width = (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);

ObjectSetInteger(0, objname, OBJPROP_XDISTANCE, width); 

Print(width);

別のマーカーに対してOnChartEventで同じ計算をすると正しい結果が得られるのに、なぜか左端の位置にあることが判明しました。

なぜ、カウントダウン反転が起こるのですか?

 
psyman:

マーカーを作成する前に移動することは可能ですか?


マーカーを画面の右側に移動させたいのですが、これはOnCalculateで計算されます。

しかし、OnChartEventで別のマーカーに対して同じ計算をすると、正しい結果が得られます。

カウントダウンの反転はなぜ起こるのですか?

ラベルは初期状態で false に設定されているため、マーカーが移動するコード断片は実行されません。しかし、ラベルが作成される前に実行されても何も起こらず、プログラムは実行され続け、後から作成されるラベルには影響がありません。

アンカーポイントに注目!アンカーポイントが違えば、結果も違う。早速、widthの代わりに0を書き込んでみて、その通りに動作すれば、アンカーポイントの問題だったということになります。

OBJ_LABEL - Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL4
OBJ_LABEL - Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL4
  • docs.mql4.com
Следующий скрипт создает и перемещает на графике объект "Текстовая метка". Для создания и изменения свойств графического объекта написаны специальные функции, которые вы можете использовать "как есть" в своих собственных программах. //| Создает текстовую метку                                          |...
 
Ilya Prozumentov:

は初期値として false が設定されているので、ラベルを移動させるコードは実行されません。しかし、ラベルが作成される前に実行されても、何も起こらず、プログラムは実行され続け、その後に作成されるラベルには影響がありません。

アンカーポイントに注目!アンカーポイントが違えば、結果も違う。早速、widthの代わりに0を書き込んでみて、予想通りの挙動になれば、アンカーポイントに問題があったということです。

アンカーポイントを持たず、垂直方向にしか動かず、水平線は画面の幅を通して一度だけ設定します。向こうから数えてくる分には問題ないのですが、同じ動作でも機能によって違うというのは意外です。


もう一つ質問ですが、Bidをラベルテキストとして表示する場合、OnChartEventとOnCalculateの どちらの関数を使えば最適に行えるのでしょうか?

 
novichok2018:

こんにちは。

コードのコンパイルは、コード自体に設定できるのか、教えてください。ありがとうございます。

誰も答えてくれないので愚問かもしれませんが、コンパイル後にEAが止まったり再開したりするのは他にどう対処すればいいのでしょうか?

プラットフォームでは、「配列が範囲外です(284,17)」というメッセージが表示されます。

行284: NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh);位置17はNomNewsで角括弧を開き、0によってグローバルに開始さ れます。

0を1に変えても結果は出ませんでした。
if(NomNews==300)break; 300の行を360000に 変更しましたが、効果はありませんでした。

コンパイルしてみると、数分間は正常に動作する。そして、どうすればいいのか?

 
novichok2018:

誰も答えてくれないので愚問かもしれませんが、コンパイル後にEAが止まったり再開したりするのは他にどう対処すればいいのでしょうか?

プラットフォームでは、「配列が範囲外です(284,17)」というメッセージが表示されます。

行284: NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh);位置17はNomNewsで角括弧を開き、0によってグローバルに開始さ れる。

0を1に変えても結果は出ませんでした。
if(NomNews==300)break; 300の行を360000に 変更しましたが、効果はありませんでした。

コンパイルしてみると、数分間は正常に動作する。そして、どうすればいいのか?

NewsArr配列の 2次元目の次元 数は?