初学者的问题 MQL5 MT5 MetaTrader 5 - 页 142

 
forexman77:

但是,我不仅在Alert中 需要变量 "st",而且在计算中也需要,而且在编译时出现了 "由于类型转换可能导致数据丢失 "的警告。

我想这是因为它变成了一个10位数,而int的最大值是2 147 483 647,我目前有1 380 758 400。也许用长的有意义,可能专家顾问在这部分会消耗大量的资源?

你不明白类型转换的 原理吗?就是这么简单。

int st=(int)tp[0];
 

我想在画布上画画。要在OnInit、OnTimer、OnTick和onChartEvent中重新绘制画布上的图片。我在全局变量 中声明CCanvas画布,并在任何地方调用画布.方法。但编译器抱怨未解决的静态变量'CCanvas::m_default_colors'(这与颜色有什么关系?)

代码是这样的

#include <Canvas/Canvas.mqh>。

CCanvas帆布。

int OnInit()
{
//CCanvas canvas;如果我在这里声明,它就会画出来,但我如何在OnTick中重画它呢?

canvas.CreateBitmapLabel("ProbeGraph", 0, 0, width ,heigth, COLOR_FORMAT_ARGB_RAW);

canvas.Circle(Xcentr,Ycentr,Rmin,ColorToARGB(clrBlue, 115)); canvas.Update()。

}

空白的OnTick()
{
canvas.Circle(Xcentr,Ycentr,Rmin,ColorToARGB(clrBlue, 115)); canvas.Update()。
}

我如何与编译器交涉?是否有一个在专家中使用画布的例子?
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
Virty:

我想在专家顾问的画布上画画。我想在OnInit、OnTimer、OnTick和onChartEvent中重新绘制画布上的图像。我在全局变量 中声明CCanvas画布,并在任何地方调用画布.方法。但编译器抱怨说,未解决的全局声明

...

你如何与编译器进行协商?是否有一个在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中。