Text im Indikator

 

Ist es möglich, ein Beispiel zu sehen, wie man einen Text innerhalb eines Indikators (separates Fenster) einfügt?

Danke

 
supermagix   :

Ist es möglich, ein Beispiel zu sehen, wie man einen Text innerhalb eines Indikators (separates Fenster) einfügt?

Danke


Ich habe versucht


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


aber

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


gibt Fehler 4101 zurück


irgendwelche Ideen? (MT5 Build 237)

 
investeo   :


Ich habe versucht



aber


gibt Fehler 4101 zurück


irgendwelche Ideen? (MT5 Build 237)


Dies ist das Ergebnis der Text erscheint:

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

nur im Chart aber nicht im Indikator.

Wenn jemand will, dass ich helfen, lade ich den Code des Indikators.

Ich akzeptiere gerne Vorschläge und modifizieren.....

Vielen Dank investeo

Dateien:
mycci.mq5  6 kb
 
supermagix   :


Dies ist das Ergebnis der Text erscheint:

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

nur im Chart, aber nicht im Indikator.

Wenn jemand will, dass ich helfen, lade ich den Code des Indikators.

Anregungen und Änderungen nehme ich gerne entgegen.....

Danke investeo


Ich habe verschiedene Konfigurationen ausprobiert und es stellte sich heraus, dass KEINE OBJEKTE innerhalb der Indikatorfenster in MT5 erlaubt sind


siehe


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


Abschnitt Benutzerdefinierter Indikator sagt:


Einbenutzerdefinierter Indikatorist ein technischer Indikator, der unabhängig von den bereits im Client-Terminal integrierten Indikatoren geschrieben wurde. Wie die eingebauten Indikatoren können sie nicht automatisch handeln und sind nur für die Implementierung von analytischen Funktionen gedacht.

Benutzerdefinierte Indikatoren können keine Funktionen für die Arbeit mit Charts oder Chart-Objekten verwenden. Benutzerdefinierte Indikatoren werden imterminal_directory\MQL5\Indicatorsgespeichert


Daher ist die einzige Möglichkeit, Text in das Indikatorfenster zu schreiben, die Einstellung der Eigenschaft INDICATOR_SHORTNAME.


z.B.

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


Korrigieren Sie mich, wenn ich falsch liege.

Mit freundlichen Grüßen

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

Benutzerdefinierte Indikatoren können keine Funktionen für die Arbeit mit Charts oder Chart-Objekten verwenden. Benutzerdefinierte Indikatoren werden imterminal_directory\MQL5\Indicatorsgespeichert .


Im Moment ist es möglich. Versuchen Sie es bitte.
 

Ich bitte Sie um einen Gefallen: Könnten Sie ein Beispiel schreiben?

Danke

 
Rosh:
Im Moment ist es noch möglich. Bitte versuchen Sie es.


Rosh, ich habe versucht, es mit Build 238 zu erreichen, aber immer noch kein Glück. Dieses Fragment des Codes


#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);
      
}


versucht, 2 Objekte (Labels) zu platzieren, eines im Hauptdiagrammfenster und das zweite im Indikatorfenster.


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


Die Fenstervariable ist für das Indikatorfenster auf 1 gesetzt, und was ich sehe, wenn ich den Indikator ausführe, ist



Und


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


GetLastError gibt den Wert '4101' zurück.

 

Probieren Sie meinen Indikator aus

//+------------------------------------------------------------------+
//|                                       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:

Versuchen Sie mein Indikatorbeispiel



Ihr Indikator funktioniert korrekt, aber er zeichnet Objekte auf dem Hauptdiagramm und nicht auf dem separaten Fenster (wir wollen ein Objekt auf dem separaten Indikatorfenster zeichnen lassen). Wenn ich


#property indicator_separate_window


anstelle von


#property indicator_chart_window


(wie in Ihrem Beispiel)


und ich setze

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


erhalte ich die folgenden Fehlermeldungen


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


der erste Parameter ("1") in der Methode Object Create ist ein Wert, der von ChartWindowFind() zurückgegeben wird:



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

):


wie hier vorgeschlagen: https://www.mql5.com/en/docs/chart_operations/chartwindowfind

Documentation on MQL5: Chart Operations / ChartWindowFind
  • www.mql5.com
Chart Operations / ChartWindowFind - Documentation on MQL5
 
ist möglich, ein Beispiel zu sehen, dass Funktionen?...... auf einen separaten Indikator angewendet jede?
 
supermagix:
ist möglich, ein Beispiel zu sehen, dass Funktionen?...... auf einen separaten Indikator angewendet jede?
//+------------------------------------------------------------------+
//|                                       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());
     }

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