Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Trade-Ergebnisse aus OrderHistory auslesen (http://www.expert-advisor.com/forum/showthread.php?t=5428)

traderdoc 30.01.17 19:18

Sorry, da fehlte noch das wichtige return.

Code:

double Profit()
{
  double x  = 0;
  double summe = 0;

  for (int i = OrdersHistoryTotal() - 1 ; i >= 0; i--)              //  "int i" wurde integriert deklariert / Zählung läuft abwärts
    {
    if OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
        {
        if(OrderSymbol() == Symbol())                              //  hier ggf. zusätzlich  "(... &&  OrderTicket() == TicketNumber())"
          {
              if (OrderCloseTime() >= StringToTime(TimeToString(TimeCurrent(), TIME_DATE))
              //oder if (OrderCloseTime() >= iTime(NULL, PERIOD_D1, 0))für den Tagesprofit
              //oder if (OrderCloseTime() >= iTime(NULL, PERIOD_MN1, 0)) für den Monatsprofit
                {
                  x = OrderProfit() + OrderSwap() + OrderCommission();  //  Swap und Commission werden jetzt berücksichtigt
                  summe += x;                                          //  "summe" kann jetzt <= (positiv) oder < 0 (negativ) sein
                }
          }
        }
    Print("Summe=", summe);                                        //  summe = positiv/Graph-green  //  summe = negativ/Graph=red
    }
  return(summe);
}
//+--- 
void OnStart()
{
  if(Profit() >= 0)  // ObjectCreate in CLR green ...
  if(Profit() <  0)  // ObjectCreate in CLR red .....
  ...
}

traderdoc

piptrade 30.01.17 19:30

Hallo RetepM,
ganz lieb von Dir, mir Deine Unterstützung zukommen zu lassen. Dennoch verwirrt mich die ganze Geschichte mehr, als dass sie mir hilft.
Mit traderdoc haben wir doch eine effiziente Möglichkeit gefunden, das Gewünschte umzusetzen. Lass uns doch auf diesem Wege fortfahren.
Was jetzt noch wünschenswert wäre, ist eine graphische Umsetzung. D.h., dass der Profit (der pos. in green / der neg. in red) optisch dargestellt und die pos. oder neg. Differenz via string ausgewiesen wird.
Hierzu habe ich zwar schon eine recht gute Idee - vielleicht hast Du aber auch schon einen vernünftigen Code dafür ?

... zwischenzeitlich hat auch traderdoc gesendet ... und es auf den Punkt gebracht: So weit bin ich leider noch nicht !

LG. an beide, Euer piptrade

piptrade 31.01.17 09:52

Hallo traderdoc, hallo RetepM,

wenn wir uns
1. auf die Auswertung auf Tagesbasis beschränken,
2. zusätzlich die externe Bestimmung eines ganz bestimmten Tages ermöglichen und
3. vorerst auf Swap bzw. Commission verzichten,
würde der Code wie folgt aussehen (einfach, übersichtlich und fast schon perfekt) ! :

Code:

extern int Shift = 0;  //  Auswertung für den heutigen Tag / "1" für gestern usw.
//+---

double Profit()
{
  double x  = 0;
  double summe = 0;

  for (int i = OrdersHistoryTotal() - 1 ; i >= 0; i--)
    {
    if OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
        {
        if (OrderSymbol() == Symbol())
          {
          if (OrderCloseTime() >= iTime(NULL, PERIOD_D1, Shift))
              {
              x = OrderProfit();
              summe += x;
              }
          }
        }
    }
  return(summe);
}
//+--- 
void OnStart()
{
  if(Profit() >= 0)  // ObjectCreate in CLR green ...
  if(Profit() <  0)  // ObjectCreate in CLR red .....
  ...
}

Sollte der Code nunmehr komplett und auch richtig sein, wäre der Weg für eine graphische Darstellung frei !!!
Dies wiederum sollte aber ein neues Thema sein.

Nochmals recht, recht herzlichen Dank für die Hilfestellungen und

ganz LG. piptrade

traderdoc 31.01.17 11:04

Ne, noch nicht ganz, weil bei diesem Code jede Order, die zur Zeit des Beginns der historischen Tageskerze und später geschlossen wurde dann zählen würde. Da fehlt sozusagen die obere Grenze:

Code:

        if (OrderSymbol() == Symbol())
          {
          if (OrderCloseTime() >= iTime(NULL, PERIOD_D1, Shift) &&
              OrderCloseTime() <  iTime(NULL, PERIOD_D1, Shift-1) //für Shift >=1
              {
              x = OrderProfit();
              summe += x;
              }
          }
        }

traderdoc

piptrade 31.01.17 13:04

Hallo traderdoc,

nur gut, dass ich hier nochmal `reingeschaut habe !
Dennoch fällt es mir schwer, Deine Argumentation zu verstehen:

Deine Worte:"..., weil ... jede Order, die zur Zeit des Beginns der historischen Tageskerze(n) (und später) geschlossen wurde, dann zählen würde.
All diese Order (also die des laufenden Tages) sollen aufaddiert werden; - eigentlich muss es doch genau so sein ! - oder ???

Wenn ich den Code um 11:00 laufen lasse und 5 Trades sind bis dahin abgeschlossen - möchte ich auch das Ergebnis dieser 5 Trades erfahren. Sind um 18:00 12 Trades abgeschlossen, will ich das Ergebnis dieser 12 Trades usw.. Ist denn hier eine obere Grenze überhaupt erforderlich ? Wenn "ja", versuche es bitte (einem geistig Gehbehinderten) zu erläutern.

Und noch eine Frage: Ist das Vergleichszeichen der 1. Zeile überhaupt richtig ausgerichtet ? Der Zeitpunkt der letzten geschlossenen Order soll doch weiter zurückliegen, also kleiner sein, als der aktuelle Zeitpunkt der Auswertung während des laufenden Tages; - oder ?

Im Moment bin ich schon ein bisschen verwirrt und hoffe sehnsüchtig auf eine Beruhigung dieses Zustandes.

LG. piptrade

traderdoc 31.01.17 13:25

Das kann ich alles verstehen, ging mir vor 10Jahren auch nicht anders. Die Zeitbetrachtungen sind im MQL4 nicht unbedingt die Anwerderfreundlichsten.
Folgendes, die Zeiten werden in Sekunden angegeben, die seit dem 01.01.1970 bis zu dem jeweiligen Zeitpunkt verstrichen sind.
Einfaches Beispiel, wir nehmen mal an:
OrderCloseTime() = 23410000 (also 23410000 Sekunden nach dem 01.01.1970 geschlossen)
und ein Tag hat 86400 Sekunden. Sollte z.B. der Tagwechsel per Shift bei 23400000 sein, dann würde der Tag bis 23486400 gehen.
D.h. wenn nun Dein Shift auf diesen Tag zeigt, dann beträgt die Zeit über iTime(NULL, PERIOD_D1, Shift) 23400000.
D.h. nun wieder, wenn Du genau für diesen Tag Shift die Profits der Orders auslesen willst, dann darf die zu betrachtende CloseTime nur bis 1 Sekunden vor 23486400 gehen, ausgedrückt über
if (OrderCloseTime() < iTime(NULL, PERIOD_D1, Shift-1)
Shift-1 wäre ja der Beginn des darauffolgenden Tages. Wenn ab Shift die Orders der folgenden x Tage auch genommen werden sollen, dann entsprechend
Shift-x.

Noch dezidierter kann ich es nicht erklären.

traderdoc

piptrade 31.01.17 16:43

Hallo, lieber traderdoc,

noch dezidierter muss es auch nicht sein. Ich kenne das Zurückgreifen auf 1970 und habe etwas ähnliches schon vermutet. Meine Interpretation von OrderCloseTime() hingegen war schlicht falsch.
Bei der jetzigen Betrachtungsweise verstehe ich Dein Ansinnen wesentlich besser. Demnach ist die 2. Zeile Deiner Codeergänzug tatsächlich absolut unverzichtbar.
Beispiel: Will ich die Ergebnisse nur des gestrigen Tages, muss der heutige Tag ja ausgeschlossen werden. Auswertungsbeginn wäre hier "Shift = 1" und das Auswertungsende dann "Shift = 1 - 1" ---> also "Shift = 0".
Soweit alles sehr gut nachvollziehbar.
Damit klärt sich auch die Frage mit dem Vergleichszeichen; - die sollten tatsächlich alle so bleiben, wie sie sind !

Dennoch eine letzte Frage: Ist es richtig, wenn ich die Weiterverarbeitung des Profit() für eine graphische Darstellung "SO" einleite:

Code:

//+--- Unterscheidg. Gewinn/Verlust ---------------------------------+

  if(Profit() >= 0)  {  Profit() = Prof; }  // CLR green
  if(Profit() <  0)  {  Profit() = Loss; }  // CLR red

//+--- paint-Bereich ------------------------------------------------+
 
  objectBlank();
  paintProf(Prof);
  paintLoss(Loss);
}

Vielleicht kannst Du mir hierauf nochmals antworten?
Unabhängig davon möchte ich mich aber schon jetzt recht herzlich bedanken: Danke! - ich werde Dich gern weiterempfehlen!

Ganz LG. piptrade

traderdoc 31.01.17 17:06

Nein, so geht es nicht, weil Du einer Variable den Rückgabe wert der Funktion Profit() übergeben musst und nicht andersherum.
In diesem Falle würde ich es etwas anders schreiben. So könnte es dann aussehen:

Code:

//+--- Unterscheidg. Gewinn/Verlust ---------------------------------+
  double prof = Profit();
  if(prof >= 0) paintProf(prof); // CLR green
  if(prof <  0)  paintLoss(prof); // CLR red

//+--- paint-Bereich ------------------------------------------------+
 
  objectBlank(); //was soll diese Funktion bewirken?
}

Damit wird der ermittelte prof den jeweiligen Funktionen übergeben und kann dann in diesen Funktionen weiterverarbeitet werden.

traderdoc

piptrade 01.02.17 00:09

Hallo traderdoc,

welche Sau soll da noch durchsteigen ?
Entschuldige bitte den Terminus; - aber "SO" ist mir gerade zumute !!!

Melde mich morgen wieder, wenn ich Deinen Comment auch verstanden habe.

LG. piptrade

piptrade 01.02.17 00:58

PS. zu meinem letzten Beitrag:

Lieber traderdoc,
1. habe mir Deinen letzten Code jetzt auch näher ansehen können: Suuuuper ! - auf diesem Weg bekomme ich die Weiterverarbeitung mit "paint", dem ersten Schritt zur Graph, sicher Stück für Stück "gebacken" ! Danke.

2. Dennoch gibt es ein vordergründiges Problem, was unseren AusleseCode betrifft: Die Zeile " if OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) " wird nach der Kompellierung mit " 'if' - open parenthesis expected ", als error ausgewiesen ! (Es werden Eröffnungsklammern erwartetet?)
Ich habe schon alles Erdenkliche probiert, bisher aber ohne Erfolg. Wo könnte der Fehler liegen ?

3. ... ganz nebenbei: Dein Nachtrag zum "return"; - unendlich wichtig ! Danke.!!! - dennoch mußte dieser Part aufwärts verschoben werden, um an der richtigen Klammerposition auch anerkannt zu werden.

Sehe ich das alles in so weit richtig ? - oder muss ich meine Vermutungen hier und da revidieren ?

LG: piptrade


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:37 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum