CGraphic 테스트 - 질문 및 제안 - 페이지 3

 

@로만 코노펠코

두 번째 문제, 아니면 알려주실 수 있나요?

닫기 가격으로 라인을 만들려고 합니다. X에서 각각 시간 배열을 전송합니다. 그런데 문제는 창녀 자체가 만들 때 틈이 생긴다는 점이다. 즉, 시간을 균일하게 하고 데이터가 없는 곳을 추가한다.

즉, 내가 알기로는 CURVE_TIMESERIES라는 별도의 창녀를 만들어야 합니다. 자동으로 단계 를 찾지 않고 X 포인트 사이에 간격을 추가하지 않아야 합니다.

이것은 X를 전달하지 않고 곡선을 생성한 방법과 유사합니다. 그러면 모든 값이 균일하게 되고 모든 것이 순전히 X 배열의 크기에 연결됩니다(m_xmax = m_size-1; m_xmin = 0.0; ).

 
o_O :

@로만 코노펠코

두 번째 문제, 아니면 알려주실 수 있나요?

닫기 가격으로 라인을 만들려고 합니다. X에서 각각 시간 배열을 전송합니다. 그런데 문제는 창녀 자체가 만들 때 틈이 생긴다는 점이다. 즉, 시간을 균일하게 하고 데이터가 없는 곳을 추가합니다.

즉, 내가 알기로는 CURVE_TIMESERIES라는 별도의 창녀를 만들어야 합니다. 자동으로 단계 를 찾지 않고 X 포인트 사이에 간격을 추가하지 않아야 합니다.

이것은 X를 전달하지 않고 곡선을 생성한 방법과 유사합니다. 그러면 모든 값이 균일하게 되고 모든 것이 순전히 X 배열의 크기에 연결됩니다(m_xmax = m_size-1; m_xmin = 0.0; ).

두 축의 단계는 내장 알고리즘에 의해 자동으로 계산됩니다. 내가 이해하는 한 최대, 최소 및 단계를 설정하고 싶습니다. 이를 위해 수동 축 스케일링 모드로 전환할 수 있습니다.

   CAxis *xAxis = graphic.XAxis();   // получаем ось X
   xAxis.AutoScale( false );           // отключаем автомасштабирование
   xAxis.Min( 0 );                     // указываем минимальное значение по X
   xAxis.Max( 10 );                   // указываем максимальное значение по X
   xAxis.DefaultStep( 1 );             // указываем шаг по X

또한 MaxLabels 축을 따라 허용되는 최대 값 수를 고려해야 합니다. 값은 (Max-Min)/DefaultStep보다 커야 합니다. 그렇지 않으면 단계가 변경됩니다.

 
Roman Konopelko :

두 축의 단계는 내장 알고리즘에 의해 자동으로 계산됩니다. 내가 이해하는 한 최대, 최소 및 단계를 설정하고 싶습니다. 이를 위해 수동 축 스케일링 모드로 전환할 수 있습니다.

또한 MaxLabels 축을 따라 허용되는 최대 값 수를 고려해야 합니다. 값은 (Max-Min)/DefaultStep보다 커야 합니다. 그렇지 않으면 단계가 변경됩니다.


네, 무슨 일이 일어났습니다.

하지만 내가 당신에게 설명했듯이, 당신의 체중계는 균일합니다.

무엇을 말하든 X만큼 크기를 조정하고 좌표를 픽셀 단위로 정확하게 계산합니다.

따라서 시계열을 빌드할 때는 이 작업을 수행할 수 없습니다.

무슨 일이 일어나는지보십시오






#include <Graphics/Graphic.mqh>

//+------------------------------------------------------------------+
void OnStart ()
{
         MqlRates rates[];
         CopyRates ( Symbol (), Period (), 0 , 100 , rates);
         ArraySetAsSeries (rates, true );
         int size= ArraySize (rates);
         double arrY[], arrX[];
         ArrayResize (arrX, size); ArrayResize (arrY, size);
         for ( int i= 0 ; i<size; ++i) { arrX[i]=( double )rates[i].time; arrY[i]=rates[i].close; }
        
        CGraphic graphic;
        graphic.Create( 0 , "Rates" , 0 , 30 , 30 , 1600 , 300 );
        CCurve* curve= NULL ;
        
         //curve=graphic.CurveAdd(arrY, CURVE_LINES, "Close");
        
        curve=graphic.CurveAdd(arrX, arrY, CURVE_LINES, "Close" );
        CAxis *xAxis = graphic.XAxis();   // получаем ось X
        xAxis.AutoScale( false );           // отключаем автомасштабирование
        xAxis.Min(arrX[size- 1 ]);                     // указываем минимальное значение по X
        xAxis.Max(arrX[ 0 ]);                 // указываем максимальное значение по X
        xAxis.DefaultStep( 10 *(arrX[ 0 ]-arrX[size- 1 ])/size);             // указываем шаг по X
        xAxis.MaxLabels((arrX[ 0 ]-arrX[size- 1 ])/xAxis.DefaultStep()+ 1 );                           // число значений по оси MaxLabels должно быть больше чем (Max-Min)/DefaultStep
        
        curve.Visible( true );
        graphic.Redraw();
        graphic.Update();
}
 

X에서 시간을 보내지 않으면 이렇게 됩니다.

구성이 그래픽으로 정확합니다.



#include <Graphics/Graphic.mqh>

//+------------------------------------------------------------------+
void OnStart ()
{
         MqlRates rates[];
         CopyRates ( Symbol (), Period (), 0 , 100 , rates);
         ArraySetAsSeries (rates, true );
         int size= ArraySize (rates);
         double arrY[];
        ArrayResize (arrY, size); ArraySetAsSeries (arrY, size);
         for ( int i= 0 ; i<size; ++i) arrY[i]=rates[i].close;
        
        CGraphic graphic;
        graphic.Create( 0 , "Rates" , 0 , 30 , 30 , 1600 , 300 );
        CCurve* curve= NULL ;
        
        curve=graphic.CurveAdd(arrY, CURVE_LINES, "Close" );
        curve.Visible( true );
        graphic.Redraw();
        graphic.Update();
}
 
o_O :


네, 무슨 일이 일어났습니다.

하지만 내가 당신에게 설명했듯이, 당신의 체중계는 균일합니다.

무엇을 말하든 X만큼 크기를 조정하고 좌표를 픽셀 단위로 정확하게 계산합니다.

따라서 시계열을 빌드할 때는 이 작업을 수행할 수 없습니다.

무슨 일이 일어나는지 확인

대부분의 경우 축 값의 출력 형식을 변경할 수 있는 가능성이 구현될 것이지만, 지금까지 어떤 특정 형식인지는 장담할 수 없습니다.

직선을 형성하는 귀하의 예에서 "토요일과 일요일"에 대해. 확인을 위해 예제를 마무리하고 파일에 배열 항목을 추가했습니다.

#include <Graphics/Graphic.mqh>
//+------------------------------------------------------------------+
void OnStart ()
  {
   MqlRates rates[];
   CopyRates ( Symbol (), Period (), 0 , 100 ,rates);
   ArraySetAsSeries (rates, true );
   int size= ArraySize (rates);
   double arrY[],arrX[];
   datetime arrTime[];
   ArrayResize (arrX,size);
   ArrayResize (arrY,size);
   ArrayResize (arrTime,size);
   int handle= FileOpen ( "result.txt" , FILE_WRITE | FILE_TXT );
   for ( int i= 0 ; i<size;++i)
     {
      arrTime[i]=rates[i].time;
      arrX[i]=( double )rates[i].time;
      arrY[i]=rates[i].close;
       string str= TimeToString (arrTime[i])+ "\t" + DoubleToString (arrY[i], 3 )+ "\n" ;
       FileWriteString (handle,str);

     }
   FileClose (handle);
   CGraphic graphic;
   graphic.Create( 0 , "Rates" , 0 , 30 , 30 , 1080 , 380 );
   CCurve *curve=graphic.CurveAdd(arrX,arrY,CURVE_LINES, "Close" );
   double min = arrX[ ArrayMinimum (arrX)];
   double max = arrX[ ArrayMaximum (arrX)];
   double step=(max-min)/ 10 ;
   CAxis *xAxis = graphic.XAxis();           // получаем ось X
   xAxis.AutoScale( false );                   // отключаем автомасштабирование
   xAxis.Min(min);                           // указываем минимальное значение по X
   xAxis.Max(max);                           // указываем максимальное значение по X
   xAxis.DefaultStep(step);                   // указываем шаг по X
   curve.Visible( true );
   graphic.Redraw();
   graphic.Update();
  }

그리고 OpenOffice에서 그래프를 작성했습니다.

이 그래프에는 직선 섹션도 있으므로 데이터 자체(배열 X 및 Y)에 포함됩니다. 이 차트를 주석 에 설명된 대로 가져오려면 입력 데이터를 수동으로 편집해야 합니다(즉, 휴일 제외).

 
Roman Konopelko :

