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

 

CGrafic::Destroy() - 작동하지 않습니다!


 //+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                     F_Spread.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, prostotrader"
#property link        "https://www.mql5.com"
#property version    "1.000"
#property indicator_separate_window
#property indicator_plots    1
#property indicator_buffers 1
//---
#define IND_RESIZE 1
#define RESULT_OR_NAN(x,expression) ((x== 0 )?( double ) "nan" :expression)
//--- Functions
double BlueFunction( double x)   { return (RESULT_OR_NAN(x, 10 *x* sin ( 1 /x)));      }
double RedFunction( double x)    { return (RESULT_OR_NAN(x, sin ( 100 *x)/ sqrt (x))); }
double OrangeFunction( double x) { return (RESULT_OR_NAN(x, sin ( 100 *x)/ sqrt (-x)));}
//---
#include <Graphics\Graphic.mqh>
CGraphic Chart;
CColorGenerator generator;
bool is_create;
int sub_window;
int cur_height, cur_width;
//double a_array[];
double v_max, v_min, i_step;
int cnt = 0 ;
uint blue, red, orange;
double a_from, a_to, a_step;
//+------------------------------------------------------------------+
//| inputs                                                           |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Custom indicator Fill data function                              |
//+------------------------------------------------------------------+
void FillData()
{
  Chart.CurveAdd(RedFunction,a_from,a_to,a_step,red,CURVE_LINES, "Red" );
  Chart.CurveAdd(OrangeFunction,a_from,a_to,a_step,orange,CURVE_LINES, "Orange" );
  Chart.CurveAdd(BlueFunction,a_from,a_to,a_step,blue,CURVE_LINES, "Blue" );
  Chart.CurvePlotAll();
  Chart.Update();
}
//+------------------------------------------------------------------+
//| Custom indicator ChartResize function                            |
//+------------------------------------------------------------------+
void ChartResize()
{
  cnt++;
   if (cnt > 2 ) return ;
   if (is_create == true )
  {
     Chart.Destroy();
    
    
    Chart.CurveAdd(RedFunction,a_from,a_to,a_step,red,CURVE_LINES, "Red_exists" );
    Chart.CurveAdd(OrangeFunction,a_from,a_to,a_step,orange,CURVE_LINES, "Orange_exists" );
    Chart.CurveAdd(BlueFunction,a_from,a_to,a_step,blue,CURVE_LINES, "Blue_exists" );
    Chart.CurvePlotAll();
    Chart.Update();
    is_create = false ;
  }  
  cur_height =   int ( ChartGetInteger ( ChartID (), CHART_HEIGHT_IN_PIXELS , sub_window));
  cur_width =   int ( ChartGetInteger ( ChartID (), CHART_WIDTH_IN_PIXELS , sub_window));
  is_create = Chart.Create( ChartID (), "Spread" , sub_window, 0 , 0 , cur_width, cur_height);
   if (is_create == true )
  {
    Chart.BackgroundColor( clrWhite );
    
    FillData();
  }
}
//+------------------------------------------------------------------+
//| Custom indicator OnInit function                                 |
//+------------------------------------------------------------------+
int OnInit ()
{
   IndicatorSetInteger ( INDICATOR_DIGITS , 0 );
   IndicatorSetString ( INDICATOR_SHORTNAME , "F_Spread" );
  sub_window = ChartWindowFind ( ChartID (), "F_Spread" );
  v_max = SymbolInfoDouble ( Symbol (), SYMBOL_SESSION_PRICE_LIMIT_MAX );
  v_min = - SymbolInfoDouble ( Symbol (), SYMBOL_SESSION_PRICE_LIMIT_MIN );  
  i_step = SymbolInfoDouble ( Symbol (), SYMBOL_TRADE_TICK_SIZE );
  is_create = false ;
//===
  a_from=- 1.2 ;
  a_to= 1.2 ;
  a_step= 0.005 ;
  blue= generator.Next();
  red = generator.Next();
  orange=generator.Next();
//---  
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Custom indicator OnDeinit function                               |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   if (is_create == true )
  {
    Chart.Destroy();
  }
}
//+------------------------------------------------------------------+
//| Custom indicator ChartEvent function                             |
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,
                   const long &lparam,
                   const double &dparam,
                   const string &sparam)
{
   if (id == CHARTEVENT_CHART_CHANGE )
  {
     int i_heigth =   int ( ChartGetInteger ( ChartID (), CHART_HEIGHT_IN_PIXELS , sub_window));
     int i_width =   int ( ChartGetInteger ( ChartID (), CHART_WIDTH_IN_PIXELS , sub_window));
     if ((i_heigth != cur_height) || (i_width != cur_width))
    {
       EventChartCustom ( ChartID (), CHARTEVENT_CUSTOM + IND_RESIZE, 1 , 1 , "resize" );
    }
  }
   else
   if ((id > CHARTEVENT_CUSTOM ) && (sparam == "resize" ))
  {
     PlaySound ( "" );
    ChartResize();
  }   
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double &price[])
{
  
   return (rates_total);
}
//+------------------------------------------------------------------+
 
prostotrader :

CGrafic::Destroy() - 작동하지 않습니다!

어떻게 결정했습니까? 증상은 무엇입니까?

 
Denis Kirichenko :

어떻게 결정했습니까? 증상은 무엇입니까?

그래서 결국 재생 코드가 첨부되었습니다 :)

예, 그림은 Destroy() 그래픽이 추가된 후 보여줍니다.

접두사

 _exists
 
prostotrader :

그래서 결국 재생 코드가 첨부되었습니다 :)

예, 그림은 Destroy() 그래픽이 추가된 후 보여줍니다.

접두사

글쎄요, 질문은 특히 CGrafic::Destroy() 에 관한 것이었습니다. 작동합니다 - 디버거에서 확인했습니다 ... 코드에 문제가 있습니까?

 
Denis Kirichenko :

글쎄요, 질문은 특히 CGrafic::Destroy() 에 관한 것이었습니다. 작동합니다 - 디버거에서 확인했습니다 ... 코드에 문제가 있습니까?

Destroy() 프로시저의 본문에 들어가는 것이(프로시저) 제대로 작동한다는 의미는 아닙니다.

객체가 실제로 파괴된 후에는 새 그래픽을 추가할 수 없었지만 추가되었습니다!

Chart.Destroy();
    
    
    Chart.CurveAdd(RedFunction,a_from,a_to,a_step,red,CURVE_LINES, "Red_exists" );
    Chart.CurveAdd(OrangeFunction,a_from,a_to,a_step,orange,CURVE_LINES, "Orange_exists" );
    Chart.CurveAdd(BlueFunction,a_from,a_to,a_step,blue,CURVE_LINES, "Blue_exists" );
 
prostotrader :

Destroy() 프로시저의 본문에 들어가는 것이(프로시저) 제대로 작동한다는 의미는 아닙니다.

객체가 실제로 파괴된 후에는 새 그래픽을 추가할 수 없었지만 추가되었습니다!

히트에 동의합니다. 하지만 여전히... 음, 우선 void CGrafic::Destroy() . 저것들. 이 방법은 우리에게 빚진 것이 없는 것 같습니다... 그리고 두 번째로, 수표를 추가하는 것이 프로그래머의 일이 될 수 있습니까? 안보리의 모든 임무를 날카롭게 할 수는 없습니다 ...

 
Denis Kirichenko :

히트에 동의합니다. 하지만 여전히... 음, 우선 void CGrafic::Destroy() . 저것들. 이 방법은 우리에게 빚진 것이 없는 것 같습니다... 그리고 두 번째로, 수표를 추가하는 것이 프로그래머의 일이 될 수 있습니까? 안보리의 모든 임무를 날카롭게 할 수는 없습니다 ...

게다가 나는 Destroy를 다시 했다.

 //+------------------------------------------------------------------+
//| Remove graphic from chart                                        |
//+------------------------------------------------------------------+
void CGraphic::Destroy( const long chart, const string name)
  {
     if ( ObjectFind (chart,name)>= 0 )
    {
      SetDefaultParameters();
      m_generator.Reset();
      m_canvas.Destroy();
       bool res = ObjectDelete (chart,name);
       if (res == true )
      {
         Print ( "Object destroyed!" ); 
      }
     }  
   }
 2020.11 . 02 17 : 16 : 45.408 F_Spread (Si- 12.20 ,M1)  Object destroyed!

그리고 모든 동일한 그래픽이 추가됩니다!

 
CGraphic 에서 크기 조정을 수행하는 방법은 무엇입니까?
 

CGraphic 을 사용하여 그래픽을 만들고 텍스트를 표시합니다. Advisor의 한 인스턴스가 실행 중이면 모든 것이 정상입니다. 그리고 다른 차트에서 동일한 Expert Advisor를 실행하면 현재 화면에 표시되는 차트에 정보가 항상 표시된다는 인상을 받습니다. Create 메서드에 지정된 차트에는 없습니다. 다음은 문제를 보여주는 EA 코드입니다.

 #include <Graphics\Graphic.mqh>

CGraphic          Graphic;     // Для вывода графика.
long ChartId;
int OnInit ()
  {
   ChartId= ID_Grafika_S_Expertom(); // Узнаем Id графика на котором запущен советник.
   Graphic.Create(ChartId, "CPrecieIdealnayFast " , 0 , 10 , 30 , 500 , 500 );   
   Print("OnInit ",Symbol()," ChartId=",ChartId);
   EventSetMillisecondTimer ( 1000 );
   return ( INIT_SUCCEEDED );
  }

void OnTimer ()
  {  
   string Str;
   StringConcatenate (Str,ChartId, " " , Symbol (), " " , TimeLocal ());
   Graphic.FontSet( "Arial" , 20 );
   Graphic.TextAdd( 20 , 30 , Str, ColorToARGB ( clrRed ), TA_LEFT | TA_TOP );
   Graphic.Update();
   Graphic.Redraw( true );     
  }
void OnDeinit ( const int Reanson )
  {
  Graphic.Destroy();
  }
  
   long ID_Grafika_S_Expertom()
  {
   string MaskaNameExpert=               MQLInfoString ( MQL_PROGRAM_NAME );
   int SekyndNaGrafikeSTekygemExpertom= PeriodSeconds ();
   string SimvolExpert=                 Symbol ();
//--- 1. Настраиваемся на первый график. Если не получилось возращаем советник не найден. 

//--- В цикле.
//--- 2. Получаем Имя эксперта.
//--- --- 2.1 Если не удалось получить имя эксперта смотрим следующий график.
//--- --- --- 2.2 Если не удалось получить слеюущий график выходим из цикла.
//--- 3.A Если на графике есть эксперт И в его названии есть маска: Запоминаем Id и выходим из цикла.
//--- 3.B Если Нет эксперта или НЕ нашли смотрим следующий график.  
//--- --- 3.B.A Если не удалось получить слеюущий график выходим из цикла.   
//--- --- 3.B.B Если  Удалось получить слеюущий график ищем в начало цикла.  

   long ID_Chart= - 1 ;
   string NameExpert= "" ;   
   long    IskomoeIdChart= - 1 ;
   int     LimitChatr= 1000 ;             // Наверняка ведь не 1000 графиков.
   int     i= 0 ;                         // Cчетчик графиков
   
//--- 1. Настраиваемся на первый график. Если не получилось возращаем советник не найден. 
   ID_Chart= ChartFirst ();
   if ( ID_Chart < 0 ) return - 1 ;
   
   string Simvol;
   int     KolichestvoSekynd;
   while ( i < LimitChatr )
     {
//--- 2. Получаем Имя эксперта.     
      NameExpert=             ChartGetString ( ID_Chart, CHART_EXPERT_NAME );
      Simvol=                 ChartSymbol (ID_Chart);
      KolichestvoSekynd=       PeriodSeconds ( ChartPeriod (ID_Chart) );
     //  Print("На графике ",ChartSymbol(ID_Chart)," Period=",ChartPeriod(ID_Chart)," Расположен советник (",NameExpert,")");
      
//--- 3.A Если на графике есть эксперт И в его названии есть маска: Запоминаем Id и выходим из цикла.  
       if ( NameExpert != ""   && 
         StringFind (NameExpert,MaskaNameExpert) > - 1 &&
          Simvol            == SimvolExpert &&
          KolichestvoSekynd == SekyndNaGrafikeSTekygemExpertom )
        {
     //    Print("НАШЛИ На графике ",ChartSymbol(ID_Chart)," Period=",ChartPeriod(ID_Chart)," Расположен советник (",NameExpert,")");
         IskomoeIdChart= ID_Chart; break ; 
        }
//--- 3.B Если Нет эксперта или НЕ нашли смотрим следующий график.      
       else
        {
       //  Print("Не удалось найти маску (",MaskaNameExpert," в названии эксперта (",NameExpert,") ",ChartSymbol(ID_Chart)," Period=",ChartPeriod(ID_Chart)," ID=",ID_Chart);
         ID_Chart= ChartNext (ID_Chart);
         i++;
//--- --- 3.B.A Если не удалось получить слеюущий график выходим из цикла.         
         if ( ID_Chart < 0 ) { /*Print("Закончились графики.");*/ break ;}
//--- --- 3.B.B Если  Удалось получить слеюущий график ищем в начало цикла.       
         else                { /* Print("Получили новое Id графика ",ChartSymbol(ID_Chart)," Period=",ChartPeriod(ID_Chart)," ID=",ID_Chart);*/ continue ;}
        }        
     }   
     return IskomoeIdChart;
  }

