Est-il possible de voir un exemple d'insertion de texte dans un indicateur (fenêtre séparée) ?
Merci
J'ai essayé
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); }
mais
ObjectCreate(window,label2_name,OBJ_LABEL,0,0,0);
Retourne l'erreur 4101
des idées ? (MT5 build 237)
J'ai essayé
mais
renvoie l'erreur 4101
des idées ? (MT5 build 237)
http://clip2net.com/clip/m19204/1263295278-clip-38kb.png
seulement dans le graphique mais pas dans l'indicateur.
Si quelqu'un veut que je l'aide, je télécharge le code de l'indicateur.
J'accepte volontiers les suggestions et les modifications.....
Merci investeo
http://clip2net.com/clip/m19204/1263295278-clip-38kb.png
seulement dans le graphique mais pas dans l'indicateur.
Si quelqu'un veut que je l'aide, je télécharge le code de l'indicateur.
J'accepte volontiers les suggestions et les modifications.....
Merci investeo
J'ai essayé différentes configurations, il s'est avéré que TOUT OBJET n'est pas autorisé dans la fenêtre de l'indicateur dans MT5.
voir
https://www.mql5.com/en/docs/index
La section sur les indicateurs personnalisés dit :
Unindicateur personnaliséest un indicateur technique écrit indépendamment en plus de ceux déjà intégrés dans le terminal client. Comme les indicateurs intégrés, ils ne peuvent pas trader automatiquement et sont destinés à la mise en œuvre de fonctions analytiques uniquement.
Les indicateurs personnalisés ne peuvent pas utiliser de fonctions pour travailler avec des graphiques ou des objets graphiques . Les indicateurs personnalisés sont stockés dans lerépertoire terminal_directory\MQL5\Indicators
Par conséquent, la seule façon d'insérer du texte dans la fenêtre de l'indicateur est de définir sa propriété INDICATOR_SHORTNAME.
Par exemple
IndicatorSetString(INDICATOR_SHORTNAME, "Bonjour "+label2_name+"...") ;
Corrigez-moi si je me trompe.
Meilleures salutations
Les indicateurs personnalisés ne peuvent pas utiliser de fonctions pour travailler avec des graphiques ou des objets graphiques . Les indicateurs personnalisés sont stockés dans lerépertoire terminal_directory\MQL5\Indicators.
C'est possible pour le moment. Essayez s'il vous plaît.
Rosh, j'ai essayé de le réaliser en utilisant le build 238 mais toujours pas de chance. Ce fragment de 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); }
essaie de mettre 2 objets (labels), un sur la fenêtre principale du graphique et le second sur la fenêtre de l'indicateur.
if((ENUM_PROGRAM_TYPE)MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR) { window=ChartWindowFind(); Print(window); }
La variable window est définie à 1 pour la fenêtre de l'indicateur, et ce que je vois quand je lance l'indicateur est le suivant
Et
Print("Generating a label2"); ObjectCreate(window,label2_name,OBJ_LABEL,0,0,0); Print(GetLastError());
GetLastError renvoie la valeur '4101'.
Essayez mon exemple d'indicateur
//+------------------------------------------------------------------+ //| 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()); } } //+------------------------------------------------------------------+
Essayez mon exemple d'indicateur
Votre indicateur fonctionne correctement, mais il trace les objets sur le graphique principal, pas sur la fenêtre séparée (nous voulons avoir un objet dessiné sur la fenêtre séparée de l'indicateur). Lorsque j'utilise
#property indicator_separate_window
au lieu de
#property indicator_chart_window
(comme dans votre exemple)
et que je mets
ObjectCreate(1,startLine,OBJ_VLINE,0,time1,0)
j'obtiens les sorties d'erreur suivantes
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
le premier paramètre ("1") de la méthode Object Create est une valeur renvoyée par ChartWindowFind() :
if((ENUM_PROGRAM_TYPE)MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR) { window=ChartWindowFind(); }
) :
comme suggéré ici : 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());
}
}
//+------------------------------------------------------------------+

- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
Est-il possible de voir un exemple d'insertion de texte dans un indicateur (fenêtre séparée) ?
Merci