Texto dentro del indicador

 

¿Es posible ver un ejemplo de cómo insertar un texto dentro de un indicador (ventana separada)?

Gracias

 
supermagix   :

¿Es posible ver un ejemplo de cómo insertar un texto dentro de un indicador (ventana separada)?

Gracias


He intentado


if(ObjectFind(0,label_name)<0)
     {
      Print("Generating a label");
      ObjectCreate(0,label_name,OBJ_LABEL,0,0,0);           
      ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,10);
      ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,30);
      ObjectSetInteger(0,label_name,OBJPROP_COLOR,YellowGreen);
      ObjectSetString(0,label_name,OBJPROP_TEXT,"This is an example text inside chart window");
      ObjectSetString(0,label_name,OBJPROP_FONT,"Arial");
      ObjectSetInteger(0,label_name,OBJPROP_FONTSIZE,14);
      ObjectSetInteger(0,label_name,OBJPROP_SELECTABLE,false);
      ChartRedraw(0);                                      
     }
     
   int window=-1;
 
   if((ENUM_PROGRAM_TYPE)MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR)
     {
      window=ChartWindowFind();
      Print(window);
     }
     
     if(ObjectFind(window,label2_name)<0)
     {
      Print("Generating a label2");
      ObjectCreate(window,label2_name,OBJ_LABEL,0,0,0);       
      Print(GetLastError());    
      ObjectSetInteger(window,label2_name,OBJPROP_XDISTANCE,10);
      ObjectSetInteger(window,label2_name,OBJPROP_YDISTANCE,30);
      ObjectSetInteger(window,label2_name,OBJPROP_COLOR,YellowGreen);
      ObjectSetString(window,label2_name,OBJPROP_TEXT,"This is an example text inside indicator, cool, huh?");
      ObjectSetString(window,label2_name,OBJPROP_FONT,"Arial");
      ObjectSetInteger(window,label2_name,OBJPROP_FONTSIZE,14);
      ObjectSetInteger(window,label2_name,OBJPROP_SELECTABLE,false);
      ChartRedraw(window);                                      
     }


pero

ObjectCreate(window,label2_name,OBJ_LABEL,0,0,0); 


devuelve el error 4101


¿alguna idea? (MT5 build 237)

 
investeo   :


he probado



pero


devuelve el error 4101


¿alguna idea? (MT5 build 237)


Este es el resultado que aparece el texto:

http://clip2net.com/clip/m19204/1263295278-clip-38kb.png

solo en el gráfico pero no en el indicador.

Si alguien quiere que le ayude subo el código del indicador.

Acepto de buen grado las sugerencias y las modificaciones.....

Gracias investeo

Archivos adjuntos:
mycci.mq5  6 kb
 
supermagix   :


Este es el resultado que aparece el texto:

http://clip2net.com/clip/m19204/1263295278-clip-38kb.png

sólo en el gráfico pero no en el indicador.

Si alguien quiere que le ayude subo el código del indicador.

Acepto gustosamente sugerencias y modificaciones.....

Gracias investeo


Probé diferentes configuraciones resultó que CUALQUIER OBJETO no está permitido dentro de las ventanas del indicador en MT5


ver


https://www.mql5.com/en/docs/index


La sección de indicadores personalizados dice:


Elindicador personalizadoes un indicador técnico escrito de forma independiente, además de los ya integrados en el terminal del cliente. Al igual que los indicadores integrados, no pueden operar automáticamente y están destinados a la implementación de funciones analíticas solamente.

Los indicadores personalizados no pueden utilizar funciones para trabajar con los gráficos o los objetos del gráfico . Los indicadores personalizadosse almacenan en terminal_directory\MQL5\NIndicators


Por lo tanto, la única manera de poner texto en la ventana del indicador es mediante la configuración de su propiedad INDICATOR_SHORTNAME.


Por ejemplo

IndicatorSetString(INDICATOR_SHORTNAME, "Hola "+label2_name+"...");


Corrígeme si me equivoco.

Saludos cordiales

MQL5 Documentation
  • www.mql5.com
MQL5 Documentation
 
investeo:

Los indicadores personalizados no pueden utilizar funciones para trabajar con los gráficos o los objetos de los gráficos . Los indicadores personalizadosse almacenan en terminal_directory\MQL5\Indicators


Por el momento es posible. Pruebe por favor.
 

Te pido un favor: ¿podrías escribir un ejemplo?

Gracias

 
Rosh:
De momento es posible. Pruebe por favor.


Rosh, he intentado conseguirlo utilizando la compilación 238 pero aún no he tenido suerte. Este fragmento de código


#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_minimum 0
#property indicator_maximum 100


string label_name="mainwindow_label";
string label2_name="indicator_label";
int window=-1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
//---
    
   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
   
   if(ObjectFind(0,label_name)<0)
     {
      Print("Generating a label");
      ObjectCreate(0,label_name,OBJ_LABEL,0,0,0);           
      ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,10);
      ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,30);
      ObjectSetInteger(0,label_name,OBJPROP_COLOR,YellowGreen);
      ObjectSetString(0,label_name,OBJPROP_TEXT,"This is an example text inside chart window");
      ObjectSetString(0,label_name,OBJPROP_FONT,"Arial");
      ObjectSetInteger(0,label_name,OBJPROP_FONTSIZE,14);
      ObjectSetInteger(0,label_name,OBJPROP_SELECTABLE,false);
      ChartRedraw(0);                                      
     }
     
   
 
   if((ENUM_PROGRAM_TYPE)MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR)
     {
      window=ChartWindowFind();
      Print(window);
     }
     
     if(ObjectFind(window,label2_name)<0)
     {
      Print("Generating a label2");
      ObjectCreate(window,label2_name,OBJ_LABEL,0,0,0);       
      Print(GetLastError());    
      ObjectSetInteger(window,label2_name,OBJPROP_XDISTANCE,10);
      ObjectSetInteger(window,label2_name,OBJPROP_YDISTANCE,10);
      ObjectSetInteger(window,label2_name,OBJPROP_COLOR,YellowGreen);
      ObjectSetString(window,label2_name,OBJPROP_TEXT,"This is an example text inside indicator, cool, huh?");
      ObjectSetString(window,label2_name,OBJPROP_FONT,"Arial");
      ObjectSetInteger(window,label2_name,OBJPROP_FONTSIZE,14);
      ObjectSetInteger(window,label2_name,OBJPROP_SELECTABLE,false);
      ChartRedraw(window);                                      
     }
     
   IndicatorSetString(INDICATOR_SHORTNAME,"Hello "+label2_name+"...");
   
   return(rates_total);
}
  
void OnDeinit(const int reason)
{
   if(ObjectFind(0,label_name)>=0)
      ObjectDelete(0,label_name);
   if(ObjectFind(window,label2_name)>=0)
      ObjectDelete(window,label2_name);
      
}


intenta poner 2 objetos (etiquetas), uno en la ventana del gráfico principal y el segundo en la ventana del indicador.


if((ENUM_PROGRAM_TYPE)MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR)
     {
      window=ChartWindowFind();
      Print(window);
     }


La variable window está puesta a 1 para la ventana del indicador, y lo que veo cuando ejecuto el indicador es



Y


Print("Generating a label2");
      ObjectCreate(window,label2_name,OBJ_LABEL,0,0,0);       
      Print(GetLastError()); 


GetLastError devuelve el valor '4101'

 

Pruebe mi ejemplo de indicador

//+------------------------------------------------------------------+
//|                                       testObjectsInIndicator.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//---- plot Bollinger
#property indicator_label1  "BB High; BB Low"
#property indicator_type1   DRAW_FILLING
#property indicator_color1  Magenta,LimeGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      BBperiod=20;            // период BBands
input int      length=30;              // длина канала
input double   width=2.0;              // ширина BBands
input color    channelColor=Turquoise; // цвет канала
//--- indicator buffers
double         BollingerBuffer1[];
double         BollingerBuffer2[];
int handleBBands;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BollingerBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,BollingerBuffer2,INDICATOR_DATA);
   handleBBands=iBands(NULL,0,BBperiod,0,width,PRICE_CLOSE);
//---
   Print("Function ",__FUNCTION__,"  Build ",__MQ5BUILD__);
   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[])
  {
//---
   static int prevbars=-1;
//int bars=Bars(NULL,0);
   int copied=CopyBuffer(handleBBands,1,0,rates_total,BollingerBuffer1);
   if(copied<=0)
     {
      Print("Copying of indicator values failed");
      return(0);
     }

   copied=CopyBuffer(handleBBands,2,0,rates_total,BollingerBuffer2);
   if(copied<=0)
     {
      Print("Copying of indicator values failed");
      return(0);
     }
   if(prevbars!=rates_total)
     {
      prevbars=rates_total;
      ArraySetAsSeries(time,true);
      SetupChannel(time[length],time[1]);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetupChannel(datetime time1,datetime time2)
  {
   static string channelName="Channel";
   static string startLine="start";
   static string finishLine="finish";

   if(ObjectFind(0,channelName)<0)
     {
      Print("Channel not found, let's create it");
      if(!ObjectCreate(0,channelName,OBJ_STDDEVCHANNEL,0,0,0))
         Print("Channel creation failed error =",GetLastError());
      else
        {
         ObjectSetInteger(0,channelName,OBJPROP_COLOR,channelColor);
         Print("Set channel beginning at",time1);
         ObjectSetInteger(0,channelName,OBJPROP_TIME,0,time1);
         Print("Set channel finish at",time2);
         bool modified=ObjectSetInteger(0,channelName,OBJPROP_TIME,1,time2);
         if(!modified)
           {
            Print("Can not to set up time coordinates. Error",GetLastError());
           }
         Print("Move channel on background");
         ObjectSetInteger(0,channelName,OBJPROP_BACK,true);

        }
     }

   if(ObjectFind(0,startLine)<0)
     {
      Print("Линия start не найдена, создадим сами");
      if(!ObjectCreate(0,startLine,OBJ_VLINE,0,time1,0))
         Print("Не удалось создать линию startLine, error =",GetLastError());
     }
   if(ObjectFind(0,finishLine)<0)
     {
      Print("Линия finish не найдена, создадим сами");
      if(!ObjectCreate(0,finishLine,OBJ_VLINE,0,time2,0))
         Print("Не удалось создать линию finishLine, error =",GetLastError());
     }

  }
//+------------------------------------------------------------------+
 
Rosh:

Pruebe mi ejemplo de indicador



Su indicador funciona correctamente, pero traza los objetos en el gráfico principal, no en la ventana separada (queremos tener un objeto dibujado en la ventana separada del indicador). Cuando utilizo


#property indicator_separate_window


en lugar de


#property indicator_chart_window


(como en su ejemplo)


y pongo

ObjectCreate(1,startLine,OBJ_VLINE,0,time1,0)


me sale el siguiente error


2010.01.14 16:11:40     testObjectOnIndicator (EURUSD,M5)       Не удалось создать линию finishLine, error = 4101
2010.01.14 16:11:40     testObjectOnIndicator (EURUSD,M5)       Линия finish не найдена, создадим сами
2010.01.14 16:11:40     testObjectOnIndicator (EURUSD,M5)       Не удалось создать линию startLine, error = 4101
2010.01.14 16:11:40     testObjectOnIndicator (EURUSD,M5)       Линия start не найдена, создадим сами
2010.01.14 16:11:40     testObjectOnIndicator (EURUSD,M5)       Channel creation failed error = 4101
2010.01.14 16:11:40     testObjectOnIndicator (EURUSD,M5)       Channel not found, let's create it
2010.01.14 16:11:40     testObjectOnIndicator (EURUSD,M5)       Function  OnInit   Build  223


el primer parámetro ("1") del método Object Create es un valor devuelto por ChartWindowFind():



if((ENUM_PROGRAM_TYPE)MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR)
     {
      window=ChartWindowFind();
     }

):


como se sugiere aquí : https://www.mql5.com/en/docs/chart_operations/chartwindowfind

Documentation on MQL5: Chart Operations / ChartWindowFind
  • www.mql5.com
Chart Operations / ChartWindowFind - Documentation on MQL5
 
¿es posible ver un ejemplo de que las funciones?...... aplicadas a un indicador separado cualquier ? gracias
 
supermagix:
¿es posible ver un ejemplo de que las funciones?...... aplicadas a un indicador separado cualquier ? gracias
//+------------------------------------------------------------------+
//|                                       testObjectsInIndicator.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2009, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//---- plot Bollinger
#property indicator_label1  "BB High; BB Low"
#property indicator_type1   DRAW_FILLING
#property indicator_color1  Magenta,LimeGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      BBperiod=20;            // период BBands
input int      length=30;              // длина канала
input double   width=2.0;              // ширина BBands
input color    channelColor=Turquoise; // цвет канала
//--- indicator buffers
double         BollingerBuffer1[];
double         BollingerBuffer2[];
int            handleBBands;
//---
int            window=1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- get window number
   window=ChartWindowFind();
//--- indicator buffers mapping
   SetIndexBuffer(0,BollingerBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,BollingerBuffer2,INDICATOR_DATA);
   handleBBands=iBands(NULL,0,BBperiod,0,width,PRICE_CLOSE);
//---
   Print("Function ",__FUNCTION__,"  Build ",__MQ5BUILD__);
   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[])
  {
//---
   static int prevbars=-1;
//int bars=Bars(NULL,0);
   int copied=CopyBuffer(handleBBands,1,0,rates_total,BollingerBuffer1);
   if(copied<=0)
     {
      Print("Copying of indicator values failed");
      return(0);
     }

   copied=CopyBuffer(handleBBands,2,0,rates_total,BollingerBuffer2);
   if(copied<=0)
     {
      Print("Copying of indicator values failed");
      return(0);
     }
   if(prevbars!=rates_total)
     {
      prevbars=rates_total;
      ArraySetAsSeries(time,true);
      SetupChannel(time[length],time[1]);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetupChannel(datetime time1,datetime time2)
  {
   static string channelName="Channel";
   static string startLine="start";
   static string finishLine="finish";

   if(ObjectFind(0,channelName)<0)
     {
      Print("Channel not found, let's create it");
      if(!ObjectCreate(0,channelName,OBJ_STDDEVCHANNEL,window,0,0))
         Print("Channel creation failed error =",GetLastError());
      else
        {
         ObjectSetInteger(0,channelName,OBJPROP_COLOR,channelColor);
         Print("Set channel beginning at",time1);
         ObjectSetInteger(0,channelName,OBJPROP_TIME,0,time1);
         Print("Set channel finish at",time2);
         bool modified=ObjectSetInteger(0,channelName,OBJPROP_TIME,1,time2);
         if(!modified)
           {
            Print("Can not to set up time coordinates. Error",GetLastError());
           }
         Print("Move channel on background");
         ObjectSetInteger(0,channelName,OBJPROP_BACK,true);

        }
     }

   if(ObjectFind(0,startLine)<0)
     {
      Print("Линия start не найдена, создадим сами");
      if(!ObjectCreate(0,startLine,OBJ_VLINE,window,time1,0))
         Print("Не удалось создать линию startLine, error =",GetLastError());
     }
   if(ObjectFind(0,finishLine)<0)
     {
      Print("Линия finish не найдена, создадим сами");
      if(!ObjectCreate(0,finishLine,OBJ_VLINE,window,time2,0))
         Print("Не удалось создать линию finishLine, error =",GetLastError());
     }

  }
//+------------------------------------------------------------------+