Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4973
Beiträge: 43254
Benutzer: 7.219
Aktive Benutzer: 81
Links: 84
Wir begrüßen unseren neuesten Benutzer: Hopfen&Malz
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einem Tag
- Hopfen&Mal...
vor 2 Tagen
- frankmicha...
vor einer Woche
- DFeck
vor einer Woche
- bb1107
vor 2 Wochen
- rg-trader

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 1164
Gesamt: 1164
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #11 (permalink)  
Alt 09.06.20
Mitglied
 
Registriert seit: Feb 2016
Beiträge: 240
RetepM befindet sich auf einem aufstrebenden Ast
Standard

Hi, nicht die fehlenden Ticks sind das Problem... Wenn man sich mit der MT4-Programmierung beschäftigt, sollte man die Grundlagen der Handelsplattform kennen. Einen ersten Schritt zum Thema BTs und zum Schlaumachen findet man hier:
http://www.autopilot-trading.at/html/backtest.pdf @MA-EA, der Text ist in Deutsch :-)
Übrigens... Wenn man bei einer Bank die Werte eines nicht existierenden Kontos abfragen will, hat man wahrscheinlich Probleme... Bei einem MT4-Konto natürlich auch, hier wäre allerdings die Alternative, ein Demo-Konto einzurichten und die BTs dann offline durchzuführen, das heißt auch, man kann mit Thirdparty-Tick-Daten arbeiten, ohne das Daten der History durch Updates verändert werden. Profis haben dafür eine Extra-MetaTrader nur für solche Zwecke und ohne jede Online-Verbindung.
  #12 (permalink)  
Alt 10.06.20
LQK LQK ist offline
Mitglied
 
Registriert seit: Nov 2019
Beiträge: 76
LQK befindet sich auf einem aufstrebenden Ast
Standard

Hallo MA-EA,

besten Dank für Deine Antwort. Bitte entschuldige, dass ich erst jetzt antworte, obwohl ich Deinen Post bereits vor zwei Tagen Abends gelesen habe. Ich war da einfach schon zu müde.

[An alle anderen: Besten Dank auch für Eure (neuen) Hinweise, ich werde alle beantworten, bin derzeit dabei, allen Hinweisen nachzugehen! ]


Zitat:
Zitat von MA-EA Beitrag anzeigen
init wird ausgeführt, wenn der EA in den Chart des jeweiligen Symbol gepackt wird. Wenn dabei was Spezielles passieren soll, muss der entsprechende Code auch zwischen den { } von init stehen, und nicht irgendwo ausserhalb.

z.B.
Code:
int init(){


   ChartSetSymbolPeriod(0,Symbol(),TimeFrame);


   return(NULL);}


Ich weiß nicht, auf welches meiner Code-Beispiele Dich Dich beziehst? Wo habe ich den Code außerhalb der {} stehen, anstelle innerhalb der {}?

Kannst Du den von mir geposteten Code den Du meinst zitieren?



Zitat:
Mit int start(){ nach init() / deinit() und return;} am Ende des EA wartet er nicht auf neue Ticks, sondern müsste sofort tun, was er soll.
Code:
int start(){ ( nicht OnTick() )

 ...

return(NULL);}

Habe das jetzt mal probiert, mit diesem Code-Beispiel:

Code:
int OnInit()
  {

   

   return(INIT_SUCCEEDED);
  }




void OnTick()
  {
//---
  
  Print("Danke Start() erscheine ich auf dem Bildschirm");
  
   
  }
//+------------------------------------------------------------------+



int Start();
   {
      }

Normalerweise wird OnTick() erst beim Auftreten von New Tick ausgelöst. Dank Start() müsste OnTick(), so habe ich Dich verstanden, unverzüglich beim Starten des EA, auch ohne Tick, ausgelöst werden.

Das ist allerdings bei obig gepostetem Beispiel-Code nicht so. Nach starten des EA ergibt sich keine Bildschirmausgabe, aber auch keine Fehlermeldung.

---

Überdies finde ich Start() nach wie vor nicht in der Referenz. Hast Du vielleicht einen Link wo Start() in der Referenz erklärt wird?

Überdies werden in Metaeditor Funktionsnamen von Metaeditor normalerweise in violetter Farbe eingefärbt. Das ist bei Start() nicht so, Start() bleibt schwarz. Das erhärtet meinen Verdacht, dass Start() keine "reguläre" Funktion ist? Sollte man Start() überhaupt verwenden?

Ich habe zu Start() nur diesen Link gefunden:
https://book.mql4.com/programm/special

In dem Link steht u.a. der Satz:

"In EAs, start() is called (and executed) immediately after a new tick comes."

Das ist allerdigns das genaue Gegenteil von dem von Dir gesagten, Du schriebst ja, Start() (bzw. die Funktionen des EA, die eigentlich einen Tick erfordern) würden Dank Start() eben gerade auch ohne Tick ausgeführt?

Besten Dank und Grüße,
LQK
  #13 (permalink)  
Alt 10.06.20
Elite Mitglied
 
Registriert seit: Sep 2015
Beiträge: 1.178
MA-EA befindet sich auf einem aufstrebenden Ast
Standard

@ LQK

Hab mich da wohl verlesen mit irgendwelchen Sachen innerhalb / ausserhalb von init() / deinit() / was auch immer.

Code:
void OnTick()
löschen.

An der Stelle
Code:
int start() {
Ganz am Ende des gesamten Codes muss mit
Code:
return(was-es-alles-für-return-Werte-gibt);}
der gesamte Code abgeschlossen werden.


Aber vielleicht reagiert int start() ja auch nur auf neue Ticks und ich weiß das bloß nicht.



Was soll Dein EA überhaupt machen, wenn ich fragen darf?
  #14 (permalink)  
Alt 11.06.20
Premium Mitglied
 
Registriert seit: Jun 2013
Beiträge: 364
Ca$hDigger befindet sich auf einem aufstrebenden Ast
Standard

Wie schon in Beitrag #3 vorgeschlagen und in Beitrag #6 vorgekaut probiere das Skript statt ein EA wenn es unbedingt offline sein soll.
  #15 (permalink)  
Alt 12.06.20
LQK LQK ist offline
Mitglied
 
Registriert seit: Nov 2019
Beiträge: 76
LQK befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Ca$hDigger Beitrag anzeigen
Probiere es doch mal mit einem Skript (siehe mein Beispiel 2 "SKRIPT:") statt mit einem EA. Ein Skript sollte auch offline funktionieren (zumindest ging das vor Jahren bei mir in MT4)
Okay, ich habe das jetzt probiert (die Endlos-Schleife für ein Script). Der Code funktioniert dann und die Ausgabe sieht so aus, wie erwartet. Danke auch für diesen "neckischen" kleinen Counter (++z), dadurch wird die Ausgabe schön "durchnummeriert" und besser nachvollziehbar. Diesen Counter werde ich mir merken, könnte mir vorstellen, dass ich beim Debuggen noch öfters Verwendung dafür haben werden.

Um Verwechslungen vorzubeugen, hier noch mal der Code-Schnipsel:
Code:
int z=0;
void OnStart()
  {
      while(1)
         {
            Sleep(1000); // Trigger jede Sekunde
            Print("TEST: ",  ++z);
         }     
  }

In einem früheren Beitrag schriebst Du:

Zitat:
Eine Endlos-Whileschleife funktioniert zwar, ist aber natürlich nicht besonders toller Programmierstil da beim Deinitialisieren eine "abnormal termination" auftreten kann.
Die sauberte Lösung wäre daher einen EventTimer zum künstlichen Triggern zu nutzen (dies geht nicht bei Skripten, nur EA und Indis)
Um ehrlich zu sein, ich kann mir unter einer abnormal termination derzeit nicht besonders viel vorstellen.

Was für Nachteile kann denn eine abnormal termination haben?

Die Endlos-Schleife brauche ich ja nur fürs Debuggen. Wenn die Endlosschleife nicht im EA funktioniert, sondern nur im Script, würde ich halt den Code-Teil den ich gerade Debuggen will vom EA in ein Script kopieren und dort dann mit der Endlos-Schleife testen.

Ist eine abnormal termination in dem Fall überhaupt von Nachteil?

---

Es gibt eine Sache, die ich noch gern aufklären würde:

Du schriebst ja, die sauberste Lösung wäre ein EventSetTimer und Du hattest auch einen Beispiel-Code gepostet. Wie ich in einem meiner früheren Beiträge geschrieben habe, habe ich diesen Beispiel-Code für einen EventSetTimer() im EA getestet, er führte dort aber nicht zu einer Ausgabe.

Meine Vermutung war, dass der EventSetTimer nicht zu einer Ausgabe führt, weil ich nicht in einem Konto eingeloggt bin? Diese Vermutung konnte ich bislang noch nicht bestätigen, wäre schön, hier noch mal Feedback zu kriegen.

Wenn das so ist (EventSetTimer funktioniert nur mit eingeloggtem Konto) frage ich mich allerdings, wozu ich den EventSetTimer überhaupt brauche. Wenn ich mich in eine Konto einlogge, bekomme ich ja ohnehin vom Broker "organische", also natürlich auftretende, Ticks, wozu sollte ich dann noch zusätzlich einen künstlichen Trigger (eben EventSetTimer) benötigen?


Sorry, dass ich so viele Code-Schnipsel poste und manchmal auch einen der schon früher gepostet wurde. Ich mache das, dass immer klar ist welchen Code ich gerade meine. Das nachvollziehbar ist, was ich gerade machen, und um zu vermeiden, dass der eine von Äpfeln redet und der andere von Birnen.

Ich bitte auch zu entschuldigen, dass ich Dir zeitverzögert antworte. Habe das schon vor zwei Tagen ausprobiert, kam dann aber nicht mehr zum posten bzw. habe angefangen den Post zu schreiben und konnte ihn gerade eben erst beenden.

Besten Dank und Grüße,
LQK
  #16 (permalink)  
Alt 12.06.20
LQK LQK ist offline
Mitglied
 
Registriert seit: Nov 2019
Beiträge: 76
LQK befindet sich auf einem aufstrebenden Ast
Standard

@MA-EA.

Ja, bei diesem kleinen Lern-EA den ich gerade debuggen will, soll jeden Tag um 9 Uhr ein Trade geöffnet werden. Aber das ist, wie gesagt, ein Lern-EA.

Der EA ist schon umgesetzt, ich will diesen jetzt debuggen. Nach einem neuen programmiertechnischen Ansatz für speziell diesen EA ("Öffne jeden Tag um 9 Uhr einen Trade") suche ich derzeit nicht.

Es geht mir auch nicht speziell um diesen EA, dieser ist, wie gesagt, für mich lediglich ein Lern-EA, also Mittel zum Zwecke.

Durch das Debuggen dieses Lern-EA verspreche ich mir, allgemeine Kenntnisse übers Debuggen zu erwerben, die ich dann bei jedem weiteren EA den ich programmiere einsetzen kann.

Insofern lohnt es sich für mich, tiefer zu schürfen und auch mal nach rechts und links zu schauen!

Grüße,
LQK
  #17 (permalink)  
Alt 12.06.20
LQK LQK ist offline
Mitglied
 
Registriert seit: Nov 2019
Beiträge: 76
LQK befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von RetepM Beitrag anzeigen
Hi, nicht die fehlenden Ticks sind das Problem... Wenn man sich mit der MT4-Programmierung beschäftigt, sollte man die Grundlagen der Handelsplattform kennen. Einen ersten Schritt zum Thema BTs und zum Schlaumachen findet man hier:
http://www.autopilot-trading.at/html/backtest.pdf @MA-EA, der Text ist in Deutsch :-)
Übrigens... Wenn man bei einer Bank die Werte eines nicht existierenden Kontos abfragen will, hat man wahrscheinlich Probleme... Bei einem MT4-Konto natürlich auch, hier wäre allerdings die Alternative, ein Demo-Konto einzurichten und die BTs dann offline durchzuführen, das heißt auch, man kann mit Thirdparty-Tick-Daten arbeiten, ohne das Daten der History durch Updates verändert werden. Profis haben dafür eine Extra-MetaTrader nur für solche Zwecke und ohne jede Online-Verbindung.
Nun ja, bei der Sache an der ich jetzt arbeite sind (siehe EP), mit Verlaub, schon die fehlenden Ticks das Problem.

Den Umweg über Demo-Konto würde ich wie gesagt gern vermeiden (ebenfalls siehe EP) bzw. nur dann gehen, wenn es gar nicht anders geht. Das hat u.a. den Grund, dass ich vor drei Jahren mal Live Forex getradet habe und die Einstellungen meiner jetzigen MT-Installation nicht verändern will, falls ich irgendwann mal da weitermachen will (traue es mir nicht zu, dass ich dann noch alle Einstellungen im Kopf habe).

Allerdings funktioniert ja jetzt wahrscheinlich die von Ca$shDigger vorgeschlagene Lösung mit dem Script. Habe es bisher nur mit Beispielen getestet, werde es aber heute oder in den nächsten Tagen noch mit echtem zu debuggenden Code probieren, und dann wieder hier berichten. Besten Dank noch mal an Ca$hDigger!

