초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 142

 
forexman77 :

그래도 Alert 뿐만 아니라 계산을 위해서도 변수 "st"가 필요하고, 컴파일할 때 "유형 변환으로 인한 데이터 손실이 가능합니다"라는 경고가 나타납니다.

나는 그것이 10자리 숫자로 밝혀지고 int에서 최대값이 2 147 483 647이기 때문에 현재 1 380 758 400을 얻습니다. 아마도 long을 사용하는 것이 합리적이고 아마도 Advisor가 많은 것을 소비할 것입니다. 이 부분의 리소스?

타입 캐스팅의 원리를 제대로 이해하지 못하셨나요? 매우 간단합니다.

 int st=( int )tp[ 0 ];
 

캔버스에 전문가를 그리고 싶습니다. 캔버스의 그림이 OnInit, OnTimer, OnTick 및 onChartEvent에서 다시 그려지도록 합니다. 전역 변수 에 CCanvas 캔버스를 선언하고 필요할 때마다 canvas.methods를 호출합니다. 그러나 컴파일러는 해결되지 않은 정적 변수 'CCanvas::m_default_colors'의 전역 선언에 맹세합니다(그리고 색상이 그것과 무슨 관련이 있습니까?)

이런 코드

#include <Canvas\Canvas.mqh>

C캔버스 캔버스;

int OnInit()
{
//캔버스 캔버스; 여기에 선언하면 그려지지만 OnTick에서 다시 그리는 방법은 무엇입니까?

canvas.CreateBitmapLabel("프로브 그래프", 0, 0, 너비, 높이, COLOR_FORMAT_ARGB_RAW);

Canvas.Circle(Xcentr,Ycentr,Rmin,ColorToARGB(clrBlue, 115)); 캔버스.업데이트();

}

무효 OnTick()
{
Canvas.Circle(Xcentr,Ycentr,Rmin,ColorToARGB(clrBlue, 115)); 캔버스.업데이트();
}

컴파일러와 어떻게 협상합니까? EA에 캔버스가 있는 예가 있습니까?
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
Virty :

캔버스에 전문가를 그리고 싶습니다. 캔버스의 그림이 OnInit, OnTimer, OnTick 및 onChartEvent에서 다시 그려지도록 합니다. 전역 변수 에 CCanvas 캔버스를 선언하고 필요할 때마다 canvas.methods를 호출합니다. 그러나 컴파일러는 이러한 전역 선언이 해결되지 않은 상태에서 맹세합니다.

...

컴파일러와 어떻게 협상합니까? EA에 캔버스가 있는 예가 있습니까?

글쎄, 당신은 새로운 것이 아닙니다! 코드를 올바르게 게시하십시오!

 
DC2008 :

글쎄, 당신은 새로운 것이 아닙니다! 코드를 올바르게 게시하십시오!

다음은 코드입니다. 그러나 그것을 파헤치는 것은 훨씬 더 나쁩니다. 그리고 그것은 작동하지 않습니다. 오류 미해결 정적 변수 'CCanvas::m_default_colors' ProbeGraph.mq5 21 9

그리고 겹치는 높이 및 너비 변수에 대한 많은 경고. 일반적으로 내가 이해하는 한 컴파일러는 전역 변수에서 CCanvas 클래스 생성자를 호출하기를 원하지 않지만 OnInit에서 생성자를 호출하기를 원합니다. 그리고 OnInit 외부에서 클래스 인스턴스에 액세스하는 방법을 이해하지 못합니다.

더. 이전에는 Draw 함수의 본문이 onInit 내부에 있었지만 Draw 자체는 없었습니다. 모든 것이 작동했지만 OnInit 내부. 나는 이미 전역 변수를 통해 작동하지 않기 때문에 Draw 함수에 클래스 인스턴스에 대한 참조를 전달하려고 시도하면서 여기에서 변태를 시작했습니다.

일반적으로 코드는 작성 중이며 문제는 CCanvas 클래스의 전역 인스턴스를 만드는 데 있습니다.


 //+------------------------------------------------------------------+
//|                                                   ProbeGraph.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property version    "1.00"

#include <Canvas\Canvas.mqh>
int heigth= 500 ;
int width= 500 ;
int Xcentr= round (width/ 2 );
int Ycentr= round (width/ 2 );
int Rmin= 25 ;
int Rmax= round (heigth/ 2 - 1 );


#define ArrayS 100000 
double arrayopen[ArrayS];
CCanvas canvas;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//CCanvas canvas;
   canvas.CreateBitmapLabel( "ProbeGraph" , 0 , 0 ,width,heigth, COLOR_FORMAT_ARGB_RAW );

//Draw(canvas);


//--- create timer
   EventSetTimer ( 60 );

//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   EventKillTimer ();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
//canvas.Update();
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---

  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,
                   const long &lparam,
                   const double &dparam,
                   const string &sparam)
  {
//---

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


int ChartVisibleBars( const long chart_ID= 0 )
  {
//--- подготовим переменную для получения значения свойства
   long result=- 1 ;
//--- сбросим значение ошибки
   ResetLastError ();
//--- получим значение свойства
   if (! ChartGetInteger (chart_ID, CHART_VISIBLE_BARS , 0 ,result))
     {
       //--- выведем сообщение об ошибке в журнал "Эксперты"
       Print ( __FUNCTION__ + ", Error Code = " , GetLastError ());
     }
//--- вернем значение свойства графика
   return (( int )result);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Draw(CCanvas *canvas)
  {
   ArrayInitialize (arrayopen, 0 );
   double r;
   double A, Amin= 0 , Amax= 2 * 3.1415 ;
   int x,y, xprev= 0 , yprev= 0 ;

//canvas.Erase(ColorToARGB(clrRed, 115));
   canvas.Circle(Xcentr,Ycentr,Rmin, ColorToARGB ( clrBlue , 115 ));
   canvas.Circle(Xcentr,Ycentr,Rmax, ColorToARGB ( clrBlue , 115 ));

   int Nbars= CopyOpen ( Symbol (), Period (), TimeCurrent (),ChartVisibleBars( 0 ),arrayopen); Print ( "Nbars=" ,Nbars);
   double KursMin= 1000000 ,KursMax= 0 ;
   for ( int i= 0 ; i<Nbars; i++)
     {
       if (KursMin>arrayopen[i]) KursMin=arrayopen[i];
       if (KursMax<arrayopen[i]) KursMax=arrayopen[i];
     };
   Print ( "KursMin=" ,KursMin); Print ( "KurMax=" ,KursMax);

   for ( int i= 0 ; i<Nbars; i++)
     {
       if ((KursMax-KursMin)> 0 ) r=Rmin+(Rmax-Rmin)*(arrayopen[i]-KursMin)/(KursMax-KursMin);
       if (Nbars> 0 ) A=Amin+(Amax-Amin)*i/(Nbars);
      x= round (Xcentr-r* MathSin (A));
      y= round (Ycentr+r* MathCos (A));
      canvas.PixelSetAA(x,y, ColorToARGB ( clrGreen , 155 ));
       if (xprev> 0 && yprev> 0 ) canvas.Line(xprev,yprev,x,y, ColorToARGB ( clrBlue , 155 ));
      xprev=x; yprev=y;

     };

   canvas.Update();

  }
//+------------------------------------------------------------------+
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 

한 가지를 이해할 수 없습니다. 컴파일러가 맹세하면 오류가 수정되지 않는 이유는 무엇입니까? 하지만?

 
DC2008 :

한 가지를 이해할 수 없습니다. 컴파일러가 맹세하면 오류가 수정되지 않는 이유는 무엇입니까? 하지만?

그래서 고칠 방법을 모르겠습니다. 그게 내가 묻는 이유야
 
//+------------------------------------------------------------------+
//|                                                   ProbeGraph.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#include <Canvas\Canvas.mqh>
int heigth=500;
int width_1=500;
int Xcentr=int(round(width_1/2));
int Ycentr=int(round(width_1/2));
int Rmin=25;
int Rmax=int(round(heigth/2-1));


#define ArrayS 100000 
double arrayopen[ArrayS];
CCanvas *canvas;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//CCanvas canvas;
   canvas=new CCanvas;
//--- проверка указателя перед его использованием
   if(CheckPointer(canvas)==POINTER_INVALID)
     {
      Print(__FUNCTION__," переменная 'canvas' не инициализирована!");
      return(INIT_SUCCEEDED);
     }
   canvas.CreateBitmapLabel("ProbeGraph",0,0,width_1,heigth,COLOR_FORMAT_ARGB_RAW);

   Draw();

//--- create timer
   EventSetTimer(60);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
//canvas.Update();
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---

  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---

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

int ChartVisibleBars(const long chart_ID=0)
  {
//--- подготовим переменную для получения значения свойства
   long result=-1;
//--- сбросим значение ошибки
   ResetLastError();
//--- получим значение свойства
   if(!ChartGetInteger(chart_ID,CHART_VISIBLE_BARS,0,result))
     {
      //--- выведем сообщение об ошибке в журнал "Эксперты"
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- вернем значение свойства графика
   return((int)result);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Draw()
  {
   ArrayInitialize(arrayopen,0);
   double r=0;
   double A=0, Amin=0, Amax=2*3.1415;
   int x,y,xprev=0,yprev=0;

//canvas.Erase(ColorToARGB(clrRed, 115));
   canvas.Circle(Xcentr,Ycentr,Rmin,ColorToARGB(clrBlue, 115));
   canvas.Circle(Xcentr,Ycentr,Rmax,ColorToARGB(clrBlue, 115));

   int Nbars=CopyOpen(Symbol(),Period(),TimeCurrent(),ChartVisibleBars(0),arrayopen); Print("Nbars=",Nbars);
   double KursMin=1000000,KursMax=0;
   for(int i=0; i<Nbars; i++)
     {
      if(KursMin>arrayopen[i]) KursMin=arrayopen[i];
      if(KursMax<arrayopen[i]) KursMax=arrayopen[i];
     };
   Print("KursMin=",KursMin); Print("KurMax=",KursMax);

   for(int i=0; i<Nbars; i++)
     {
      if((KursMax-KursMin)>0) r=Rmin+(Rmax-Rmin)*(arrayopen[i]-KursMin)/(KursMax-KursMin);
      if(Nbars>0) A=Amin+(Amax-Amin)*i/(Nbars);
      x=int(round(Xcentr-r*MathSin(A)));
      y=int(round(Ycentr+r*MathCos(A)));
      canvas.PixelSetAA(x,y,ColorToARGB(clrGreen,155));
      if(xprev>0 && yprev>0) canvas.Line(xprev,yprev,x,y,ColorToARGB(clrBlue,155));
      xprev=x; yprev=y;

     };

   canvas.Update();

  }
//+------------------------------------------------------------------+
 
barabashkakvn :
코드 전체를 복사했습니다. 해결되지 않은 정적 변수 'CCanvas::m_default_colors'와 동일한 오류 prob1.mq5 21 9
 
Virty :
코드 전체를 복사했습니다. 해결되지 않은 정적 변수 'CCanvas::m_default_colors'와 동일한 오류 prob1.mq5 21 9

나는 오류가 없습니다. 마지막으로 빌드합니다.

프로브 그래프

 
Virty :
코드 전체를 복사했습니다. 해결되지 않은 정적 변수 'CCanvas::m_default_colors'와 동일한 오류 prob1.mq5 21 9
따라서 오류는 prob1.mq5 파일에 있습니다.