Texto dentro del indicador - página 5

 

Gracias wald99 : lo estoy intentando.

Sugeriría a Metaquotes la creación de un curso que parta de las bases (sintaxis), también con algún vídeo si es posible, de forma específica para mq5: esto es muy útil para los que se inician en la programación.

Creo que mucha gente está interesada en MT5 pero no sabe programar.
 
walb99:

Hola Investeo

muchas gracias, tu código funciona, es decir, la etiqueta aparece, pero el valor no se actualiza. ¿He cometido un error?

Aquí está mi código.


walb99,


Intenta esto. El problema era que intentaba actualizar el valor sólo si el objeto label no estaba disponible. He añadido el timestamp a la etiqueta, para que puedas ver la actualización del tiempo con cada 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,


Intenta esto. El problema era que intentabas actualizar el valor sólo si el objeto etiqueta no estaba disponible. He añadido el timestamp a la etiqueta, para que puedas ver la actualización del tiempo con cada tick.


Gracias, esto funciona

si pongo también información sobre el color de la etiqueta en los corchetes, el color de la etiqueta también se actualiza correctamente.

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

¿dónde se asigna el nombre del objeto en el ejemplo de rsi? He leído todo el código pero no lo entiendo,

Sólo quiero poner un texto simple en las ventanas del indicador, sólo que no puedo obtener el mismo resultado que el ejemplo RSI arriba

Mi código :

//+------------------------------------------------------------------+
//|                                                    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);
  }
//+------------------------------------------------------------------+

resultado :

 

ok, creo que he conseguido que funcione solo mostrando el texto, lo siguiente será trabajar con el indicador. pero ¿alguien puede decirme por qué no puedo usar obj_label en lugar de obj_text para hacer que muestre el texto?

//+------------------------------------------------------------------+
//|                                                   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);
  } */