Graphische Panels im MT5

Einloggen oder registrieren, um einen Kommentar zu schreiben
amando
2873
amando  

Hallo,


das die GUI Möglichkeiten im MT5 ja sehr begrenzt sind ist ja schon seit längeren klar.

Auch die Trennung mit den verschiedenen Möglichkeiten zwischen EA und Indikator sind mühsam.


in einem Indicator kann ich keine Trade befehle ausführen oder Order setzen.

In einem EA kann ich die Buttons nicht in ein Subwindow schieben




ich hab hier 2 relativ gleiche Panales,

das obere als EA, das untere als Indicator in einem Subwindow, in diesem Fall 2


ich versuche, die Button vom EA auch in einem Subwindow darzustellen, aber das bekomme ich nicht hin

bei der Erstellung kann ich ja das ja nicht in den #property einstellen


in der OnInit läuft das so ab

      if(!TradePanel.Create(ChartID(),"Trade Panel",Hier steht das Subwindow,0,high-panelhigh,width,high))
         return(INIT_FAILED);
      TradePanel.Run();


das ganze greift auf die 

class CTradePanel  : public CAppDialog

zu,


hier steht drin

class CPanel : public CWndObj
  {
private:
   CChartObjectRectLabel m_rectangle;       // chart object
   //--- parameters of the chart object
   ENUM_BORDER_TYPE  m_border;              // border type

public:
                     CPanel(void);
                    ~CPanel(void);
   //--- create
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
   //--- parameters of the chart object
   ENUM_BORDER_TYPE  BorderType(void)       const { return(m_border);                                  }
   bool              BorderType(const ENUM_BORDER_TYPE type);

protected:
   //--- handlers of object settings
   virtual bool      OnSetText(void)              { return(m_rectangle.Description(m_text));           }
   virtual bool      OnSetColorBackground(void)   { return(m_rectangle.BackColor(m_color_background)); }
   virtual bool      OnSetColorBorder(void)       { return(m_rectangle.Color(m_color_border));         }
   //--- internal event handlers
   virtual bool      OnCreate(void);
   virtual bool      OnShow(void);
   virtual bool      OnHide(void);
   virtual bool      OnMove(void);
   virtual bool      OnResize(void);
   virtual bool      OnChange(void);
  };


geht das etwa gar nicht bei EA, das ich die Button in ein Sub Window auslagere?

bzw, wenns geht wie? eine Sub Window ID eintragen geht mal nicht, auch -1 geht nicht, das war auch schon eine Idee


warum das ganze?

wenn ich die Button im Hauptfenster habe, muss ich den Chart immer zusammenschieben, das verzerrt den ganzen Chart


hoffe ich hab das Problem ausreichend erklärt


lg

amando

Carl Schreiber
Moderator
9791
Carl Schreiber  

Huuch?

ObjectCreate() hat doch die Möglichkeit ein gr. Objekt in einem Unterfenster zu erstellen:

sub_window

[in]  Nummer des Subfensters des Charts. Das angegebene Subfenster muss existieren, anderenfalls gibt die Funktion false zurück. .

Man müsste halt vorher prüfen ob es existiert.

amando
2873
amando  
Carl Schreiber:

Huuch?

ObjectCreate() hat doch die Möglichkeit ein gr. Objekt in einem Unterfenster zu erstellen:

Man müsste halt vorher prüfen ob es existiert.

Ja, aber das geht scheinbar nur bei indicatoren

Otto Pauser
2165
Otto Pauser  

Das Problem liegt hier bei CAppDialog().

Da müsstest du tief in die Systemlibrary reingreifen. CAppDialog() unterscheidet zwischen EA, Indicator und Script.

Wenn du einen Dialog in einem Subwindow erstellst, wird der Dialog über das ganze Subwindow gepappt. Frag MQ warum, ich frag mich da schon lang nix mehr.

ObjectCreate() kann durchaus in einem Subwindow grafische Objekte erzeugen.

Eine schnelle Lösung wäre: Chart duplizieren ,einen 'abdocken' und dort das Panel einfügen.

amando
2873
amando  

Hab da mal eine neue Frage, wie Christian ja schon geschrieben hat, funktioniert das aus dem Indicator Window heraus, wenn man den Object Button erzeugt.

das ganze geht eigentlich relativ gut, das hab ich mir dort ausgeborgt 

https://www.mql5.com/de/articles/2720


das Objekt erzeuge ich über eine Text Datei. In dieser habe ich mal die Symbole abgespeichert und diese werden auch in den Array geschrieben

mal der Inhalt der txt Datei

EURUSD

GBPUSD

AUDUSD

GBPJPY

USDJPY

US30


also nix aufregendes, einfach nur die Symbole


die lese ich in den Array lines welchen ich im Public Teil des Codes definiert habe um den Zugriff zu erleichtern

string lines[];

hoffe das ist kein Schwerverbrechen, den Array als string zu definieren, aber es funktioniert

dann gehe ich her und will baue mir meine Button anhand des Array


   if(!ReadFileToArray(FileNamePair,lines))
     {
      Alert("Error, see the \"Experts\" tab for details");
     }
   else
     {
      for(int i=0;i<ArraySize(lines);i++)
        {
         ButtonCreate(0,"Cross"+(string)i,SubWin,InpXdistance*(i+1)+ButtonWidth*(i),TopDistance*2+ButtonHigh*1,ButtonWidth,ButtonHigh,CORNER_LEFT_UPPER,lines[i],"Arial",FontSize,clrWhite,clrBlack,clrNONE,false,false,false,true,0);
        }

auch das funktioniert Problemlos, ist auch wesentlich einfacher als das ganze starr zu codieren

sieht dann so aus, die 2te Zeile ist es


nur jetzt hab ich das Problem,

wie erzeuge ich die OnChartEvent? beim Sell Button steht das so drin, damit ich es testen konnte ob die Werte richtig übernommen wurden

#

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {


   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      if(sparam=="Sell") {Print(ArraySize(lines));            ObjectSetInteger(0,"Sell",OBJPROP_STATE,false); }

     }




  }


wie kann ich hier die richtige Anzahl und den Namen der Button identifizieren wenn ich ihn drücke mit der Maus?

Muss ich den woanders zuerst identifizieren?


PS: ich habs auch versucht mit der Class Button zu arbeiten, aber da komme ich gar nicht zusammen. Und wenn man hier im Forum sucht oder in den Artikeln, dann ist klar, das hier keiner die Button.mqh verwendet

MQL5 Grundlagen der Programmierung: Dateien
MQL5 Grundlagen der Programmierung: Dateien
  • www.mql5.com
Wie viele andere Programmiersprachen besitzt auch MQL5 Funktionen für das Arbeiten mit Dateien. Das Arbeiten mit Dateien ist zwar keine sehr häufige Aufgabe bei der Entwicklung von MQL5 Expert Advisors und Indikatoren, aber jeder Entwickler wird früher oder später damit konfrontiert. Die Palette der Themen, die das Arbeiten mit Dateien...
amando
2873
amando  

danke, Problem gelöst, habs selbst gefunden


      string Objekt = sparam;      
      if(sparam == Objekt) { Print(ObjectGetString(0,Objekt,OBJPROP_TEXT,0) );  ObjectSetInteger(0,Objekt,OBJPROP_STATE,false); }
      
Christian
3160
Christian  
amando:

danke, Problem gelöst, habs selbst gefunden


:-) ...trick 17 mit selbstüberlistung ....
Einloggen oder registrieren, um einen Kommentar zu schreiben