Überdies auch Dank an Dich, RetepM, für das sehr interessante PDF zum Thema Backtests! Backtests sind ohnehin das nächste Thema mit dem ich mich befassen und für das ich Expertise erwerben muss. Da kommt mir das von Dir angebotene, offenbar sehr gut gemachte Script, gerade recht. Habe es mir ausgedruckt und werde es durcharbeiten. Würde mich nicht wundern, wenn sich daraus der ein oder andere Diskussionsbedarf zum Thema Backtests ergibt.

Besten Dank und Grüße,
LQK
  #18 (permalink)  
Alt 12.06.20
Premium Mitglied
 
Registriert seit: Jun 2013
Beiträge: 364
Ca$hDigger befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von LQK Beitrag anzeigen
Der Code funktioniert dann und die Ausgabe sieht so aus, wie erwartet.
Ok prima dann gibts schon mal eine funktionierende Variante für offline.

Zitat:
Zitat von LQK Beitrag anzeigen

Um ehrlich zu sein, ich kann mir unter einer abnormal termination derzeit nicht besonders viel vorstellen.

Was für Nachteile kann denn eine abnormal termination haben?

Die Endlos-Schleife brauche ich ja nur fürs Debuggen. Wenn die Endlosschleife nicht im EA funktioniert, sondern nur im Script, würde ich halt den Code-Teil den ich gerade Debuggen will vom EA in ein Script kopieren und dort dann mit der Endlos-Schleife testen.

Ist eine abnormal termination in dem Fall überhaupt von Nachteil?
Nein in diesem Fall nicht, fürs debuggen ist das kein Problem. Es ist eben so, dass die Schleife nie verlassen wird und die "abnormal termination" gibt es auch erst wenn du das Skript vom Chart entfernst. Wenn das Skript entfernt wird versucht das Terminal das Programm zu beenden aber jenes steckt in der Endlosschleife daher wird es vom Terminal dann einfach gezwungen beendet, dabei entsteht dann diese Meldung. Ist also nicht weiter schlimm fürs debuggen.


Zitat:
Zitat von LQK Beitrag anzeigen
Du schriebst ja, die sauberste Lösung wäre ein EventSetTimer und Du hattest auch einen Beispiel-Code gepostet. Wie ich in einem meiner früheren Beiträge geschrieben habe, habe ich diesen Beispiel-Code für einen EventSetTimer() im EA getestet, er führte dort aber nicht zu einer Ausgabe.

Meine Vermutung war, dass der EventSetTimer nicht zu einer Ausgabe führt, weil ich nicht in einem Konto eingeloggt bin? Diese Vermutung konnte ich bislang noch nicht bestätigen, wäre schön, hier noch mal Feedback zu kriegen.
Wenn bei dir mit dem Code keine Ausgabe kommt, dann ist es im Grunde der Beweis, dass OnInit() (und damit der EventTimer) nicht aufgerufen wird wenn du nicht eingeloggt bist. Würde OnInit() aufgerufen werden, würde der EventTimer funktionieren, da das aber nicht so ist wird OnInit() erst gar nicht aufgerufen.
Als Fazit kann man also festhalten, da OnInit() in einem nicht eingeloggten Konto nicht gestartet wird, kann man grundsätzlich EAs ohne eingeloggtes Konto NICHT zum künstlichen triggern nutzen. Die einzige funktionierende Lösung ohne eingeloggtes Konto ist also das Skript mit der Endlosschleife.

Zitat:
Zitat von LQK Beitrag anzeigen
Wenn das so ist (EventSetTimer funktioniert nur mit eingeloggtem Konto) frage ich mich allerdings, wozu ich den EventSetTimer überhaupt brauche. Wenn ich mich in eine Konto einlogge, bekomme ich ja ohnehin vom Broker "organische", also natürlich auftretende, Ticks, wozu sollte ich dann noch zusätzlich einen künstlichen Trigger (eben EventSetTimer) benötigen?
Mit einem EventTimer bekommt man einen Trigger in definierten Abständen, mit Ticks wiederum nur wenn ein neuer Kurs kommt. Ein Anwendungsfall könnte sein zB Variablen alle Stunde in einer File zu sichern als Backup, es gibt viele Möglichkeiten wo sowas nützlich sein kann, eben immer wenn man in einem bestimmten Zeitintervall etwas durchführen möchte.
  #19 (permalink)  
Alt 13.06.20
LQK LQK ist offline
Mitglied
 
Registriert seit: Nov 2019
Beiträge: 76
LQK befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Ca$hDigger Beitrag anzeigen

...

Besten Dank für Deine Ausführungen. Das ist für mich hilfreich. Mehr fällt mir dazu derzeit nicht ein.
Thema geschlossen

Lesezeichen

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 Uhr.





Suchmaschine - Reisen - Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------