Testo all'interno dell'indicatore - pagina 5

 

Grazie wald99 : ci sto provando.

Suggerirei a Metaquotes la creazione di un corso che parta dalle basi (sintassi), anche con qualche video se possibile, di specifico per mq5: questo è molto utile per chi inizia a programmare.

Penso che molte persone siano interessate a MT5 ma non sappiano programmare.
 
walb99:

Ciao Investeo

molte grazie, il tuo codice funziona, cioè l'etichetta appare, ma il valore non si aggiorna. Ho fatto un errore?

Ecco il mio codice.


walb99,


Prova questo. Il problema era che hai cercato di aggiornare il valore solo se l'oggetto etichetta non era disponibile. Ho aggiunto il timestamp all'etichetta, così puoi vedere il tempo che si aggiorna ad ogni tick.


int OnCalculate(        const int rates_total,
                                                const int prev_calculated,
                                                const datetime &time[],
                                                const double &open[],
                                                const double &high[],
                                                const double &low[],
                                                const double &close[],
                                                const long &tick_volume[],
                                                const long &volume[],
                                                const int &spread[])
{
        int limit;
        if (CountBars >= rates_total) limit = 0; else limit = rates_total - CountBars; 
        

        CopyBuffer(ma1_handle, 0, 0, rates_total, MA1TempBuffer);
        

        for (int i = rates_total - 1; i > limit; i--)
        {
                MA1Buffer[i] = MA1TempBuffer[i];
           double myMA_now = MA1TempBuffer[i];
                double myMA_previous = MA1TempBuffer[i - 1]; //MA One bar ago
                
                
                 
                if (myMA_now >= myMA_previous) MA1ColorBuffer[i] = 0;
                else if (myMA_now < myMA_previous) MA1ColorBuffer[i] = 1;
                        
        }
                

        myMAnow=MA1TempBuffer[rates_total-1-MA1_Shift]; 
       // myMAnow=MA1TempBuffer[rates_total - 1]; 
        


          
   myPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   
   if(myPrice>myMAnow)label_color=Lime;  else label_color=Red; 

   
   


  // check if label object does not already exist and create it
 
  if(ObjectFind(0,label_info)<0)
  {
      // Create label in indicator's window 
      ObjectCreate(0,label_info,OBJ_LABEL,window,0,0); 
        // Set X and Y distance from UPPER RIGHT CORNER      
      ObjectSetInteger(0,label_info,OBJPROP_XDISTANCE,200);
      ObjectSetInteger(0,label_info,OBJPROP_YDISTANCE,20);
       ObjectSetInteger(0,label_info,OBJPROP_CORNER, CORNER_RIGHT_UPPER); 
          
       // Set text properties: colour, font and font size
      ObjectSetInteger(0,label_info,OBJPROP_COLOR,label_color);
      ObjectSetString(0,label_info,OBJPROP_FONT,"Arial");
      ObjectSetInteger(0,label_info,OBJPROP_FONTSIZE,14);   
    
       // Set text to display
      ObjectSetString(0,label_info,OBJPROP_TEXT,DoubleToString(myMAnow,nDigits));

      
     
  } else 
  {
      ObjectSetString(0,label_info,OBJPROP_TEXT,TimeToString(TimeCurrent(), TIME_SECONDS)+" "+DoubleToString(myMAnow,nDigits));
  }; 
  

 
        return(rates_total);
}
  
 
investeo:


walb99,


Prova questo. Il problema era che si cercava di aggiornare il valore solo se l'oggetto etichetta non era disponibile. Ho aggiunto il timestamp all'etichetta, così puoi vedere il tempo che si aggiorna ad ogni tick.


Grazie, questo funziona

se metto anche le informazioni sul colore dell'etichetta nelle parentesi, anche il colore dell'etichetta viene aggiornato correttamente.

 } else 
  {
      ObjectSetInteger(0,label_info,OBJPROP_COLOR,label_color);
      ObjectSetString(0,label_info,OBJPROP_TEXT,TimeToString(TimeCurrent(), TIME_SECONDS)+" "+DoubleToString(myMAnow,nDigits));
  }; 
  
 

dove si assegna il nome dell'oggetto nell'esempio rsi di cui sopra? Ho letto tutto il codice ma non capisco,

Voglio solo mettere un semplice testo nelle finestre dell'indicatore, ma non riesco ad ottenere lo stesso risultato come nell'esempio RSI qui sopra

Il mio codice :

//+------------------------------------------------------------------+
//|                                                    text win .mq5 |
//|                                           Copyright CREATE BY DK |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "CREATE BY DK"
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot mv1
#property indicator_label1  "mv1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      mv1=20;
//--- indicator buffers
double         mv1Buffer[];
int      mahandle;

string objectname = "text";
int windows;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,mv1Buffer,INDICATOR_DATA);
   windows = ChartWindowFind(0,objectname);
  
  // IndicatorSetString(INDICATOR_SHORTNAME,"Text window");

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
//---
int i ;
i=rates_total;
mahandle = iMA(NULL,PERIOD_CURRENT,mv1,0,MODE_SMA,PRICE_CLOSE);
if (CopyBuffer(mahandle,0,0,rates_total,mv1Buffer)<=0)
{
Print("getting errors somewhere",GetLastError());
return(0);
}

ObjectCreate(0,objectname,OBJ_TEXT,windows,0,0);
ObjectSetString(0,objectname,OBJPROP_TEXT,"check it out");
ObjectSetInteger(0,objectname,OBJPROP_COLOR,Red);
//ObjectSetInteger(0,objectname,OBJPROP_XDISTANCE,1480);
//ObjectSetInteger(0,objectname,OBJPROP_YDISTANCE,100);
ObjectSetString(0,"Name",OBJPROP_FONT,"Arial");
   ObjectSetInteger(0,"Name",OBJPROP_FONTSIZE,20);
   ObjectSetInteger(0,"Name",OBJPROP_XDISTANCE,1480);
   ObjectSetInteger(0,"Name",OBJPROP_YDISTANCE,450);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

risultato :

 

Ok, penso di averlo fatto funzionare solo mostrando il testo, poi lavorerò con l'indicatore. ma qualcuno può dirmi perché non posso usare obj_label invece di obj_text per fargli visualizzare il testo?

//+------------------------------------------------------------------+
//|                                                   text win 2.mq5 |
//|                                           Copyright CREATE BY DK |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "CREATE BY DK"
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_plots 1

string ddock = "try it out";
int windows = -1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
/*
if ((ENUM_PROGRAM_TYPE)MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR)
windows=ChartWindowFind();


if (ObjectFind(0,ddock)<0)
{
   ObjectCreate(0,ddock,OBJ_LABEL,windows,0,0);
   ObjectSetInteger(0,ddock,OBJPROP_XDISTANCE,200);
   ObjectSetInteger(0,ddock,OBJPROP_YDISTANCE,20);
   ObjectSetInteger(0,ddock,OBJPROP_CORNER, CORNER_RIGHT_UPPER);
   ObjectSetInteger(0,ddock,OBJPROP_COLOR,LightBlue);
   ObjectSetString(0,ddock,OBJPROP_FONT,"Arial");
   ObjectSetInteger(0,ddock,OBJPROP_FONTSIZE,14);
   ObjectSetString(0,ddock,OBJPROP_TEXT, "TRYING VERY HARD");
}
else
Print("ddock already exists");
*/

/*
  if((ENUM_PROGRAM_TYPE)MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR)
     windows=ChartWindowFind();
*/

  // check if label object does not already exist and create it
  if(ObjectFind(0,ddock)<0)
  {
      // Create label in indicator's window
      ObjectCreate(0,ddock,OBJ_TEXT,windows,0,0);        
      // Set X and Y distance from UPPER RIGHT CORNER
      ObjectSetInteger(0,ddock,OBJPROP_XDISTANCE,200);
      ObjectSetInteger(0,ddock,OBJPROP_YDISTANCE,20);
      ObjectSetInteger(0,ddock,OBJPROP_CORNER, CORNER_RIGHT_UPPER);
      // Set text properties: colour, font and font size
      ObjectSetInteger(0,ddock,OBJPROP_COLOR,LightPink);
      ObjectSetString(0,ddock,OBJPROP_FONT,"Arial");
      ObjectSetInteger(0,ddock,OBJPROP_FONTSIZE,14);
      // Set text to display
      ObjectSetString(0,ddock,OBJPROP_TEXT,"TRYING VERY HARD");
  } else Print("ddock already exists");
  

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
//---
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
/* void OnDeinit(const int reason)
{
if (!ObjectFind(0,ddock)<0)
ObjectDelete(0,ddock);
}
/* void OnDeinit(const int reason)
  {
//---
  if(!ObjectFind(0,ddock)<0)
      ObjectDelete(0, ddock);
  } */