Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 142

 
forexman77:

Ancora, avrò bisogno della variabile "st" non solo in Alert, ma anche per i calcoli, e quando si compila esce l'avviso "possibile perdita di dati a causa della conversione del tipo".

Suppongo che questo sia perché risulta essere un numero di 10 cifre, mentre il valore massimo in int è 2 147 483 647, attualmente ho 1 380 758 400. Forse ha senso usare il lungo, e probabilmente l'Expert Advisor consumerà molte risorse in questa parte?

Non capite il principio della conversione dei tipi? È così semplice:

int st=(int)tp[0];
 

Voglio disegnare su tela. Per avere un'immagine su tela ridisegnata in OnInit, OnTimer, OnTick e in onChartEvent. Dichiaro CCanvas canvas in variabili globali e chiamo canvas.methods ovunque io voglia. Ma il compilatore si lamenta della variabile statica irrisolta 'CCanvas::m_default_colors' (cosa ha a che fare con i colori?)

il codice è come questo

#include <Canvas\Canvas.mqh>

Tela CCanvas;

int OnInit()
{
//CCanvas canvas; se lo dichiaro qui, disegna ma poi come lo ridisegno in 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();
}

Come posso negoziare con il compilatore? C'è un esempio con la tela in esperto?
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
Virty:

Voglio disegnare su tela in Expert Advisor. Voglio che l'immagine sulla tela sia ridisegnata in OnInit, OnTimer, OnTick e in onChartEvent. Dichiaro CCanvas canvas in variabili globali e chiamo canvas.methods ovunque io voglia. Ma il compilatore si lamenta della dichiarazione globale non risolta

...

Come si negozia con il compilatore? C'è un esempio con la tela in EA?

Beh, non sei un principiante! Pubblicare il codice correttamente!

 
DC2008:

Beh, non sei un principiante! Pubblicare il codice correttamente!

Il codice è proprio qui. Ma c'è molto di peggio da scavare. E non funziona nemmeno. Errore nella variabile statica non risolta 'CCanvas::m_default_colors' ProbeGraph.mq5 21 9

E un mucchio di garanzie sulla sovrapposizione di variabili di altezza e larghezza. Per quanto ho capito, il compilatore non vuole chiamare il costruttore della classe CCanvas nelle variabili globali, ma vuole chiamare il costruttore a OnInit. E poi come fare riferimento a un'istanza della classe al di fuori di OnInit, non capisco.

Inoltre, prima, il corpo della funzione Draw era dentro onInit, ma il Draw stesso non lo era. Tutto ha funzionato, ma dentro OnInit. Ho già iniziato a girare qui, cercando di passare un riferimento a un'istanza della classe nella funzione Draw, perché le variabili globali non funzionano.

In generale, il codice è stato scritto, il problema con la creazione di un'istanza globale della 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
 

Una cosa non riesco a capire: se il compilatore giura, perché gli errori non vengono corretti? А?

 
DC2008:

Una cosa non riesco a capire: se il compilatore giura, perché gli errori non vengono corretti? А?

Non so come aggiustarlo, è per questo che lo chiedo.
 
//+------------------------------------------------------------------+
//|                                                   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:
Copiato il codice suggerito per intero. L'errore è lo stesso della variabile statica non risolta 'CCanvas::m_default_colors' prob1.mq5 21 9
 
Virty:
Copiato completamente il codice suggerito. L'errore è lo stesso della variabile statica non risolta 'CCanvas::m_default_colors' prob1.mq5 21 9

Non ho nessun errore. La build è l'ultima.

ProbeGraph

 
Virty:
Copiato il codice suggerito per intero. L'errore è lo stesso della variabile statica non risolta 'CCanvas::m_default_colors' prob1.mq5 21 9
quindi l'errore è nel tuo file prob1.mq5 .
Motivazione: