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)
-   -   New Tick-Event künstlich erzeugen zwecks Debugging? (http://www.expert-advisor.com/forum/showthread.php?t=6681)

LQK 05.06.20 16:21

New Tick-Event künstlich erzeugen zwecks Debugging?
 
Hallo,

ich habe meinen ersten kleinen EA fertiggestellt. Seine Funktion:

Öffne jeden Tag beim ersten Tick der nach 9 Uhr eintritt einen Trade. Wenn an diesem Tag bereits ein Trade geöffnet wurde, kann an diesem Tag kein weiterer Trade geöffnet werden. Ein Trade darf Overnight offen bleiben, d.h. es kann dennoch der Fall eintreten, dass mehrere Trades gleichzeitig geöffnet sind.

Wollte jetzt in MT einen kleinen Backtest machen. Der Backtest endet aber nach längerer Rechenzeit nicht, auch wenn ich nur ganz kurze Zeitfenster (z.B. drei Tage) als Grundlage für den Backtest nehme.

Ich muss also debuggen. Beim kompilieren gab es keine offensichtlichen Fehlermeldungen. Wollte daher mit Hilfe von Print() schrittweise die einzellnen Abschnitte des Quellcodes testen, ob die Ihre Arbeit ordnungsgemäß machen.

Wollte jetzt erstmal testen, ob der EA um 9 Uhr ordnungsgemäß eine action durchführt, wenn noch kein Trade offen ist (eben mit der Print-Funktion). Die Uhrzeit kann ich testen, indem ich halt die Systemzeit auf 8:59 umstelle (die Abfrage der Uhrzeit erfolgt bei meine EA mit TimeHour(LocalTime()) oder halt indem ich die aktuelle Stunde zum testen als Wert in den Code eintrage.

Dummerweise gibt es neben der Uhrzeit noch eine zweite Bedingung, die zum Öffnen eines Trades erforderlich ist: Es muss ein Tick auftreten (weil sonst ja die Funktion OnTick() nicht abläuft.

Aus verschiedenen Gründen habe ich derzeit kein Konto, dass ich verwenden kann. bzw. verwenden will, um den EA mit Ticks zu füttern. Überdies wäre es mitunter vielleicht auch lästig, auf den nächsten Tick warten zu müssen.

---

Ich habe mich daher gefragt, ob ich irgendwie einen Tick "künstlich" erzeugen und den EA damit füttern kann? Dem EA (oder Teilen des EA) gewissermaßen vorgaukeln, dass ein neuer Tick aufgetreten wäre. Also ein Ereignis New Tick auf Knopfdruck oder mit ein bisw zwei Codezeilen erzeugen und den EA oder Teile des EA damit füttern.

Gibt es da eine Möglichkeit? Oder wie ist einem solchen Fall, wenn man Ticks für das Debugging braucht, die "kanonische" Vorgehensweise?


Ich freue mich über jeden konstruktiven Hinweis! :)

Besten Dank und Grüße,
LQK

MA-EA 05.06.20 20:21

Code:

int start()

Ca$hDigger 06.06.20 06:05

Stecke einfach eine Endlosschleife in zB ein Skript, dieses kann immer ausgeführt werden

Code:

while(1)
{
  Sleep(1000); // Trigger jede Sekunde

  // hier der zu triggernde code

}


LQK 08.06.20 16:25

Zitat:

Zitat von MA-EA (Beitrag 43821)
Code:

int start()

Ich verstehe nicht, was man mit dieser Funktion machen kann. Könntest Du ein oder zwei Sätze dazu verlieren? :)

---

Ich habe die Funktion Start() nicht in der Reference gefunden. Ist diese Funktion überhaupt noch Bestantdteil des aktuellen Release von MQL?

Habe auch im Web nicht viel zu Start() gefunden, was ich gefunden habe:

https://www.mql5.com/en/forum/172489

Die beiden in o.g. Link zitierten Code-Schnipsel sind:

Code:

int  OnInit(void) { return(INIT_SUCCEEDED); }
void OnDeinit(const int reason) {}
void OnTick()
{
  Comment("I am here "+TimeToString(TimeLocal(),TIME_SECONDS));
}


und


Code:

int init(void) { return(INIT_SUCCEEDED); }
int deinit() { return(0); }
void start()
{
  Comment("I am here "+TimeToString(TimeLocal(),TIME_SECONDS));
}


Beide Syntax-Schnipsel führen bei mir zu keiner Bildschirmausgabe und ich erkenne auch nicht, dass diese einer für mich sichtbaren Tätigkeit nachgehen (nach Kompilieren und Ausführen tun diese anscheinend "nichts").

Da ich mir nicht sicher bin, was die Funktion Comment() macht, habe ich diese durch Print(Test); ersetzt, was aber auch nichts geändert hat.

Grüße,
LQK

LQK 08.06.20 17:22

Zitat:

Zitat von Ca$hDigger (Beitrag 43822)
Stecke einfach eine Endlosschleife in zB ein Skript, dieses kann immer ausgeführt werden

Code:

while(1)
{
  Sleep(1000); // Trigger jede Sekunde

  // hier der zu triggernde code

}



Danke für diesen Codeschnipsel. Die Programmieridee dahinter ist mir noch nicht ganz klar geworden. Die Endlos-Schleife führt dazu, dass der Schleifenrumpf immer und immer wieder ausgeführt wird, klar.

Aber warum sollte daraus ein Ereignis New Tick entstehen?


---

Habe jetzt mal die von Dir vorgeschlagene Endlos-Schleife getestet. Bislang noch nicht zum echten Debuggen, sondern nur probeweise.

Bislang ist es mir offenbar noch nicht gelungen, die Schleife zum Laufen zu bringen. Hab zuerst eine Funktion Test() welche mit Print(TimeLocal()) die aktuelle Uhrzeit ausgeben soll in den Schleifenrumpf geschrieben und dann von OnInit() aus die Funktion Test() aufgerufen.

Das hat nicht funktioniert, und nach einigem Ausprobieren, ist mir auch der Grund klargeworden, warum es nicht funktioniert: Wenn ich Test() von OnInit() aus aufrufe, wird deswegen ja noch lange nicht die While-Schleife aufgerufen.

Das hat mich auf die Idee gebraucht, dass ich eine Art Rahmenfunktion() brauche, welche die While-Schleife umschließt. Test() bzw. die Funktion die iteriert werden soll, sollte dann im Schleifenrumpf der While-Schleife stehen.

Habe das so umgesetzt und es ergibt sich der unten stehende Code.
Passiert ist aber nach Kompilieren und Ausführen dieses Codes tatsächlich gar nichts. Es wurde keine Uhrzeit ausgegeben, aber auch keine Fehlermeldung.

Hier der Code:

Code:


void OnInit()
  {
 
    rahmenfunktion()
 
  }


void rahmenfunktion()
  {
 
      while(1)
        {
            Sleep(1000); // Trigger jede Sekunde
           
            void test()
              {
                  Print(TimeLocal());
              }
        }           
  }


Um sicherzugehen habe ich dann noch Print(TimeLocal()); durch Print("Test"); ersetzt. Den sich daraus ergebenden Code poste ich unten stehend, Änderung rot markiert. Allerdings hat die Änderung nichts bewirkt, weder kommt eine Fehlermeldung, noch eine Ausgabe.

Hier der Code:
Code:



void OnInit()
  {
 
    rahmenfunktion()
 
  }


void rahmenfunktion()
  {
 
      while(1)
        {
            Sleep(1000); // Trigger jede Sekunde
           
            void test()
              {
                Print("TEST");
              }
        }           
  }


Es ist mir somit letzten Endes nicht klar, was ich falsch mache. Habe ich die Idee mit der Schleife konzeptionell falsch umgesetzt, z.B. dasss die Idee mit der rahmenfunktion() nichts taugt, oder etwas in der Art?

Oder ist meine Idee der konzeptionellen Umsetzung richtig, und ich habe nur irgendwo Programmierfehler gemacht?

---

Würde mich über einen Hinweis freuen! :)


Beste Grüße,
LQK

Ca$hDigger 08.06.20 19:45

Wenn ich es richtig verstanden habe willst du einfach nur Code triggern unabhängig von Kursdaten etc. Die whileschleife als Endlosschleife sollte funktionieren, die kann man direkt in OnInit() (EA) bzw OnStart() (Skript) einfügen.

EA:
Code:

int z=0;
int OnInit()
  {
      while(1)
        {
            Sleep(1000); // Trigger jede Sekunde
            Print("TEST: ",  ++z);
        }   
  return(INIT_SUCCEEDED);
  }

SKRIPT:
Code:

int z=0;
void OnStart()
  {
      while(1)
        {
            Sleep(1000); // Trigger jede Sekunde
            Print("TEST: ",  ++z);
        }   
  }

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)

Code:

int z=0;
int OnInit()
  {
  EventSetTimer(1);
  return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
  EventKillTimer();
  }

void OnTimer()
  {
    Print("TEST: ",  ++z);
  }

Alle gezeigten Beispiele funktionieren. Das bei dir die Dinge zum Teil nicht laufen, liegt vielleicht daran, dass du entweder nicht korrekt in ein Konto eingeloggt bist bzw die Märkte nicht offen haben. Dein OnInit() beim EA wird ggf deshalb nie aufgerufen. Jedes beliebige Demokonto würde da Abhilfe schaffen ;)

MA-EA 08.06.20 19:52

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);}

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);}


LQK 08.06.20 20:29

Zitat:

Zitat von Ca$hDigger (Beitrag 43833)
Alle gezeigten Beispiele funktionieren. Das bei dir die Dinge zum Teil nicht laufen, liegt vielleicht daran, dass du entweder nicht korrekt in ein Konto eingeloggt bist bzw die Märkte nicht offen haben. Dein OnInit() beim EA wird ggf deshalb nie aufgerufen. Jedes beliebige Demokonto würde da Abhilfe schaffen ;)

Ja, genau das war ja meine Frage im EP. Ich will irgendwie triggern, d.h. ein Ereignis New Tick auslösen, ohne dass ich dafür in irgendeinem Konto eingeloggt bin.

Geht das mit EventSetTimer() auch nicht? Habe gerade das dritte von Dir gepostete Code-Beispiel probiert, ohne Konto-Login geht das auch nicht. (Mit Konto-Login habe ich es noch nicht probiert.)


Heißt das, diese Anforderung ist unlösbar, ich kann ohne in ein Konto eingeloggt zu sein grundsätzlich kein Ereignis New Tick auslösen?

Wenn das so ist, wäre es bedauerlich, andererseits ist es dann gut für mich, Bescheid zu wissen, dann brauche ich nicht mehr nach einer Lösung zu suchen, die es nicht gibt. :)

Oder gibt es doch eine Möglichkeit?



Besten Dank und Grüße
LQK

Ca$hDigger 08.06.20 20:53

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)

MA-EA 08.06.20 21:48

Wenn ich das Alles richtig verstehe, dann soll ein mal täglich eine einzige Order geöffnet werden. Und zwar ab 9 Uhr.
Code:

bool TagesOrderGeöffnet = false;

if( Hour >= 9 || Hour<= 8 ) {

for ( i=OrdersTotal ... eben feststellen, ob ne Order offen ist ... )

if ( ...ja... ) TagesOrderGeöffnet = true ;

if ( ...nein... ) Ticket = OrderSend... eben die Order senden ... )

if ( ...Ticket... Ticket zurück liefert... ) TagesOrderGeöffnet = true ;

Vom Prinzip her müsste das ungefähr klappen. :rolleyes:

RetepM 09.06.20 18:56

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.

LQK 10.06.20 13:36

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 43834)
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

MA-EA 10.06.20 14:02

@ LQK

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

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. :rolleyes:



Was soll Dein EA überhaupt machen, wenn ich fragen darf?

Ca$hDigger 11.06.20 01:28

Wie schon in Beitrag #3 vorgeschlagen und in Beitrag #6 vorgekaut probiere das Skript statt ein EA wenn es unbedingt offline sein soll.

LQK 12.06.20 10:23

Zitat:

Zitat von Ca$hDigger (Beitrag 43836)
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

LQK 12.06.20 10:31

@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

LQK 12.06.20 10:45

Zitat:

Zitat von RetepM (Beitrag 43838)
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. :D

Besten Dank und Grüße,
LQK

Ca$hDigger 12.06.20 13:15

Zitat:

Zitat von LQK (Beitrag 43853)
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 43853)

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 43853)
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 43853)
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.

LQK 13.06.20 09:16

Zitat:

Zitat von Ca$hDigger (Beitrag 43857)

...


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


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