Inhalte aufrufen

  • Über WindowsLive anmelden Log In with Google Anmelden
  • Mitglied werden
Profilbild

The7 Trading System - Traden auf Dailycharts

- - - - -

  • Du kannst leider keine neuen Themen eröffnen
  • Please log in to reply
539 Antworten zu diesem Thema

  #481
OFFLINE   PazO

@fxdaytrader Ich finde der Ais hat das etwas übertrieben. Da weiß man beim selber coden schon gar nicht mehr wie und nach was man den Code ausrichten soll. Die Lesbarkeit leidet auch schon wieder drunter. Aber das ist evtl. Geschmackssache.

  #482
OFFLINE   traderdoc

@PazO82
"if (OrderStopLoss() < 0.01 ) OrderModify(OrderTicket(),preis,SL,TP_fin,0,CLR_NONE);break;
Da hab ich das OrderModify übersehen und das break als Aktion verstanden.

Und nochmal @traderdoc. Es sieht so aus als wölltest du uns hier gleich mal nen CodeStyleGuide schreiben? Ich würde es auch als sinnvoll erachten. :-)"


Na ja, das mit dem übergesehen lasse ich einfach mal so stehen.
Und ich werde Dir natürlich keinen CodeStyleGuide schreiben. Aber Du kannst Dir gerne von mir einen EA gegen Honorar schreiben lassen, dann bekommst Du den CodeStyle gratis dazu. Oder fragst halt im Forum diejenigen, die meinen CodeStyle bereits in ihren Programmen sehen konnten.

traderdoc
  • fxdaytrader gefällt das
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierwünsche.

  #483
OFFLINE   blindfish

jo, macht er sehr strukturiert und ausführlich :welldone:
  • traderdoc gefällt das

.... ich muss nicht immer der beste sein, mir reicht es vor dem 2ten zu sein ....

 

mini.jpg


  #484
OFFLINE   ekenom

Ich hab nach dem gestrigen Codegeplänkel ein paar Änderungen vorgenommen. U.a. habe ich den Programmteil in dem die Variablen ausgelesen werden als Funktion ausgelagert. Das sieht so aus:

Please Login or Register to see this Hidden Content

Die Zeilen müssen nicht bei jedem Durchlauf ausgelesen werden. Leider ist es so, wie ich schon gestern schrieb, das die Ticketnr. bei Orderclose und Ordermodify nicht mehr zuzuordnen ist und es kommt zur Fehlermeldung 4108. Wo liegt der Fehler?
ICh hänge, falls Interesse besteht, auch den gesamten Code mal an. ABer bitte nicht zum backtesten. Er funktioniert nicht.

Dateianhang


Ich kann die Börsenkurse beeinflussen!
Kaufe ich, so fällt der Kurs, und wenn ich verkaufe dann steigt er wieder.

  #485
OFFLINE   PazO

Du mußt auf jeden fall in der Methode refresh_Daten() die Variable ticket=0; setzen bevor du die Order neu suchst. Auch wenn du die Order schließt kannst/solltest du das ticket = 0 setzen.
Die Order kann auch per SL oder TP geschlossen worden sein. Um das raus zu finden kannst du noch auf OrderCloseTime() == 0 prüfen. Wenn die nen Wert hat ist die Order geschlossen.

Leider ist dein Ansatz mit dem Suchen der Order nicht ganz das was ich meine.Es reicht die Order direkt nach dem Beginn von der Startfunktion zu suchen und danach nicht nochmal. Die Methode refresh_Daten() rufst du so oft auf, dass das nach hinten losgeht und der Rechenaufwand unnötig gesteigert wird.

Ich habs mir nochmal angeschaut. Du brauchst die Methode refresh_Daten() nur einmal am Anfang der Startfunktion rufen und danach ist gut. Es bringt nichts die nochmal zu rufen.

Ich hoffe, dass dir das weiterhilft.

PazO

  #486
OFFLINE   ekenom

Du mußt auf jeden fall in der Methode refresh_Daten() die Variable ticket=0; setzen bevor du die Order neu suchst. Auch wenn du die Order schließt kannst/solltest du das ticket = 0 setzen.
Die Order kann auch per SL oder TP geschlossen worden sein. Um das raus zu finden kannst du noch auf OrderCloseTime() == 0 prüfen. Wenn die nen Wert hat ist die Order geschlossen.

Leider ist dein Ansatz mit dem Suchen der Order nicht ganz das was ich meine.Es reicht die Order direkt nach dem Beginn von der Startfunktion zu suchen und danach nicht nochmal. Die Methode refresh_Daten() rufst du so oft auf, dass das nach hinten losgeht und der Rechenaufwand unnötig gesteigert wird.

Ich habs mir nochmal angeschaut. Du brauchst die Methode refresh_Daten() nur einmal am Anfang der Startfunktion rufen und danach ist gut. Es bringt nichts die nochmal zu rufen.

Ich hoffe, dass dir das weiterhilft.

PazO


@PazO
wenn ich Ticket = Orderticket(), setze muss die doch vorher nicht =0 sein. Und warum Orderticket und andere nicht? Das ergibt doch keinen Sinn. Da muss ein anderer Denkfehler drin sein.
Selbstverständlich muss nachdem sich Werte geändert haben refresh_Daten durchlaufen werden. das geschieht jetzt aber nur noch 3 oder 4 mal während einTrade läuft. Bezogen auf den Rechenleistung ist das zu vernachlässigen. Nach dem Kauf, dem Verkauf, und den OrderModify ändern sich Parameter und die müssen ausgelesen werden. Es ändert sich die ticket Nr. z.B. nach jedem Teilverkauf.

ekenom
Ich kann die Börsenkurse beeinflussen!
Kaufe ich, so fällt der Kurs, und wenn ich verkaufe dann steigt er wieder.

  #487
OFFLINE   PazO

@Ekenom


Wie im Code von mir angefügt musst du noch prüfen ob die Order noch offen ist, die du gerade selektiert hast. Und das ticket setzt man sicherheitshalber auf 0 damit wenn du keine Order findest nicht das alte Ticket verwendest. Wir wollen doch alles richtig machen und nicht später nochmal Fehler suchen. Also bei OrderClose ebenfalls das ticket=0; setzen.


Please Login or Register to see this Hidden Content



Wie du ja sagst ist die Rechenleistung hoch, was bedeutet, dass sich in der Zeit Während des Durchlaufs durch die Startfunktion kein Tick ändert und somit auch die Werte nicht neu berechnet werden müssen.
Aber wenn du da anderer Meinung bist, ist das auch ok. Ich möchte ja nur Hilfestellung geben.


Gruß PazO

  #488
OFFLINE   fxdaytrader

Warum soll er prüfen ob die Order noch offen ist? Wenn Orderselect true ergibt, ist die Order doch offen und ausgewählt.
Er wählt doch nicht aus der History aus.

Oder hab' ich jetzt was verpaßt?
Kommst' heut' nicht, kommst' morgen oder gar nicht ...
Krank im Kopf, aber sonst ganz nett :troll:

meet the Fabrik-Mods | ForexFabrik ForenSuche | alter mql4 compiler (hier

  #489
OFFLINE   traderdoc

Yes! Kann ich auch nicht nachvollziehen. Mit diesen SelectText wird eigentlich nur unter den lebenden Orders gesucht.
Ich sag es mal so, so wie der Code derzeitig aussieht, wird es unnötig immer komplizierter. Was die Orderselection anbelangt hat PazO82 sicherlich recht. Diese braucht im Falle Deines Codes, wie er mit der Version g war, nur einmal am Anfang durchlaufen werden, weil die orderrelevanten Variablen wie OrderTicket() usw. in keinen Subfunktionen verarbeitet werden.

traderdoc
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierwünsche.

  #490
OFFLINE   ekenom

Yes! Kann ich auch nicht nachvollziehen. Mit diesen SelectText wird eigentlich nur unter den lebenden Orders gesucht.
Ich sag es mal so, so wie der Code derzeitig aussieht, wird es unnötig immer komplizierter. Was die Orderselection anbelangt hat PazO82 sicherlich recht. Diese braucht im Falle Deines Codes, wie er mit der Version g war, nur einmal am Anfang durchlaufen werden, weil die orderrelevanten Variablen wie OrderTicket() usw. in keinen Subfunktionen verarbeitet werden.

traderdoc

Die Ticketnr. ändert sich doch aber bei jedem Teilverkauf. AUch andere Traderelevante Daten wie Orderlot, oder SL werden angepasst. Der Programmteil muss nicht ständig durchlaufen werden, aber z.B. nach einem Teilverkauf schon. Und wenn dann die TicketNr. nicht mehr zuzuordnen ist, dann liegt es nicht daran wie häufig der Programmteil durchlaufen wird.
Ich kann die Börsenkurse beeinflussen!
Kaufe ich, so fällt der Kurs, und wenn ich verkaufe dann steigt er wieder.

  #491
OFFLINE   PazO

Jo. Stimmt es werden nur Offene/Pending Orders geliefert und dann wäre das an der Stelle immer true. Sorry für den Fehlinput. Das OrderCloseTime() bräuchte man aber wahrscheinlich bevor die OrderModify() ausgeführt wird um eine Fehlermeldung im Log zu umgehen. Denn durch SL/TP kann die Order schon geschlossen sein und das Modify bringt dann eine Fehlermeldung.

@Ekenom
Wenn das mit dem neuen Ticket wirklich so ist, kannst du das lösen, indem du nach einem Teilschliesen ein return(0); machst und damit die Startfunktion automatisch erneut beginnst. Dann ermittelst du ja wieder die aktuelle TicketNr deine offenen Order und deine Daten werden neu initialisiert.

  #492
OFFLINE   traderdoc

Nochmals sorry, aber diese Komplikationen treten häufig auf, wenn der Code nicht in Modulen geschrieben wird.
Wenn er so in einem Fluß ohne Subfunktionen geschrieben wird und nach jeglichen orderändernden Funktionen mittels return zum Abschluß der start()-Funktion gezwungen wird, dann läuft das Programm beim nächsten Tick durch die OrderSelect-Funktion und dann müssen natürlich alle ordrrelevanten Variablen auf den aktuellen Stand aktualisiert werden. Mit diesen aktuellen Werten wird dann im EA weitergearbeitet, z.B. das Ordermanagement etc.

Die weitaus elegantere Programmierung liegt in der Modulbauweise. Dadurch wird der Inhalt der start()-Funktion extrem kurz (evtl. nur 5 bis 10 Zeilen) und der Rest wird in Subfunktionen "ausgelagert", die dann die jeweiligen Teilprozesse abarbeiten, wie das Selektieren der aktuellen Order, die Triggerfunktion, die Orderöffnung, das Ordermanagement, das Trailing, die Zeitbegrenzung usw.
Nur dazu müßte jetzt der EA "völlig" umstrukturiert werden, was einiger Arbeit und dem entsprechenden Strukturwissen bedarf.
Es tut mir jetzt auch leid, Dir das so offen sagen zu müssen, aber derzeitig ist die Struktur des Codes insgesamt stark überarbeitungsbedürftig, sonst wird es auch schwer, selbst wenn er mal bugfrei ist, Neuerungen aufzunehmen, ohne dass alte Codeteile in Mitleidenschaft gezogen werden. Und dann geht die Sucherei wieder von vorne los.


traderdoc
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierwünsche.

  #493
OFFLINE   PazO

Ich stimme traderdoc zum Teil zu was die neu Strukturierung angeht. Ich denke aber das dies mit dem vorhanden EA-Code durchaus einfach umzusetzen ist.
Hatte ja in meinem ersten Post hier im Thread schon mal ein sehr einfach gehaltenes Beispiel für deine Restrukturierung gezeigt. Wenn das dem traderdoc ausreicht, kannst du deine einzelnen Codeteile in Methoden auslagern. Erstmal ohne Parameterübergabe und alles noch mit Globalen Variablen, damit alle Methoden den vollen Zugriff haben.

Ich hätte noch Vorschläge zur Verbesserung der Struktur, damit man den Code einfacher überblicken kann. Mir ist klar, dass jeder Entwickler seine eigene Handschrift hat, jedoch gibt es bestimmte Regeln die wirklich hilfreich sind. Deine Abschnitte die du dir mit Kommentaren trennst kannst du auch in Methoden auslagern. Dadurch wird die Start()-Methode sehr viel kürzer und man erkennt sehr schnell den Ablauf der einzelnen Aktionen.

sehr vereinfachtes grobes Beispiel:

Please Login or Register to see this Hidden Content

Die Methoden kannst du in der selben Reihenfolge hintereinander einfügen um den Codeablauf von Methode zu Methode verständlich zu halten.


Das passt eigentlich für deinen Code. Hatte mich damals schon an deinem Code orientiert.

PazO
  • Divecall gefällt das

  #494
OFFLINE   fxdaytrader

sonst wird es auch schwer, selbst wenn er mal bugfrei ist, Neuerungen aufzunehmen, ohne dass alte Codeteile in Mitleidenschaft gezogen werden. Und dann geht die Sucherei wieder von vorne los.


Nicht zu vergessen: Einmal angelegt haben Module den Vorteil, daß sie sich in jedem neuen EA verwenden lassen. Sprich: Einmal arbeiten, danach im Prinzip nur noch copy & paste ;)
Kommst' heut' nicht, kommst' morgen oder gar nicht ...
Krank im Kopf, aber sonst ganz nett :troll:

meet the Fabrik-Mods | ForexFabrik ForenSuche | alter mql4 compiler (hier

  #495
OFFLINE   PriNova

Ich habe mir, für meinen Teil, auch angewöhnt erst das Ordermanagement (falls offene Order vorhanden) und dann erst mögliche Signale für neue Order, um z.b. die Möglichkeit von NFA regulierte Broker einzubauen, abzuhandeln. Somit würde 1. alle Routinen in einem Tick verarbeitet und 2. bei Hedgeregulierung keinen Widerstand geben etc.
Auch verwende ich keine for()-schleifen mehr, sondern nur noch while()-schleifen, da diese schneller verarbeitet werden. (Habe dies bei einem Performance-Test während der Grafikprogrammierung herausgefunden). Ob das im MT4 auch so ist, kann ich bisher nur nicht bestätigen.

Meine 2 Synapsen.
Copyright © 2008-2016

Als Nomade quer durch Europa. Bei Interesse auch Hausbesuche 😉

  #496
OFFLINE   traderdoc

@Prinova
Ein interesanter Sachverhalt, dem ich sofort nachgegangen bin.
Eine for()-Schleife mit 2Milliarden!! Durchgängen und folgender {}-Zeile benötigt 11 Sekunden.
Eine while()-Schleife mit 2Milliarden Durchgängen und folgende i++; Zeile benötigt 11 Sekunden.

Selbst wenn da Differenzen im Millisekundenbereich ablaufen würden, behaupte ich mal, dass zwischen beiden Schleifentypen rechenzeittechnisch kein performancerelevanter Unterschied besteht.
Das wollte ich im alten Jahr mal noch festgestellt haben!:)

traderdoc
  • fxdaytrader gefällt das
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierwünsche.

  #497
OFFLINE   fxdaytrader

@Doc: Interessant. Mir ist nur folgendes unklar: Wie misst man die Zeit bei soetwas? Mit der Stoppuhr wohl kaum, gibt es da extra Programme für oder wie ist da das procedere? :)
Kommst' heut' nicht, kommst' morgen oder gar nicht ...
Krank im Kopf, aber sonst ganz nett :troll:

meet the Fabrik-Mods | ForexFabrik ForenSuche | alter mql4 compiler (hier

  #498
OFFLINE   traderdoc

Ja klar, mit der internen!! Stopuhr!

datetime TimeStart = TimeLocal();
int i = 0;
while (i <= 2000000000) i++;
datetime TimeEnd = TimeLocal();
Alert (TimeEnd - TimeStart);
return(0);

oder

datetime TimeStart = TimeLocal();
for (int i = 0; i <= 2000000000; i++) {}
datetime TimeEnd = TimeLocal();
Alert (TimeEnd - TimeStart);
return(0);

traderdoc
  • fxdaytrader gefällt das
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierwünsche.

  #499
OFFLINE   PriNova

sauber @traderdoc. These für MT4 widerlegt. habe diesen test dazumal mit Rechenaufgaben in diesen schleifen durchgeführt, aber hatte einen Compiler eines Grafikprogrammes.
Wurzelziehen ist bekanntlich sehr kostbar und es gab einen deutlichen Unterschied, ob ich for() oder while() genommen habe.
Könnte dann wohl nur an dem Compiler liegen.

So denn allen einen guten Rutsch und nächstes Jahr geht es dann back to topic weiterhin mit for()-schleifen.
Copyright © 2008-2016

Als Nomade quer durch Europa. Bei Interesse auch Hausbesuche 😉

  #500
OFFLINE   ekenom

An dem EA habe ich einige Änderungen vorgenommen. Ich habe die Funktionen mit dem Stochastic und der Signalsuche in einem zweiten TF wieder entfernt, da mir diese Funktionen nicht nützlich erschienen.

Ich habe ihn einige male mit verschiedenen Einstellungen im Backtest durchlaufen lassen. Es kam bei mir zu keinerlei Fehlermeldungen.
Für die Anregungen und Hinweise der vielen anteilnehmenden Forenmitglieder bedanke ich mich ausdrücklich, bitte aber dennoch um Nachsicht wenn es so scheint, als ob ich die vielen guten Tipp einfach ignoriert habe. Das ist beileibe nicht der Fall, aber meine offenbar rudimentären Fähigkeiten reichen nicht aus um das alles zu verstehen geschweige denn, es umzusetzen. Dennoch muss ich gestehen, dass es mir Spass macht.
Wer also trotz meiner unprofessionellen Programmiererei dabeibleiben will, für den habe ich nun die nächste Version angehängt.

Ich wünsche allen, hier im Forum, ein gesundes und erfolgreiches 2013.

Ekenom

Dateianhang


Ich kann die Börsenkurse beeinflussen!
Kaufe ich, so fällt der Kurs, und wenn ich verkaufe dann steigt er wieder.





0 Benutzer lesen gerade dieses Thema

0 Mitglieder, 0 Gäste, 0 anonyme Nutzer