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 MQL5 (http://www.expert-advisor.com/forum/forumdisplay.php?f=221)
-   -   Umstellung MT4 -> MT5 (http://www.expert-advisor.com/forum/showthread.php?t=7195)

pascalper 11.06.22 22:56

Umstellung MT4 -> MT5
 
Hallo,
ich beginne meinen MT4 EA auf MT5 umzustellen, die Vorteile sind klar.
Coding C, Pascal kein Problem für mich, MT5 C++ "Dialekt" ist schon eine Herausforderung :)

Nun möchte ich die Community befragen ob die Umstellung nachfolgender Funktion korrekt ist? Bitte Danke im voraus!
Arbeite viel mit globalen Variablen, die Weiterverarbeitung (nächste Order, etc) erleichtert sich um einiges.
Beim kompilieren im MT5 gibt es keine Fehler, jeglicher Art.

MT4
Code:

  void GlobalSet() {
  for(int pos=0;pos<HistoryOrdersTotal();pos++)
  if(OrderSelect(pos,SELECT_BY_POS,MODE_HISTORY))
  if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
    if(OrderType()==OP_BUY && OrderProfit()<0) {
    GlobalVariableSet(Symbol()+"-LastBuyLots",OrderLots());
    GlobalVariableSet(Symbol()+"-LastBuyProfit",OrderProfit());
    GlobalVariableSet(Symbol()+"-LastSellLots",0);
    GlobalVariableSet(Symbol()+"-LastSellProfit",0);
    }
    if(OrderType()==OP_SELL && OrderProfit()<0) {
    GlobalVariableSet(Symbol()+"-LastSellLots",OrderLots());
    GlobalVariableSet(Symbol()+"-LastSellProfit",OrderProfit());
    GlobalVariableSet(Symbol()+"-LastBuyLots",0);
    GlobalVariableSet(Symbol()+"-LastBuyProfit",0);
    }
  }
  }

MT5
Code:

  void GlobalSet() {
  ulong total=HistoryOrdersTotal();
  ulong ticket;
  for(uint i=0;i<total;i++) {
  if((ticket=HistoryOrderGetTicket(i))>0) {
    if(PositionGetString(POSITION_SYMBOL)==Symbol() && PositionGetInteger(POSITION_MAGIC)==Magic) {
   
      if(ENUM_POSITION_TYPE(ORDER_TYPE_BUY) && ENUM_ORDER_PROPERTY_DOUBLE(POSITION_PROFIT)<0) {
      GlobalVariableSet(Symbol()+"-LastBuyLots",ENUM_ORDER_PROPERTY_DOUBLE(ORDER_VOLUME_INITIAL));
      GlobalVariableSet(Symbol()+"-LastBuyProfit",ENUM_ORDER_PROPERTY_DOUBLE(POSITION_PROFIT));
      GlobalVariableSet(Symbol()+"-LastSellLots",0);
      GlobalVariableSet(Symbol()+"-LastSellProfit",0); }
   
      if(ENUM_POSITION_TYPE(ORDER_TYPE_SELL) && ENUM_ORDER_PROPERTY_DOUBLE(POSITION_PROFIT)<0) {
      GlobalVariableSet(Symbol()+"-LastSellLots",ENUM_ORDER_PROPERTY_DOUBLE(ORDER_VOLUME_INITIAL));
      GlobalVariableSet(Symbol()+"-LastSellProfit",ENUM_ORDER_PROPERTY_DOUBLE(POSITION_PROFIT));
      GlobalVariableSet(Symbol()+"-LastBuyLots",0);
      GlobalVariableSet(Symbol()+"-LastBuyProfit",0); }
        }
      }
    }
  }

Fragen:
- Richtig von MT4 auf MT5 übertragen?
- MT5 "ticket" (rot) überhaupt notwendig?

Beste Grüße
pascalper

Indikator-Trading 12.06.22 19:29

Hallo,
du kannst HistoryOrderGetTicket natürlich benutzen und dann über HistoryOrderGetString() HistoryOrderGetDouble() und HistoryOrderGetInteger() die entsprechenden Werte der Order auslesen.
HistoryOrderGetTicket() selektiert allerdings nicht die jeweilige Order.
Dafür musst du HistorySelect() oder HistorySelectByPosition() aufrufen.

Indikator-Trading 12.06.22 19:35

Das Hauptproblem ist hier allerdings, dass du PositionGetString() nutzt, also eine Funktion die die Eigenschaften einer noch offenen Position auslesen soll.

Mit dem MT5 kann man ja echte Aktien und auch Futures ohne CFD handeln. Das geht, da es im Gegensatz zum MT4 Orders, Deals und Positions gibt.

Mach dich also erstmal damit vertraut, dann klappt die Umstellung auf den MT5 deutlich einfacher.

Hier ein Link dazu:
https://www.mql5.com/de/articles/211

pascalper 13.06.22 00:27

Zitat:

Zitat von Indikator-Trading (Beitrag 46082)
Das Hauptproblem ist hier allerdings, dass du PositionGetString() nutzt, also eine Funktion die die Eigenschaften einer noch offenen Position auslesen soll.

Mit dem MT5 kann man ja echte Aktien und auch Futures ohne CFD handeln. Das geht, da es im Gegensatz zum MT4 Orders, Deals und Positions gibt.

Mach dich also erstmal damit vertraut, dann klappt die Umstellung auf den MT5 deutlich einfacher.

Hier ein Link dazu:
https://www.mql5.com/de/articles/211

Danke für den Link, wird schon klarer - ein Mix der Pools geht natürlich nicht. :)

von
if(PositionGetString(POSITION_SYMBOL)==Symbol() && PositionGetInteger(POSITION_MAGIC)==Magic

geändert auf
if(HistoryOrderGetString(ticket, ORDER_SYMBOL)==Symbol() && HistoryOrderGetInteger(ticket, ORDER_MAGIC))

pascalper 13.06.22 01:31

Zitat:

Zitat von Indikator-Trading (Beitrag 46081)
Hallo,
du kannst HistoryOrderGetTicket natürlich benutzen und dann über HistoryOrderGetString() HistoryOrderGetDouble() und HistoryOrderGetInteger() die entsprechenden Werte der Order auslesen.
HistoryOrderGetTicket() selektiert allerdings nicht die jeweilige Order.
Dafür musst du HistorySelect() oder HistorySelectByPosition() aufrufen.

Nun bin ich verwirrt...

Ich interpretiere deinen letzten Satz das man in der Reihenfolge selektiert?

1) HistoryOrdersTotal (Pool)
2) HistorySelectByPosition (Pos_id)
3) HistoryOrderGetTicket (oder Deals) Selektiert das nicht die Order/Deal?
4) HistoryOrderGetString, etc. (Eigenschaften)

Beispiele habe ich nur in der Reihenfolge 1+3+4 gefunden. Nicht von 1-4.

HistorySelectByPosition NACH HistoryOrderGetTicket zu verwenden ergibt für mich (derzeit noch) keinen Sinn.

Könntest du mir Beispiele zeigen (Bitte, Danke) wo man HistorySelectByPosition verwendet, in der MT5 Doku (https://www.mql5.com/de/docs/trading...lectbyposition) unter HistorySelectByPosition steht:
"die Größe der Liste der Ordern kann man mittels HistoryOrdersTotal() erfahren. Elemente der Liste der Ordern ist es besser, mittels der Funktion HistoryOrderGetTicket() durchzusehen" (Grauenvolle Übersetzung...)
"the size of the list of orders in the history can be obtained using HistoryOrdersTotal(). To run through elements of the orders list, use HistoryOrderGetTicket()"
Habe mir die eng. Doku angesehen, steht genauso drinnen
(Ich lese mir immer grundsätzlich immer die de+en Doku durch, um die Infos zu bestätigen)

Bedeutet für mich:Mit HistoryOrdersTotal bekomme ich die gesamte Liste der Orders und mit HistoryOrderGetTicket die einzelnen Orders und weiterführend dann die Order/Deals Eigenschaften (HistoryOrderGetString)
Was ich so mache

Code:

  ulong total=HistoryOrdersTotal();
  ulong ticket;
  for(uint i=0;i<total;i++) {
    if((ticket=HistoryOrderGetTicket(i))>0)

Kann mich aber natürlich komplett verrannt haben!

Ps: HistorySelect(start, end) finde ich super! Wobei mein EA kaum die vollen Möglichkeiten von MT5 jemals brauchen wird.

TraderMike 15.06.22 13:39

Hallo
auch ich habe Probleme dem russischen Coding Gedanken zu folgen im besonderen das es keine wirklich guten (logischen) Beispiele gibt und die Doku entweder mehr schlecht als recht übersetzt ist....obwohl ich als Spiele Entwickler C*, Unify, Java, alles kann, der MT4/5 Krampf mit Date+Time als Beispiel, läßt einem den Kopf schütteln.

Nach langem Nachdenken bin ich zum Schluss gekommen das MetaQuotes den MT4 Server eigentlich nicht "abdrehen" kann, vielleicht wenn MT5 bei 90% Nutzung liegt, kein Broker kann und wird es sich leisten können die restlichen MT4 Retail Nutzer zu verlieren. MT5 ist von 90% noch Welten entfernt.

Viele haben nur ex4 Datein, oft gibt es für Scripte, Indikatoren, EA's kein MT5 Pedant.
Man sieht es an der Anzahl der MT5 Foreneinträge, das MT5 trotz seines Alters eher wenig verwendet wird, auch ist mir in anderen Foren aufgefallen das andere Coder ebenso Probleme haben, damit ist echtes OOP gemeint.

Da wird wohl zuerst eine MT4 Runtime innnerhalb MT5 kommen, damit kein Trader verloren geht - das Risiko für eine Nutzer Abwanderung ist einfach zu hoch. Es gibt genügend Alternativen.

Würde die MT5 Umstellung ganz locker angehen und gleich den MT4 Code entrümpeln, auch wenn MT5 viele Vorteile hat, bleibt der harte Kern weiterhin seriell prozedural-was keiner sagt oder schreibt, aka "es muss nicht schön sein (OOP), es muß funktionieren"!!!!!

Gruß
Mike

traderdoc 15.06.22 14:17

Auch ich gebe zu, dass MT5 nicht der Weisheit letzter Schluß ist.
Ich programmiere nun seit 12 Jahren hier und für Mitglieder eines anderen Forums
diverse EAs, Indikatoren und Scripte und meine auch, dass MT4 nicht so einfach abgestellt werden kann, wobei MT4 ja eigentlich schon MT4/5 heißen müsste, denn auch in MT4 kann man OOP.
Und ja die Datum- und Zeitfunktionen sind der absolute Graus.

Wie dem auch sei, die Aussage: es muß funktionieren ist die alles Entscheidende!

traderdoc

TraderMike 15.06.22 17:49

Zitat:

Zitat von traderdoc (Beitrag 46093)
Auch ich gebe zu, dass MT5 nicht der Weisheit letzter Schluß ist.
Ich programmiere nun seit 12 Jahren hier und für Mitglieder eines anderen Forums
diverse EAs, Indikatoren und Scripte und meine auch, dass MT4 nicht so einfach abgestellt werden kann, wobei MT4 ja eigentlich schon MT4/5 heißen müsste, denn auch in MT4 kann man OOP.
Und ja die Datum- und Zeitfunktionen sind der absolute Graus.

Wie dem auch sei, die Aussage: es muß funktionieren ist die alles Entscheidende!

traderdoc

Ich denke du meintest MT 4.5, naja einige wesentliche Unterschiede gibt es schon von C zu C++, C ist eine Teilmenge von C++, der C++ Compiler unterstützt z.B. mehr Abstraktionsmechanismen, MT5 ist eher als ein schlampiges Scripting zu sehen.
Statt MT5 (russisches Dialekt C++) hätten sie in Richtung Objectve CAML (OCaml) gehen sollen, MT5 für die echten Profis und MT4 für den Retail.

Fakt ist, für die Trading Kernaufgaben braucht es kein OOP, da sind wir einer Meinung. Mir ist kein MT4 Retail Code bekannt der an die 32-Bit Grenze kommt, Klicki-Bunti Indikatoren eventuell, Auswertungen sollte man sowieso extern machen, egal ob 32-Bit oder 64-Bit um dem Klient keine Ressourcen wegzunehmen.

Mir persönlich wäre es am liebsten, wenn (mehr/viele) Broker API, bzw Bridges zur Verfügung stellen würden, denn der Datentransfer ist gering (OHLC, Orders) - dann würde ich mir einen eigenen superschnellen modularen Klient schreiben, ein "One Signal - many Broker", parallel Verarbeitung/Broker/Ordering rückte damit immer näher, alleine was man mit dem Symbol Management alles machen könnte...Spread, Swaps, Multi Currency, Method Ordering etc...das wäre sinnvoll, nicht der lausige Marketplace....

Gruß
Mike

Indikator-Trading 15.06.22 18:02

Der MT5 hat zum MT4 zwei große Vorteile:
1)
Der Backtest kann mehrere Symbole zur gleichen Zeit simulieren.
D.h. ich kann einen Backtest mit z.B. allen 28 "großen" Forex Pairs gleichzeitig durchführen. Dies hat den Vorteil, dass man mehr statistische Signifikanz erhält und Curvefitting nicht soo schnell passiert (wenn man weiß was man macht)

Ein Backtest im M4 Chart mit 7 Symbolen hat bei mir z.B. ~20.000 Trades.

2)
Im MT5 werden alle Cores des Prozessors genutzt. Beim MT4 ist es immer nur einer. Mein aktueller Prozessor hat 24 Cores. Ein Optimierungsbacktest kann also bis zu 24 mal schneller laufen, als es beim MT4 der Fall wäre.

Für mich als Entwickler von EAs und Indikatoren ist es nicht nachvollziehbar weswegen man bei einer Software bleibt, welche 2005 Entwickelt wurde und die oben genannten Nachteile hat. Von 2005 hat es noch zwei weitere Jahre gedauert hat bis der erste iPhone vorgestellt worden ist... Davor waren alle Handys noch ohne Touch Screen...

TraderMike 15.06.22 18:35

Zitat:

Zitat von Indikator-Trading (Beitrag 46096)
Der MT5 hat zum MT4 zwei große Vorteile:
1)
Der Backtest kann mehrere Symbole zur gleichen Zeit simulieren.
D.h. ich kann einen Backtest mit z.B. allen 28 "großen" Forex Pairs gleichzeitig durchführen. Dies hat den Vorteil, dass man mehr statistische Signifikanz erhält und Curvefitting nicht soo schnell passiert (wenn man weiß was man macht)

Ein Backtest im M4 Chart mit 7 Symbolen hat bei mir z.B. ~20.000 Trades.

2)
Im MT5 werden alle Cores des Prozessors genutzt. Beim MT4 ist es immer nur einer. Mein aktueller Prozessor hat 24 Cores. Ein Optimierungsbacktest kann also bis zu 24 mal schneller laufen, als es beim MT4 der Fall wäre.

Für mich als Entwickler von EAs und Indikatoren ist es nicht nachvollziehbar weswegen man bei einer Software bleibt, welche 2005 Entwickelt wurde und die oben genannten Nachteile hat. Von 2005 hat es noch zwei weitere Jahre gedauert hat bis der erste iPhone vorgestellt worden ist... Davor waren alle Handys noch ohne Touch Screen...

Hallo,

Multi Threading lasse ich ja noch so gelten!

Aber Backtests? Das ist komplett veraltet, denn mit veralteten statischen Daten kann man keine dynamische realtime Märkte bespielen!
Starre Settings sind der Tod in einem dynamischen Markt Umfeld!
Mit veralteten Daten auf die Zukunft schließen = Kaffeesud Leserei

Also wenn man halbwegs neartime sein möchte dann gibt es NUR eine Lösung: Foward Demos! Daraus kann ein Live EA SOFORT Nutzen ziehen! (CopyTrading, Named Pipes, etc)

Ich lasse Forward Demos mit jeweils ALLEN Symbolen, auch Indizes, Metalle etc = 86 Symbole pro MT4 laufen, weil manchmal läuft es im FX gut, dann wieder Silber, dann wieder Indizes usw.
Diese Daten stehen realtime zur Verfügung
Voraussetzung: Volldynamischer Profilgesteuerter Live EA, die eigentliche Arbeit machen die Forward Demos

Wenn du eurjpy, usdjpy, gbpjpy gleichzeitig handelst und der yen geht süden, laufen alle deine *jpy in den SL - mit neartime Daten kann man Method Ordering machen um genau solche Szenarien zu verhindern - mit Backtest Settings NICHT!

Die Restaussage werte ich als Marketing damit jemand deine Coding Skills vielleicht kauft....
IPhone mit FinanzSoftware zu vergleichen....

Gruß
Mike


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:57 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