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)
-   -   if-Abfragen und Co. richig abbrechen (http://www.expert-advisor.com/forum/showthread.php?t=6055)

L0rdy 23.03.18 14:13

if-Abfragen und Co. richig abbrechen
 
Hallo,
ich berechne mir an zwei Stellen in meinem EA eine Variable "n" aus, die aus Account- und Eingangsparametern bestimmt wird. Bei “n” unter 3 ist es nur eine Frage der Zeit ob der Balance gegen Süden gehen wird. Deswegen für eine Tester-Optimierung bietet es sich ja an bei n<3 abzubrechen um Zeit zu sparen. Nun wie mache ich das ? (in Sachen "return" bin ich nicht so mächtig)

Hier ist die Struktur meines EAs:

PHP-Code:

double n;
void OnInit()
{
    
n=................; // n wird berechnet 1
        
if (n<3)
            {
                
// wenn n unter 3 ist, sollte komplett abgebrochen werden
            
}
}

void OnTick(void)
{
    if(....)
    {
        
// eigentlich ein besserer Platz für "n wird berechnet 2" und if Abfrage    
        
if(...) 
        {
            if(...)
            {
            .....
            }
            else
            {
                
n=................; // n wird berechnet 2
                
if (n<3)
                {
                
// wenn n unter 3 ist, sollte komplett abgebrochen werden d.h. OnTick verlassen
                
}
            }
            ...
            if(...)
            {
            ...
            }
            else
            ...
            return;
        }
    }
    
    for(....)
    {
        
//TrailingStop routine
    
}


für OnInit() gibts ja eine Möglichkeit, die in etwa so aussieht:
PHP-Code:

int OnInit()
{
      
n=................; // n wird berechnet 1
        
if (n<3) {
            return(
INIT_FAILED);
        }


Die Frage ist auch, ob das mit "return(INIT_FAILED);" ein echter Abruch- oder erst eine Fehlerbehandlung ist.



Vielen Dank !

traderdoc 23.03.18 14:51

Da setze ich immer:

Code:

void OnInit() {
  EAWorking = true;
}

void OnTick() {
if (!EAWorking) return;
//Berechung, falls false dann mit Fehlermeldung über Print()
EAWorking = false;

traderdoc

L0rdy 24.03.18 16:23

traderdoc von dir habe ich eher sowas erwartet::)

PHP-Code:

if(MQLInfoInteger(MQL_OPTIMIZATION))
{
   if (
n<3)
     {
      
ExpertRemove();
     }


geht leider bei mir nicht :(

traderdoc 24.03.18 17:00

Ich habe solche Probleme nicht, entweder weil ich sie tatsächlich nicht habe oder weil ich sie gar nicht entstehen lasse.
Die von mir genannte Methode ist immer gekoppelt mit einer dann erscheinenden dicken roten Fehlermeldung im Chart. Und die kommt v.a. immer, wenn irgendwelche Werte der externen Variablen nicht gültig sind oder mit anderen Werten anderer Variablen keinen Sinn ergeben.
Im Testermodus muss dann das Programm angehalten werden, im Demo oder Livekonto kann man dann einfach in den externen Variablen auf diese Fehlermeldung reagieren.

Und wenn das u.g. bei Dir nicht funktioniert, wird das schon seinen Grund haben.

traderdoc

AVT 24.03.18 19:20

Zitat:

Zitat von L0rdy (Beitrag 40656)
für OnInit() gibts ja eine Möglichkeit, die in etwa so aussieht:
PHP-Code:

int OnInit()
{
      
n=................; // n wird berechnet 1
        
if (n<3) {
            return(
INIT_FAILED);
        }


Die Frage ist auch, ob das mit "return(INIT_FAILED);" ein echter Abruch- oder erst eine Fehlerbehandlung ist.

Das läuft so ab: wenn INIT_FAILED,
1. meldet es initialization failed(1),
2. dann wird OnDeinit() aufgerufen und
3. bekommt gleichzeitig mitgeliefert, daß INIT_FAILED (uninit reason 8)
4. der EA wird damit aus dem Chart entfernt
5. und hinterläßt zum Abschied seine deinit reason 8
Es ist also ein echter Abruch mit Entfernen des EA. AVT

traderdoc 24.03.18 19:28

In der OnInit-Funktion geht das sicherlich so, das hat er ja auch schon festgestellt, aber wie soll er das innerhalb der OnTick-Funktion machen.
Das ist sein Hauptproblem.

Ich bin jetzt nicht an meinem PC, aber aus meiner Sicht ist tatsächlich ExpertRemove() der einzige Weg. Könnte höchstens sein, dass diese Funktion, wie einige andere auch, nicht im Testermodus erlaubt sind.

traderdoc

L0rdy 26.03.18 07:40

Ich spreche ab jetzt nur noch über OnTick().
Habe hier bisi mit Print() gearbeitet und müsste feststellen, bevor n unter 3 geht, kommt entweder StopOut oder Fehler 134 wärend EA versucht bei Balance 170€ 0,01Lot von EURAUD (500:1) zu kaufen. (Mein EA öffnet nur ein Order gleichzeitig.)
D.h. EA springt auch gar nicht in dieses if rein.

Das einzige was mir hier einfällt MT4 neu installieren, wenn das nichts bringt dann weiss ich nicht :mad:

traderdoc 26.03.18 09:47

Das Problem, was hier immer mal wieder bei verschiedenen Usern besteht ist das, nur wenige wollen den wirklich relevanten Code einstellen. Nur denen kann aber am Schnellsten geholfen werden.
Wenn ich diese ganz allgemeinen if-Verschachtelungen unten sehe, kann ich nicht auf die Lösung Deines ursächlichen Problems kommen, v.a. nicht nach dem Text Deines letzten Mails.

Also, wem geholfen werden soll, muss auch die nötige Transparenz walten lassen.

traderdoc

L0rdy 26.03.18 10:54

Liste der Anhänge anzeigen (Anzahl: 1)
Ich nutze einen iCustom() noch, aber hier ist der komplette Code des EAs.
Das ist ein MArtingale EA, "n" ist Anzahl der Verluste mit Berücksichtigung von StopOut 100%, Account Balance und SL.
Lot wird je nach Fall ausgerechnet, 1. nach Verlust und 2.im NormFall nach Balance.
Kauf wird ausgelöst bei Schneiden eines von INDI berechneten Levels, TP und SL sind fest.
Klar könnte das Code in Funktionen gepackt werden, es geht mir um die Funktionalität.Anhang 3024

Es geht mir hier um Abbruch in OnTick beim Testen(Optimieren) falls Balance nicht mehr ausreicht. Denn seit dem ich oben angefangen habe, hat sich schon einiges geändert. Ich denke Lot muss man direkt nach OnTick berechnen(was in mq4 noch nicht gezeigt ist). Und dann muss if-Abfrage mit ExpertRemove() funktionieren. Nun wie ich gesagt habe kommt es gar nicht dazu dass ausgerechnete Lot unter 0,01 geht, da Abbruch durch Tester(StopOut oder Error 134) ausgelöst wird. Das sieht man wenn man mit Print arbeitet.

traderdoc 26.03.18 11:45

Nach dem ersten Überfliegen des Codes sage ich das mal so:
Wenn es schon daran hapert, die Variable Lot an der richtigen Stelle zu deklarieren, denn bei dieser Version wird der Compiler die Fehlermeldung:
'Lot' - undeclared identifier ausgeben und damit würde das Programm ja gar nicht erst lauffähig sein, dann sehe ich schwindende Chancen, in Kürze zu einer Gesamtlösung zu kommen.

Und bevor ich jetzt das Seziermesser zum bekannten Y-Schnitt ansetze, erkennt der Laie bereits an der äußeren Begutachtung, dass ExpertRemove()

Code:

if(MQLInfoInteger(MQL_OPTIMIZATION)) {
  if (Lot<0.01) {
      ExpertRemove();
  }
}

nie angesprungen werden kann!

Begründung: Ganz einfach, in jeglicher Lotberechnung wird der Lot-Wert über NormlizeDouble(....., 2) berechnet, d.h. es wird immer auf die zweite Stelle nach dem Komma normiert. Ja dann kann doch aber Lot nie < 0.01 sein!!!

Nur mal so viel in aller Kürze. Das hätte wir aber bereits vor Tagen klären können, wenn der gesamte Code vorgelegen hätte.

Und dann noch ein letzter Tip: Der Code lässt sich auch extrem schwer lesen, weil er rel. unstrukturiert geschrieben ist. Du tust Dir damit keinen Gefallen und den Usern, die nach einer Lösung suchen und sich erst einmal überhaupt in fremden Code einwühlen müssen, erst recht nicht. Für gut strukturierten Code gibt es hier im Forum sehr gute Beispiele.

Und ein allerletzter Tip: Falls trotz Lotberechnung, die auch ein Lot < 0.01 zuliese, ExpertRemove() immer noch nicht angesprungen wird, dann würde ich rein nach try and error statt
if(MQLInfoInteger(MQL_OPTIMIZATION)) { mal einfach if(IsOptimization() { setzen und vor und nach dieser if-Abfrage mal ein Print() benutzen, womit die Größe von Lot ausgegeben wird. Dann würde man auch so einige Erkenntnisse gewinnen.

traderdoc


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