Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 142

 
forexman77:

Dennoch benötige ich die Variable "st" nicht nur in Alert, sondern auch für Berechnungen, und beim Kompilieren kommt die Warnung "möglicher Datenverlust durch Typkonvertierung".

Ich nehme an, das liegt daran, dass es sich um eine 10-stellige Zahl handelt, während der Höchstwert in int 2 147 483 647 beträgt, habe ich derzeit 1 380 758 400. Vielleicht ist es sinnvoll, lange zu verwenden, und wahrscheinlich der Expert Advisor wird eine Menge von Ressourcen in diesem Teil verbrauchen?

Verstehen Sie nicht das Prinzip der Typumwandlung? So einfach ist das:

int st=(int)tp[0];
 

Ich möchte auf Leinwand malen. Um ein Bild auf der Leinwand in OnInit, OnTimer, OnTick und in onChartEvent neu zu zeichnen. Ich deklariere CCanvas canvas in globalen Variablen und rufe canvas.methods überall auf, wo ich will. Aber der Compiler beschwert sich über nicht aufgelöste statische Variable 'CCanvas::m_default_colors' (was hat das mit Farben zu tun?)

Der Code sieht folgendermaßen aus

#include <Canvas.mqh>

CCanvas-Leinwand;

int OnInit()
{
//CCanvas canvas; wenn ich es hier deklariere, wird es gezeichnet, aber wie kann ich es dann in OnTick neu zeichnen?

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();
}

Wie kann ich mit dem Compiler verhandeln? Gibt es ein Beispiel mit Canvas in Expert?
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
Virty:

Ich möchte in Expert Advisor auf der Leinwand zeichnen. Ich möchte, dass das Bild auf der Leinwand in OnInit, OnTimer, OnTick und in onChartEvent neu gezeichnet wird. Ich deklariere CCanvas canvas in globalen Variablen und rufe canvas.methods überall auf, wo ich will. Aber der Compiler beschwert sich über nicht aufgelöste globale Deklarationen

...

Wie verhandeln Sie mit dem Compiler? Gibt es ein Beispiel mit Leinwand in EA?

Nun, Sie sind kein Anfänger! Veröffentlichen Sie den Code korrekt!

 
DC2008:

Nun, Sie sind kein Anfänger! Veröffentlichen Sie den Code korrekt!

Der Code ist hier zu finden. Aber es ist viel schlimmer, wenn man sich damit beschäftigt. Und es funktioniert auch nicht. Fehler nicht aufgelöste statische Variable 'CCanvas::m_default_colors' ProbeGraph.mq5 21 9

Und ein Haufen Haftbefehle wegen sich überschneidender Höhen- und Breitenvariablen. Soweit ich verstehe, will der Compiler nicht CCanvas Klasse Konstruktor in globalen Variablen aufrufen, sondern will den Konstruktor bei OnInit aufrufen. Und wie man dann auf eine Instanz der Klasse außerhalb von OnInit verweist, verstehe ich nicht.

Außerdem befand sich vorher der Körper der Draw-Funktion innerhalb von onInit, aber die Draw-Funktion selbst war es nicht. Alles funktionierte, aber innerhalb von OnInit. Ich habe bereits begonnen, hier zu verdrehen, versuchen, einen Verweis auf eine Instanz der Klasse in der Draw-Funktion übergeben, weil globale Variablen nicht funktionieren.

Im Allgemeinen wird der Code geschrieben, das Problem mit der Erstellung einer globalen Instanz der CCanvas-Klasse.


//+------------------------------------------------------------------+
//|                                                   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
 

Eines verstehe ich nicht: Wenn der Compiler flucht, warum werden die Fehler nicht korrigiert? А?

 
DC2008:

Eines verstehe ich nicht: Wenn der Compiler flucht, warum werden die Fehler nicht korrigiert? А?

Ich weiß nicht, wie man es repariert, deshalb frage ich.
 
//+------------------------------------------------------------------+
//|                                                   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:
Kopieren Sie den vorgeschlagenen Code vollständig. Der Fehler ist derselbe wie bei der nicht aufgelösten statischen Variable 'CCanvas::m_default_colors' prob1.mq5 21 9
 
Virty:
Der vorgeschlagene Code wurde vollständig kopiert. Der Fehler ist derselbe wie bei der nicht aufgelösten statischen Variable 'CCanvas::m_default_colors' prob1.mq5 21 9

Ich habe keine Fehler. Der Build ist der neueste.

ProbeGraph

 
Virty:
Kopieren Sie den vorgeschlagenen Code vollständig. Der Fehler ist derselbe wie bei der nicht aufgelösten statischen Variable 'CCanvas::m_default_colors' prob1.mq5 21 9
Der Fehler liegt also in Ihrer Datei prob1.mq5.