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.


Portalsuche


Werbung

Login
Benutzername:
Kennwort:


Statistik
Themen: 3947
Beiträge: 37722
Benutzer: 6.242
Aktive Benutzer: 419
Links: 80
Wir begrüßen unseren neuesten Benutzer: Marcel83
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 2 Tagen
- Marcel83
vor 5 Tagen
- Megaule
vor 5 Tagen
- faanx
vor 5 Tagen
- baldwinlol
vor 6 Tagen
- adaba

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 43
Gesamt: 44
Team: 0
Team:  
Benutzer:  traderdoc
Freunde anzeigen

Empfehlungen

Werbung

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt vor 4 Wochen
Neues Mitglied
 
Registriert seit: Jan 2018
Beiträge: 13
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 !
Mit Zitat antworten
  #2 (permalink)  
Alt vor 4 Wochen
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.989
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.
Mit Zitat antworten
  #3 (permalink)  
Alt vor 4 Wochen
Neues Mitglied
 
Registriert seit: Jan 2018
Beiträge: 13
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
Mit Zitat antworten
  #4 (permalink)  
Alt vor 4 Wochen
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.989
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.
Mit Zitat antworten
  #5 (permalink)  
Alt vor 4 Wochen
AVT AVT ist offline
Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 54
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
__________________
heute schon gelacht?
Mit Zitat antworten
  #6 (permalink)  
Alt vor 4 Wochen
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.989
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.
Mit Zitat antworten
  #7 (permalink)  
Alt vor 3 Wochen
Neues Mitglied
 
Registriert seit: Jan 2018
Beiträge: 13
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
Mit Zitat antworten
  #8 (permalink)  
Alt vor 3 Wochen
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.989
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.
Mit Zitat antworten
  #9 (permalink)  
Alt vor 3 Wochen
Neues Mitglied
 
Registriert seit: Jan 2018
Beiträge: 13
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 (vor 3 Wochen um 11:14 Uhr)
Mit Zitat antworten
  #10 (permalink)  
Alt vor 3 Wochen
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.989
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 (vor 3 Wochen um 12:04 Uhr)
Mit Zitat antworten
Antwort

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 +2. Es ist jetzt 16:31 Uhr.



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