Attribut ist immer static?

Einloggen oder registrieren, um einen Kommentar zu schreiben
Eidechse
13
Eidechse  

Hallo zusammen,

ich bin gerade neu mit MQL4 angefangen (Bisher Java) und möchte mir einen eigenen EA basteln. Dieser soll in einem CAppDialog mehrere Buttons enthalten, die im Grunde das gleiche tun: Eine Order eröffnen zu einem Unterschiedlichen Preis. Dazu soll der Preis an den Button geknüpft sein. Allerdings habe ich das Problem, dass das Attribut in der Klasse static zu sein scheint und alle den Buttons den gleichen Wert haben. Wer kann mir weiterhelfen, was ich falsch gemacht habe?

Hier die Klasse des Buttons:

class OrderButton : public CButton {
   public:
      double preis;
   
      OrderButton();
      ~OrderButton();
      virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
      void setPreis(double r);
      double getPreis(void);
};

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
OrderButton::OrderButton() {
   
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
OrderButton::~OrderButton() {

}

bool OrderButton::Create(const long chart,const string id,const int subwin,const int x1,const int y1,const int x2,const int y2) {
 
   if(!CButton::Create(chart,id,subwin,x1,y1,x2,y2)) 
      return(false); 
//--- succeed 
   return(true); 
   
}

void OrderButton::setPreis(double r){
   preis = r;
   
}

double OrderButton::getPreis(void){
   return preis;
}
}



Und so würde ich die Buttons gerne erzeugen und auf den Dialog adden:

for(int i = 0; i <= 9; i++) {
      OrderButton *o = new OrderButton();
      
      
     
      o.setPreis(Ask + i);
      o.Text("B");
      o.Color(Green);
      o.Create(0,"btnOrder+i,0,x1_btn,y1,x2_btn,y2);
      Add(o);
           
      y1 += 24; //Button-Height + 4
      y2 += 24;
      
   }


Danke schonmal :)

Carl Schreiber
Moderator
7071
Carl Schreiber  
  1. Herzlich Willkommen und viel Erfolg!!
  2. MQL4-Code gehört ausschließlich in den untersten Thread - ich werde das später verschieben.
  3. OOP in MQL4/5 kann nicht alles, was andere OOP-Sprachen können, drück mal F1 im Editor und und gib OOP unter Suche ein..
  4. Kleiner Tipp: Stell mal den Kursor auf eine ML-Funktion und drück F1 - ist meist die schnellste Antwort auf Fragen.
  5. Bevor Du programmierst, schau erst einmal was es schon gibt. Generell gilt, es gibt fast nichts, was nicht schon in MQL4/5 existiert. Daher frag entweder Prof. Dr. Google oder (vorher) oben die Lupe (Maus drauf, OOP eingeben, Enter). Du findest viele Beispiele für Grafische Interfaces (in Artikel, Code Forum, ..), nutze mit copy & paste doch einfach den Code, dafür ist das ja da!
  6. Wen es keinen Grund für MQL4 gibt, überleg Dir eventuell gleich MQL5 zu verwenden - hat manche Vorteile!
  7. In Deiner for-Schleife (über-)schreibst Du wohl immer wieder dieselbe Variable (*o), müsstest Du da nicht einen Array verwenden
    OrderButton *o[10];
    for(int i = 0; i <= 9; i++) {
        *o[i] = new OrderButton();
    ...
    }
    (Hängt natürlich vom Kontext ab)
Eidechse
13
Eidechse  
Carl Schreiber:
  1. Herzlich Willkommen und viel Erfolg!!
  2. MQL4-Code gehört ausschließlich in den untersten Thread - ich werde das später verschieben.
  3. OOP in MQL4/5 kann nicht alles, was andere OOP-Sprachen können, drück mal F1 im Editor und und gib OOP unter Suche ein..
  4. Kleiner Tipp: Stell mal den Kursor auf eine ML-Funktion und drück F1 - ist meist die schnellste Antwort auf Fragen.
  5. Bevor Du programmierst, schau erst einmal was es schon gibt. Generell gilt, es gibt fast nichts, was nicht schon in MQL4/5 existiert. Daher frag entweder Prof. Dr. Google oder (vorher) oben die Lupe (Maus drauf, OOP eingeben, Enter). Du findest viele Beispiele für Grafische Interfaces (in Artikel, Code Forum, ..), nutze mit copy & paste doch einfach den Code, dafür ist das ja da!
  6. Wen es keinen Grund für MQL4 gibt, überleg Dir eventuell gleich MQL5 zu verwenden - hat manche Vorteile!
  7. In Deiner for-Schleife (über-)schreibst Du wohl immer wieder dieselbe Variable (*o), müsstest Du da nicht einen Array verwenden
    (Hängt natürlich vom Kontext ab)

Danke erstmal für die Tipps und Hinweise. Ich möchte etwas sehr spezielles für mich programmieren, das habe ich so in der Form leider nicht gefunden, deshalb würde ich es gerne selber machen.

Zu MQL5: Okay ich gebe zu ich habe noch keine Ahnung: Funktioniert MQL5 ebenfalls im MT4?

Habe auch bereits viel gegooglet, Aber irgendwie nichts gefunden, was mir geholfen hat. (Ich frage mich, ob wie ich Fachinformatiker werden konnte :D)

Zu der Schleife: Ja, du hast recht. Ich hatte das ganze Spiel auch schon mit einem Array versucht. Und auf viele verschiedene Weisen. Aber jedes mal wird für alle Buttons nur der als letztes gesetzte Preis zurückgegeben.

Carl Schreiber
Moderator
7071
Carl Schreiber  
  1. MT5/MQL5 ist der (C++-angelehnte) Nachfolger des MT4/MQL4 (eher C-ähnlich, aber jetzt auch mit OOP).
  2. MQL5 und MQL4 sind ähnlich, aber zB. bei den Aufträgen gibt es entscheidende, nicht kompatible Unterschiede, also MT4 kann nur MQL4 und MT5 nur MQL5!
  3. Der Editor verfügt auch über einen Debugger (F5). Damit kannst Du Deine Klassenentstehung und die Werteentwicklung verfolgen. Print und Comment helfen da auch!
  4. Hier:
    o.setPreis(Ask + i);
    mixt Du double (Ask) und i (int)? Aus 1,23456 entsteht so 2,23456; 3,23456; .. Ist das Deine Absicht?
  5. Manchmal castet MQL4 die double Ask in ein int-Wert (i+Ask) - mach das lieber ganz deutlich, zB.:
    o.setPreis(Ask + (double)i);
    Wenn Du das so willst.
  6. Definiere und  übergib dem Konstruktor doch eine ID und kontrolliere sie im Debugger:
    new OrderButton("ID "+(string)i);
Eidechse
13
Eidechse  
Okay, ich muss mich entschuldigen. Ich musste einfach nur mal den Kopf frei bekommen und schon habe ich beim Debuggen gemerkt, dass nicht das Attribut immer gleich gesetzt ist, sondern das Eventhandling Blödsinn war.

Trotzdem vielen lieben Dank für die Tipps und Hinweise.
Carl Schreiber
Moderator
7071
Carl Schreiber  
Eidechse:
Okay, ich muss mich entschuldigen.

Kein Problem, ist mir auch schon passiert!

Ich habe mal gefragt, wie bei mir eine for-Schleife eine Endlosschleife (=Terminal-Neustart) sein könnte. es stellte sich heraus, statt 1 stand eine I (oder so), das hatte ich nicht gesehen - ich hab mir dann einen neuen Bildschirm gekauft. ;)

Einloggen oder registrieren, um einen Kommentar zu schreiben