대부분의 경우 축 값의 출력 형식을 변경할 수 있는 가능성이 구현될 것이지만, 지금까지 어떤 특정 형식인지는 장담할 수 없습니다.

좋은 소식입니다. 감사합니다.

내가 말했듯이 공식 빌드를 기다릴 수는 없지만 여기에 테스트용 클래스를 넣습니다.
 
o_O :

좋은 소식입니다. 감사합니다.

내가 말했듯이 공식 빌드를 기다릴 수는 없지만 여기에 테스트용 클래스를 넣습니다.
지금까지 축의 형식을 세 가지 형식으로 설정하는 기능을 구현할 계획이었습니다.
enum ENUM_AXIS_TYPE
  {
   AXIS_TYPE_DOUBLE,
   AXIS_TYPE_DATETIME,
   AXIS_TYPE_CUSTOM,
  };
  1. AXIS_TYPE_DOUBLE - 지금 사용되는 것이 기본적으로 설정됩니다.
  2. AXIS_TYPE_DATETIME - 요청한 내용은 TimeToString을 기반으로 합니다.
  3. AXIS_TYPE_CUSTOM - DoubleToStringFunction 함수 에 대한 포인터를 기반으로 임의의 출력을 만들 수 있습니다.
    typedef string (*DoubleToStringFunction)( double );

만일을 대비하여 첨부파일에 라이브러리의 모든 파일을 올렸습니다.

서비스 데스크에 보내는 메시지와 관련하여 그렇습니다. X 배열에는 토요일과 일요일 날짜가 없습니다. 그래서 데이터를 수정해야 한다는 말을 제대로 하지 않았습니다.

그러나 여전히 AXIS_TYPE_CUSTOM을 사용하여 문제를 해결할 수 있습니다.

#include <Graphics/Graphic.mqh>
double arrX[];
double arrY[];
//---
string TimeFirmat( double x)
  {
   return ( TimeToString (( datetime )arrX[ ArraySize (arrX)-( int )x- 1 ]));
  }
//+------------------------------------------------------------------+
void OnStart ()
  {
   MqlRates rates[];
   CopyRates ( Symbol (), Period (), 0 , 100 ,rates);
   ArraySetAsSeries (rates, true );
   int size= ArraySize (rates);
   ArrayResize (arrX,size);
   ArrayResize (arrY,size);
   for ( int i= 0 ; i<size;++i)
     {
      arrX[i]=( double )rates[i].time;
      arrY[i]=rates[i].close;
     }
   CGraphic graphic;
   graphic.Create( 0 , "Rates" , 0 , 30 , 30 , 780 , 380 );
   CCurve *curve=graphic.CurveAdd(arrY,CURVE_LINES, "Close" );
   CAxis *xAxis=graphic.XAxis();           // получаем ось X
   xAxis.AutoScale( false );
   xAxis.Type(AXIS_TYPE_CUSTOM);
   xAxis.ValuesFunctionFormat(TimeFirmat);
   xAxis.DefaultStep( 20.0 );
   curve.Visible( true );
   graphic.Redraw();
   graphic.Update();
  }
//+------------------------------------------------------------------+

결과:


파일:
Graphic.mqh  86 kb
Curve.mqh  21 kb
Axis.mqh  12 kb
 
Roman Konopelko :

그러나 여전히 AXIS_TYPE_CUSTOM을 사용하여 문제를 해결할 수 있습니다.

슈퍼, 맞습니다!
 

Graphic.mqh 파일을 간단히 살펴보았습니다.

모든 기능을 가상 이 아닌 상태로 두기로 결정하셨습니까?

확인,

최소한 ***Plot 기능(HistogramPlot, LinesPlot 등)을 가상으로 만들 수 있습니다. ?

"디자인" 기능이 작업에 충분하지 않기 때문입니다(채울 때의 그라디언트 또는 렌더링 시 여러 색상).

 
o_O :

Graphic.mqh 파일을 간단히 살펴보았습니다.

모든 기능을 가상 이 아닌 상태로 두기로 결정하셨습니까?

확인,

최소한 ***Plot 기능(HistogramPlot, LinesPlot 등)을 가상으로 만들 수 있습니다. ?

"디자인" 기능이 작업에 충분하지 않기 때문입니다(채울 때의 그라디언트 또는 렌더링 시 여러 색상).

가상 으로 만들더라도CGraphics 클래스 멤버에 대한 전체 액세스 권한 없이 일반 오버로드를 수행할 수 없으므로 그들 모두(대부분)는 protected 으로 선언되어야 합니다. 또한 확실하게 말할 수는 없지만 두 가지 측면이 모두 구현될 가능성이 큽니다.
사유: