Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4
Startseite Registrieren Hilfe Community Kalender Heutige Beiträge Suchen

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4978
Beiträge: 43264
Benutzer: 7.224
Aktive Benutzer: 75
Links: 84
Wir begrüßen unseren neuesten Benutzer: Sundaytrader
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor 3 Tagen
- Sundaytrad...
vor 3 Tagen
- TS_6
vor 5 Tagen
- Mane
vor 2 Wochen
- AlbertZiz
vor 2 Wochen
- michak

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

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 23.03.18
Neues Mitglied
 
Registriert seit: Jan 2018
Beiträge: 14
L0rdy befindet sich auf einem aufstrebenden Ast
Standard 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 !
  #2 (permalink)  
Alt 23.03.18
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.735
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #3 (permalink)  
Alt 24.03.18
Neues Mitglied
 
Registriert seit: Jan 2018
Beiträge: 14
L0rdy befindet sich auf einem aufstrebenden Ast
Standard

traderdoc von dir habe ich eher sowas erwartet:

PHP-Code:
if(MQLInfoInteger(MQL_OPTIMIZATION))
{
   if (
n<3)
     {
      
ExpertRemove();
     }

geht leider bei mir nicht
  #4 (permalink)  
Alt 24.03.18
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.735
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #5 (permalink)  
Alt 24.03.18
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von L0rdy Beitrag anzeigen
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
  #6 (permalink)  
Alt 24.03.18
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.735
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #7 (permalink)  
Alt 26.03.18
Neues Mitglied
 
Registriert seit: Jan 2018
Beiträge: 14
L0rdy befindet sich auf einem aufstrebenden Ast
Standard

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
  #8 (permalink)  
Alt 26.03.18
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.735
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #9 (permalink)  
Alt 26.03.18
Neues Mitglied
 
Registriert seit: Jan 2018
Beiträge: 14
L0rdy befindet sich auf einem aufstrebenden Ast
Standard

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.6_3_4_2.mq4

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.

Geändert von L0rdy (26.03.18 um 11:14 Uhr)
  #10 (permalink)  
Alt 26.03.18
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.735
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.

Geändert von traderdoc (26.03.18 um 12:04 Uhr)
Thema geschlossen

Lesezeichen

Stichworte
abfrage abbrechen, abfragen, if-abfrage, if-abfragen, mql4, programmierung, programmierung metatrader, programmierung mql4


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 +2. Es ist jetzt 02:44 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.
-----------------------------------------------------------------------------------------------------------------------------