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: 3824
Beiträge: 36908
Benutzer: 6.076
Aktive Benutzer: 496
Links: 80
Wir begrüßen unseren neuesten Benutzer: Spitzmaus
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor einer Stunde
- Spitzmaus
vor 3 Stunden
- juleslesqu...
vor einem Tag
- hmf44
vor einem Tag
- Crossa
vor einem Tag
- snatshit

Onlineuser
'Wer ist online' anzeigen Benutzer: 3
Gäste: 46
Gesamt: 49
Team: 0
Team:  
Benutzer:  Domke01, Spitzmaus, traderdoc
Freunde anzeigen

Empfehlungen

Werbung

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 09.05.13
Neues Mitglied
 
Registriert seit: May 2013
Beiträge: 5
trader99 befindet sich auf einem aufstrebenden Ast
Standard Hilfe bei Programmierung eines Loops

Hallo, ich trade zwar schon seit Jahren, bin aber das erste mal in einem Forum. Ich befürchte, diesmal brauche ich wirklich Hilfe. Ich habe mir das Coden mit Tutorials erst vor kurzem beigebracht, habe mich durch zig Handbücher und Guides gequält, aber die meisten fangen bei Adam und Eva an und wenn man mal etwas leicht spezielleres braucht, ist es fast unmöglich, eine Anleitung zu finden. Ich habe auch viel gelernt indem ich mir andere EAs angeschaut und die Logik nachvollzogen habe und dann in meine eingebaut. Aber hier bin ich nun leider anscheinend an die Grenzen meiner Möglichkeiten gestoßen.

Folgendes Problem: Ich will eine Schleife (Zählung) einbauen, die unter anderem eine Einstiegsbedingung sein soll. Der Indikator , den ich dazu gebaut habe, funktioniert und ist vorab im EA schon definert, der Einfachheit halber nenne ich ihn hier nur Indicator.

Bedingung soll sein: Der Wert des Indikators war in der Vergangenheit =< -40 und seitdem noch nicht wieder >0 (für Long, umgekehrt für Short). Ich habe das so versucht:

bool Buycondition= false;
bool Sellcondition = false;
int x=1;
while(x>0)
{
if(Indicator <=-40) {Buycondition= true;break;}
if(Indicator<=-40) { for(int y=1; y<x; y++) {if(Indicator>0) Buycondition =false; break; }}

if(Indicator >= 40) {Sellcondition= true;break;}
if(Indicator >=40) { for(int z=1; z<x; z++) {if(Indicator<0) Sellcondition =false; break; }}

x++;}

Ein Programmierer wird wahrscheinlich die Hände über dem Kopf zusammenschlagen, aber leider ist mir nichts besseres eingefallen. Im Backtest scheint es mir so, als ob er mit dieser Schleife zwar immer erkennt, ob der Indikator größer oder kleiner war, aber das zweite und vierte“ if“ ignoriert er scheinbar total und tradet, sobald er unter -40 oder über 40 war ohne Rücksicht, ob er danach schon mal über Null war oder nicht.

Ich wäre sehr dankbar, wenn mir jemand sagen könnte, wie man diese Schleife richtig codet, denn ich probiere jetzt seit fast ner Woche daran rum aber kriege es nicht hin. Vielen Dank schon mal vorab, wenn sich jemand die Mühe machen sollte.
  #2 (permalink)  
Alt 09.05.13
Neues Mitglied
 
Registriert seit: May 2013
Beiträge: 5
trader99 befindet sich auf einem aufstrebenden Ast
Standard

Hier nochmal der Loop, weil ich die Variable vergessen hatte. Im Editor war die Variable natürlich drin, trotzdem funktioniert es nicht, also daran lag es leider nicht.

bool Buycondition= false;
bool Sellcondition = false;
int x=1;
while(x>0)
{
if(iCustom(NULL,0,”Indicator”,0,x) <=-40) {Buycondition= true;break;}
if(iCustom(NULL,0,”Indicator”,0,x) <=-40)
{for(int y=1; y<x; y++) {if(iCustom(NULL,0,”Indicator”,0,x) >0) Buycondition =false; break; }}

if(iCustom(NULL,0,”Indicator”,0,x) >= 40) {Sellcondition= true;break;}
if(iCustom(NULL,0,”Indicator”,0,x) >=40)
{for(int z=1; z<x; z++) {if(iCustom(NULL,0,”Indicator”,0,x) <0) Sellcondition =false; break; }}

x++;}
  #3 (permalink)  
Alt 09.05.13
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.875
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Sorry, ich habe mal etwas Struktur in den Code gelegt. Und dann ist es besser Code auch unter# (im Nachrichtenmenü!) zu schreiben. sonst wird es zu unübersichtlich.

Code:
bool Buycondition= false;
bool Sellcondition = false;
int x=1;
while(x>0) {
   if(iCustom(NULL,0,”Indicator”,0,x) <=-40) {
      Buycondition= true;
      break;
   }
   if(iCustom(NULL,0,”Indicator”,0,x) <=-40) {
      for(int y=1; y<x; y++) {
         if(iCustom(NULL,0,”Indicator”,0,x) >0) {
            Buycondition =false;
            break; 
         }
      }
   }

   if(iCustom(NULL,0,”Indicator”,0,x) >= 40) {
      Sellcondition= true;
      break;
   }
   if(iCustom(NULL,0,”Indicator”,0,x) >=40) {
      for(int z=1; z<x; z++) {
         if(iCustom(NULL,0,”Indicator”,0,x) <0) {
            Sellcondition =false; 
            break; 
         }
      }
   }
   x++;
}
Das der EA nicht in den Ausführungsteil der 2. und 5.!! if-Abfrage springt, liegt daran, dass der EA nur die Werte <= -40 und >= 40 berücksichtigt, denn sowohl mit
Code:
if(iCustom(NULL,0,”Indicator”,0,x) <=-40) {
   Buycondition= true;
   break;
}
als auch mit
Code:
if(iCustom(NULL,0,”Indicator”,0,x) >= 40) {
   Sellcondition= true;
   break;
}
springt der EA aufgrund des Befehls break aus der While-Schleife, wenn eben der Indikator <= -40 oder eben >= 40 beträgt. Da in der 2. und 5. if-Abfrage aber dieselben Werte genommen werden, kann er nicht in deren Ausführungsteil springen, weil er vorher ausgestiegen ist oder zwischen -39 und + 39 die 2. und 5. if-Abfrage false ergibt!

Was mir daran aber nicht klar ist:
"Bedingung soll sein: Der Wert des Indikators war in der Vergangenheit =< -40 und seitdem noch nicht wieder >0 (für Long, umgekehrt für Short)."

Soll ein Long Signal solange gegeben sein, bis der Indikator-Wert wieder > 0 ist (das hieße dann Long für alle! Werte < 0) und dann in ein Short Signal umschlägt oder soll das Long-Signal nur kommen, solange der Wert <= -40 und für Sell >= 40 ist, d.h. zwischen -39 und +39 überhaupt kein Signal?

traderdoc
  #4 (permalink)  
Alt 09.05.13
Neues Mitglied
 
Registriert seit: May 2013
Beiträge: 5
trader99 befindet sich auf einem aufstrebenden Ast
Standard

Hi Traderdoc,

also erstmal vielen Dank, dass Du Dir die Mühe gemacht hast, Dich mit der Schleife auseinanderzusetzen.

Jetzt ist mir auch klar, warum er alles was nach dem ersten if kommt, nicht mehr beachtet, egal was ich da eingegeben habe. Klar, logisch, aber mit der Zeit kriegt man manchmal auch ein Brett vor dem Kopf, wenn man seit ner Woche an so ner Schleife sitzt. Außerdem hast Du mich dahingehend beruhigt, dass ich schon gedacht habe, ich grundlegend die while-Schleife total verkehrt gecodet, das scheint aber nicht der Fall zu sein, sonst hättest Du es sicher erwähnt.

Zu Deiner Frage: Es soll ein Long Signal gegeben sein, wenn der Wert <= -40 war und dann das erste Mal >0 wird. Danach soll kein Signal mehr sein, erst wieder, wenn der Wert erneut <= -40 war. Zu dem Zweck habe ich beim Einstieg noch die zusätzliche Bedingung: iCustom(NULL,0,”Indicator”,0,1) <=0 && iCustom(NULL,0,”Indicator”,0,0) > 0 in der späteren Entscheidungsschleife, ob ein Kauf stattfinden soll. Die habe ich hier allerdings zwecks der Übersichtlichkeit nicht mit reinkopiert, hätte ich vielleicht noch erwähnen sollen. Übrigens war noch ein Fehler im Code den ich hier reinkopiert hatte, ich hatte statt y und z jedesmal x gesetzt. Das war aber in meinem Editor auch nicht der Fehler.

Die Antwort auf Deine Frage ist also: Ja, es soll in dieser Schleife Long-Signal gegeben sein, jedesmal wenn der Wert <= -40 war. Da y seinen ersten Wert mit 1 hat, also die Vorperiode, müsste das doch eigentlich passen, denn wenn er in der laufenden Periode >0 wird, hat er sein einziges Einstiegssignal, wenn ich hier richtig gedacht habe.

Jetzt habe ich es mal so probiert:

Code:
bool Buycondition= false;
bool Sellcondition = false;
int x=1;
while(x>0) {
   
   if(iCustom(NULL,0,”Indicator”,0,x) <=-40) {
      for(int y=1; y<x; y++) {
         if(iCustom(NULL,0,”Indicator”,0,y) <=0) {
            Buycondition =true;
            break; 
         }
      }
   }

   
   if(iCustom(NULL,0,”Indicator”,0,x) >=40) {
      for(int z=1; z<x; z++) {
         if(iCustom(NULL,0,”Indicator”,0,z) >=0) {
            Sellcondition =true; 
            break; 
         }
      }
   }
   x++;
}
Jetzt macht er allerdings im Backtest gar nichts mehr, der grüne Balken fängt nicht mal mehr an zu laufen, scheinbar ist das nicht rechenbar, was ich hier eingebe. Wenn Du eine Idee hast, wie man die Schleife richtig programmiert, wäre ich Dir sehr dankbar, ich habe echt langsam keine Ahnung mehr. Vielen Dank für Deine Mühe.
  #5 (permalink)  
Alt 09.05.13
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.875
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

OK, dann lösen wir das mal ganz einfach!

In den Variablenteil (über init() und nicht! in start()) kommt:
bool LowRangeFlag = false;
bool HighRangeFlag = false;
double IndiValue;
bool Buycondition= false;
bool Sellcondition = false;

In die start()-Funktion kommt:
Code:
IndiValue = iCustom(NULL,0,”Indicator”,0,0); //Value auf der aktuellen Kerze, sonst statt der letzten 0 eine 1
if (IndiVakue <=-40) LowRangeFlag = true;
if (LowRangeFlag && IndiVakue > 0) Buycondition = true;
.
.
.
if (IndiVakue >= 40) HighRangeFlag = true;
if (HigRangeFlag && IndiVakue < 0) Sellcondition = true;
Hinter der Stelle, wo die Order gesetzt wurde, schreibst Du:
Für die Buy-Order:
Code:
LowRangeFlag = false;
Buycondition = false;
Für die Sell-Order entsprechend:
Code:
HighRangeFlag = false;
Sellcondition = false;
Damit werden die bool-Variablen wieder resettet.

Das ist alles, was Du brauchst.

Viel Erfolg!

traderdoc
  #6 (permalink)  
Alt 09.05.13
Neues Mitglied
 
Registriert seit: May 2013
Beiträge: 5
trader99 befindet sich auf einem aufstrebenden Ast
Standard

Hi Traderdoc, das ist DIE Lösung, und natürlich funzt es so. Der Ansatz, dass man die bool-Variablen VOR dem Start definiert und er dann auch beim nächsten Rechnen die vorherigen bool-Werte beibehältet, bis man sie resettet, da bin ich einfach nicht drauf gekommen. Das revolutioniert nun mein Coding im Gesamten, weil dadurch vieles ganz leicht möglich wird, was ich bisher immer durch komplexe Zählungen versucht habe zu lösen, weil ich bisher nicht wusste, wie man es anstellen kann, dass er sich einen Vorwert für den nächsten Rechenschritt merken kann.

Super, damit hast Du für mich im Coding neue Horizonte eröffnet. Das sind halt Dinge, die Antwort darauf habe ich in keinem Tutorial gefunden, weil es zu speziell ist, seit einer Woche sitze ich an diesem und anderen Problemen, aber jetzt kann ich auch die anderen mit diesem Ansatz lösen.

Tausend Dank dafür, das hat mich jetzt in vielerlei Hinsicht ein großes Stück weiter gebracht !!! (Auch wenn der erste Backtest leider enttäuschend verlief, aber die Werte stimmen.)

Eine Frage hab ich noch: Funktioniert das auch mit anderen Variablen oder nur mit bools? Also z.B. angenommen ich definiere ein "double x=0;" vor dem Startteil. Wenn der Preis ein bestimmtes Hoch nimmt, erhält im Programmteil Start das x den Wert des Hochs. Merkt sich das Programm dann auch diesen Wert für die nächsten Ticks immer noch? Solange bis z.B. die Variable durch ein neues Hoch oder sonst eine Bedingung, die man setzt, verändert wird ?
  #7 (permalink)  
Alt 09.05.13
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.875
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Wenn eine Variable, egal welcher Typ, in einer Funktion deklariert wird, also z.B. double wert = ......; dann wird der Wert dieser Variablen nach dem Sprung aus der Funktion wieder gelöscht. Deshalb muß so eine Variable, die über die gesamte Dauer des Programms existieren soll, im externen Teil deklariert werden.

traderdoc
  #8 (permalink)  
Alt 09.05.13
Neues Mitglied
 
Registriert seit: May 2013
Beiträge: 5
trader99 befindet sich auf einem aufstrebenden Ast
Standard

Vielen Dank für die Antwort, alles klar, hast mir sehr weitergeholfen !!
Thema geschlossen

Lesezeichen

Stichworte
loop, loop programmieren, metatrader programmierung, mql4, programmierung, schleife, schleife programmieren


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 22:04 Uhr.



Der Wavesnode - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2017 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.
-----------------------------------------------------------------------------------------------------------------------------