チャート上に等幅フォントで出力するにはどうしたらいいですか? - ページ 3

 
Victor Ziborov:

パラメータのテストや最適化の段階では、Commentへの出力とLabelへの出力を無効にすることができますが、EAを実際に使用するときには、Commentへの出力とLabelへの出力を再び有効にする必要があります。


thanks, cap ))))) 知らなかった。

 
Victor Ziborov:

パラメータのテストや最適化の段階では、Commentの出力とLabelの出力をオフにしても良いが、実際にEAを使う時には、Commentの出力とLabelの出力をオンに戻す必要がある。

一般に、これは自動的に行われます。

bool bIsComment = (!IsTesting() || IsVisualMode());

そして、Commentを出力するか、チャート 作成を行うか、コード内のbIsCommentをチェックします。その結果、手動で何かを切り替える必要がありません。

 
Ihor Herasko:

これは自動的に行われます。

そして、Commentを出力したり、グラフィカルな構造を 作成する必要がある場合には、コードのbIsCommentをチェックする。その結果、手動で何かを切り替える必要がありません。


手動でやるというのは、どこに書いてあったのですか?何か見落としがあったのでしょうか?

 
Yury Kirillov:

どこに手動でやらなきゃいけないって書いてあった?何か見落としがあったのでしょうか?


この 投稿に反応するそこは基本的にあいまいなんです。しかし、何となく、「無効」「有効」は、プログラムの実行方法によってユーザーが変更する設定パラメータのような気がします。ただ、そのようなパラメータは必要ないことを明確にした。

 
Artem Virskiy:

各文字の幅をピスケルで測定することができます(同じ幅のグループがいくつかあります)。任意の文字列を与えられた幅になるまで空白で追加する関数を作成しなさい。そして、これらの部分文字列からコメントを組み立てる。

もし、このような機能を作ったら、kodobaseに投稿してください。そして私も。面倒くさがりなので。

この場合、スペース幅の最小値を示す記号(˶‾᷄ -̫ ̫ ᷅˵)が有効です。そして、通常のスペースを記号 /1 - ワイドスペースに置き換えてください(結局のところ、コメントの長さは制限されています)。もしかしたら、他にも便利なスペースがあるかもしれませんが、私は知らないんです。


アイデアありがとうございました

 
Yury Kirillov:
グラフィカルフォントと比較すると、コメントは圧倒的に高速です。

論理的にはそうなのですが、そうではありません。
しかも、簡単にチェックできる。
以下はMQL5でのスクリプトです(MT4では試していません)。

#property script_show_inputs
#include <Canvas\Canvas.mqh>

input uint   FontSize=12;                                   // размер шрифта
input ENUM_COLOR_FORMAT format=COLOR_FORMAT_ARGB_NORMALIZE; //Способ обработки цвета

void OnStart()
  {
   CCanvas Text;
   ulong ColorScreen=ChartGetInteger(0,CHART_COLOR_BACKGROUND,0);

   Text.FontSet("Arial",FontSize);
   string str="Соотношение времени выполнения Canvas/Comment = 0.00000";
   int H=Text.TextHeight(str);
   int W=Text.TextWidth(str);
   if(!Text.CreateBitmapLabel(0,0,"FONT",2,130,W,H,format)) Print("Error creating canvas: ",GetLastError());

   ulong t1=1,t2=1,t0;
   int i=0;
   color clr=(color)ARGB(255,255^GETRGBR(ColorScreen),255^GETRGBG(ColorScreen),255^GETRGBB(ColorScreen));
   while(!IsStopped())
     {
      t0=GetMicrosecondCount();
      Text.Erase((color)ColorScreen);
      Text.TextOut(0,0,str,clr);
      Text.Update();
      t1+=GetMicrosecondCount()-t0;
      t0=GetMicrosecondCount();
      Comment(str);
      t2+=GetMicrosecondCount()-t0;
      str="Соотношение времени выполнения Canvas/Comment = "+DoubleToString((double)t1/(double)t2,5);
      if(i==1000) {Print("Canvas - ",t1,"   Comment - ",t2); i=0; t1=1; t2=1; } else i++;
     }
   Text.Destroy();
   Comment("");

}

テストでは、グラフィカルな出力が10%程度高速化されています。しかし、面白いのは、フォントサイズを(12ではなく)30にしても、スピードが速くなることです。個人的には謎なんですけどね。

ファイル:
 
Alexey Volchanskiy:

60k/秒のアニメはやらない、出すだけ出してオッケー。

キャンバスはアニメもできるんですよ。


ファイル:
 
Nikolai Semko:


以下はMQL5でのスクリプトです(MT4では試していません)。


MT4で試してみました。
MT4では、Comment()はそのグラフィカルなアナログよりも5倍高速であることが判明しています。そして、MT5ではMT4に比べてComment()が5-6倍遅いことが判明しました。さて、これは不愉快で奇妙な驚きです。そこで、開発者の方に質問です。どうして?明らかに5のバグだろ!!!!

 
Nikolai Semko:

論理的ではありますが、そうではありません。
しかも、これは簡単に確認できる。
以下は、MQL5用のスクリプトです(MT4では試していません)。

テストでは、グラフィカルな出力が10%程度高速化されています。しかし、面白いのは、フォントサイズを(12ではなく)30にしても、スピードが速くなることです。個人的には謎なんですけどね。


この測定は何の意味もありません。CommentとCanvasを別々に何万パスもループさせるべきで、そうすれば何か判断できるはずです。また、カウンターの値を表示させるなど、表示させるテキストを変更する必要があります。

このようにやり直すことはできないのでしょうか?

 
Alexey Volchanskiy:

この測定値は何の意味もない。CommentとCanvasを別々に数万回のサイクルを作るべきで、そうすれば何か判断できるはずです。また、印刷するテキストは、例えばカウンターの値を印刷させるなど、変更する必要があります。

この形でやり直せないでしょうか。


私もループを分けて作ってみたのですが、なんだか変な結果になったなぁと思いました。同じ結果です。一般的なループであろうと、別々であろうと、違いはありません。私のサンプルでは、毎回テキストが変わっているのですが、なぜ気づかれなかったのでしょう。コンパイラの最適化も知っています。))