É possível ver um exemplo de como inserir um texto dentro de um indicador (janela separada) ?
Obrigado
eu tentei
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); }
mas
ObjectCreate(window,label2_name,OBJ_LABEL,0,0,0);
erro de retorno 4101
alguma idéia? (MT5 build 237)
eu tentei
mas
erro de retorno 4101
alguma idéia? (MT5 build 237)
http://clip2net.com/clip/m19204/1263295278-clip-38kb.png
somente no gráfico, mas não no indicador.
Se alguém quiser que eu ajude, eu carrego o código do indicador.
Aceito de bom grado sugestões e modifico.....
Obrigado investeo
http://clip2net.com/clip/m19204/1263295278-clip-38kb.png
somente no gráfico, mas não no indicador.
Se alguém quiser que eu ajude, eu carrego o código do indicador.
Aceito de bom grado sugestões e modifico.....
Obrigado investeo
Tentei configurações diferentes e descobri que QUALQUER OBJETIVO não é permitido dentro das janelas indicadoras no MT5.
ver
https://www.mql5.com/en/docs/index
A seção Indicador personalizado diz:
Custom Indicator éum indicador técnico escrito independentemente, além daqueles já integrados no terminal do cliente. Como os indicadores integrados, eles não podem ser comercializados automaticamente e são destinados apenas à implementação de funções analíticas.
Os indicadores personalizados não podem usar funções para trabalhar com gráficos ou objetos gráficos . Osindicadores personalizados são armazenados no diretório_de_indicadores do terminal\MQL5\Indicadores
Portanto, a única forma de colocar texto na janela indicadora é através de ajustes de sua propriedade INDICADOR_SHORTNAME.
por exemplo
IndicatorSetString(INDICADOR_SHORTNAME, "Olá "+label2_name+"...");
Corrija-me se eu estiver errado.
melhores cumprimentos
Os indicadores personalizados não podem usar funções para trabalhar com gráficos ou objetos gráficos . Indicadores personalizados são armazenados nodiretório_de_indicadores do terminal\MQL5\Indicadores
Eu lhe peço um favor: você poderia escrever um exemplo?
Obrigado
Isso é possível no momento. Tente, por favor.
Rosh, tentei alcançá-lo usando o build 238, mas ainda não tive sorte. 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); }
tenta colocar 2 objetos (rótulos), um na janela principal do gráfico e o segundo na janela indicadora.
if((ENUM_PROGRAM_TYPE)MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR) { window=ChartWindowFind(); Print(window); }
A variável janela é definida como 1 para janela indicadora, e o que vejo quando corro o indicador é
E
Print("Generating a label2"); ObjectCreate(window,label2_name,OBJ_LABEL,0,0,0); Print(GetLastError());
GetLastError retorna o valor '4101'.
Experimente minha amostra indicadora
//+------------------------------------------------------------------+ //| 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()); } } //+------------------------------------------------------------------+
Experimente minha amostra indicadora
Seu indicador funciona corretamente, mas ele traça os objetos no gráfico principal, não na janela separada (queremos que um objeto seja desenhado em uma janela indicadora separada). Quando eu uso
#property indicator_separate_window
em vez de
#property indicator_chart_window
(como em seu exemplo)
e eu estabeleço
ObjectCreate(1,startLine,OBJ_VLINE,0,time1,0)
Recebo as seguintes saídas de erro
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
o primeiro parâmetro ("1") no método Object Create é um valor retornado de ChartWindowFind():
if((ENUM_PROGRAM_TYPE)MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR) { window=ChartWindowFind(); }
):
como sugerido aqui : 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());
}
}
//+------------------------------------------------------------------+
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
É possível ver um exemplo de como inserir um texto dentro de um indicador (janela separada) ?
Obrigado