Easy and Fast Gui, finde Fehler nicht - Seite 5

 

Soooo endlich n Graph!


#include <EasyAndFastGUI\WndCreate.mqh>
ulong magic=123;
double x_norm[];//time
double y_norm[];//test
double y_norm2[];//test
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CProgram: public CWndCreate
  {
private:
   CWindow           m_window;
   CGraph            m_graph1;

public:
   void              CreateGui()
     {
      CWndCreate::CreateWindow(m_window,"Test",20,20,800,600);
      CreateGraph1(2,50);
      CWndEvents::CompletedGUI();
     }

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

   void               OnInitEvent()
     {

     }

   void               OnTickEvent()
     {

     }

   void              InitArrays()
     {
      int arraysize= 3;//HistoryDealsTotal();
      ArrayResize(x_norm,arraysize);
      ArrayResize(y_norm,arraysize);
      ArrayResize(y_norm2,arraysize);
      x_norm[0]=(double)TimeCurrent(); //Zeitachse Value
      y_norm[0]=1000; // testachse1 value
     y_norm2[0]=1067; // testachse1 value

     }

   bool              CreateGraph1(int x_gap,int y_gap)
     {
      m_graph1.MainPointer(m_window);
      InitArrays();
      m_graph1.AutoXResizeMode(true);
      m_graph1.AutoXResizeRightOffset(2);

      if(!m_graph1.CreateGraph(x_gap,y_gap))
         return(false);

      CGraphic *graph=m_graph1.GetGraphicPointer();
      graph.BackgroundColor(::ColorToARGB(clrWhiteSmoke));

      CAxis *x_axis=graph.XAxis();
      x_axis.AutoScale(true);
      x_axis.Type(AXIS_TYPE_CUSTOM);
      x_axis.ValuesFunctionFormat(TimeFormat);
      CCurve *curve1=graph.CurveAdd(y_norm,::ColorToARGB(clrCornflowerBlue),CURVE_LINES,"test achse1");
      CCurve *curve2=graph.CurveAdd(y_norm2,::ColorToARGB(clrRed),CURVE_LINES,"test achse2");
      x_axis.DefaultStep(10);
      graph.CurvePlotAll();
      graph.Update(true);
      CWndContainer::AddToElementsArray(0,m_graph1);
      return(true);
     }



  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string            TimeFormat(double x,void *cbdata)
  {
   return(TimeToString((datetime)x_norm[ArraySize(x_norm)-(int)x-1]));
  }


CProgram Program;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Program.CreateGui();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

   Program.OnTickEvent();

  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//---

  }

Jetzt ist nur noch die Fage wie ich meine Historischen Daten da rein bekomme.
Hätte jemand eine Idee?

 

historische Daten sind im MT5 enthalten, die musst du nicht in deine UI reingeben

 
amando #:

historische Daten sind im MT5 enthalten, die musst du nicht in deine UI reingeben

Korrekt, allerdings will ich meine historischen Daten als Graph darstellen lassen. Deswegen hatte ich mir als Lösungsweg überlegt die funktion leicht zu ändern

   void              InitArrays()
     {
      HistorySelect(0,TimeCurrent());
      int deals=HistoryDealsTotal();

      for(int i=0; i<deals; i++)
        {
         ulong deal_ticket=HistoryDealGetTicket(i);
         if(deal_ticket>0)
           {
            string symbol=HistoryDealGetString(deal_ticket,DEAL_SYMBOL);
            datetime time=(datetime)HistoryDealGetInteger(deal_ticket,DEAL_TIME);
            ulong order  =HistoryDealGetInteger(deal_ticket,DEAL_ORDER);
            long pos_ID  =HistoryDealGetInteger(deal_ticket,DEAL_POSITION_ID);
            ENUM_DEAL_ENTRY entry_type=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(deal_ticket,DEAL_ENTRY);

            if(entry_type==DEAL_ENTRY_OUT)
              {
               ArrayResize(x_norm,i+1);
               ArrayResize(y_norm,i+1);
               ArrayResize(y_norm2,i+1);
               x_norm[i]=(double)time; //Zeitachse Value
               y_norm[i]=HistoryDealGetDouble(deal_ticket,DEAL_PROFIT); //Testachse1 value
              }
           }
         else
           {
            PrintFormat("Kein Deal in Auflistung %d. Fehler %d",i,GetLastError());
           }
        }

     }

Somit sollten die Arrays erweitert werden pro Eintrag erweitert und gleich befüllt werden.

Kompiler meckert da auch nicht... :)

Anmerkung :

Die neue Testdatei siehe kompletten Code vorrangehender Beitrag, nennt sich jetzt GUITest.mq5

Allerdings kommt im Expert-Journal dann die Meldung: array out of range in 'GUITest.mq5' (105,65)

Der dort befindliche code ist

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string            TimeFormat(double x,void *cbdata)
  {
   return(TimeToString((datetime)x_norm[ArraySize(x_norm)-(int)x-1]));
  }

und betrifft speziell die Stelle "(int)x-1]"

So wie ich es verstehe wird doch mittels ArraySize gefragt wie groß das Array "x_norm" ist ind dann der Wert von x-1 abgezogen.

Der Wert von "x_norm" array wird als Datetime übergeben und zum String gewandelt.

