고정 폭 글꼴로 차트 출력을 표시하는 방법은 무엇입니까? - 페이지 3

 
Victor Ziborov :

매개변수를 테스트하고 최적화하는 단계에서는 Comment 출력과 Label 출력을 비활성화할 수 있지만, 실생활에서 Expert Advisor를 사용할 때는 Comment 출력과 Label 출력을 다시 활성화해야 합니다.


감사합니다 캡 )))))) 우리는 몰랐습니다

 
Victor Ziborov :

매개변수를 테스트하고 최적화하는 단계에서는 Comment 출력과 Label 출력을 비활성화할 수 있지만, 실생활에서 Expert Advisor를 사용할 때는 Comment 출력과 Label 출력을 다시 활성화해야 합니다.

글쎄, 이것은 일반적으로 자동으로 수행됩니다.

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

코드를 따라 더 나아가 Comment를 표시하거나 그래픽 구성 을 수행해야 하는 경우 bIsComment를 확인합니다. 따라서 수동으로 전환할 필요가 없습니다.

 
Ihor Herasko :

글쎄, 이것은 일반적으로 자동으로 수행됩니다.

코드를 따라 더 나아가 Comment를 표시하거나 그래픽 구성 을 수행해야 하는 경우 bIsComment를 확인합니다. 따라서 수동으로 전환할 필요가 없습니다.


그리고 어디에서 수동으로 해야 한다고 했습니까? 내가 뭐 놓친 거 없니?

 
Yury Kirillov :

그리고 어디에서 수동으로 해야 한다고 했습니까? 내가 뭐 놓친 거 없니?


게시물에 답글을 남겼습니다. 원칙적으로 모호합니다. 그러나 어떻게 보면 "disable"에 더 가깝고 "enable"은 프로그램이 실행되는 방식에 따라 사용자가 변경하는 설정 매개변수입니다. 그러한 매개변수가 필요하지 않다는 것을 명확히 했습니다.

 
Artem Virskiy :

각 문자의 너비를 픽셀 단위로 측정할 수 있습니다(폭이 동일한 여러 그룹이 있음). 지정된 너비에 도달할 때까지 모든 문자열을 공백으로 채우는 함수를 작성하십시오. 그런 다음 이 하위 문자열에서 주석을 수집합니다.

그러한 기능을 만들어 코드베이스에 넣으면 많은 사람들이 감사할 것입니다. 나도. 그리고 귀찮게 하기에는 너무 게으르다.

이 경우 문자 \x200A가 유용할 것입니다. 정확한 맞춤을 위해 최소 너비의 공백입니다. 그리고 일반적인 공백을 기호 /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/sec 만화는 안하고 꺼내서 ok

만화가있는 캔버스도 대처할 것입니다.


파일:
 
Nikolai Semko :


다음은 MQL5의 스크립트입니다(MT4에서는 시도하지 않았습니다).


MT4에 도전했습니다. 코드도 작동합니다.
MT4에서 Comment 는 그래픽보다 약 5배 빠른 것으로 나타났습니다. 또한 MT5 Comment()는 MT4보다 5~6배 느리게 작동합니다. 그러나 이것은 이미 불쾌한 놀라움과 이상함입니다. 그런 다음 개발자에게 질문합니다. 어때요? 결국 이것은 5명의 명백한 버그입니다!

 
Nikolai Semko :

논리적이지만 그렇지 않습니다.
그리고 확인하기도 쉽습니다.
다음은 MQL5의 스크립트입니다(MT4에서는 시도하지 않았습니다).

테스트 결과 그래픽 출력이 약 10% 더 빨라졌습니다. 동시에 그래픽 출력 방식은 주석과 달리 글꼴을 매끄럽게 합니다. 그러나 가장 흥미로운 점은 글꼴 크기 를 12가 아닌 30으로 설정하더라도 속도가 여전히 더 높다는 것입니다. 개인적으로 이것은 미스터리입니다.


이러한 측정은 아무것도 아닙니다. 댓글과 캔버스에 대해 별도로 몇 만 번의 패스 주기를 별도로 수행해야 판단할 수 있습니다. 예를 들어 출력 텍스트가 변경되도록 카운터 값이 표시되도록 합니다.

이런 식으로 리메이크 할 수 있습니까?

 
Alexey Volchanskiy :

이러한 측정은 아무것도 아닙니다. 댓글과 캔버스에 대해 별도로 몇 만 번의 패스 주기를 별도로 수행해야 판단할 수 있습니다. 예를 들어 출력 텍스트가 변경되도록 카운터 값이 표시되도록 합니다.

이런 식으로 리메이크 할 수 있습니까?


싸이클도 따로 했는데 결과가 뭔가 이상하다는 생각도 들었다. 모두 같은. 같은 결과입니다. 일반적인 주기나 따로따로 차이가 없습니다. 내 예에서는 텍스트가 매번 바뀌는데 왜 이것을 눈치채지 못했는지 이상합니다. 컴파일러 최적화에 대해서도 알고 있습니다. ))