初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 217

 
alex_xss:

うーん、そうかもしれませんね。

まだ持っていないのはあなたが初めてです))

しかし、それは問題ではない、誰にでもポップアップすることができます - ので、あなたは、残念ながら、それを修正する必要があります。

MT4のバージョンにもよりますが(私はAlpariのものを持っています)、たくさん持っています。

私は異なるバージョンのものをたくさん持っていて、それらのためにプログラミングをしています :-) しかし、ソフトウェアはまだ同じで、それらは小さなブランドとインジケータ/アドバイザの小さなチップだけが異なっています。

PS/カラートリックは、モニターのDPI設定の誤り、「色温度補正ユーティリティ」の存在、「ビデオカードゲーム拡張機能」などが原因で発生する場合があります。などなど。

PPS/ところで、どのDCも独自の指標/アドバイザー/スクリプト/ツールパッケージを克服していない(欲深さ、お金のためと思われる)。せいぜいコーポレートカラーの安っぽいダッシュボードくらいです。を示唆するようなものです。

 

こんにちは!
OBJPROP_XSIZEが 0になる理由を教えてください。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   ObjectsDeleteAll();
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   string mnth=(string)TimeMonth(TimeCurrent())+".";
   string dy=(string)TimeDay(TimeCurrent())+" ";
   string hr=(string)TimeHour(TimeCurrent())+":00 ";

   string TimeSig1=TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES);
   string Label1=" TEST "+Symbol()+"   "+TimeSig1+" Test:  "+mnth+dy+hr+" 1 2 3 4 5 6 7 8 9 10 11";
//string Label1="123456789"+"1"+"123456789"+"2"+"123456789"+"3"+"123456789"+"4"+"123456789"+" 5 "+"123456789";
   obj_create("Sym",Label1,50,clrWhite,15);

  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void obj_create(string name,string object,int Y_distance,color Color,int size)
  {
   if(ObjectFind(name)==-1)
     {
      ObjectCreate(0,name,OBJ_LABEL,0,0,0);
      ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
      ObjectSetInteger(0,name,OBJPROP_FONTSIZE,size);
      ObjectSetString(0,name,OBJPROP_FONT,"Rockwell");
      ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
      ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT);
      ObjectSetInteger(0,name,OBJPROP_XDISTANCE,10);
      ObjectSetInteger(0,name,OBJPROP_YDISTANCE,Y_distance);
      ObjectSetInteger(0,name,OBJPROP_COLOR,Color);
     }
   ObjectSetString(0,name,OBJPROP_TEXT,object);

//text size
   int text_sizeX=int(ObjectGetInteger(0,name,OBJPROP_XSIZE));
   
Print(" _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj_create  text_sizeX: ",text_sizeX);   
  }
//+------------------------------------------------------------------+
 
Nauris Zukas:

こんにちは!
OBJPROP_XSIZEが 0になる理由を教えてください。

OBJ_LABELは 非常に特殊なオブジェクトで、配置後、最初のチャート更新前では、幅(X_SIZE)は定義されていません。

フォント、画面のdpiに依存します。レンダリングが完全に機能するまでは、実幅については何とも言えません。

 
Maxim Kuznetsov:

OBJ_LABELは 非常に特殊なオブジェクトで、配置後、最初のチャート更新前では、幅(X_SIZE)が不定になります。

フォントや画面のdpiなど、一般的な条件によって異なります。レンダリングが完全に機能するまでは、実幅については何とも言えません。

再描画してみてから確認する

   ObjectSetString(0,name,OBJPROP_TEXT,object);
   ChartRedraw();
//text size
   int text_sizeX=int(ObjectGetInteger(0,name,OBJPROP_XSIZE));
 
Vitaly Muzichenko:

再描画をしてみて、その後で確認する

ありがとうございます!挑戦してみます。

うまくいかなかった。
 
Maxim Kuznetsov:

OBJ_LABELは 非常に特殊なオブジェクトで、配置後、最初のチャート更新前では、幅(X_SIZE)が不定になります。

フォントや画面のdpiなど、一般的な条件によって異なります。レンダリング機能が完全に動作するまでは、実幅については何とも言えません。


ありがとうございます!発想は明快です!何か実験してみます。

 
Nauris Zukas:


ありがとうございます、イメージがわきました、実験してみます。

ChartRedrawは直接再描画 するのではなく、ターミナルの深さのどこかに「チャートはできるだけ早く再描画されるべき」という目印を置くだけです。

テキストマークの幅を知るには、TextSetFontやTextGetSizeを試すとよいでしょう。あるいは、そうでないかもしれません :-) 私は試していません。

または、次のtick/chart_eventで既に実際のOBJ_LABELの 幅を取得する、つまり、再描画の後に正確に取得する。

 
Maxim Kuznetsov:

ChartRedrawは直接再描画 するのではなく、ターミナルの深さのどこかに「チャートはできるだけ早く再描画されるべき」という目印を置くだけです。

テキストマークの幅を知るには、TextSetFontとTextGetSizeを試してみてください - 大きな違いはHiDPIでのみ現れます。あるいは、そうでないかもしれません :-) 私は試していません。

あるいは、次のtick/chart_eventで既に実際のOBJ_LABELの 幅を取得する、つまり、再描画の後、正確に

すでに動作するようになりました、ありがとうございますOnDeinit()を追加し、そこにディレイを置き、さらにOBJPROP_XSIZEを追加しました。
P.S.スクリプトの遅延について、他にいい方法が思いつかなかった。

for(int i=100000000; i>0; i--) {} 
 
Nauris Zukas:

ありがとうございます!すべてうまくいきました。OnDeinit()を追加し、そこにdelayを置き、OBJPROP_XSIZEを追加しました。
P.S.スクリプトの遅延について、他にいい方法が思いつかなかった。

// задержка 500 милисекунд, годная для тестера

ulong timestamp=GetTickCount64();

do {

   Sleep(500/4);  // в тестере не сработает, зато спасёт GetTickCount

} while(GetTickCount64()-timestamp<500);

 
Maxim Kuznetsov:

// задержка 500 милисекунд, годная для тестера

ulong timestamp=GetTickCount64();

do {

   Sleep(500/4);  // в тестере не сработает, зато спасёт GetTickCount

} while(GetTickCount64()-timestamp<500);

ありがとうございます!うまくいきました。

   do{}
   while(GetTickCount()-Time11<1000);