初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 142

 
forexman77:

それでも、変数「st」はAlertだけ でなく、計算にも必要で、コンパイル時に「型変換によるデータ損失の可能性」の警告が出ます。

intの最大値が2 147 483 647であるのに対し、10桁の数字であることが判明したためと思われますが、現在は1 380 758 400となっています。多分、ロングを使用することに意味があり、おそらくExpert Advisorはこの部分で多くのリソースを消費するのでしょうか?

型変換の 原理を理解していないのか?それだけでいいんです。

int st=(int)tp[0];
 

キャンバスに描きたい。OnInit, OnTimer, OnTick, onChartEventでキャンバス上の画像を再描画させる。CCanvasのcanvasをグローバル変数 で宣言し、canvas.methodsを好きなところで呼び出しています。しかし、コンパイラは未解決の静的変数 'CCanvas::m_default_colors' について文句を言います (これは色とどう関係があるのでしょうか?)。

は次のようなコードです。

#include <CanvasCanvas.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()を実行。

}

void OnTick()
{
canvas.Circle(Xcentr,Ycentr,Rmin,ColorToARGB(clrBlue, 115)); canvas.Update()を実行。
}

コンパイラとの交渉はどのようにすればよいのですか?エキスパートでキャンバスを使った例はありますか?
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
Virty:

Expert Advisorでキャンバスに描画したいのですが、どうすればいいですか?OnInit, OnTimer, OnTick, onChartEventでキャンバス上の画像を再描画させたいのですが、どうすればいいですか?CCanvasのcanvasをグローバル変数 で宣言し、canvas.methodsを好きなところで呼び出しています。しかし、コンパイラは未解決のグローバル宣言について文句を言います。

...

コンパイラーとの交渉はどうするのか?EAでキャンバスを使った例はありますか?

なるほど......あなたは初心者ではないんですね!コードを正しくパブリッシュしてください

 
DC2008:

そうか......君は初心者じゃないんだね!コードを正しくパブリッシュしてください

コードはここにあります。でも、掘り下げるともっとひどいことになる。そして、それもうまくいかない。Error unresolved static variable 'CCanvas::m_default_colors' ProbeGraph.mq5 21 9

そして、heigthとwidth変数のオーバーラップに関する警告が山ほど。私の理解では、コンパイラは 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というファイルにエラーがあるということですね。
理由: