|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
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 ..... ... }
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
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 |
|
|||
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 ..... ... } Dies wiederum sollte aber ein neues Thema sein. Nochmals recht, recht herzlichen Dank für die Hilfestellungen und ganz LG. piptrade |
|
|||
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; } } }
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
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 |
|
|||
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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
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); } Unabhängig davon möchte ich mich aber schon jetzt recht herzlich bedanken: Danke! - ich werde Dich gern weiterempfehlen! Ganz LG. piptrade |
|
|||
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? } traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
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 |
|
|||
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 |
Lesezeichen |
Stichworte |
gewinn, mql4, orderhistorytotal, orderhistrory, profit, programmierung, programmierung metatrader, programmierung mql4, verlust |
|
|