어드바이저가 작동하면 1 모든 것이 정상입니다.

그러나 다른 차트에서 두 번째 Expert Advisor를 열면 첫 번째 차트는 첫 번째 Expert Advisor와 두 번째 Expert Advisor로부터 동시에 정보를 받습니다.

즉, 깜박임이 시작됩니다. 한 번에 같은 차트에 여러 Expert Advisors를 작성하기 때문입니다. Init 기능에서 각 Expert Advisor는 실행되는 차트의 ID를 받습니다. 그런 다음 Create가 즉시 호출됩니다.

 int OnInit ()
  {
   ChartId= ID_Grafika_S_Expertom(); // Узнаем Id графика на котором запущен советник.
   Graphic.Create(ChartId, "CPrecieIdealnayFast " , 0 , 10 , 30 , 500 , 500 );   
   Print ( "OnInit " , Symbol (), " ChartId=" ,ChartId);
   EventSetMillisecondTimer ( 1000 );
   return ( INIT_SUCCEEDED );
  }

문제가 무엇인지 이해하도록 도와주세요.

Визуализируй это! Графическая библиотека в MQL5 как аналог plot из R
Визуализируй это! Графическая библиотека в MQL5 как аналог plot из R
  • www.mql5.com
При исследовании и изучении закономерностей важную роль играет визуальное отображение с помощью графиков. В популярных среди научного сообщества языках программирования, таких как R и Python, для визуализации предназначена специальная функция plot. С её помощью можно рисовать линии, точечные распределения и гистограммы для наглядного представления закономерностей. В MQL5 вы можете делать всё то же самое с помощью класса CGraphics.
 
pivomoe :

CGraphic 을 사용하여 그래픽을 만들고 텍스트를 표시합니다. Advisor의 한 인스턴스가 실행 중이면 모든 것이 정상입니다. 그리고 다른 차트에서 동일한 Expert Advisor를 실행하면 현재 화면에 표시되는 차트에 정보가 항상 표시된다는 인상을 받습니다. Create 메서드에 지정된 차트에는 없습니다. 다음은 문제를 보여주는 EA 코드입니다.

어드바이저가 작동하면 1 모든 것이 정상입니다.

그러나 다른 차트에서 두 번째 Expert Advisor를 열면 첫 번째 차트는 첫 번째 Expert Advisor와 두 번째 Expert Advisor로부터 동시에 정보를 받습니다.

즉, 깜박임이 시작됩니다. 한 번에 같은 차트에 여러 Expert Advisors를 작성하기 때문입니다. Init 기능에서 각 Expert Advisor는 실행되는 차트의 ID를 받습니다. 그런 다음 Create가 즉시 호출됩니다.

문제가 무엇인지 이해하도록 도와주세요.

ChartId를 개체 이름에 추가하면 안 되나요? 함수 안에 추가했는지 기억나지 않습니다.

사유: