Is possible to see an example of how to insert a text inside an indicator (separate window) ?
Thanks
i tried
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); }
but
ObjectCreate(window,label2_name,OBJ_LABEL,0,0,0);
returns error 4101
any ideas? (MT5 build 237)
i tried
but
returns error 4101
any ideas? (MT5 build 237)
http://clip2net.com/clip/m19204/1263295278-clip-38kb.png
only in the chart but not in the indicator.
If someone wants me to help do I upload the code of the indicator.
I gladly accept suggestions and modify.....
Thanks investeo
http://clip2net.com/clip/m19204/1263295278-clip-38kb.png
only in the chart but not in the indicator.
If someone wants me to help do I upload the code of the indicator.
I gladly accept suggestions and modify.....
Thanks investeo
I tried different configurations it turned out that ANY OBJECTS are not allowed inside indicator windows in MT5
see
https://www.mql5.com/en/docs/index
Custom Indicator section says:
Custom Indicator is a technical indicator written independently in addition to those already integrated into the client terminal. Like built-in indicators, they cannot trade automatically and are intended for implementing of analytical functions only.
Custom indicators can't use functions for working with charts or chart objects. Custom indicators are stored in terminal_directory\MQL5\Indicators
Therefore, only way to put text into indicator window is by settings its INDICATOR_SHORTNAME property.
e.g.
IndicatorSetString(INDICATOR_SHORTNAME,"Hello "+label2_name+"...");
Correct me if I am wrong.
best regards
Custom indicators can't use functions for working with charts or chart objects. Custom indicators are stored in terminal_directory\MQL5\Indicators
I ask you a favor: could you write an example?
Thanks
It's possible at the moment. Try please.
Rosh, I tried to achieve it using build 238 but still no luck. This fragment of code
#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); }
tries to put 2 objects (labels), one on main chart window and second on indicator window.
if((ENUM_PROGRAM_TYPE)MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR) { window=ChartWindowFind(); Print(window); }
window variable is set to 1 for indicator window, and what I see when I run the indicator is
And
Print("Generating a label2"); ObjectCreate(window,label2_name,OBJ_LABEL,0,0,0); Print(GetLastError());
GetLastError returns value '4101'
Try my indicator sample
//+------------------------------------------------------------------+ //| 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()); } } //+------------------------------------------------------------------+
Try my indicator sample
Your indicator works correctly, but it plots objects on the main chart, not on the separate window (we want to have an object drawn on separate indicator window). When I use
#property indicator_separate_window
instead of
#property indicator_chart_window
(as in your example)
and I set
ObjectCreate(1,startLine,OBJ_VLINE,0,time1,0)
I get the following error outputs
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
the first parameter ("1") in Object Create method is a value returned from ChartWindowFind():
if((ENUM_PROGRAM_TYPE)MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR) { window=ChartWindowFind(); }
):
as suggested here : https://www.mql5.com/en/docs/chart_operations/chartwindowfind
- www.mql5.com
//| 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());
}
}
//+------------------------------------------------------------------+
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Is possible to see an example of how to insert a text inside an indicator (separate window) ?
Thanks