aber wieso macht der dort den Fehler ?

 
Wieso machst Du nicht einfach Nutzerdefinierte Symbole (custom symbols): https://www.mql5.com/de/articles/4566
Modellierung von Zeitreihen unter Verwendung nutzerdefinierter Symbole nach festgelegten Verteilungsgesetzen
Modellierung von Zeitreihen unter Verwendung nutzerdefinierter Symbole nach festgelegten Verteilungsgesetzen
  • www.mql5.com
Der Artikel gibt einen Überblick über die Möglichkeiten des Terminals zum Erstellen und Arbeiten mit nutzerdefinierten Symbolen, bietet Optionen zur Simulation einer Handelshistorie mit nutzerdefinierten Symbolen, Trend- und verschiedenen Chartmustern.
 
Carl Schreiber #:
Wieso machst Du nicht einfach Nutzerdefinierte Symbole (custom symbols): https://www.mql5.com/de/articles/4566

Weil es mir um die Trades geht die bereits gemacht wurden. Bzw um den Verlauf einer Kapitalkurve.Da wüsste ich nicht wie mir da ein Nutzerdefiniertes Symbol helfen soll.

 
Aleksi-Trader #:

Weil es mir um die Trades geht die bereits gemacht wurden. Bzw um den Verlauf einer Kapitalkurve.Da wüsste ich nicht wie mir da ein Nutzerdefiniertes Symbol helfen soll.

Aber dafür kannst Du doch die Handelshistorie a) als Report (mit Bild) oder als Exceldatei ausgeben lassen.
 
Carl Schreiber #:
Aber dafür kannst Du doch die Handelshistorie a) als Report (mit Bild) oder als Exceldatei ausgeben lassen.

Weis ich, was ich ja auch nutze.

Ich will speziell nach Magic filtern, gut dafür muss ich den geposteten Code leicht anpassen. was aber keine Kunst ist.

Wenn ich weis wie das mit den Kurven funzt kann ich dann Infos noch ausgeben die der Bericht zb nicht hat. zb eine "Deaktivierungslinie"

 
Aleksi-Trader #:

Weis ich, was ich ja auch nutze.

Ich will speziell nach Magic filtern, gut dafür muss ich den geposteten Code leicht anpassen. was aber keine Kunst ist.

Wenn ich weis wie das mit den Kurven funzt kann ich dann Infos noch ausgeben die der Bericht zb nicht hat. zb eine "Deaktivierungslinie"

Quäl dich nicht mit MQl5 rum .....geh mit den Daten zu Python ...es kann so leicht sein ☺

 
Christian #:

Quäl dich nicht mit MQl5 rum .....geh mit den Daten zu Python ...es kann so leicht sein ☺

Da muss ich ja wieder ne neue Sprache lernen und von 0 anfangen. 
 
Christian #:

Quäl dich nicht mit MQl5 rum .....geh mit den Daten zu Python ...es kann so leicht sein ☺


Ich bin mittlerwele skeptisch. Bis man in Python den Überblick hat um das zu machen was man in MQL schon kann... ist doch gehopst wie gesprungen... 

Da ist so ein Überangebot - auch wenn die Sprache super nützlich ist: Wenn man keine anderen Projekte hat ist der Umstieg einfach nur unnötig. 

Und es ist ja mit Python-Grundwissen nicht getan, man braucht immenses Spezialwissen (bei MQL allerdings auch), da die Algotradingbezogenen Informationen nicht so gebündelt vorliegen wie bei der hochspezialisierten Sprache MQL. Das sagt einem keiner. Und dann kommt da noch dazu dass die Packages die man verwendet abstrakte numerisch mathematische Aufgaben erfüllen. Da warten immense Transferleistungen auf den User, der mal eben Python lernt, weil "es ja so einfach sein kann". Wenn man da scheitert wäre man besser bei MQL geblieben. 

Du hast selber Jahre an Erfahrung und hast scheinbar einen Weg gefunden, mit den Daten erfolgreich umzugehen und tust so als ware das einfach gewesen. Überleg doch mal. Das sind die wertvollen Jahre die Du jetzt im Rücken hast.
Zu sagen man könnte sich das Alles sparen, obwohl Du selber davon enorm profitierst, erscheint doch zumindest unreflektiert.

Also ich will Deinen Rat jetzt nicht schlecht reden, und will auch Python nicht schlecht reden. Wenn man vor MQL schon mit Python gearbeitet hat - und numpy ist wieder etwas anders als das normale Python... - dann ist das sicher extrem von Vorteil. Doch selbst dann muss man erstmal MQL lernen wenn man über die Python API mit Metatrader arbeiten will. Aber jetzt mal angenommen man betrachtet das Ganze losgelöst von MQL und versucht was mit json, fix oder pinescript, das wird dann noch komplizierter, einfach wird da nix... gut, es ist vielleicht einfach wenn man das Alles schon kann... 

Aber extra Python zu lernen, nur um das, was man in MQL macht stattdessen in Python zu machen ist nicht gerade eine sinnvolle Motivation. Da quält man sich auch ganz schön rum und hat nicht einmal die kleinen Erfolge. Man muss da schon den Kosten-Nutzen Faktor im Auge behalten und für manchen sind die Kosten da zu hoch. Oder gibt es in dem ganzen Wust einen detaillierten, schnellen Direkteinstieg?


PS das ist nur meine unqualifizierte Meinung. Ich habe aber aufgrund von persönlichen Erfahrungen die berechtigte Einschätzung, dass es ziemlich genau so ist.
Grund der Beschwerde: