Questions des débutants MQL5 MT5 MetaTrader 5 - page 142

 
forexman77:

Pourtant, je vais avoir besoin de la variable "st" non seulement dans Alert, mais aussi pour les calculs, et lors de la compilation, l'avertissement "perte de données possible due à la conversion de type" apparaît.

Je suppose que c'est parce qu'il s'agit d'un nombre à 10 chiffres, alors que la valeur maximale en int est 2 147 483 647, j'ai actuellement 1 380 758 400. Il est peut-être judicieux d'utiliser le long terme, et le conseiller expert consommera probablement beaucoup de ressources dans cette partie ?

Ne comprenez-vous pas le principe de la conversion de type? C'est aussi simple que cela :

int st=(int)tp[0];
 

Je veux dessiner sur la toile. Pour faire redessiner une image sur le canevas dans OnInit, OnTimer, OnTick et dans onChartEvent. Je déclare CCanvas canvas dans des variables globales et j'appelle canvas.methods partout où je veux. Mais le compilateur se plaint d'une variable statique non résolue "CCanvas::m_default_colors" (qu'est-ce que cela a à voir avec les couleurs ?).

le code est comme ceci

#include <Canvas\Canvas.mqh>

CCanvas canvas ;

int OnInit()
{
//CCanvas canvas ; si je le déclare ici, il se dessine mais alors comment le redessiner dans 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() ;
}

Comment négocier avec le compilateur ? Existe-t-il un exemple avec la toile en expert ?
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
Virty:

Je veux dessiner sur la toile dans Expert Advisor. Je veux que l'image sur le canevas soit redessinée dans OnInit, OnTimer, OnTick et dans onChartEvent. Je déclare CCanvas canvas dans des variables globales et j'appelle canvas.methods partout où je veux. Mais le compilateur se plaint de la déclaration globale non résolue

...

Comment négocier avec le compilateur ? Existe-t-il un exemple de canevas dans l'EA ?

Eh bien, vous n'êtes pas un débutant ! Publiez le code correctement !

 
DC2008:

Eh bien, vous n'êtes pas un débutant ! Publiez le code correctement !

Le code est juste là. Mais c'est bien pire à creuser. Et ça ne marche pas non plus. Erreur de variable statique non résolue 'CCanvas::m_default_colors' ProbeGraph.mq5 21 9

Et un tas de mandats concernant le chevauchement des variables de hauteur et de largeur. D'après ce que je comprends, le compilateur ne veut pas appeler le constructeur de la classe CCanvas dans les variables globales, mais veut appeler le constructeur à OnInit. Et puis comment faire référence à une instance de la classe en dehors de OnInit, je ne comprends pas.

De plus, avant, le corps de la fonction Draw était dans onInit, mais le Draw lui-même ne l'était pas. Tout a fonctionné, mais dans OnInit. J'ai déjà commencé à me tortiller ici, en essayant de passer une référence à une instance de la classe dans la fonction Draw, car les variables globales ne fonctionnent pas.

En général, le code est en cours d'écriture, le problème étant de créer une instance globale de la classe 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
 

Une chose que je n'arrive pas à comprendre : si le compilateur jure, pourquoi les erreurs ne sont-elles pas corrigées ? А ?

 
DC2008:

Une chose que je n'arrive pas à comprendre : si le compilateur jure, pourquoi les erreurs ne sont-elles pas corrigées ? А ?

Je ne sais pas comment le réparer. C'est pour ça que je demande.
 
//+------------------------------------------------------------------+
//|                                                   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:
J'ai copié le code proposé dans son intégralité. L'erreur est la même que pour la variable statique non résolue 'CCanvas::m_default_colors' prob1.mq5 21 9
 
Virty:
J'ai copié entièrement le code suggéré. L'erreur est la même que pour la variable statique non résolue 'CCanvas::m_default_colors' prob1.mq5 21 9

Je n'ai pas d'erreurs. La construction est la plus récente.

ProbeGraph

 
Virty:
J'ai copié le code proposé dans son intégralité. L'erreur est la même que pour la variable statique non résolue 'CCanvas::m_default_colors' prob1.mq5 21 9
L'erreur se trouve donc dans votre fichier prob1.mq5 .
Raison: