Easy and Fast Gui, finde Fehler nicht - Seite 4

 
Christian #:

Es wurde noch nicht verstanden was ich meinte mit den Fehlern.

Und ich weis auch das verschieden Versionen von der Bibliothek gibt.


Also:

1. Fehler Tritt auf und der Compiler bricht an der Stelle mit der Angabe der Position.  GUI Grundgeruest.mq5    44    19

Wenn man sich den ersten Post ansieht ist das ein anderes File wie der 2. Fehler.      GUI Graphtest.mq5    25    19

.....logisch oder ?


Nun muss der 2. Fehler  wahrscheinlich auf die gleiche Weise korregiert werden.

  GUI Graphtest.mq5 ist nur die abgespeckte version der GUI Grundgeruest.mq5

  GUI Graphtest.mq5 ist die mit der ich arbeite und dann später auf mein Grundgerüst wieder erweitern werde.

von daher ist der Fehler bei GUI Graphtest.mq5    25    19 relevant

 
Aleksi-Trader #:

  GUI Graphtest.mq5 ist nur die abgespeckte version der GUI Grundgeruest.mq5

  GUI Graphtest.mq5 ist die mit der ich arbeite und dann später auf mein Grundgerüst wieder erweitern werde.

von daher ist der Fehler bei GUI Graphtest.mq5    25    19 relevant

Na wenn du zwischendurch die Files änderst ,.... kommmen wir auch an die Grenzen :-)

Für mich sieht es dann so aus als ob der fehler behoben wurde.

Was stimmt denn nun ?

 
Christian #:

Na wenn du zwischendurch die Files änderst ,.... kommmen wir auch an die Grenzen :-)

Für mich sieht es dann so aus als ob der fehler behoben wurde.

Was stimmt denn nun ?

Also der Fehler mit der StringToDouble Funktion ist behoben. Das was jetzt noch offen ist, ist der Fehler am Anfang der Eingaben, das Objekt ist richtig, aber der 2. Wert ist ein CElement& main wo es noch hakt. 

Da weiß ich nicht wie man das angibt... Ich habe da momentan m_window drin stehen da ich dachte das man dort das Fenster angeben muss in den der Graph angezeigt werden soll.... was der Fehler ist.
 
Aleksi-Trader #:
Also der Fehler mit der StringToDouble Funktion ist behoben. Das was jetzt noch offen ist, ist der Fehler am Anfang der Eingaben, das Objekt ist richtig, aber der 2. Wert ist ein CElement& main wo es noch hakt. 

Da weiß ich nicht wie man das angibt... Ich habe da momentan m_window drin stehen da ich dachte das man dort das Fenster angeben muss in den der Graph angezeigt werden soll.... was der Fehler ist.
Wo und wie sind die Variablen deklariert?
 
Carl Schreiber #:
Wo und wie sind die Variablen deklariert?
  CWndCreate::CreateGraph(m_gra,//CGraph &object
                              m_window, //CElement &main <- DA KLEMMT ES.....
                              0,//const int window_index
                              5,//const int x
                              140,//const int y
                              false,//const bool auto_x_resize
                              false,//const bool auto_y_resize
                              10,//const int right_offset
                              23,//const bool is_bottom
                              false,//const bool is_right
                              false,//const bool is_bottom
                              AXIS_TYPE_DOUBLE,// ENUM_AXIS_TYPE axis_type
                              DoubleToString(2.654),//DoubleToStringFunction func_x_axis
                              DoubleToString(8.398)//DoubleToStringFunction func_y_axis
                              );

In der EasyandFastGui wie ich diese als Zip bereitgestellt hab wird in der WndCreate.mqh das so festgelegt:

 bool              CreateGraph(CGraph &object,CElement &main,const int window_index,
                                 const int x,const int y,const bool auto_x_resize,const bool auto_y_resize,
                                 const int right_offset,const int bottom_offset,const bool is_right,const bool is_bottom,
                                 ENUM_AXIS_TYPE axis_type,DoubleToStringFunction func_x_axis,DoubleToStringFunction func_y_axis);
                                 
   bool              CreateGraph(CGraph &object,CElement &main,const int window_index,CTabs &tabs,const int tab_index,
                                 const int x,const int y,const bool auto_x_resize,const bool auto_y_resize,
                                 const int right_offset,const int bottom_offset,const bool is_right,const bool is_bottom,
                                 ENUM_AXIS_TYPE axis_type,DoubleToStringFunction func_x_axis,DoubleToStringFunction func_y_axis);
  

Jetz ist also die Frage was ist dann das "CElement main" ? muss ich das noch anlegen?

der gesammte code ist:

//+------------------------------------------------------------------+
//|                                                          GUI.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <EasyAndFastGUI\WndCreate.mqh>
ulong magic=123;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CProgram: public CWndCreate
  {
private:
   CWindow           m_window;
   CGraph            m_gra;
   CTextLabel        m_label;
public:
   void              CreateGui()
     {
      CWndCreate::CreateWindow(m_window,"Test",20,20,600,300);
      CWndCreate::CreateGraph(m_gra, m_window,0,5,14,true,false,10,23,false,false,AXIS_TYPE_DOUBLE,DoubleToString(2.644),DoubleToString(8.398));
      CWndEvents::CompletedGUI();
     }
//Fehler ist grün markiert

   void              OnTimerEvent()
     {
      CWndEvents::OnTimerEvent();
     }

   void               OnInitEvent()
     {

     }

   void               OnTickEvent()
     {

     }

   void              OnTradeTransactionEvent(double lineval1,ulong inmagic)
     {
     //double lineval1 = Profit der gesammten History
     //double lineval2= Profit der geschlossenen Position nach magic
     //double lineval3= Kommt von Framework
      
      //Graph erstellen ähnlich der Grafik
     }

   void               OnDeinitEvent(const int reason)
     {
      CWndEvents::Destroy();
     }

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


     }
  };

CProgram programm;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   programm.OnInitEvent();
   programm.CreateGui();

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   programm.OnDeinitEvent(reason);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   programm.OnTickEvent();
   programm.OnTimerEvent();

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTimer()
  {
   programm.OnTimerEvent();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // Identifikator des Ereignisses
                  const long& lparam,   // Parameter des Ereignisses des Typs long
                  const double& dparam, // Parameter des Ereignisses des Typs double
                  const string& sparam  // Parameter des Ereignisses des Typs string
                 )
  {
   programm.ChartEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//---
   ENUM_DEAL_TYPE deal_direktion=DEAL_TYPE_BUY;
   long           deal_entry   =0;
   string         deal_symbol  ="";
   long           deal_magicn  =0;
   double         deal_profit  =0;
   double         deal_priceout=0;
   datetime       deal_time    =0;
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {

      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magicn=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
         deal_direktion=(ENUM_DEAL_TYPE)HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_priceout=HistoryDealGetDouble(trans.deal,DEAL_PRICE);
         deal_profit=HistoryDealGetDouble(trans.deal,DEAL_PROFIT);
         deal_time=(datetime)HistoryDealGetInteger(trans.deal,DEAL_TIME);
        }
     }

   if(deal_entry==DEAL_ENTRY_OUT)
     {
     if(magic==deal_magicn)
      programm.OnTradeTransactionEvent(deal_profit,deal_magicn);
     }

  }

//+------------------------------------------------------------------+
 
Aleksi-Trader #:

In der EasyandFastGui wie ich diese als Zip bereitgestellt hab wird in der WndCreate.mqh das so festgelegt:

Jetz ist also die Frage was ist dann das "CElement main" ? muss ich das noch anlegen?

der gesammte code ist:

Dein Object m_window ist vom Typ CWindow es muss aber vom typ CElement sein.

Änder deine Dekleration von m_window.

Generell solltest du OOP Lernen ....so wird das auf dauer anstrengend :-)

 
Christian #:

Dein Object m_window ist vom Typ CWindow es muss aber vom typ CElement sein.

Änder deine Dekleration von m_window.

Generell solltest du OOP Lernen ....so wird das auf dauer anstrengend :-)

Das ist korrekt... ich seh kaum durch...darum hab ich schon mal mit Klassen und Vererbung wiederhole.

Die Frage ist wie komme ich an das Element?

CWindow           m_window; //is aber so korrekt.... nur so bekomme ich ein Fenster... ohne Graph

CElement           m_window; //noch mehr Fehler

Das ist aber jetzt komisch....

Hier mal ein Code aus den Kurs wo CWindow korrekt ist:


//+------------------------------------------------------------------+
//|                                                          GUI.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <EasyAndFastGUI\WndCreate.mqh>
#include <Trade/Trade.mqh> //Bereitstellen der CTrade 
CTrade trade;// Einbinden der CTrade Klasse

input ulong Magic=1323;


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CProgram: public CWndCreate
  {
private:
   CWindow           m_window;
   CButton           m_button_buy;
   CButton           m_button_sell;
   CButton           m_button_close;
   CTextEdit         m_lot;
   CTextEdit         m_tp;
   CTextEdit         m_sl;
   CTextEdit         m_tsl;


public:
   void              CreateGui()
     {
      CWndCreate::CreateWindow(m_window,"Tradingpanel",20,20,300,300);
      CWndCreate::CreateButton(m_button_buy,"Buy",m_window,0,5,30,110,false,false,clrAliceBlue,clrAqua,clrSilver);
      CWndCreate::CreateButton(m_button_sell,"Sell",m_window,0,185,30,110,false,false,clrMistyRose,clrOrangeRed,clrSilver);
      CWndCreate::CreateButton(m_button_close,"Close",m_window,0,5,55,290,false,false,clrLemonChiffon,clrYellow,clrSilver);
      CWndCreate::CreateTextEdit(m_lot,"Lot",m_window,0,false,5,155,110,60,100.00,0,0.01,2,0);
      CWndCreate::CreateTextEdit(m_tp,"TP",m_window,0,false,5,80,110,60,INT_MAX,0,1,0,0);
      CWndCreate::CreateTextEdit(m_sl,"SL",m_window,0,false,5,105,110,60,INT_MAX,0,1,0,0);
      CWndCreate::CreateTextEdit(m_tsl,"TSL",m_window,0,false,5,130,110,60,INT_MAX,0,1,0,0);

      
      CWndEvents::CompletedGUI();

     }

   void              OnTimerEvent()
     {
      CWndEvents::OnTimerEvent();
     }

   void               OnInitEvent()
     {

     }

   void               OnTickEvent()
     {
      double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
      double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);

      m_button_buy.LabelText("Buy @ "+DoubleToString(ask,_Digits));
      m_button_buy.Update(true);

      m_button_sell.LabelText("Sell @ "+DoubleToString(bid,_Digits));
      m_button_sell.Update(true);

      for(int i = PositionsTotal()-1; i >= 0; i--)
        {
         ulong ticket = PositionGetTicket(i);
         if(PositionSelectByTicket(ticket))
           {
            string symbol = PositionGetString(POSITION_SYMBOL);
            ulong magic= PositionGetInteger(POSITION_MAGIC);
            double sl= PositionGetDouble(POSITION_SL);
            double tp=PositionGetDouble(POSITION_TP);
            ENUM_POSITION_TYPE Ptyp=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);

            int tslval=0;
            tslval=(int)StringToInteger(m_tsl.GetValue());

            if(magic==Magic  && symbol==_Symbol)

               if(Ptyp==POSITION_TYPE_BUY)
                 {
                  if(tslval>0)
                    {
                     double newsl=bid-tslval*_Point;
                     newsl=NormalizeDouble(newsl,_Digits);
                     if(newsl>sl)
                        if(trade.PositionModify(ticket,newsl,tp))
                          {
                           Print(i, " -> ",ticket,", ", symbol," >> Position Buy SL wurde angepasst!");
                          }
                    }
                 }
               else
                  if(Ptyp==POSITION_TYPE_SELL)
                    {
                     if(tslval>0)
                       {
                        double newsl=ask+tslval*_Point;
                        newsl=NormalizeDouble(newsl,_Digits);
                        if(newsl<sl || sl==0)
                           if(trade.PositionModify(ticket,newsl,tp))
                             {
                              Print(i, " -> ",ticket,", ", symbol," >> Position Sell SL wurde angepasst!");
                             }
                       }
                    }
           }
        }
     }

   void               OnDeinitEvent(const int reason)
     {
      CWndEvents::Destroy();
     }

   void              OnEvent(const int id,const long& lparam,const double& dparam,const string& sparam)
     {
      if(id==CHARTEVENT_CUSTOM+ON_CLICK_BUTTON)
        {
         if(lparam==m_button_buy.Id())
           {
            trade.SetExpertMagicNumber(Magic);
            double entry =SymbolInfoDouble(_Symbol,SYMBOL_ASK);
            double tp=0;
            double sl=0;
            int slval=(int)StringToInteger(m_sl.GetValue());
            int tpval=(int)StringToInteger(m_tp.GetValue());

            if(slval>0)
               sl= entry-slval*_Point;

            if(tpval>0)
               tp= entry+tpval*_Point;

            double lot=StringToDouble(m_lot.GetValue());
            trade.Buy(lot,_Symbol,entry,sl,tp);
            Print(__FUNCTION__,"Buy Button wurde geklickt...");
           }


         else
            if(lparam==m_button_sell.Id())
              {
               trade.SetExpertMagicNumber(Magic);
               double entry =SymbolInfoDouble(_Symbol,SYMBOL_BID);
               double sl=0;
               double tp=0;
               int slval=(int)StringToInteger(m_sl.GetValue());
               int tpval=(int)StringToInteger(m_tp.GetValue());

               if(slval>0)
                  sl= entry+slval*_Point;

               if(tpval>0)
                  tp= entry-tpval*_Point;

               double lot=StringToDouble(m_lot.GetValue());
               trade.Sell(lot,_Symbol,entry,sl,tp);
               Print(__FUNCTION__,"Sell Button wurde geklickt...");
              }
            else
               if(lparam==m_button_close.Id())
                 {
                  for(int i = PositionsTotal()-1; i >= 0; i--)
                    {
                     ulong ticket = PositionGetTicket(i);
                     if(PositionSelectByTicket(ticket))
                       {
                        string symbol = PositionGetString(POSITION_SYMBOL);
                        ulong magic= PositionGetInteger(POSITION_MAGIC);
                        if(magic==Magic  && symbol==_Symbol)
                           if(trade.PositionClose(ticket))
                             {
                              Print(i, " -> ",ticket,", ", symbol," >> Position geschlossen!");
                             }
                       }
                    }
                  Print(__FUNCTION__,"Close Button wurde geklickt...");
                 }
        }
     }
  };

CProgram programm;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   programm.OnInitEvent();
   programm.CreateGui();

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   programm.OnDeinitEvent(reason);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   programm.OnTickEvent();
   programm.OnTimerEvent();

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTimer()
  {
   programm.OnTimerEvent();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // Identifikator des Ereignisses
                  const long& lparam,   // Parameter des Ereignisses des Typs long
                  const double& dparam, // Parameter des Ereignisses des Typs double
                  const string& sparam  // Parameter des Ereignisses des Typs string
                 )
  {
   programm.ChartEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+

Daher muss das mit den Grah anders gehen.

Eben weil ich das aus den Programmierkurs nicht anders kenne.... das problem ist halt das wir nie sowas wie Graphpen gebandelt haben

 
Im Kurs hatte ich zwar OOP aber eben nur angerissen genauso wie bei der GUI nur mal angerissen wurde
 

Hab noch mal geforscht und was herrausgefunden... leider bisher ohne erfolg.

aber es geht richtung CElement


screenshot2:


 
Aleksi-Trader #:

Hab noch mal geforscht und was herrausgefunden... leider bisher ohne erfolg.

aber es geht richtung CElement


screenshot2:


Also CElement *Element(const uint index) bedeutet erstmal nur dass Du ein "Element" der Klasse CElement deklarierst.
Ähnlich wie Du double oder int deklarierst. 

Ich glaube das ist eine Klasse die Khazarski für sämtliche Steuerungselemente eingeführt hat, damit er alle die zu einem Fenster gehören in einem Array aufbewahren kann.

Also Du deklarierst ein Element des Fensters "main" mitsamt Index, und Du hast davon gleich ein ganzes Array.
Wenn Du es deklariert hast, ist es aber glaube ich bin noch leer und braucht erst eine Zuweisung, So wie Du eine Zahl zu einem Feld im double Array zuweist. Z.B. ein Button oder ein Label, es kann glaube ich Alles sein. Er hat ja ein Vererbungschart dazu veröffentlicht, welches hier auch schon in der Diskussion rumgeflogen ist. Da sieht man das auch. Aber was das praktisch heißt...

Ich habe mir den Artikel mal durchgelesen (letztes Jahr, doch das waren mir zu dem Zeitpunkt zu viele Klassen und es hat mir einen herben Dämpfer verpasst. Gleichzeitig ist es von der Theorie her recht interessant gewesen.

Ich denke wenn Du es wirklich wissen willst musst Du mit dem Artikel nebendran sitzen und die Klassen und Methoden abarbeiten, bis Du weißt, welche was macht... aber ich glaube er erklärt nurmehr die Grundprinzipien und führt Einiges nicht so explizit aus.

Es gibt sicher eine bzw. mehrere Methoden, wo die Elemente ihre Zuweisungen bekommen. Aber wie er das gemacht hat... Puh... Überflieg mal den/die Artikel und schau nach dem 'Element'.

Mich interessiert das selber auch, ich weiß aber nicht ob ich mir jetzt schon wieder die Zeit nehmen will ein riesen Faß aufzumachen... Kann sein wenn es mich genug juckt dass ich es mir auch genauer anschaue, damit ich mit der OOP weiterkomme. Aber das ist gefährlich, so ein Thema unterschätzt man leicht, gerade wenn man es nich versteht und dann fliegt man heftig auf die Schnauze. Da stecken vielleicht Jahre an Erfahrung und Wissen dahinter. Da kann man nicht so einfach mit dem Kopf durch die Wand. Zu viele Unbekannte.
Grund der Beschwerde: